├── docker ├── .gitignore ├── .env ├── prometheus.yml └── latest │ ├── frontend │ └── frontend.yaml │ └── consumers │ └── consumers.yaml ├── hermes-console ├── .nvmrc ├── env.d.ts ├── src │ ├── settings.scss │ ├── api │ │ ├── group.ts │ │ ├── owner-id.ts │ │ ├── tracking-url.ts │ │ ├── offline-clients-source.ts │ │ ├── access-token-response.ts │ │ ├── OffsetRetransmissionDate.ts │ │ ├── content-type.ts │ │ ├── role.ts │ │ ├── inactive-topics.ts │ │ ├── datacenter-readiness.ts │ │ ├── owner.ts │ │ ├── subscription-metrics.ts │ │ ├── offline-retransmission.ts │ │ ├── stats.ts │ │ ├── message-filters-verification.ts │ │ └── constraints.ts │ ├── assets │ │ ├── hermes-logo.png │ │ ├── hermes-logo-full.png │ │ ├── hermes-logo-header.png │ │ ├── hermes-logo-dark-theme.png │ │ ├── hermes-logo-full-dark-theme.png │ │ └── hermes-logo-header-dark-theme.png │ ├── dummy │ │ ├── metricsDashboardUrl.ts │ │ ├── roles.ts │ │ ├── inconsistentGroups.ts │ │ ├── inconsistentTopics.ts │ │ ├── inconsistentMetadata.ts │ │ ├── tracking-urls.ts │ │ ├── readiness.ts │ │ ├── stats.ts │ │ ├── jwt-tokens.ts │ │ ├── inactiveTopics.ts │ │ └── constraints.ts │ ├── store │ │ ├── favorites │ │ │ └── types.ts │ │ ├── auth │ │ │ └── types.ts │ │ ├── app-config │ │ │ └── types.ts │ │ └── consistency │ │ │ └── types.ts │ ├── components │ │ ├── select-field │ │ │ └── types.ts │ │ ├── loading-spinner │ │ │ └── LoadingSpinner.vue │ │ └── console-footer │ │ │ └── ConsoleFooter.spec.ts │ ├── styles │ │ └── vuetify-settings.scss │ ├── utils │ │ ├── axios │ │ │ ├── axios-utils.ts │ │ │ └── axios-instance.ts │ │ ├── download-utils.ts │ │ ├── number-formatter │ │ │ └── number-formatter.ts │ │ └── topic-utils │ │ │ ├── topic-utils.spec.ts │ │ │ └── topic-utils.ts │ ├── i18n │ │ ├── messages.ts │ │ └── en-US │ │ │ └── searchCommander.ts │ ├── views │ │ ├── subscription │ │ │ └── subscription-form │ │ │ │ ├── subscription-headers │ │ │ │ └── types.ts │ │ │ │ ├── subscription-header-filters │ │ │ │ └── types.ts │ │ │ │ └── subscription-basic-filters │ │ │ │ └── types.ts │ │ └── topic │ │ │ ├── offline-clients │ │ │ └── OfflineClients.vue │ │ │ └── messages-preview │ │ │ └── types.ts │ ├── i18n.ts │ └── main.scss ├── public │ └── favicon.ico ├── json-server │ └── filter-debug.json ├── .vscode │ └── extensions.json ├── .prettierrc.json ├── tsconfig.config.json ├── tsconfig.json ├── tsconfig.vitest.json ├── index.html ├── .gitignore └── tsconfig.app.json ├── .github ├── CODEOWNERS └── release.yml ├── gradle.properties ├── requirements.txt ├── hermes-management ├── src │ ├── test │ │ ├── resources │ │ │ ├── console │ │ │ │ └── config-test │ │ │ ├── allure.properties │ │ │ ├── prometheus-stubs │ │ │ │ └── __files │ │ │ │ │ ├── prometheus_empty_response.json │ │ │ │ │ ├── subscription_batches_total.json │ │ │ │ │ ├── subscription_delivered_total.json │ │ │ │ │ ├── subscription_retries_total.json │ │ │ │ │ ├── subscription_timeouts_total.json │ │ │ │ │ ├── subscription_other_errors_total.json │ │ │ │ │ ├── subscription_throughput_bytes_total.json │ │ │ │ │ ├── subscription_2xx_http_status_codes_total.json │ │ │ │ │ ├── subscription_4xx_http_status_codes_total.json │ │ │ │ │ └── subscription_5xx_http_status_codes_total.json │ │ │ └── application.yaml │ │ └── groovy │ │ │ └── pl │ │ │ └── allegro │ │ │ └── tech │ │ │ └── hermes │ │ │ └── management │ │ │ └── utils │ │ │ └── MockAppender.groovy │ └── main │ │ ├── java │ │ └── pl │ │ │ └── allegro │ │ │ └── tech │ │ │ └── hermes │ │ │ └── management │ │ │ ├── infrastructure │ │ │ ├── graphite │ │ │ │ └── RestTemplateGraphiteClient.java │ │ │ ├── query │ │ │ │ ├── graph │ │ │ │ │ ├── ObjectAttribute.java │ │ │ │ │ └── ObjectGraph.java │ │ │ │ ├── matcher │ │ │ │ │ ├── Matcher.java │ │ │ │ │ ├── ComparisonOperator.java │ │ │ │ │ ├── MatcherException.java │ │ │ │ │ ├── MatcherFactory.java │ │ │ │ │ ├── MatcherNotFoundException.java │ │ │ │ │ └── NotMatcher.java │ │ │ │ └── parser │ │ │ │ │ ├── QueryParser.java │ │ │ │ │ └── ParseException.java │ │ │ ├── schema │ │ │ │ └── validator │ │ │ │ │ └── SchemaValidator.java │ │ │ ├── audit │ │ │ │ └── AuditEventType.java │ │ │ └── zookeeper │ │ │ │ └── ZookeeperClientNotFoundException.java │ │ │ ├── domain │ │ │ ├── search │ │ │ │ ├── cache │ │ │ │ │ ├── CachedItemType.java │ │ │ │ │ ├── CachedItem.java │ │ │ │ │ ├── SearchCache.java │ │ │ │ │ ├── CachedTopicItem.java │ │ │ │ │ └── CachedSubscriptionItem.java │ │ │ │ └── SearchQuery.java │ │ │ ├── console │ │ │ │ └── ConsoleConfigurationRepository.java │ │ │ ├── topic │ │ │ │ ├── CreatorRights.java │ │ │ │ ├── TopicMetricsRepository.java │ │ │ │ ├── SingleMessageReader.java │ │ │ │ └── BrokerTopicManagement.java │ │ │ ├── detection │ │ │ │ ├── InactiveTopicWithOwner.java │ │ │ │ ├── InactiveTopicsNotifier.java │ │ │ │ ├── InactiveTopicsRepository.java │ │ │ │ └── LastPublishedMessageMetricsRepository.java │ │ │ ├── clients │ │ │ │ ├── OfflineClientsService.java │ │ │ │ └── AllTopicClientsService.java │ │ │ ├── MetricsDashboardUrlService.java │ │ │ ├── consistency │ │ │ │ ├── SynchronizationException.java │ │ │ │ └── ConsistencyCheckingException.java │ │ │ ├── health │ │ │ │ └── CouldNotResolveHostNameException.java │ │ │ ├── auth │ │ │ │ └── RequestUser.java │ │ │ ├── subscription │ │ │ │ ├── validator │ │ │ │ │ ├── EndpointAddressValidator.java │ │ │ │ │ ├── EndpointOwnershipValidator.java │ │ │ │ │ └── NoOpEndpointOwnershipValidator.java │ │ │ │ ├── SubscriptionLagSource.java │ │ │ │ ├── health │ │ │ │ │ └── SubscriptionHealthProblemIndicator.java │ │ │ │ └── consumergroup │ │ │ │ │ ├── ConsumerGroupManager.java │ │ │ │ │ ├── ConsumerGroupToDeleteRepository.java │ │ │ │ │ └── ConsumerGroupToDelete.java │ │ │ ├── dc │ │ │ │ ├── RepositoryManager.java │ │ │ │ └── RepositoryCommand.java │ │ │ ├── readiness │ │ │ │ └── DatacenterReadinessRepository.java │ │ │ ├── PermissionDeniedException.java │ │ │ ├── retransmit │ │ │ │ ├── OfflineRetransmissionRepository.java │ │ │ │ └── RetransmissionMonitoringUrlProvider.java │ │ │ └── GroupNameIsNotAllowedException.java │ │ │ ├── api │ │ │ ├── auth │ │ │ │ ├── CreatorRights.java │ │ │ │ └── Roles.java │ │ │ └── UiResource.java │ │ │ ├── config │ │ │ ├── CorsConfiguration.java │ │ │ ├── AvroConfiguration.java │ │ │ ├── AuditProperties.java │ │ │ └── CorsProperties.java │ │ │ └── HermesManagement.java │ │ └── resources │ │ └── avro-schema-metadata-field.avsc └── README.md ├── docs └── docs │ ├── img │ ├── hermes.png │ ├── hermes-mini.png │ ├── architecture-overview.png │ └── architecture-multi-cluster.png │ └── overview │ └── features-maturity.md ├── hermes-consumers └── src │ ├── main │ ├── resources │ │ ├── application.yaml │ │ └── application-local.yaml │ └── java │ │ └── pl │ │ └── allegro │ │ └── tech │ │ └── hermes │ │ └── consumers │ │ ├── consumer │ │ ├── sender │ │ │ ├── SenderTarget.java │ │ │ ├── http │ │ │ │ ├── Http2ClientParameters.java │ │ │ │ ├── Http1ClientParameters.java │ │ │ │ ├── auth │ │ │ │ │ └── HttpAuthorizationProvider.java │ │ │ │ ├── HttpBatchSenderException.java │ │ │ │ ├── headers │ │ │ │ │ ├── BatchHttpHeadersProvider.java │ │ │ │ │ ├── HttpHeadersProvider.java │ │ │ │ │ └── DefaultBatchHeadersProvider.java │ │ │ │ ├── HttpHeadersProvidersFactory.java │ │ │ │ ├── HttpRequestFactory.java │ │ │ │ ├── HttpClientParameters.java │ │ │ │ ├── Http2ClientHolder.java │ │ │ │ └── EmptyHttpHeadersProvidersFactory.java │ │ │ ├── resolver │ │ │ │ └── SimpleEndpointAddressResolver.java │ │ │ ├── googlebigquery │ │ │ │ ├── GoogleBigQueryStreamWriterFactory.java │ │ │ │ └── GoogleBigQueryMessageTransformer.java │ │ │ ├── MessageBatchSenderFactory.java │ │ │ ├── googlepubsub │ │ │ │ ├── GooglePubSubMessageCompressionException.java │ │ │ │ ├── GooglePubSubMessageTransformer.java │ │ │ │ └── CompressionCodec.java │ │ │ ├── MessageSender.java │ │ │ ├── CompletableFutureAwareMessageSender.java │ │ │ ├── jms │ │ │ │ └── JmsMessageSenderProvider.java │ │ │ └── SenderClient.java │ │ ├── rate │ │ │ ├── InflightsPool.java │ │ │ ├── calculator │ │ │ │ ├── ModeOutputRateCalculator.java │ │ │ │ └── RateCalculatorParameters.java │ │ │ ├── maxrate │ │ │ │ ├── MaxRateProvider.java │ │ │ │ ├── SubscriptionIdMapper.java │ │ │ │ └── MaxRateParameters.java │ │ │ └── ConsumerRateLimiter.java │ │ ├── offset │ │ │ ├── MessageState.java │ │ │ ├── PendingOffsetsAppender.java │ │ │ └── kafka │ │ │ │ └── broker │ │ │ │ └── PartitionNotAssignedException.java │ │ ├── profiling │ │ │ └── ConsumerRun.java │ │ ├── idletime │ │ │ └── IdleTimeCalculator.java │ │ ├── trace │ │ │ └── MetadataAppender.java │ │ ├── load │ │ │ ├── SubscriptionLoadRecorder.java │ │ │ └── SubscriptionLoadRecordersRegistry.java │ │ ├── SerialConsumerParameters.java │ │ ├── receiver │ │ │ ├── kafka │ │ │ │ ├── MessageContentReaderFactory.java │ │ │ │ └── MessageContentReader.java │ │ │ ├── RetryableReceiverError.java │ │ │ └── ConsumerNotInitializedException.java │ │ ├── interpolation │ │ │ ├── InterpolationException.java │ │ │ └── UriInterpolator.java │ │ ├── oauth │ │ │ ├── OAuthProviderCacheListener.java │ │ │ └── client │ │ │ │ ├── OAuthClient.java │ │ │ │ └── OAuthTokenRequestException.java │ │ ├── result │ │ │ ├── SubscriptionChangeAwareSuccessHandler.java │ │ │ └── SuccessHandler.java │ │ ├── batch │ │ │ └── MessageBatchFactory.java │ │ └── converter │ │ │ ├── MessageConverter.java │ │ │ ├── MessageConverterResolver.java │ │ │ └── NoOperationMessageConverter.java │ │ ├── uri │ │ └── InvalidHostException.java │ │ ├── health │ │ └── Checks.java │ │ ├── subscription │ │ └── id │ │ │ ├── SubscriptionIdProvider.java │ │ │ └── SubscriptionIds.java │ │ ├── supervisor │ │ ├── workload │ │ │ ├── weighted │ │ │ │ ├── SubscriptionProfileRegistry.java │ │ │ │ ├── TargetWeightCalculator.java │ │ │ │ └── ConsumerNodeLoadRegistry.java │ │ │ ├── BalancingListener.java │ │ │ ├── WorkBalancingParameters.java │ │ │ ├── WorkBalancer.java │ │ │ ├── NoOpBalancingListener.java │ │ │ └── SubscriptionAssignmentAware.java │ │ ├── SupervisorParameters.java │ │ ├── process │ │ │ └── ConsumerProcessSupplier.java │ │ └── monitor │ │ │ └── DifferenceCalculator.java │ │ ├── queue │ │ └── MpscQueue.java │ │ ├── config │ │ ├── GoogleBigQueryAvroThreadPoolProperties.java │ │ └── GoogleBigQueryJsonThreadPoolProperties.java │ │ └── CommonConsumerParameters.java │ └── test │ ├── resources │ ├── allure.properties │ ├── responses │ │ └── discovery │ │ │ ├── instance.json │ │ │ └── instances.json │ └── schemas │ │ ├── primitives │ │ ├── bytes.avsc │ │ ├── float.avsc │ │ ├── int.avsc │ │ ├── long.avsc │ │ ├── boolean.avsc │ │ ├── double.avsc │ │ └── string.avsc │ │ ├── nullable-primitives │ │ ├── int.avsc │ │ ├── bytes.avsc │ │ ├── double.avsc │ │ ├── float.avsc │ │ ├── long.avsc │ │ ├── boolean.avsc │ │ └── string.avsc │ │ ├── default-primitives │ │ ├── int.avsc │ │ ├── double.avsc │ │ ├── float.avsc │ │ ├── boolean.avsc │ │ ├── long.avsc │ │ ├── bytes.avsc │ │ └── string.avsc │ │ ├── defaults │ │ ├── primitive-with-default.avsc │ │ ├── string-with-default.avsc │ │ ├── union-with-default.avsc │ │ ├── array-with-default.avsc │ │ ├── array-with-default-items.avsc │ │ ├── map-with-default-values.avsc │ │ ├── enum-with-default.avsc │ │ └── map-with-default.avsc │ │ ├── array-primitives │ │ ├── int.avsc │ │ ├── boolean.avsc │ │ ├── bytes.avsc │ │ ├── float.avsc │ │ ├── long.avsc │ │ ├── double.avsc │ │ └── string.avsc │ │ ├── map-primitives │ │ ├── int.avsc │ │ ├── boolean.avsc │ │ ├── bytes.avsc │ │ ├── float.avsc │ │ ├── long.avsc │ │ ├── double.avsc │ │ └── string.avsc │ │ └── record-primitives │ │ ├── boolean.avsc │ │ ├── bytes.avsc │ │ ├── float.avsc │ │ ├── int.avsc │ │ ├── long.avsc │ │ ├── double.avsc │ │ └── string.avsc │ ├── groovy │ └── pl │ │ └── allegro │ │ └── tech │ │ └── hermes │ │ └── consumers │ │ ├── consumer │ │ └── receiver │ │ │ └── kafka │ │ │ └── KafkaConsumerRecordToMessageConverterTest.groovy │ │ └── supervisor │ │ └── process │ │ └── ConsumerProcessWaiter.groovy │ └── java │ └── pl │ └── allegro │ └── tech │ └── hermes │ └── consumers │ ├── queue │ ├── FullDrainMpscQueueTest.java │ └── WaitFreeDrainMpscQueueTest.java │ └── test │ ├── TestTrackers.java │ └── Wait.java ├── hermes-frontend └── src │ ├── main │ ├── resources │ │ ├── application.yaml │ │ └── application-local.yaml │ └── java │ │ └── pl │ │ └── allegro │ │ └── tech │ │ └── hermes │ │ └── frontend │ │ ├── server │ │ └── auth │ │ │ └── Roles.java │ │ ├── publishing │ │ ├── preview │ │ │ └── MessagePreviewPersister.java │ │ ├── message │ │ │ ├── MessageIdGenerator.java │ │ │ └── AvroEnforcer.java │ │ ├── metadata │ │ │ └── HeadersPropagator.java │ │ └── handlers │ │ │ ├── end │ │ │ ├── TrackingHeadersExtractor.java │ │ │ └── DefaultTrackingHeaderExtractor.java │ │ │ ├── KeepAliveHeaderHandler.java │ │ │ └── ThroughputParameters.java │ │ ├── readiness │ │ ├── ReadinessChecker.java │ │ └── HealthCheckService.java │ │ ├── buffer │ │ ├── chronicle │ │ │ ├── ChronicleMapClosedException.java │ │ │ └── ChronicleMapCreationException.java │ │ ├── BackupMessagesLoaderParameters.java │ │ ├── MessageRepository.java │ │ └── PersistentBufferExtensionParameters.java │ │ ├── validator │ │ └── TopicMessageValidator.java │ │ ├── listeners │ │ ├── BrokerTimeoutListener.java │ │ ├── BrokerErrorListener.java │ │ └── BrokerAcknowledgeListener.java │ │ ├── producer │ │ ├── BrokerTopicAvailabilityChecker.java │ │ ├── BrokerMessageProducer.java │ │ └── kafka │ │ │ └── ChaosException.java │ │ ├── cache │ │ └── topic │ │ │ └── TopicsCache.java │ │ └── metric │ │ └── MetersPair.java │ └── test │ └── resources │ ├── allure.properties │ └── hermes-buffer-v3_2-5-0.dat ├── hermes-api └── src │ ├── test │ └── resources │ │ └── allure.properties │ └── main │ └── java │ └── pl │ └── allegro │ └── tech │ └── hermes │ └── api │ ├── MessageTrace.java │ ├── ContentType.java │ ├── DeliveryType.java │ ├── constraints │ ├── AdminPermitted.java │ └── Names.java │ ├── Anonymizable.java │ ├── SearchItemType.java │ ├── SubscriptionMode.java │ ├── PublishedMessageTraceStatus.java │ ├── SentMessageTraceStatus.java │ ├── AvroMediaType.java │ ├── SearchResults.java │ ├── TopicSearchItem.java │ ├── subscription │ └── metrics │ │ └── SubscriptionMetricsConfig.java │ ├── SubscriptionSearchItem.java │ ├── helpers │ └── Replacer.java │ ├── Query.java │ └── SearchItem.java ├── hermes-client └── src │ ├── test │ └── resources │ │ └── allure.properties │ └── main │ └── java │ └── pl │ └── allegro │ └── tech │ └── hermes │ └── client │ ├── HermesSender.java │ ├── ReactiveHermesSender.java │ ├── metrics │ └── MetricsUtils.java │ ├── HermesClientShutdownException.java │ └── MessageDeliveryListener.java ├── hermes-common └── src │ ├── test │ └── resources │ │ └── allure.properties │ └── main │ └── java │ └── pl │ └── allegro │ └── tech │ └── hermes │ ├── common │ ├── message │ │ ├── wrapper │ │ │ ├── SchemaOnlineChecksWaitingRateLimiter.java │ │ │ ├── DeserializationException.java │ │ │ ├── AvroMetadataMarker.java │ │ │ ├── WrappingException.java │ │ │ ├── UnwrappingException.java │ │ │ ├── AvroInvalidMetadataException.java │ │ │ └── AvroMessageContentUnwrapper.java │ │ └── undelivered │ │ │ ├── UndeliveredMessageLog.java │ │ │ └── LastUndeliveredMessageReader.java │ ├── util │ │ └── InstanceIdResolver.java │ ├── ssl │ │ ├── SslContextFactory.java │ │ ├── KeyManagersProvider.java │ │ ├── SslContextCreationException.java │ │ ├── TrustManagersProvider.java │ │ ├── KeystoreConfigurationException.java │ │ ├── TruststoreConfigurationException.java │ │ └── KeystoreSource.java │ ├── metric │ │ └── Histograms.java │ ├── clock │ │ └── ClockFactory.java │ ├── kafka │ │ ├── HTTPHeadersPropagationAsKafkaHeadersProperties.java │ │ ├── KafkaHeaderNameParameters.java │ │ ├── KafkaNamesMapper.java │ │ ├── KafkaParameters.java │ │ └── KafkaConsumerPoolException.java │ ├── admin │ │ ├── AdminToolStartupException.java │ │ ├── AdminOperationsCallback.java │ │ └── AdminTool.java │ ├── exception │ │ ├── RepositoryNotAvailableException.java │ │ ├── BrokerInfoNotAvailableException.java │ │ ├── BrokerNotFoundForPartitionException.java │ │ ├── InternalProcessingException.java │ │ └── HermesException.java │ ├── concurrent │ │ └── ExecutorServiceFactory.java │ ├── broker │ │ ├── BrokerStorage.java │ │ └── BrokerDetails.java │ ├── di │ │ └── factories │ │ │ └── MicrometerRegistryParameters.java │ └── schema │ │ └── SchemaVersionRepositoryParameters.java │ ├── infrastructure │ ├── dc │ │ ├── DcNameSource.java │ │ ├── DatacenterNameProvider.java │ │ └── DcNameProvisionException.java │ └── MalformedDataException.java │ └── domain │ ├── notifications │ ├── AdminCallback.java │ ├── TopicCallback.java │ ├── InternalNotificationsBus.java │ └── SubscriptionCallback.java │ ├── CredentialsRepository.java │ ├── filtering │ ├── MessageFilterSource.java │ ├── UnsupportedMatchingStrategyException.java │ ├── NoSuchFilterException.java │ └── FilterableMessage.java │ ├── topic │ └── preview │ │ └── MessagePreviewRepository.java │ └── group │ └── GroupNotEmptyException.java ├── hermes-mock └── src │ ├── test │ └── resources │ │ ├── allure.properties │ │ └── msg.avsc │ └── main │ └── java │ └── pl │ └── allegro │ └── tech │ └── hermes │ └── mock │ └── HermesMockException.java ├── hermes-schema ├── src │ ├── test │ │ └── resources │ │ │ └── allure.properties │ └── main │ │ └── java │ │ └── pl │ │ └── allegro │ │ └── tech │ │ └── hermes │ │ └── schema │ │ ├── SchemaCompiler.java │ │ ├── resolver │ │ └── SchemaRepositoryInstanceResolver.java │ │ ├── SchemaCompilersFactory.java │ │ ├── CompiledSchemaRepository.java │ │ └── SchemaException.java └── build.gradle ├── hermes-metrics ├── src │ ├── test │ │ └── resources │ │ │ └── allure.properties │ └── main │ │ └── java │ │ └── pl │ │ └── allegro │ │ └── tech │ │ └── hermes │ │ └── metrics │ │ ├── HermesRateMeter.java │ │ ├── HermesHistogram.java │ │ ├── HermesCounter.java │ │ └── counters │ │ └── HermesCounters.java └── build.gradle ├── hermes-tracker ├── src │ ├── test │ │ └── resources │ │ │ └── allure.properties │ └── main │ │ └── java │ │ └── pl │ │ └── allegro │ │ └── tech │ │ └── hermes │ │ └── tracker │ │ ├── management │ │ ├── TrackingUrl.java │ │ ├── TrackingUrlProvider.java │ │ └── LogRepository.java │ │ └── consumers │ │ ├── deadletters │ │ └── DeadRepository.java │ │ └── SendingTracker.java └── build.gradle ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── hermes-tracker-elasticsearch └── src │ ├── test │ └── resources │ │ └── allure.properties │ └── main │ └── java │ └── pl │ └── allegro │ └── tech │ └── hermes │ └── tracker │ └── elasticsearch │ ├── IndexFactory.java │ ├── frontend │ └── FrontendIndexFactory.java │ ├── consumers │ └── ConsumersIndexFactory.java │ └── ElasticsearchRepositoryException.java ├── integration-tests └── src │ ├── integrationTest │ └── resources │ │ └── allure.properties │ ├── slowIntegrationTest │ └── resources │ │ ├── allure.properties │ │ ├── client.keystore │ │ ├── client.truststore │ │ ├── server.keystore │ │ └── server.truststore │ └── common │ ├── resources │ └── hornetq-users.xml │ └── java │ └── pl │ └── allegro │ └── tech │ └── hermes │ ├── utils │ └── Headers.java │ └── integrationtests │ └── prometheus │ └── PrometheusResponse.java ├── scripts └── requirements.txt ├── .idea ├── vcs.xml ├── google-java-format.xml └── externalDependencies.xml ├── hermes-benchmark ├── README.md └── src │ └── jmh │ ├── resources │ └── message │ │ └── completeMessage.json │ └── java │ └── pl │ └── allegro │ └── tech │ └── hermes │ └── benchmark │ └── environment │ └── NoOpMessagePreviewPersister.java ├── hermes-test-helper └── src │ └── main │ ├── java │ └── pl │ │ └── allegro │ │ └── tech │ │ └── hermes │ │ └── test │ │ └── helper │ │ ├── oauth │ │ └── server │ │ │ ├── OAuthClient.java │ │ │ └── OAuthResourceOwner.java │ │ ├── environment │ │ ├── Starter.java │ │ └── HermesTestApp.java │ │ ├── containers │ │ └── ImageTags.java │ │ ├── metrics │ │ └── TestMetricsFacadeFactory.java │ │ └── cache │ │ └── FakeTicker.java │ └── resources │ ├── schema │ ├── user_no_metadata.avsc │ └── user.avsc │ └── testcontainers │ ├── kafka_start.sh │ └── kafka_start_stop_wrapper.sh ├── readthedocs.yml └── settings.gradle /docker/.gitignore: -------------------------------------------------------------------------------- 1 | data -------------------------------------------------------------------------------- /hermes-console/.nvmrc: -------------------------------------------------------------------------------- 1 | 22.20.0 2 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | @allegro/hermes 2 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.jvmargs=-Xmx2g -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | mkdocs==1.4.0 2 | mkdocs-material==8.5.6 3 | -------------------------------------------------------------------------------- /hermes-console/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /hermes-console/src/settings.scss: -------------------------------------------------------------------------------- 1 | @forward 'vuetify/settings'; 2 | -------------------------------------------------------------------------------- /docker/.env: -------------------------------------------------------------------------------- 1 | CONFLUENT_IMAGES_TAG="6.1.0" 2 | VICTORIA_METRICS_IMAGES_TAG="v1.112.0" -------------------------------------------------------------------------------- /hermes-management/src/test/resources/console/config-test: -------------------------------------------------------------------------------- 1 | { "property": "value" } 2 | -------------------------------------------------------------------------------- /hermes-console/src/api/group.ts: -------------------------------------------------------------------------------- 1 | export interface Group { 2 | groupName: string; 3 | } 4 | -------------------------------------------------------------------------------- /docs/docs/img/hermes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/docs/docs/img/hermes.png -------------------------------------------------------------------------------- /hermes-consumers/src/main/resources/application.yaml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | default: local -------------------------------------------------------------------------------- /hermes-frontend/src/main/resources/application.yaml: -------------------------------------------------------------------------------- 1 | spring: 2 | profiles: 3 | default: local -------------------------------------------------------------------------------- /hermes-api/src/test/resources/allure.properties: -------------------------------------------------------------------------------- 1 | allure.results.directory=../build/allure-results 2 | -------------------------------------------------------------------------------- /hermes-client/src/test/resources/allure.properties: -------------------------------------------------------------------------------- 1 | allure.results.directory=../build/allure-results 2 | -------------------------------------------------------------------------------- /hermes-common/src/test/resources/allure.properties: -------------------------------------------------------------------------------- 1 | allure.results.directory=../build/allure-results 2 | -------------------------------------------------------------------------------- /hermes-mock/src/test/resources/allure.properties: -------------------------------------------------------------------------------- 1 | allure.results.directory=../build/allure-results 2 | -------------------------------------------------------------------------------- /hermes-schema/src/test/resources/allure.properties: -------------------------------------------------------------------------------- 1 | allure.results.directory=../build/allure-results 2 | -------------------------------------------------------------------------------- /docs/docs/img/hermes-mini.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/docs/docs/img/hermes-mini.png -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/allure.properties: -------------------------------------------------------------------------------- 1 | allure.results.directory=../build/allure-results 2 | -------------------------------------------------------------------------------- /hermes-frontend/src/test/resources/allure.properties: -------------------------------------------------------------------------------- 1 | allure.results.directory=../build/allure-results 2 | -------------------------------------------------------------------------------- /hermes-management/src/test/resources/allure.properties: -------------------------------------------------------------------------------- 1 | allure.results.directory=../build/allure-results 2 | -------------------------------------------------------------------------------- /hermes-metrics/src/test/resources/allure.properties: -------------------------------------------------------------------------------- 1 | allure.results.directory=../build/allure-results 2 | -------------------------------------------------------------------------------- /hermes-tracker/src/test/resources/allure.properties: -------------------------------------------------------------------------------- 1 | allure.results.directory=../build/allure-results 2 | -------------------------------------------------------------------------------- /hermes-console/src/api/owner-id.ts: -------------------------------------------------------------------------------- 1 | export interface OwnerId { 2 | source: string; 3 | id: string; 4 | } 5 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /hermes-console/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/hermes-console/public/favicon.ico -------------------------------------------------------------------------------- /hermes-console/src/api/tracking-url.ts: -------------------------------------------------------------------------------- 1 | export interface TrackingUrl { 2 | name: string; 3 | url: string; 4 | } 5 | -------------------------------------------------------------------------------- /hermes-tracker-elasticsearch/src/test/resources/allure.properties: -------------------------------------------------------------------------------- 1 | allure.results.directory=../build/allure-results 2 | -------------------------------------------------------------------------------- /integration-tests/src/integrationTest/resources/allure.properties: -------------------------------------------------------------------------------- 1 | allure.results.directory=../build/allure-results 2 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/message/wrapper/SchemaOnlineChecksWaitingRateLimiter.java: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /hermes-console/json-server/filter-debug.json: -------------------------------------------------------------------------------- 1 | { 2 | "status": "ERROR", 3 | "errorMessage": "Failed to parse json" 4 | } -------------------------------------------------------------------------------- /hermes-console/src/api/offline-clients-source.ts: -------------------------------------------------------------------------------- 1 | export interface OfflineClientsSource { 2 | source: string; 3 | } 4 | -------------------------------------------------------------------------------- /integration-tests/src/slowIntegrationTest/resources/allure.properties: -------------------------------------------------------------------------------- 1 | allure.results.directory=../build/allure-results 2 | -------------------------------------------------------------------------------- /docs/docs/img/architecture-overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/docs/docs/img/architecture-overview.png -------------------------------------------------------------------------------- /hermes-console/.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] 3 | } 4 | -------------------------------------------------------------------------------- /hermes-console/src/api/access-token-response.ts: -------------------------------------------------------------------------------- 1 | export interface AccessTokenResponse { 2 | access_token: string; 3 | } 4 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/infrastructure/graphite/RestTemplateGraphiteClient.java: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /hermes-console/src/api/OffsetRetransmissionDate.ts: -------------------------------------------------------------------------------- 1 | export interface RetransmissionDate { 2 | retransmissionDate: string; 3 | } 4 | -------------------------------------------------------------------------------- /hermes-console/src/assets/hermes-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/hermes-console/src/assets/hermes-logo.png -------------------------------------------------------------------------------- /scripts/requirements.txt: -------------------------------------------------------------------------------- 1 | appdirs==1.4.0 2 | click==6.7 3 | kazoo==2.2.1 4 | packaging==16.8 5 | pyparsing==2.1.10 6 | six==1.10.0 7 | -------------------------------------------------------------------------------- /docs/docs/img/architecture-multi-cluster.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/docs/docs/img/architecture-multi-cluster.png -------------------------------------------------------------------------------- /hermes-console/src/dummy/metricsDashboardUrl.ts: -------------------------------------------------------------------------------- 1 | export const dummyMetricsDashboardUrl = { 2 | url: 'https://www.google.com', 3 | }; 4 | -------------------------------------------------------------------------------- /hermes-console/src/dummy/roles.ts: -------------------------------------------------------------------------------- 1 | import { Role } from '@/api/role'; 2 | 3 | export const dummyRoles = [Role.ANY, Role.TOPIC_OWNER]; 4 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/groovy/pl/allegro/tech/hermes/consumers/consumer/receiver/kafka/KafkaConsumerRecordToMessageConverterTest.groovy: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /hermes-console/src/assets/hermes-logo-full.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/hermes-console/src/assets/hermes-logo-full.png -------------------------------------------------------------------------------- /hermes-console/src/store/favorites/types.ts: -------------------------------------------------------------------------------- 1 | export interface FavoritesState { 2 | topics: string[]; 3 | subscriptions: string[]; 4 | } 5 | -------------------------------------------------------------------------------- /hermes-console/src/assets/hermes-logo-header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/hermes-console/src/assets/hermes-logo-header.png -------------------------------------------------------------------------------- /hermes-api/src/main/java/pl/allegro/tech/hermes/api/MessageTrace.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.api; 2 | 3 | public interface MessageTrace {} 4 | -------------------------------------------------------------------------------- /hermes-console/src/assets/hermes-logo-dark-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/hermes-console/src/assets/hermes-logo-dark-theme.png -------------------------------------------------------------------------------- /hermes-console/src/components/select-field/types.ts: -------------------------------------------------------------------------------- 1 | export interface SelectFieldOption { 2 | title: string; 3 | value: TValue; 4 | } 5 | -------------------------------------------------------------------------------- /hermes-console/src/styles/vuetify-settings.scss: -------------------------------------------------------------------------------- 1 | @use "vuetify/settings" with ( 2 | $table-border-color: rgba(var(--v-border-color), 0.06), 3 | ); 4 | 5 | -------------------------------------------------------------------------------- /hermes-console/src/api/content-type.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-unused-vars */ 2 | export const enum ContentType { 3 | JSON = 'JSON', 4 | AVRO = 'AVRO', 5 | } 6 | -------------------------------------------------------------------------------- /hermes-console/src/utils/axios/axios-utils.ts: -------------------------------------------------------------------------------- 1 | import type { AxiosResponse } from 'axios'; 2 | 3 | export type ResponsePromise = Promise>; 4 | -------------------------------------------------------------------------------- /hermes-console/src/assets/hermes-logo-full-dark-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/hermes-console/src/assets/hermes-logo-full-dark-theme.png -------------------------------------------------------------------------------- /hermes-console/src/assets/hermes-logo-header-dark-theme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/hermes-console/src/assets/hermes-logo-header-dark-theme.png -------------------------------------------------------------------------------- /hermes-console/src/i18n/messages.ts: -------------------------------------------------------------------------------- 1 | import en_US from '@/i18n/en-US'; 2 | 3 | const messages = { 4 | 'en-US': en_US, 5 | }; 6 | 7 | export default messages; 8 | -------------------------------------------------------------------------------- /hermes-api/src/main/java/pl/allegro/tech/hermes/api/ContentType.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.api; 2 | 3 | public enum ContentType { 4 | JSON, 5 | AVRO 6 | } 7 | -------------------------------------------------------------------------------- /hermes-frontend/src/test/resources/hermes-buffer-v3_2-5-0.dat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/hermes-frontend/src/test/resources/hermes-buffer-v3_2-5-0.dat -------------------------------------------------------------------------------- /hermes-api/src/main/java/pl/allegro/tech/hermes/api/DeliveryType.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.api; 2 | 3 | public enum DeliveryType { 4 | SERIAL, 5 | BATCH 6 | } 7 | -------------------------------------------------------------------------------- /hermes-console/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "tabWidth": 2, 4 | "trailingComma": "all", 5 | "useTabs": false, 6 | "vueIndentScriptAndStyle": true 7 | } -------------------------------------------------------------------------------- /hermes-api/src/main/java/pl/allegro/tech/hermes/api/constraints/AdminPermitted.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.api.constraints; 2 | 3 | public interface AdminPermitted {} 4 | -------------------------------------------------------------------------------- /hermes-api/src/main/java/pl/allegro/tech/hermes/api/Anonymizable.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.api; 2 | 3 | public interface Anonymizable { 4 | Anonymizable anonymize(); 5 | } 6 | -------------------------------------------------------------------------------- /hermes-api/src/main/java/pl/allegro/tech/hermes/api/SearchItemType.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.api; 2 | 3 | public enum SearchItemType { 4 | TOPIC, 5 | SUBSCRIPTION 6 | } 7 | -------------------------------------------------------------------------------- /hermes-console/src/dummy/inconsistentGroups.ts: -------------------------------------------------------------------------------- 1 | export const dummyInconsistentGroups: string[] = [ 2 | 'pl.allegro.group', 3 | 'pl.allegro.group2', 4 | 'pl.allegro.group3', 5 | ]; 6 | -------------------------------------------------------------------------------- /hermes-console/src/views/subscription/subscription-form/subscription-headers/types.ts: -------------------------------------------------------------------------------- 1 | export interface HeaderWithId { 2 | id: string; 3 | name: string; 4 | value: string; 5 | } 6 | -------------------------------------------------------------------------------- /integration-tests/src/slowIntegrationTest/resources/client.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/integration-tests/src/slowIntegrationTest/resources/client.keystore -------------------------------------------------------------------------------- /integration-tests/src/slowIntegrationTest/resources/client.truststore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/integration-tests/src/slowIntegrationTest/resources/client.truststore -------------------------------------------------------------------------------- /integration-tests/src/slowIntegrationTest/resources/server.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/integration-tests/src/slowIntegrationTest/resources/server.keystore -------------------------------------------------------------------------------- /integration-tests/src/slowIntegrationTest/resources/server.truststore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/allegro/hermes/HEAD/integration-tests/src/slowIntegrationTest/resources/server.truststore -------------------------------------------------------------------------------- /hermes-api/src/main/java/pl/allegro/tech/hermes/api/SubscriptionMode.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.api; 2 | 3 | public enum SubscriptionMode { 4 | ANYCAST, 5 | BROADCAST 6 | } 7 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/infrastructure/dc/DcNameSource.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.infrastructure.dc; 2 | 3 | public enum DcNameSource { 4 | ENV 5 | } 6 | -------------------------------------------------------------------------------- /hermes-console/src/api/role.ts: -------------------------------------------------------------------------------- 1 | export const enum Role { 2 | ANY = 'any', 3 | ADMIN = 'admin', 4 | TOPIC_OWNER = 'topicOwner', 5 | SUBSCRIPTION_OWNER = 'subscriptionOwner', 6 | } 7 | -------------------------------------------------------------------------------- /hermes-console/src/views/subscription/subscription-form/subscription-header-filters/types.ts: -------------------------------------------------------------------------------- 1 | export interface HeaderFilter { 2 | id: string; 3 | header: string; 4 | matcher: string; 5 | } 6 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /docker/prometheus.yml: -------------------------------------------------------------------------------- 1 | scrape_configs: 2 | - job_name: hermes_consumers 3 | scrape_interval: 15s 4 | static_configs: 5 | - targets: 6 | - http://consumers:8070/status/prometheus -------------------------------------------------------------------------------- /hermes-console/src/api/inactive-topics.ts: -------------------------------------------------------------------------------- 1 | export interface InactiveTopic { 2 | topic: string; 3 | lastPublishedTsMs: number; 4 | notificationTsMs: number[]; 5 | whitelisted: boolean; 6 | } 7 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/SenderTarget.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.sender; 2 | 3 | public interface SenderTarget {} 4 | -------------------------------------------------------------------------------- /hermes-management/src/test/resources/prometheus-stubs/__files/prometheus_empty_response.json: -------------------------------------------------------------------------------- 1 | { 2 | "status": "success", 3 | "data": { 4 | "resultType": "vector", 5 | "result": [] 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /hermes-metrics/src/main/java/pl/allegro/tech/hermes/metrics/HermesRateMeter.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.metrics; 2 | 3 | public interface HermesRateMeter { 4 | double getOneMinuteRate(); 5 | } 6 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/util/InstanceIdResolver.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.util; 2 | 3 | public interface InstanceIdResolver { 4 | String resolve(); 5 | } 6 | -------------------------------------------------------------------------------- /hermes-management/README.md: -------------------------------------------------------------------------------- 1 | # Development 2 | 3 | 1. To run hermes-management locally serving hermes-console execute: 4 | 5 | `./gradlew -Pdistribution hermes-management:attachHermesConsole hermes-management:run` -------------------------------------------------------------------------------- /hermes-metrics/src/main/java/pl/allegro/tech/hermes/metrics/HermesHistogram.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.metrics; 2 | 3 | public interface HermesHistogram { 4 | 5 | void record(long value); 6 | } 7 | -------------------------------------------------------------------------------- /.idea/google-java-format.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/ssl/SslContextFactory.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.ssl; 2 | 3 | public interface SslContextFactory { 4 | 5 | SSLContextHolder create(); 6 | } 7 | -------------------------------------------------------------------------------- /hermes-console/src/dummy/inconsistentTopics.ts: -------------------------------------------------------------------------------- 1 | export const dummyInconsistentTopics: string[] = [ 2 | 'pl.allegro.group.Topic1_avro', 3 | 'pl.allegro.group.Topic2_avro', 4 | 'pl.allegro.group.Dummy_avro', 5 | ]; 6 | -------------------------------------------------------------------------------- /hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/server/auth/Roles.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.frontend.server.auth; 2 | 3 | public interface Roles { 4 | String PUBLISHER = "PUBLISHER"; 5 | } 6 | -------------------------------------------------------------------------------- /hermes-api/src/main/java/pl/allegro/tech/hermes/api/PublishedMessageTraceStatus.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.api; 2 | 3 | public enum PublishedMessageTraceStatus { 4 | INFLIGHT, 5 | SUCCESS, 6 | ERROR 7 | } 8 | -------------------------------------------------------------------------------- /hermes-benchmark/README.md: -------------------------------------------------------------------------------- 1 | Hermes-benchmark 2 | ====== 3 | 4 | Hermes benchmarks written in [JMH](http://openjdk.java.net/projects/code-tools/jmh/). 5 | 6 | Running 7 | --- 8 | ``` 9 | ./gradlew jmh 10 | ``` 11 | -------------------------------------------------------------------------------- /hermes-console/src/api/datacenter-readiness.ts: -------------------------------------------------------------------------------- 1 | export interface DatacenterReadiness { 2 | datacenter: string; 3 | status: 'READY' | 'NOT_READY'; 4 | } 5 | 6 | export interface Readiness { 7 | isReady: boolean; 8 | } 9 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/rate/InflightsPool.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.rate; 2 | 3 | public interface InflightsPool { 4 | void release(); 5 | } 6 | -------------------------------------------------------------------------------- /hermes-test-helper/src/main/java/pl/allegro/tech/hermes/test/helper/oauth/server/OAuthClient.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.test.helper.oauth.server; 2 | 3 | public record OAuthClient(String clientId, String secret) {} 4 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/offset/MessageState.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.offset; 2 | 3 | public enum MessageState { 4 | INFLIGHT, 5 | PROCESSED 6 | } 7 | -------------------------------------------------------------------------------- /hermes-console/src/dummy/inconsistentMetadata.ts: -------------------------------------------------------------------------------- 1 | export const inconsistentMetadata = [ 2 | { 3 | datacenter: 'DC1', 4 | }, 5 | { 6 | datacenter: 'DC2', 7 | content: '{ "lorem": "ipsum" }', 8 | }, 9 | ]; 10 | -------------------------------------------------------------------------------- /.idea/externalDependencies.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /hermes-api/src/main/java/pl/allegro/tech/hermes/api/constraints/Names.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.api.constraints; 2 | 3 | public final class Names { 4 | public static final String ALLOWED_NAME_REGEX = "[a-zA-Z0-9_.-]+"; 5 | } 6 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/infrastructure/dc/DatacenterNameProvider.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.infrastructure.dc; 2 | 3 | public interface DatacenterNameProvider { 4 | String getDatacenterName(); 5 | } 6 | -------------------------------------------------------------------------------- /hermes-tracker-elasticsearch/src/main/java/pl/allegro/tech/hermes/tracker/elasticsearch/IndexFactory.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.tracker.elasticsearch; 2 | 3 | public interface IndexFactory { 4 | 5 | String createIndex(); 6 | } 7 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/responses/discovery/instance.json: -------------------------------------------------------------------------------- 1 | {"id":"9ea44837-ed82-4074-9ff5-47411b09d2d5","zone":"default","uri":"http://10.196.224.17:8080/","version":"1.0.1-SNAPSHOT","ratio":2,"region":"default","secureConnection":false} -------------------------------------------------------------------------------- /hermes-test-helper/src/main/java/pl/allegro/tech/hermes/test/helper/oauth/server/OAuthResourceOwner.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.test.helper.oauth.server; 2 | 3 | public record OAuthResourceOwner(String username, String password) {} 4 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/search/cache/CachedItemType.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.search.cache; 2 | 3 | public enum CachedItemType { 4 | TOPIC, 5 | SUBSCRIPTION, 6 | } 7 | -------------------------------------------------------------------------------- /hermes-api/src/main/java/pl/allegro/tech/hermes/api/SentMessageTraceStatus.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.api; 2 | 3 | public enum SentMessageTraceStatus { 4 | INFLIGHT, 5 | SUCCESS, 6 | FAILED, 7 | DISCARDED, 8 | FILTERED 9 | } 10 | -------------------------------------------------------------------------------- /hermes-console/src/api/owner.ts: -------------------------------------------------------------------------------- 1 | export interface OwnerSource { 2 | name: string; 3 | autocomplete: boolean; 4 | deprecated: boolean; 5 | } 6 | 7 | export interface Owner { 8 | id: string; 9 | name: string; 10 | url: string; 11 | } 12 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/http/Http2ClientParameters.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.sender.http; 2 | 3 | public interface Http2ClientParameters extends HttpClientParameters {} 4 | -------------------------------------------------------------------------------- /hermes-benchmark/src/jmh/resources/message/completeMessage.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Bob", 3 | "favorite_number": 6, 4 | "favorite_color": "Blue", 5 | "address": { 6 | "city": "Warsaw", 7 | "street": "Mokotowska", 8 | "number": 1 9 | } 10 | } -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/domain/notifications/AdminCallback.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.domain.notifications; 2 | 3 | public interface AdminCallback { 4 | 5 | void onAdminOperationCreated(String type, String content); 6 | } 7 | -------------------------------------------------------------------------------- /hermes-console/src/dummy/tracking-urls.ts: -------------------------------------------------------------------------------- 1 | import type { TrackingUrl } from '@/api/tracking-url'; 2 | 3 | export const dummyTrackingUrls: TrackingUrl[] = [ 4 | { name: 'url1', url: 'https://test-url1' }, 5 | { name: 'url2', url: 'https://test-url2' }, 6 | ]; 7 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/infrastructure/query/graph/ObjectAttribute.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.infrastructure.query.graph; 2 | 3 | public interface ObjectAttribute { 4 | 5 | Object value(); 6 | } 7 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/infrastructure/query/matcher/Matcher.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.infrastructure.query.matcher; 2 | 3 | public interface Matcher { 4 | 5 | boolean match(Object value); 6 | } 7 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/responses/discovery/instances.json: -------------------------------------------------------------------------------- 1 | {"links":[ 2 | {"id":"12a2a9c1-06dd-48c5-b78a-f011a7fd3e8f", 3 | "rel":"instance", 4 | "href":"##HOST##/services/spring-bootstrap/instances/12a2a9c1-06dd-48c5-b78a-f011a7fd3e8f"} 5 | ]} -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/ssl/KeyManagersProvider.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.ssl; 2 | 3 | import javax.net.ssl.KeyManager; 4 | 5 | public interface KeyManagersProvider { 6 | KeyManager[] getKeyManagers() throws Exception; 7 | } 8 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/domain/CredentialsRepository.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.domain; 2 | 3 | public interface CredentialsRepository { 4 | NodePassword readAdminPassword(); 5 | 6 | void overwriteAdminPassword(String password); 7 | } 8 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/console/ConsoleConfigurationRepository.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.console; 2 | 3 | public interface ConsoleConfigurationRepository { 4 | 5 | String getConfiguration(); 6 | } 7 | -------------------------------------------------------------------------------- /hermes-metrics/src/main/java/pl/allegro/tech/hermes/metrics/HermesCounter.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.metrics; 2 | 3 | public interface HermesCounter { 4 | void increment(long size); 5 | 6 | default void increment() { 7 | increment(1L); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /hermes-api/src/main/java/pl/allegro/tech/hermes/api/AvroMediaType.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.api; 2 | 3 | public class AvroMediaType { 4 | 5 | public static final String AVRO_BINARY = "avro/binary"; 6 | 7 | public static final String AVRO_JSON = "avro/json"; 8 | } 9 | -------------------------------------------------------------------------------- /hermes-console/tsconfig.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.node.json", 3 | "include": ["vite.config.*", "vitest.config.*", "cypress.config.*", "playwright.config.*"], 4 | "compilerOptions": { 5 | "composite": true, 6 | "types": ["node"] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/resolver/SimpleEndpointAddressResolver.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.sender.resolver; 2 | 3 | public class SimpleEndpointAddressResolver implements EndpointAddressResolver {} 4 | -------------------------------------------------------------------------------- /hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/publishing/preview/MessagePreviewPersister.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.frontend.publishing.preview; 2 | 3 | public interface MessagePreviewPersister { 4 | 5 | void start(); 6 | 7 | void shutdown(); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/ssl/SslContextCreationException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.ssl; 2 | 3 | class SslContextCreationException extends RuntimeException { 4 | SslContextCreationException(Exception e) { 5 | super(e); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/ssl/TrustManagersProvider.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.ssl; 2 | 3 | import javax.net.ssl.TrustManager; 4 | 5 | public interface TrustManagersProvider { 6 | TrustManager[] getTrustManagers() throws Exception; 7 | } 8 | -------------------------------------------------------------------------------- /hermes-console/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "files": [], 3 | "references": [ 4 | { 5 | "path": "./tsconfig.config.json" 6 | }, 7 | { 8 | "path": "./tsconfig.app.json" 9 | }, 10 | { 11 | "path": "./tsconfig.vitest.json" 12 | } 13 | ], 14 | } 15 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/profiling/ConsumerRun.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.profiling; 2 | 3 | public enum ConsumerRun { 4 | EMPTY, 5 | DELIVERED, 6 | DISCARDED, 7 | RETRIED, 8 | FILTERED 9 | } 10 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/primitives/bytes.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": "bytes" 9 | } 10 | ] 11 | } -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/primitives/float.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": "float" 9 | } 10 | ] 11 | } -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/primitives/int.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": "int" 9 | } 10 | ] 11 | } -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/primitives/long.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": "long" 9 | } 10 | ] 11 | } -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/api/auth/CreatorRights.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.api.auth; 2 | 3 | public interface CreatorRights { 4 | 5 | boolean allowedToManage(T entity); 6 | 7 | boolean allowedToCreate(T entity); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/infrastructure/query/matcher/ComparisonOperator.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.infrastructure.query.matcher; 2 | 3 | public interface ComparisonOperator { 4 | boolean compare(double a, double b); 5 | } 6 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/metric/Histograms.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.metric; 2 | 3 | public class Histograms { 4 | public static final String PERSISTED_UNDELIVERED_MESSAGE_SIZE = 5 | "undelivered-messages.persisted.message-size"; 6 | } 7 | -------------------------------------------------------------------------------- /hermes-console/src/store/auth/types.ts: -------------------------------------------------------------------------------- 1 | export interface AuthStoreState { 2 | accessToken: string | null; 3 | codeVerifier: string | null; 4 | loading: boolean; 5 | error: AuthStoreErrors; 6 | } 7 | 8 | export interface AuthStoreErrors { 9 | loadAuth: Error | null; 10 | } 11 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/primitives/boolean.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": "boolean" 9 | } 10 | ] 11 | } -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/primitives/double.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": "double" 9 | } 10 | ] 11 | } -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/primitives/string.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": "string" 9 | } 10 | ] 11 | } -------------------------------------------------------------------------------- /hermes-tracker/src/main/java/pl/allegro/tech/hermes/tracker/management/TrackingUrl.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.tracker.management; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | 5 | public record TrackingUrl(@JsonProperty String name, @JsonProperty String url) {} 6 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/clock/ClockFactory.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.clock; 2 | 3 | import java.time.Clock; 4 | 5 | public class ClockFactory { 6 | 7 | public Clock provide() { 8 | return Clock.systemDefaultZone(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/kafka/HTTPHeadersPropagationAsKafkaHeadersProperties.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.kafka; 2 | 3 | public interface HTTPHeadersPropagationAsKafkaHeadersProperties { 4 | boolean isEnabled(); 5 | 6 | String getPrefix(); 7 | } 8 | -------------------------------------------------------------------------------- /hermes-console/src/views/subscription/subscription-form/subscription-basic-filters/types.ts: -------------------------------------------------------------------------------- 1 | export type FilterMatchingStrategy = 'all' | 'any'; 2 | 3 | export interface PathFilter { 4 | id: string; 5 | path: string; 6 | matcher: string; 7 | matchingStrategy: FilterMatchingStrategy; 8 | } 9 | -------------------------------------------------------------------------------- /hermes-console/src/utils/axios/axios-instance.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | 3 | const instance = axios.create({ 4 | baseURL: import.meta.env.DEV 5 | ? 'http://localhost:3000' 6 | : window.location.origin, 7 | timeout: 1000 * 30, //30s 8 | }); 9 | 10 | export default instance; 11 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/uri/InvalidHostException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.uri; 2 | 3 | public class InvalidHostException extends RuntimeException { 4 | 5 | public InvalidHostException(String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/topic/CreatorRights.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.topic; 2 | 3 | import pl.allegro.tech.hermes.api.Topic; 4 | 5 | public interface CreatorRights { 6 | 7 | boolean allowedToManage(Topic topic); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-schema/src/main/java/pl/allegro/tech/hermes/schema/SchemaCompiler.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.schema; 2 | 3 | import pl.allegro.tech.hermes.api.RawSchema; 4 | 5 | @FunctionalInterface 6 | public interface SchemaCompiler { 7 | 8 | T compile(RawSchema rawSchema); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/http/Http1ClientParameters.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.sender.http; 2 | 3 | public interface Http1ClientParameters extends HttpClientParameters { 4 | 5 | int getMaxConnectionsPerDestination(); 6 | } 7 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/detection/InactiveTopicWithOwner.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.detection; 2 | 3 | import pl.allegro.tech.hermes.api.OwnerId; 4 | 5 | public record InactiveTopicWithOwner(InactiveTopic topic, OwnerId ownerId) {} 6 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/infrastructure/schema/validator/SchemaValidator.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.infrastructure.schema.validator; 2 | 3 | public interface SchemaValidator { 4 | void check(String schema) throws InvalidSchemaException; 5 | } 6 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/admin/AdminToolStartupException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.admin; 2 | 3 | public class AdminToolStartupException extends RuntimeException { 4 | 5 | public AdminToolStartupException(Throwable cause) { 6 | super(cause); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/offset/PendingOffsetsAppender.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.offset; 2 | 3 | public interface PendingOffsetsAppender { 4 | 5 | void markAsProcessed(SubscriptionPartitionOffset subscriptionPartitionOffset); 6 | } 7 | -------------------------------------------------------------------------------- /hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/readiness/ReadinessChecker.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.frontend.readiness; 2 | 3 | public interface ReadinessChecker { 4 | 5 | boolean isReady(); 6 | 7 | void start(); 8 | 9 | void stop() throws InterruptedException; 10 | } 11 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/search/SearchQuery.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.search; 2 | 3 | public record SearchQuery(String query) { 4 | public boolean isQueryNullOrBlank() { 5 | return query == null || query.isBlank(); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /hermes-schema/src/main/java/pl/allegro/tech/hermes/schema/resolver/SchemaRepositoryInstanceResolver.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.schema.resolver; 2 | 3 | import jakarta.ws.rs.client.WebTarget; 4 | 5 | public interface SchemaRepositoryInstanceResolver { 6 | 7 | WebTarget resolve(String subject); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-test-helper/src/main/java/pl/allegro/tech/hermes/test/helper/environment/Starter.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.test.helper.environment; 2 | 3 | public interface Starter { 4 | 5 | void start() throws Exception; 6 | 7 | void stop() throws Exception; 8 | 9 | T instance(); 10 | } 11 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip 4 | networkTimeout=10000 5 | validateDistributionUrl=true 6 | zipStoreBase=GRADLE_USER_HOME 7 | zipStorePath=wrapper/dists 8 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/kafka/KafkaHeaderNameParameters.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.kafka; 2 | 3 | public interface KafkaHeaderNameParameters { 4 | 5 | String getSchemaVersion(); 6 | 7 | String getSchemaId(); 8 | 9 | String getMessageId(); 10 | } 11 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/idletime/IdleTimeCalculator.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.idletime; 2 | 3 | public interface IdleTimeCalculator { 4 | long increaseIdleTime(); 5 | 6 | long getIdleTime(); 7 | 8 | void reset(); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/health/Checks.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.health; 2 | 3 | public final class Checks { 4 | public static final String SUBSCRIPTIONS = "subscriptions"; 5 | public static final String SUBSCRIPTIONS_COUNT = "subscriptionsCount"; 6 | } 7 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/groovy/pl/allegro/tech/hermes/consumers/supervisor/process/ConsumerProcessWaiter.groovy: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.supervisor.process 2 | 3 | class ConsumerProcessWaiter { 4 | 5 | void waitForSignalProcessing() { 6 | Thread.sleep(100) 7 | } 8 | 9 | } 10 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/nullable-primitives/int.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "NullablePrimitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": ["null", "int"] 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /.github/release.yml: -------------------------------------------------------------------------------- 1 | changelog: 2 | exclude: 3 | labels: 4 | - ignore-for-release 5 | categories: 6 | - title: Enhancements 7 | labels: 8 | - enhancement 9 | - title: Bugfixes 10 | labels: 11 | - bug 12 | - title: Other Changes 13 | labels: 14 | - "*" -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/message/wrapper/DeserializationException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.message.wrapper; 2 | 3 | public class DeserializationException extends RuntimeException { 4 | 5 | DeserializationException(String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/infrastructure/dc/DcNameProvisionException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.infrastructure.dc; 2 | 3 | public class DcNameProvisionException extends RuntimeException { 4 | 5 | public DcNameProvisionException(String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /hermes-console/src/utils/download-utils.ts: -------------------------------------------------------------------------------- 1 | export function download(content: any, fileName: string, contentType: string) { 2 | const a = document.createElement('a'); 3 | const file = new Blob([content], { type: contentType }); 4 | a.href = URL.createObjectURL(file); 5 | a.download = fileName; 6 | a.click(); 7 | } 8 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/nullable-primitives/bytes.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "NullablePrimitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": ["null", "bytes"] 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/nullable-primitives/double.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "NullablePrimitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": ["null", "double"] 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/nullable-primitives/float.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "NullablePrimitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": ["null", "float"] 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/nullable-primitives/long.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "NullablePrimitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": ["null", "long"] 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/clients/OfflineClientsService.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.clients; 2 | 3 | import pl.allegro.tech.hermes.api.TopicName; 4 | 5 | public interface OfflineClientsService { 6 | String getIframeSource(TopicName topic); 7 | } 8 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/search/cache/CachedItem.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.search.cache; 2 | 3 | public sealed interface CachedItem permits CachedSubscriptionItem, CachedTopicItem { 4 | 5 | String name(); 6 | 7 | CachedItemType type(); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/googlebigquery/GoogleBigQueryStreamWriterFactory.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.sender.googlebigquery; 2 | 3 | public interface GoogleBigQueryStreamWriterFactory { 4 | 5 | T getWriterForStream(String streamName); 6 | } 7 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/trace/MetadataAppender.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.trace; 2 | 3 | import pl.allegro.tech.hermes.consumers.consumer.Message; 4 | 5 | public interface MetadataAppender { 6 | 7 | T append(T target, Message message); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/default-primitives/int.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": "int", 9 | "default": 997 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/nullable-primitives/boolean.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "NullablePrimitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": ["null", "boolean"] 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/load/SubscriptionLoadRecorder.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.load; 2 | 3 | public interface SubscriptionLoadRecorder { 4 | 5 | void initialize(); 6 | 7 | void recordSingleOperation(); 8 | 9 | void shutdown(); 10 | } 11 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/http/auth/HttpAuthorizationProvider.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.sender.http.auth; 2 | 3 | import java.util.Optional; 4 | 5 | public interface HttpAuthorizationProvider { 6 | 7 | Optional authorizationToken(); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/default-primitives/double.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": "double", 9 | "default": 3.14 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/default-primitives/float.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": "float", 9 | "default": 3.14 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/defaults/primitive-with-default.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "int_field", 8 | "type": "int", 9 | "default": 1 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/search/cache/SearchCache.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.search.cache; 2 | 3 | import java.util.stream.Stream; 4 | 5 | public interface SearchCache { 6 | Stream getAllItems(); 7 | 8 | void initialize(); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-tracker-elasticsearch/src/main/java/pl/allegro/tech/hermes/tracker/elasticsearch/frontend/FrontendIndexFactory.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.tracker.elasticsearch.frontend; 2 | 3 | import pl.allegro.tech.hermes.tracker.elasticsearch.IndexFactory; 4 | 5 | public interface FrontendIndexFactory extends IndexFactory {} 6 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/admin/AdminOperationsCallback.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.admin; 2 | 3 | import pl.allegro.tech.hermes.api.SubscriptionName; 4 | 5 | public interface AdminOperationsCallback { 6 | void onRetransmissionStarts(SubscriptionName subscription) throws Exception; 7 | } 8 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/default-primitives/boolean.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": "boolean", 9 | "default": true 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/default-primitives/long.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": "long", 9 | "default": 1614322339997 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/defaults/string-with-default.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "str_field", 8 | "type": "string", 9 | "default": "test" 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/MetricsDashboardUrlService.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain; 2 | 3 | public interface MetricsDashboardUrlService { 4 | 5 | String getUrlForTopic(String topic); 6 | 7 | String getUrlForSubscription(String topic, String subscription); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/detection/InactiveTopicsNotifier.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.detection; 2 | 3 | import java.util.List; 4 | 5 | public interface InactiveTopicsNotifier { 6 | NotificationResult notify(List inactiveTopics); 7 | } 8 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/infrastructure/audit/AuditEventType.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.infrastructure.audit; 2 | 3 | public enum AuditEventType { 4 | BEFORE_CREATION, 5 | CREATED, 6 | BEFORE_UPDATE, 7 | UPDATED, 8 | BEFORE_REMOVAL, 9 | REMOVED 10 | } 11 | -------------------------------------------------------------------------------- /hermes-tracker-elasticsearch/src/main/java/pl/allegro/tech/hermes/tracker/elasticsearch/consumers/ConsumersIndexFactory.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.tracker.elasticsearch.consumers; 2 | 3 | import pl.allegro.tech.hermes.tracker.elasticsearch.IndexFactory; 4 | 5 | public interface ConsumersIndexFactory extends IndexFactory {} 6 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/SerialConsumerParameters.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer; 2 | 3 | import java.time.Duration; 4 | 5 | public interface SerialConsumerParameters { 6 | 7 | Duration getSignalProcessingInterval(); 8 | 9 | int getInflightSize(); 10 | } 11 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/consistency/SynchronizationException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.consistency; 2 | 3 | public class SynchronizationException extends RuntimeException { 4 | public SynchronizationException(String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/health/CouldNotResolveHostNameException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.health; 2 | 3 | class CouldNotResolveHostNameException extends RuntimeException { 4 | CouldNotResolveHostNameException(Throwable cause) { 5 | super(cause); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /hermes-console/src/dummy/readiness.ts: -------------------------------------------------------------------------------- 1 | import type { DatacenterReadiness } from '@/api/datacenter-readiness'; 2 | 3 | export const dummyDatacentersReadiness: DatacenterReadiness[] = [ 4 | { 5 | datacenter: 'DC1', 6 | status: 'READY', 7 | }, 8 | { 9 | datacenter: 'DC2', 10 | status: 'NOT_READY', 11 | }, 12 | ]; 13 | -------------------------------------------------------------------------------- /hermes-console/src/i18n.ts: -------------------------------------------------------------------------------- 1 | import { createI18n } from 'vue-i18n'; 2 | import messages from '@/i18n/messages'; 3 | 4 | export const i18n = createI18n({ 5 | legacy: false, 6 | locale: 'en-US', 7 | fallbackLocale: 'en-US', 8 | messages: messages, 9 | }); 10 | 11 | export function useGlobalI18n() { 12 | return i18n.global; 13 | } 14 | -------------------------------------------------------------------------------- /hermes-console/src/utils/number-formatter/number-formatter.ts: -------------------------------------------------------------------------------- 1 | export function formatNumber( 2 | number: number | string, 3 | fractionDigits: number = 0, 4 | ): string { 5 | return Number(number).toLocaleString('en-US', { 6 | minimumFractionDigits: fractionDigits, 7 | maximumFractionDigits: fractionDigits, 8 | }); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/receiver/kafka/MessageContentReaderFactory.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.receiver.kafka; 2 | 3 | import pl.allegro.tech.hermes.api.Topic; 4 | 5 | public interface MessageContentReaderFactory { 6 | MessageContentReader provide(Topic topic); 7 | } 8 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/MessageBatchSenderFactory.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.sender; 2 | 3 | import pl.allegro.tech.hermes.api.Subscription; 4 | 5 | public interface MessageBatchSenderFactory { 6 | MessageBatchSender create(Subscription subscription); 7 | } 8 | -------------------------------------------------------------------------------- /hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/buffer/chronicle/ChronicleMapClosedException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.frontend.buffer.chronicle; 2 | 3 | public class ChronicleMapClosedException extends RuntimeException { 4 | 5 | public ChronicleMapClosedException(String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/exception/RepositoryNotAvailableException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.exception; 2 | 3 | public class RepositoryNotAvailableException extends InternalProcessingException { 4 | 5 | public RepositoryNotAvailableException(String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/interpolation/InterpolationException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.interpolation; 2 | 3 | public class InterpolationException extends Exception { 4 | public InterpolationException(String format, Throwable t) { 5 | super(format, t); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/oauth/OAuthProviderCacheListener.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.oauth; 2 | 3 | import pl.allegro.tech.hermes.api.OAuthProvider; 4 | 5 | public interface OAuthProviderCacheListener { 6 | 7 | void oAuthProviderUpdate(OAuthProvider oAuthProvider); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/subscription/id/SubscriptionIdProvider.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.subscription.id; 2 | 3 | import pl.allegro.tech.hermes.api.SubscriptionName; 4 | 5 | public interface SubscriptionIdProvider { 6 | 7 | SubscriptionId getSubscriptionId(SubscriptionName name); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/default-primitives/bytes.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": "bytes", 9 | "default": "\u0074\u0065\u0073\u0074" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/defaults/union-with-default.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Union", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "int_field", 8 | "type": [ 9 | "int" 10 | ], 11 | "default": 1 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/publishing/message/MessageIdGenerator.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.frontend.publishing.message; 2 | 3 | import java.util.UUID; 4 | 5 | public class MessageIdGenerator { 6 | 7 | public static String generate() { 8 | return UUID.randomUUID().toString(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/concurrent/ExecutorServiceFactory.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.concurrent; 2 | 3 | import java.util.concurrent.ScheduledExecutorService; 4 | 5 | public interface ExecutorServiceFactory { 6 | 7 | ScheduledExecutorService createSingleThreadScheduledExecutor(String nameFormat); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-console/src/store/app-config/types.ts: -------------------------------------------------------------------------------- 1 | import type { AppConfiguration } from '@/api/app-configuration'; 2 | 3 | export interface AppConfigStoreState { 4 | appConfig?: AppConfiguration; 5 | loading: boolean; 6 | error: AppConfigStoreErrors; 7 | } 8 | 9 | export interface AppConfigStoreErrors { 10 | loadConfig: Error | null; 11 | } 12 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/http/HttpBatchSenderException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.sender.http; 2 | 3 | class HttpBatchSenderException extends RuntimeException { 4 | HttpBatchSenderException(String message, Throwable cause) { 5 | super(message, cause); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/supervisor/workload/weighted/SubscriptionProfileRegistry.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.supervisor.workload.weighted; 2 | 3 | public interface SubscriptionProfileRegistry { 4 | 5 | SubscriptionProfiles fetch(); 6 | 7 | void persist(SubscriptionProfiles profiles); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/publishing/metadata/HeadersPropagator.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.frontend.publishing.metadata; 2 | 3 | import io.undertow.util.HeaderMap; 4 | import java.util.Map; 5 | 6 | public interface HeadersPropagator { 7 | 8 | Map extract(HeaderMap headers); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-metrics/src/main/java/pl/allegro/tech/hermes/metrics/counters/HermesCounters.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.metrics.counters; 2 | 3 | public class HermesCounters { 4 | public static DefaultHermesCounter from(io.micrometer.core.instrument.Counter micrometerCounter) { 5 | return new DefaultHermesCounter(micrometerCounter); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /hermes-test-helper/src/main/resources/schema/user_no_metadata.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro", 3 | "type": "record", 4 | "name": "User", 5 | "fields": [ 6 | {"name": "name", "type": "string"}, 7 | {"name": "age", "type": "int"}, 8 | {"name": "favoriteColor", "type": ["null", "string"]} 9 | ] 10 | } 11 | -------------------------------------------------------------------------------- /hermes-client/src/main/java/pl/allegro/tech/hermes/client/HermesSender.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.client; 2 | 3 | import java.net.URI; 4 | import java.util.concurrent.CompletableFuture; 5 | 6 | @FunctionalInterface 7 | public interface HermesSender { 8 | 9 | CompletableFuture send(URI uri, HermesMessage message); 10 | } 11 | -------------------------------------------------------------------------------- /hermes-client/src/main/java/pl/allegro/tech/hermes/client/ReactiveHermesSender.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.client; 2 | 3 | import java.net.URI; 4 | import reactor.core.publisher.Mono; 5 | 6 | @FunctionalInterface 7 | public interface ReactiveHermesSender { 8 | 9 | Mono sendReactively(URI uri, HermesMessage message); 10 | } 11 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/admin/AdminTool.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.admin; 2 | 3 | import pl.allegro.tech.hermes.api.SubscriptionName; 4 | 5 | public interface AdminTool { 6 | 7 | void retransmit(SubscriptionName subscriptionName); 8 | 9 | enum Operations { 10 | RETRANSMIT 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/array-primitives/int.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": { 9 | "type": "array", 10 | "items": "int" 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/map-primitives/int.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "MapPrimitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": { 9 | "type": "map", 10 | "values": "int" 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /hermes-tracker-elasticsearch/src/main/java/pl/allegro/tech/hermes/tracker/elasticsearch/ElasticsearchRepositoryException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.tracker.elasticsearch; 2 | 3 | public class ElasticsearchRepositoryException extends RuntimeException { 4 | public ElasticsearchRepositoryException(Throwable cause) { 5 | super(cause); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/supervisor/SupervisorParameters.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.supervisor; 2 | 3 | import java.time.Duration; 4 | 5 | public interface SupervisorParameters { 6 | 7 | Duration getInterval(); 8 | 9 | Duration getUnhealthyAfter(); 10 | 11 | Duration getKillAfter(); 12 | } 13 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/array-primitives/boolean.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": { 9 | "type": "array", 10 | "items": "boolean" 11 | } 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/array-primitives/bytes.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": { 9 | "type": "array", 10 | "items": "bytes" 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/array-primitives/float.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": { 9 | "type": "array", 10 | "items": "float" 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/array-primitives/long.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": { 9 | "type": "array", 10 | "items": "long" 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/map-primitives/boolean.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "MapPrimitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": { 9 | "type": "map", 10 | "values": "boolean" 11 | } 12 | } 13 | ] 14 | } -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/map-primitives/bytes.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "MapPrimitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": { 9 | "type": "map", 10 | "values": "bytes" 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/map-primitives/float.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "MapPrimitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": { 9 | "type": "map", 10 | "values": "float" 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/map-primitives/long.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "MapPrimitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": { 9 | "type": "map", 10 | "values": "long" 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/auth/RequestUser.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.auth; 2 | 3 | import pl.allegro.tech.hermes.api.OwnerId; 4 | 5 | public interface RequestUser { 6 | 7 | String getUsername(); 8 | 9 | boolean isAdmin(); 10 | 11 | boolean isOwner(OwnerId ownerId); 12 | } 13 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/detection/InactiveTopicsRepository.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.detection; 2 | 3 | import java.util.List; 4 | 5 | public interface InactiveTopicsRepository { 6 | void upsert(List inactiveTopics); 7 | 8 | List read(); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/subscription/validator/EndpointAddressValidator.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.subscription.validator; 2 | 3 | import pl.allegro.tech.hermes.api.EndpointAddress; 4 | 5 | public interface EndpointAddressValidator { 6 | 7 | void check(EndpointAddress address); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-console/src/i18n/en-US/searchCommander.ts: -------------------------------------------------------------------------------- 1 | const searchCommander = { 2 | sections: { 3 | topics: 'Topics', 4 | subscriptions: 'Subscriptions', 5 | others: 'Others', 6 | }, 7 | owner: 'Owner: ', 8 | topic: 'Topic: ', 9 | searchInputPlaceholder: 'Search for topics or subscriptions', 10 | }; 11 | 12 | export default searchCommander; 13 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/http/headers/BatchHttpHeadersProvider.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.sender.http.headers; 2 | 3 | import pl.allegro.tech.hermes.api.EndpointAddress; 4 | 5 | public interface BatchHttpHeadersProvider { 6 | HttpRequestHeaders getHeaders(EndpointAddress address); 7 | } 8 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/array-primitives/double.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": { 9 | "type": "array", 10 | "items": "double" 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/array-primitives/string.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": { 9 | "type": "array", 10 | "items": "string" 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/map-primitives/double.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "MapPrimitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": { 9 | "type": "map", 10 | "values": "double" 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/map-primitives/string.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "MapPrimitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": { 9 | "type": "map", 10 | "values": "string" 11 | } 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/validator/TopicMessageValidator.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.frontend.validator; 2 | 3 | import pl.allegro.tech.hermes.api.Topic; 4 | import pl.allegro.tech.hermes.frontend.publishing.message.Message; 5 | 6 | public interface TopicMessageValidator { 7 | void check(Message message, Topic topic); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/consistency/ConsistencyCheckingException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.consistency; 2 | 3 | public class ConsistencyCheckingException extends RuntimeException { 4 | 5 | ConsistencyCheckingException(String message, Throwable th) { 6 | super(message, th); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /hermes-schema/src/main/java/pl/allegro/tech/hermes/schema/SchemaCompilersFactory.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.schema; 2 | 3 | import org.apache.avro.Schema; 4 | 5 | public interface SchemaCompilersFactory { 6 | 7 | static SchemaCompiler avroSchemaCompiler() { 8 | return source -> new Schema.Parser().parse(source.value()); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/message/undelivered/UndeliveredMessageLog.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.message.undelivered; 2 | 3 | import pl.allegro.tech.hermes.api.SentMessageTrace; 4 | 5 | public interface UndeliveredMessageLog { 6 | 7 | void add(SentMessageTrace undeliveredMessage); 8 | 9 | void persist(); 10 | } 11 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/java/pl/allegro/tech/hermes/consumers/queue/FullDrainMpscQueueTest.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.queue; 2 | 3 | public class FullDrainMpscQueueTest extends MpscQueuesAbstractTest { 4 | 5 | @Override 6 | protected MpscQueue createMpscQueue(int size) { 7 | return new FullDrainMpscQueue<>(size); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/resources/schemas/default-primitives/string.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools", 3 | "name": "Primitives", 4 | "type": "record", 5 | "fields": [ 6 | { 7 | "name": "field", 8 | "type": "string", 9 | "default": "Z sejmu dla Faktów Katarzyna Bolesna-Mordęga" 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/publishing/handlers/end/TrackingHeadersExtractor.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.frontend.publishing.handlers.end; 2 | 3 | import io.undertow.util.HeaderMap; 4 | import java.util.Map; 5 | 6 | public interface TrackingHeadersExtractor { 7 | Map extractHeadersToLog(HeaderMap headers); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/ssl/KeystoreConfigurationException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.ssl; 2 | 3 | public class KeystoreConfigurationException extends RuntimeException { 4 | public KeystoreConfigurationException(String keystoreSource) { 5 | super(String.format("Unknown key store source: %s", keystoreSource)); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /hermes-console/tsconfig.vitest.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.app.json", 3 | "exclude": [], 4 | "compilerOptions": { 5 | "composite": true, 6 | "lib": [], 7 | "types": [ 8 | "node", 9 | "jsdom", 10 | "jest", 11 | "vitest/globals", 12 | "@testing-library/jest-dom" 13 | ] 14 | }, 15 | "skipLibCheck": true 16 | } 17 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/load/SubscriptionLoadRecordersRegistry.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.load; 2 | 3 | import pl.allegro.tech.hermes.api.SubscriptionName; 4 | 5 | public interface SubscriptionLoadRecordersRegistry { 6 | 7 | SubscriptionLoadRecorder register(SubscriptionName subscriptionName); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/clients/AllTopicClientsService.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.clients; 2 | 3 | import java.util.List; 4 | import pl.allegro.tech.hermes.api.TopicName; 5 | 6 | public interface AllTopicClientsService { 7 | 8 | List getAllClientsByTopic(TopicName topicName); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-test-helper/src/main/java/pl/allegro/tech/hermes/test/helper/environment/HermesTestApp.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.test.helper.environment; 2 | 3 | public interface HermesTestApp { 4 | 5 | HermesTestApp start(); 6 | 7 | void stop(); 8 | 9 | boolean shouldBeRestarted(); 10 | 11 | void restoreDefaultSettings(); 12 | 13 | int getPort(); 14 | } 15 | -------------------------------------------------------------------------------- /hermes-tracker/src/main/java/pl/allegro/tech/hermes/tracker/consumers/deadletters/DeadRepository.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.tracker.consumers.deadletters; 2 | 3 | import pl.allegro.tech.hermes.api.Subscription; 4 | 5 | public interface DeadRepository { 6 | void logDeadLetter(DeadMessage message); 7 | 8 | boolean supports(Subscription subscription); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/infrastructure/MalformedDataException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.infrastructure; 2 | 3 | public class MalformedDataException extends RuntimeException { 4 | 5 | public MalformedDataException(String path, Throwable throwable) { 6 | super(String.format("Unable to read data from path %s", path), throwable); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/java/pl/allegro/tech/hermes/consumers/queue/WaitFreeDrainMpscQueueTest.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.queue; 2 | 3 | public class WaitFreeDrainMpscQueueTest extends MpscQueuesAbstractTest { 4 | 5 | @Override 6 | protected MpscQueue createMpscQueue(int size) { 7 | return new WaitFreeDrainMpscQueue<>(size); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/buffer/chronicle/ChronicleMapCreationException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.frontend.buffer.chronicle; 2 | 3 | public class ChronicleMapCreationException extends RuntimeException { 4 | 5 | public ChronicleMapCreationException(Exception e) { 6 | super("Exception while creating ChronicleMap", e); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /hermes-mock/src/test/resources/msg.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "namespace": "hermes", 3 | "type": "record", 4 | "name": "Message", 5 | "fields": [ 6 | { 7 | "name": "id", 8 | "type": "string" 9 | }, 10 | { 11 | "name": "type", 12 | "type": "string" 13 | }, 14 | { 15 | "name": "value", 16 | "type": "double" 17 | } 18 | ] 19 | } -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/ssl/TruststoreConfigurationException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.ssl; 2 | 3 | public class TruststoreConfigurationException extends RuntimeException { 4 | public TruststoreConfigurationException(String truststoreSource) { 5 | super(String.format("Unknown trust store source: %s", truststoreSource)); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/result/SubscriptionChangeAwareSuccessHandler.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.result; 2 | 3 | import pl.allegro.tech.hermes.api.Subscription; 4 | 5 | public interface SubscriptionChangeAwareSuccessHandler extends SuccessHandler { 6 | void updateSubscription(Subscription subscription); 7 | } 8 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/googlebigquery/GoogleBigQueryMessageTransformer.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.sender.googlebigquery; 2 | 3 | import pl.allegro.tech.hermes.consumers.consumer.Message; 4 | 5 | public interface GoogleBigQueryMessageTransformer { 6 | 7 | T fromHermesMessage(Message message); 8 | } 9 | -------------------------------------------------------------------------------- /hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/listeners/BrokerTimeoutListener.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.frontend.listeners; 2 | 3 | import pl.allegro.tech.hermes.api.Topic; 4 | import pl.allegro.tech.hermes.frontend.publishing.message.Message; 5 | 6 | public interface BrokerTimeoutListener { 7 | 8 | void onTimeout(Message message, Topic topic); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/topic/TopicMetricsRepository.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.topic; 2 | 3 | import pl.allegro.tech.hermes.api.TopicMetrics; 4 | import pl.allegro.tech.hermes.api.TopicName; 5 | 6 | public interface TopicMetricsRepository { 7 | 8 | TopicMetrics loadMetrics(TopicName topicName); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-api/src/main/java/pl/allegro/tech/hermes/api/SearchResults.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.api; 2 | 3 | import static java.util.Collections.emptyList; 4 | 5 | import java.util.List; 6 | 7 | public record SearchResults(List results, long totalCount) { 8 | public static SearchResults empty() { 9 | return new SearchResults(emptyList(), 0); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/batch/MessageBatchFactory.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.batch; 2 | 3 | import pl.allegro.tech.hermes.api.Subscription; 4 | 5 | public interface MessageBatchFactory { 6 | 7 | MessageBatch createBatch(Subscription subscription); 8 | 9 | void destroyBatch(MessageBatch batch); 10 | } 11 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/converter/MessageConverter.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.converter; 2 | 3 | import pl.allegro.tech.hermes.api.Topic; 4 | import pl.allegro.tech.hermes.consumers.consumer.Message; 5 | 6 | public interface MessageConverter { 7 | 8 | Message convert(Message message, Topic topic); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/publishing/message/AvroEnforcer.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.frontend.publishing.message; 2 | 3 | import org.apache.avro.Schema; 4 | import pl.allegro.tech.hermes.api.Topic; 5 | 6 | public interface AvroEnforcer { 7 | 8 | byte[] enforceAvro(String payloadContentType, byte[] data, Schema schema, Topic topic); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-mock/src/main/java/pl/allegro/tech/hermes/mock/HermesMockException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.mock; 2 | 3 | public class HermesMockException extends RuntimeException { 4 | public HermesMockException(String message) { 5 | super(message); 6 | } 7 | 8 | public HermesMockException(String message, Throwable cause) { 9 | super(message, cause); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /hermes-console/src/store/consistency/types.ts: -------------------------------------------------------------------------------- 1 | import type { InconsistentGroup } from '@/api/inconsistent-group'; 2 | 3 | export interface ConsistencyStoreState { 4 | groups: InconsistentGroup[]; 5 | progressPercent: number; 6 | fetchInProgress: boolean; 7 | error: ConsistencyFetchError; 8 | } 9 | 10 | export interface ConsistencyFetchError { 11 | fetchError: Error | null; 12 | } 13 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/queue/MpscQueue.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.queue; 2 | 3 | import org.jctools.queues.MessagePassingQueue; 4 | 5 | public interface MpscQueue { 6 | 7 | boolean offer(T element); 8 | 9 | void drain(MessagePassingQueue.Consumer consumer); 10 | 11 | int size(); 12 | 13 | int capacity(); 14 | } 15 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/supervisor/workload/weighted/TargetWeightCalculator.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.supervisor.workload.weighted; 2 | 3 | import java.util.Collection; 4 | import java.util.Map; 5 | 6 | public interface TargetWeightCalculator { 7 | 8 | Map calculate(Collection consumers); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-consumers/src/test/java/pl/allegro/tech/hermes/consumers/test/TestTrackers.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.test; 2 | 3 | import com.google.common.collect.ImmutableList; 4 | import pl.allegro.tech.hermes.tracker.consumers.Trackers; 5 | 6 | public class TestTrackers extends Trackers { 7 | 8 | public TestTrackers() { 9 | super(ImmutableList.of()); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/listeners/BrokerErrorListener.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.frontend.listeners; 2 | 3 | import pl.allegro.tech.hermes.api.Topic; 4 | import pl.allegro.tech.hermes.frontend.publishing.message.Message; 5 | 6 | public interface BrokerErrorListener { 7 | 8 | void onError(Message message, Topic topic, Exception ex); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-management/src/main/resources/avro-schema-metadata-field.avsc: -------------------------------------------------------------------------------- 1 | { 2 | "type" : "record", 3 | "name" : "minimalisticHermesSchema", 4 | "fields" : [ 5 | { 6 | "name": "__metadata", "default": null, 7 | "type": ["null", {"type": "map", "values": "string"}], 8 | "doc": "Field used in Hermes internals to propagate metadata like hermes-id" 9 | } 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/broker/BrokerStorage.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.broker; 2 | 3 | import java.util.List; 4 | import org.apache.kafka.common.TopicPartition; 5 | 6 | public interface BrokerStorage { 7 | 8 | int readLeaderForPartition(TopicPartition topicAndPartition); 9 | 10 | List readPartitionsIds(String topicName); 11 | } 12 | -------------------------------------------------------------------------------- /hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/listeners/BrokerAcknowledgeListener.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.frontend.listeners; 2 | 3 | import pl.allegro.tech.hermes.api.Topic; 4 | import pl.allegro.tech.hermes.frontend.publishing.message.Message; 5 | 6 | public interface BrokerAcknowledgeListener { 7 | 8 | void onAcknowledge(Message message, Topic topic); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/producer/BrokerTopicAvailabilityChecker.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.frontend.producer; 2 | 3 | import pl.allegro.tech.hermes.frontend.metric.CachedTopic; 4 | 5 | public interface BrokerTopicAvailabilityChecker { 6 | 7 | boolean areAllTopicsAvailable(); 8 | 9 | boolean isTopicAvailable(CachedTopic cachedTopic); 10 | } 11 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/api/auth/Roles.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.api.auth; 2 | 3 | public final class Roles { 4 | public static final String ANY = "any"; 5 | public static final String ADMIN = "admin"; 6 | public static final String TOPIC_OWNER = "topicOwner"; 7 | public static final String SUBSCRIPTION_OWNER = "subscriptionOwner"; 8 | } 9 | -------------------------------------------------------------------------------- /integration-tests/src/common/resources/hornetq-users.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/domain/notifications/TopicCallback.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.domain.notifications; 2 | 3 | import pl.allegro.tech.hermes.api.Topic; 4 | 5 | public interface TopicCallback { 6 | 7 | default void onTopicCreated(Topic topic) {} 8 | 9 | default void onTopicRemoved(Topic topic) {} 10 | 11 | default void onTopicChanged(Topic topic) {} 12 | } 13 | -------------------------------------------------------------------------------- /hermes-console/src/api/subscription-metrics.ts: -------------------------------------------------------------------------------- 1 | export interface SubscriptionMetrics { 2 | delivered: number; 3 | discarded: number; 4 | volume: number; 5 | timeouts: string; 6 | otherErrors: string; 7 | codes2xx: string; 8 | codes4xx: string; 9 | codes5xx: string; 10 | retries: string; 11 | lag: string; 12 | rate: string; 13 | throughput: string; 14 | batchRate: string; 15 | } 16 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/subscription/SubscriptionLagSource.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.domain.subscription; 2 | 3 | import pl.allegro.tech.hermes.api.MetricLongValue; 4 | import pl.allegro.tech.hermes.api.TopicName; 5 | 6 | public interface SubscriptionLagSource { 7 | MetricLongValue getLag(TopicName topicName, String subscriptionName); 8 | } 9 | -------------------------------------------------------------------------------- /docker/latest/frontend/frontend.yaml: -------------------------------------------------------------------------------- 1 | frontend: 2 | zookeeper: 3 | clusters: 4 | - datacenter: "dc" 5 | root: "/run/hermes" 6 | connectionString: "zk:2181" 7 | kafka: 8 | clusters: 9 | - datacenter: "dc" 10 | brokerList: "kafka:29092" 11 | schema: 12 | cache: 13 | refreshAfterWrite: 1m 14 | repository: 15 | serverUrl: "http://schema-registry:8081" -------------------------------------------------------------------------------- /hermes-api/src/main/java/pl/allegro/tech/hermes/api/TopicSearchItem.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.api; 2 | 3 | public record TopicSearchItem(String name, Topic topic) implements SearchItem { 4 | @Override 5 | public SearchItemType type() { 6 | return SearchItemType.TOPIC; 7 | } 8 | 9 | public record Topic(String groupName, Owner owner) {} 10 | 11 | public record Owner(String id) {} 12 | } 13 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/di/factories/MicrometerRegistryParameters.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.di.factories; 2 | 3 | import java.time.Duration; 4 | import java.util.List; 5 | 6 | public interface MicrometerRegistryParameters { 7 | List getPercentiles(); 8 | 9 | boolean zookeeperReporterEnabled(); 10 | 11 | Duration zookeeperReportPeriod(); 12 | } 13 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/message/wrapper/AvroMetadataMarker.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.message.wrapper; 2 | 3 | import org.apache.avro.util.Utf8; 4 | 5 | public interface AvroMetadataMarker { 6 | String METADATA_MARKER = "__metadata"; 7 | Utf8 METADATA_TIMESTAMP_KEY = new Utf8("timestamp"); 8 | Utf8 METADATA_MESSAGE_ID_KEY = new Utf8("messageId"); 9 | } 10 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/ssl/KeystoreSource.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.ssl; 2 | 3 | public enum KeystoreSource { 4 | JRE("jre"), 5 | PROVIDED("provided"); 6 | 7 | KeystoreSource(String value) { 8 | this.value = value; 9 | } 10 | 11 | private final String value; 12 | 13 | public final String getValue() { 14 | return value; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /hermes-console/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Hermes Console 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/oauth/client/OAuthClient.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.oauth.client; 2 | 3 | import pl.allegro.tech.hermes.consumers.consumer.oauth.OAuthAccessToken; 4 | 5 | public interface OAuthClient { 6 | 7 | OAuthAccessToken getToken(OAuthTokenRequest request); 8 | 9 | void start(); 10 | 11 | void stop(); 12 | } 13 | -------------------------------------------------------------------------------- /hermes-management/src/main/java/pl/allegro/tech/hermes/management/config/CorsConfiguration.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.management.config; 2 | 3 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 4 | import org.springframework.context.annotation.Configuration; 5 | 6 | @Configuration 7 | @EnableConfigurationProperties(CorsProperties.class) 8 | public class CorsConfiguration {} 9 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/kafka/KafkaNamesMapper.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.kafka; 2 | 3 | import pl.allegro.tech.hermes.api.SubscriptionName; 4 | import pl.allegro.tech.hermes.api.Topic; 5 | 6 | public interface KafkaNamesMapper { 7 | 8 | ConsumerGroupId toConsumerGroupId(SubscriptionName subscription); 9 | 10 | KafkaTopics toKafkaTopics(Topic topic); 11 | } 12 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/domain/filtering/MessageFilterSource.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.domain.filtering; 2 | 3 | import java.util.List; 4 | import pl.allegro.tech.hermes.api.MessageFilterSpecification; 5 | 6 | public interface MessageFilterSource { 7 | MessageFilter compile(MessageFilterSpecification specification); 8 | 9 | List getGlobalFilters(); 10 | } 11 | -------------------------------------------------------------------------------- /hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/googlepubsub/GooglePubSubMessageCompressionException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.consumers.consumer.sender.googlepubsub; 2 | 3 | public class GooglePubSubMessageCompressionException extends RuntimeException { 4 | 5 | public GooglePubSubMessageCompressionException(String message, Throwable e) { 6 | super(message, e); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /hermes-client/src/main/java/pl/allegro/tech/hermes/client/metrics/MetricsUtils.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.client.metrics; 2 | 3 | class MetricsUtils { 4 | 5 | static String sanitizeTopic(String topic) { 6 | int lastDot = topic.lastIndexOf("."); 7 | char[] sanitized = topic.replaceAll("\\.", "_").toCharArray(); 8 | sanitized[lastDot] = '.'; 9 | return String.valueOf(sanitized); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/exception/BrokerInfoNotAvailableException.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.exception; 2 | 3 | public class BrokerInfoNotAvailableException extends InternalProcessingException { 4 | 5 | public BrokerInfoNotAvailableException(Integer brokerId, Throwable cause) { 6 | super("Could not find or read info about broker with id " + brokerId, cause); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /hermes-common/src/main/java/pl/allegro/tech/hermes/common/schema/SchemaVersionRepositoryParameters.java: -------------------------------------------------------------------------------- 1 | package pl.allegro.tech.hermes.common.schema; 2 | 3 | import java.time.Duration; 4 | 5 | public interface SchemaVersionRepositoryParameters { 6 | 7 | boolean isCacheEnabled(); 8 | 9 | Duration getRefreshAfterWrite(); 10 | 11 | Duration getExpireAfterWrite(); 12 | 13 | int getReloadThreadPoolSize(); 14 | } 15 | -------------------------------------------------------------------------------- /hermes-console/src/utils/topic-utils/topic-utils.spec.ts: -------------------------------------------------------------------------------- 1 | import { describe, expect } from 'vitest'; 2 | import { groupName } from '@/utils/topic-utils/topic-utils'; 3 | 4 | describe('topics-utils', () => { 5 | it('should retrieve group name from topic name', () => { 6 | const actual = groupName('pl.allegro.public.group.DummyEvent'); 7 | 8 | expect(actual).toEqual('pl.allegro.public.group'); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /hermes-console/src/views/topic/offline-clients/OfflineClients.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 |