├── 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 |
5 |
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 |
8 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/converter/MessageConverterResolver.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.converter;
2 |
3 | import pl.allegro.tech.hermes.api.Subscription;
4 | import pl.allegro.tech.hermes.consumers.consumer.Message;
5 |
6 | public interface MessageConverterResolver {
7 | MessageConverter converterFor(Message message, Subscription subscription);
8 | }
9 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/MessageSender.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.sender;
2 |
3 | import java.util.concurrent.CompletableFuture;
4 | import pl.allegro.tech.hermes.consumers.consumer.Message;
5 |
6 | public interface MessageSender {
7 |
8 | CompletableFuture send(Message message);
9 |
10 | void stop();
11 | }
12 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/topic/SingleMessageReader.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.topic;
2 |
3 | import pl.allegro.tech.hermes.api.Topic;
4 | import pl.allegro.tech.hermes.common.kafka.KafkaTopic;
5 |
6 | public interface SingleMessageReader {
7 |
8 | String readMessageAsJson(Topic topic, KafkaTopic kafkaTopic, int partition, long offset);
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-test-helper/src/main/resources/testcontainers/kafka_start.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | export KAFKA_ZOOKEEPER_CONNECT=''
4 | export KAFKA_ADVERTISED_LISTENERS='PLAINTEXT://localhost:,BROKER://:9092,INTERNAL_CLIENT://:'
5 |
6 | . /etc/confluent/docker/bash-config
7 | /etc/confluent/docker/configure
8 | /etc/confluent/docker/launch
9 |
--------------------------------------------------------------------------------
/integration-tests/src/common/java/pl/allegro/tech/hermes/utils/Headers.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.utils;
2 |
3 | import java.util.Map;
4 | import org.springframework.http.HttpHeaders;
5 |
6 | public class Headers {
7 | public static HttpHeaders createHeaders(Map map) {
8 | HttpHeaders headers = new HttpHeaders();
9 | map.forEach(headers::add);
10 | return headers;
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-client/src/main/java/pl/allegro/tech/hermes/client/HermesClientShutdownException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.client;
2 |
3 | public class HermesClientShutdownException extends RuntimeException {
4 |
5 | public HermesClientShutdownException() {
6 | this("Hermes client is already shutdown");
7 | }
8 |
9 | public HermesClientShutdownException(String message) {
10 | super(message);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/common/message/wrapper/WrappingException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.common.message.wrapper;
2 |
3 | import pl.allegro.tech.hermes.common.exception.InternalProcessingException;
4 |
5 | public class WrappingException extends InternalProcessingException {
6 | public WrappingException(String message, Exception cause) {
7 | super(message, cause);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-console/src/api/offline-retransmission.ts:
--------------------------------------------------------------------------------
1 | export interface OfflineRetransmissionCreateTask {
2 | type: string;
3 | sourceTopic: string;
4 | targetTopic: string;
5 | startTimestamp: string;
6 | endTimestamp: string;
7 | }
8 |
9 | export interface OfflineRetransmissionActiveTask {
10 | type: string;
11 | taskId: string;
12 | logsUrl: string;
13 | metricsUrl: string;
14 | jobDetailsUrl: string;
15 | }
16 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/config/GoogleBigQueryAvroThreadPoolProperties.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.config;
2 |
3 | import org.springframework.boot.context.properties.ConfigurationProperties;
4 |
5 | @ConfigurationProperties(prefix = "consumer.google.bigquery.avro.thread-pool")
6 | public class GoogleBigQueryAvroThreadPoolProperties extends GoogleBigQueryThreadPoolProperties {}
7 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/config/GoogleBigQueryJsonThreadPoolProperties.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.config;
2 |
3 | import org.springframework.boot.context.properties.ConfigurationProperties;
4 |
5 | @ConfigurationProperties(prefix = "consumer.google.bigquery.json.thread-pool")
6 | public class GoogleBigQueryJsonThreadPoolProperties extends GoogleBigQueryThreadPoolProperties {}
7 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/supervisor/workload/BalancingListener.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.supervisor.workload;
2 |
3 | import java.util.List;
4 |
5 | public interface BalancingListener {
6 |
7 | void onBeforeBalancing(List activeConsumers);
8 |
9 | void onAfterBalancing(WorkDistributionChanges changes);
10 |
11 | void onBalancingSkipped();
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/dc/RepositoryManager.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.dc;
2 |
3 | import java.util.List;
4 |
5 | public interface RepositoryManager {
6 |
7 | DatacenterBoundRepositoryHolder getLocalRepository(Class repositoryType);
8 |
9 | List> getRepositories(Class repositoryType);
10 | }
11 |
--------------------------------------------------------------------------------
/docs/docs/overview/features-maturity.md:
--------------------------------------------------------------------------------
1 | # Features maturity
2 |
3 | Feature is stable and ready for production use after we have used it on our production cluster internally and can
4 | assure that there are no major bugs. Some features are already merged and are released but are yet undocumented or
5 | documentation states they are in **incubating** phase. All incubating features have own feature switches which are
6 | off by default.
7 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/common/kafka/KafkaParameters.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.common.kafka;
2 |
3 | public interface KafkaParameters {
4 |
5 | String getDatacenter();
6 |
7 | boolean isAuthenticationEnabled();
8 |
9 | String getAuthenticationMechanism();
10 |
11 | String getAuthenticationProtocol();
12 |
13 | String getBrokerList();
14 |
15 | String getJaasConfig();
16 | }
17 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/common/message/wrapper/UnwrappingException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.common.message.wrapper;
2 |
3 | import pl.allegro.tech.hermes.common.exception.InternalProcessingException;
4 |
5 | public class UnwrappingException extends InternalProcessingException {
6 | public UnwrappingException(String message, Exception cause) {
7 | super(message, cause);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/domain/topic/preview/MessagePreviewRepository.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.domain.topic.preview;
2 |
3 | import java.util.List;
4 | import pl.allegro.tech.hermes.api.TopicName;
5 |
6 | public interface MessagePreviewRepository {
7 |
8 | List loadPreview(TopicName topicName);
9 |
10 | void persist(TopicsMessagesPreview topicsMessagesPreview);
11 | }
12 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/googlepubsub/GooglePubSubMessageTransformer.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.sender.googlepubsub;
2 |
3 | import com.google.pubsub.v1.PubsubMessage;
4 | import pl.allegro.tech.hermes.consumers.consumer.Message;
5 |
6 | interface GooglePubSubMessageTransformer {
7 |
8 | PubsubMessage fromHermesMessage(Message message);
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/http/HttpHeadersProvidersFactory.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.sender.http;
2 |
3 | import java.util.Collection;
4 | import pl.allegro.tech.hermes.consumers.consumer.sender.http.headers.HttpHeadersProvider;
5 |
6 | public interface HttpHeadersProvidersFactory {
7 |
8 | Collection createAll();
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/subscription/validator/EndpointOwnershipValidator.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.subscription.validator;
2 |
3 | import pl.allegro.tech.hermes.api.EndpointAddress;
4 | import pl.allegro.tech.hermes.api.OwnerId;
5 |
6 | public interface EndpointOwnershipValidator {
7 |
8 | void check(OwnerId owner, EndpointAddress endpoint);
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-management/src/test/resources/application.yaml:
--------------------------------------------------------------------------------
1 | application:
2 | name: hermes-management
3 |
4 | zookeeper:
5 | enabled: false
6 |
7 | storage:
8 | pathPrefix: /hermes
9 | connectionString: localhost:42182
10 |
11 | # this is a hack to make /status/* endpoints work with Jersey
12 | spring:
13 | mvc:
14 | servlet:
15 | path: /status
16 |
17 | topic:
18 | defaultSchemaIdAwareSerializationEnabled: true
19 |
--------------------------------------------------------------------------------
/hermes-console/src/dummy/stats.ts:
--------------------------------------------------------------------------------
1 | import type { Stats } from '@/api/stats';
2 |
3 | export const statsResponse: Stats = {
4 | topicStats: {
5 | topicCount: 100,
6 | trackingEnabledTopicCount: 50,
7 | avroTopicCount: 20,
8 | ackAllTopicCount: 10,
9 | },
10 | subscriptionStats: {
11 | subscriptionCount: 1000,
12 | avroSubscriptionCount: 500,
13 | trackingEnabledSubscriptionCount: 100,
14 | },
15 | };
16 |
--------------------------------------------------------------------------------
/hermes-consumers/src/test/resources/schemas/defaults/array-with-default.avsc:
--------------------------------------------------------------------------------
1 | {
2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools",
3 | "name": "Primitives",
4 | "type": "record",
5 | "fields": [
6 | {
7 | "name": "array_ints_field",
8 | "type": {
9 | "type": "array",
10 | "items": {
11 | "type": "int"
12 | }
13 | },
14 | "default": [9, 9, 7]
15 | }
16 | ]
17 | }
--------------------------------------------------------------------------------
/hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/buffer/BackupMessagesLoaderParameters.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.frontend.buffer;
2 |
3 | import java.time.Duration;
4 |
5 | public interface BackupMessagesLoaderParameters {
6 |
7 | Duration getMaxAge();
8 |
9 | int getMaxResendRetries();
10 |
11 | Duration getLoadingPauseBetweenResend();
12 |
13 | Duration getLoadingWaitForBrokerTopicInfo();
14 | }
15 |
--------------------------------------------------------------------------------
/hermes-frontend/src/main/resources/application-local.yaml:
--------------------------------------------------------------------------------
1 | frontend:
2 | zookeeper:
3 | clusters:
4 | - datacenter: "dc"
5 | root: "/run/hermes"
6 | connectionString: "localhost:2181"
7 | kafka:
8 | clusters:
9 | - datacenter: "dc"
10 | brokerList: "localhost:9092"
11 | schema:
12 | cache:
13 | refreshAfterWrite: 1m
14 | repository:
15 | serverUrl: "http://localhost:8081"
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/infrastructure/query/parser/QueryParser.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.infrastructure.query.parser;
2 |
3 | import java.io.InputStream;
4 | import pl.allegro.tech.hermes.api.Query;
5 |
6 | public interface QueryParser {
7 |
8 | Query parse(InputStream input, Class type);
9 |
10 | Query parse(String query, Class type);
11 | }
12 |
--------------------------------------------------------------------------------
/hermes-console/src/components/loading-spinner/LoadingSpinner.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/hermes-console/src/dummy/jwt-tokens.ts:
--------------------------------------------------------------------------------
1 | export const dummyValidToken: string =
2 | 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiZXhwIjoxOTk2MjM5MDIyfQ.3CP-EemSMKu8O2cZNJCAT4PUCiolDcHIx3Du7EpR8EY';
3 | export const dummyExpiredToken: string =
4 | 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiZXhwIjoxOTYyMzkwMjJ9.dqPw8DoRNgDoV68oprIwJG6546VccGfnoPgyMOGT8yQ';
5 |
--------------------------------------------------------------------------------
/hermes-consumers/src/test/resources/schemas/defaults/array-with-default-items.avsc:
--------------------------------------------------------------------------------
1 | {
2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools",
3 | "name": "Primitives",
4 | "type": "record",
5 | "fields": [
6 | {
7 | "name": "array_ints_field",
8 | "type": {
9 | "type": "array",
10 | "items": {
11 | "type": "int",
12 | "default": 1
13 | }
14 | }
15 | }
16 | ]
17 | }
--------------------------------------------------------------------------------
/hermes-consumers/src/test/resources/schemas/defaults/map-with-default-values.avsc:
--------------------------------------------------------------------------------
1 | {
2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools",
3 | "name": "Primitives",
4 | "type": "record",
5 | "fields": [
6 | {
7 | "name": "map_of_ints_field",
8 | "type": {
9 | "type": "map",
10 | "values": {
11 | "type": "int",
12 | "default": 1
13 | }
14 | }
15 | }
16 | ]
17 | }
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/topic/BrokerTopicManagement.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.topic;
2 |
3 | import pl.allegro.tech.hermes.api.Topic;
4 |
5 | public interface BrokerTopicManagement {
6 |
7 | void createTopic(Topic topic);
8 |
9 | void removeTopic(Topic topic);
10 |
11 | void updateTopic(Topic topic);
12 |
13 | boolean topicExists(Topic topic);
14 | }
15 |
--------------------------------------------------------------------------------
/hermes-benchmark/src/jmh/java/pl/allegro/tech/hermes/benchmark/environment/NoOpMessagePreviewPersister.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.benchmark.environment;
2 |
3 | import pl.allegro.tech.hermes.frontend.publishing.preview.MessagePreviewPersister;
4 |
5 | class NoOpMessagePreviewPersister implements MessagePreviewPersister {
6 |
7 | @Override
8 | public void start() {}
9 |
10 | @Override
11 | public void shutdown() {}
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/infrastructure/query/parser/ParseException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.infrastructure.query.parser;
2 |
3 | public class ParseException extends RuntimeException {
4 |
5 | public ParseException(String message) {
6 | super(message);
7 | }
8 |
9 | public ParseException(String message, Throwable cause) {
10 | super(message, cause);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/rate/calculator/ModeOutputRateCalculator.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.rate.calculator;
2 |
3 | import pl.allegro.tech.hermes.consumers.consumer.rate.SendCounters;
4 |
5 | interface ModeOutputRateCalculator {
6 |
7 | OutputRateCalculationResult calculateOutputRate(
8 | double currentRate, double maximumOutputRate, SendCounters counters);
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/rate/maxrate/MaxRateProvider.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.rate.maxrate;
2 |
3 | import pl.allegro.tech.hermes.api.Subscription;
4 |
5 | public interface MaxRateProvider {
6 | double get();
7 |
8 | default void start() {}
9 |
10 | default void shutdown() {}
11 |
12 | default void updateSubscription(Subscription newSubscription) {}
13 | }
14 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/supervisor/workload/WorkBalancingParameters.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.supervisor.workload;
2 |
3 | import java.time.Duration;
4 |
5 | public interface WorkBalancingParameters {
6 |
7 | Duration getRebalanceInterval();
8 |
9 | int getConsumersPerSubscription();
10 |
11 | int getMaxSubscriptionsPerConsumer();
12 |
13 | boolean isAutoRebalance();
14 | }
15 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/detection/LastPublishedMessageMetricsRepository.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.detection;
2 |
3 | import java.time.Instant;
4 | import java.util.Optional;
5 | import pl.allegro.tech.hermes.api.TopicName;
6 |
7 | public interface LastPublishedMessageMetricsRepository {
8 | Optional getLastPublishedMessageTimestamp(TopicName topicName);
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/subscription/health/SubscriptionHealthProblemIndicator.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.subscription.health;
2 |
3 | import java.util.Optional;
4 | import pl.allegro.tech.hermes.api.SubscriptionHealthProblem;
5 |
6 | public interface SubscriptionHealthProblemIndicator {
7 | Optional getProblem(SubscriptionHealthContext context);
8 | }
9 |
--------------------------------------------------------------------------------
/hermes-test-helper/src/main/java/pl/allegro/tech/hermes/test/helper/containers/ImageTags.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.test.helper.containers;
2 |
3 | public class ImageTags {
4 | public static String confluentImagesTag() {
5 | if (System.getProperty("os.arch").equals("aarch64")) {
6 | return System.getProperty("confluentImagesTag", "7.6.1");
7 | }
8 | return System.getProperty("confluentImagesTag", "6.1.0");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/hermes-test-helper/src/main/resources/testcontainers/kafka_start_stop_wrapper.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | STARTER_SCRIPT=
4 |
5 | touch /tmp/start
6 |
7 | while :; do
8 | if [ -f $STARTER_SCRIPT ]; then
9 | if [ -f /tmp/stop ]; then
10 | rm /tmp/stop;
11 | /usr/bin/kafka-server-stop;
12 | elif [ -f /tmp/start ]; then
13 | rm /tmp/start;
14 | bash -c "$STARTER_SCRIPT &";
15 | fi
16 | fi
17 | sleep 0.1
18 | done
19 |
--------------------------------------------------------------------------------
/hermes-tracker/src/main/java/pl/allegro/tech/hermes/tracker/management/TrackingUrlProvider.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.tracker.management;
2 |
3 | import java.util.Collection;
4 |
5 | public interface TrackingUrlProvider {
6 | Collection getTrackingUrlsForTopic(String qualifiedTopicName);
7 |
8 | Collection getTrackingUrlsForSubscription(
9 | String qualifiedTopicName, String subscriptionName);
10 | }
11 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/common/message/wrapper/AvroInvalidMetadataException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.common.message.wrapper;
2 |
3 | import pl.allegro.tech.hermes.common.exception.InternalProcessingException;
4 |
5 | public class AvroInvalidMetadataException extends InternalProcessingException {
6 | public AvroInvalidMetadataException(String message, Exception cause) {
7 | super(message, cause);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/cache/topic/TopicsCache.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.frontend.cache.topic;
2 |
3 | import java.util.List;
4 | import java.util.Optional;
5 | import pl.allegro.tech.hermes.frontend.metric.CachedTopic;
6 |
7 | public interface TopicsCache {
8 |
9 | Optional getTopic(String qualifiedTopicName);
10 |
11 | List getTopics();
12 |
13 | void start();
14 | }
15 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/infrastructure/query/matcher/MatcherException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.infrastructure.query.matcher;
2 |
3 | public class MatcherException extends RuntimeException {
4 |
5 | public MatcherException(String message) {
6 | super(message);
7 | }
8 |
9 | public MatcherException(String message, Throwable cause) {
10 | super(message, cause);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/domain/notifications/InternalNotificationsBus.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.domain.notifications;
2 |
3 | /** All callbacks must be nonblocking. */
4 | public interface InternalNotificationsBus {
5 |
6 | void registerSubscriptionCallback(SubscriptionCallback callback);
7 |
8 | void registerTopicCallback(TopicCallback callback);
9 |
10 | void registerAdminCallback(AdminCallback callback);
11 | }
12 |
--------------------------------------------------------------------------------
/hermes-console/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | allure-results
12 | .DS_Store
13 | dist
14 | dist-ssr
15 | coverage
16 | *.local
17 |
18 | /cypress/videos/
19 | /cypress/screenshots/
20 |
21 | # Editor directories and files
22 | .vscode/*
23 | !.vscode/extensions.json
24 | *.suo
25 | *.ntvs*
26 | *.njsproj
27 | *.sln
28 | *.sw?
29 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/receiver/RetryableReceiverError.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.receiver;
2 |
3 | import pl.allegro.tech.hermes.common.exception.InternalProcessingException;
4 |
5 | public class RetryableReceiverError extends InternalProcessingException {
6 | public RetryableReceiverError(String message, Throwable throwable) {
7 | super(message, throwable);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/HermesManagement.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management;
2 |
3 | import org.springframework.boot.SpringApplication;
4 | import org.springframework.boot.autoconfigure.SpringBootApplication;
5 |
6 | @SpringBootApplication
7 | public class HermesManagement {
8 |
9 | public static void main(String[] args) {
10 | SpringApplication.run(HermesManagement.class, args);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/readiness/DatacenterReadinessRepository.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.readiness;
2 |
3 | import java.util.List;
4 | import pl.allegro.tech.hermes.api.DatacenterReadiness;
5 |
6 | public interface DatacenterReadinessRepository {
7 |
8 | List getReadiness();
9 |
10 | void setReadiness(List datacenterReadiness);
11 | }
12 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/common/message/undelivered/LastUndeliveredMessageReader.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.common.message.undelivered;
2 |
3 | import java.util.Optional;
4 | import pl.allegro.tech.hermes.api.SentMessageTrace;
5 | import pl.allegro.tech.hermes.api.TopicName;
6 |
7 | public interface LastUndeliveredMessageReader {
8 |
9 | Optional last(TopicName topicName, String subscriptionName);
10 | }
11 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/interpolation/UriInterpolator.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.interpolation;
2 |
3 | import java.net.URI;
4 | import pl.allegro.tech.hermes.api.EndpointAddress;
5 | import pl.allegro.tech.hermes.consumers.consumer.Message;
6 |
7 | public interface UriInterpolator {
8 | URI interpolate(EndpointAddress endpoint, Message message) throws InterpolationException;
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-test-helper/src/main/java/pl/allegro/tech/hermes/test/helper/metrics/TestMetricsFacadeFactory.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.test.helper.metrics;
2 |
3 | import io.micrometer.core.instrument.simple.SimpleMeterRegistry;
4 | import pl.allegro.tech.hermes.common.metric.MetricsFacade;
5 |
6 | public class TestMetricsFacadeFactory {
7 |
8 | public static MetricsFacade create() {
9 | return new MetricsFacade(new SimpleMeterRegistry());
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/http/headers/HttpHeadersProvider.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.sender.http.headers;
2 |
3 | import pl.allegro.tech.hermes.consumers.consumer.Message;
4 | import pl.allegro.tech.hermes.consumers.consumer.sender.http.HttpRequestData;
5 |
6 | public interface HttpHeadersProvider {
7 |
8 | HttpRequestHeaders getHeaders(Message message, HttpRequestData requestData);
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/readiness/HealthCheckService.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.frontend.readiness;
2 |
3 | public class HealthCheckService {
4 |
5 | private volatile boolean shutdown = true;
6 |
7 | public boolean isShutdown() {
8 | return shutdown;
9 | }
10 |
11 | public void shutdown() {
12 | this.shutdown = true;
13 | }
14 |
15 | public void startup() {
16 | this.shutdown = false;
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/infrastructure/query/matcher/MatcherFactory.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.infrastructure.query.matcher;
2 |
3 | import com.fasterxml.jackson.databind.JsonNode;
4 | import pl.allegro.tech.hermes.management.infrastructure.query.parser.QueryParserContext;
5 |
6 | public interface MatcherFactory {
7 |
8 | Matcher createMatcher(String path, JsonNode value, QueryParserContext context);
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/oauth/client/OAuthTokenRequestException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.oauth.client;
2 |
3 | public class OAuthTokenRequestException extends RuntimeException {
4 |
5 | public OAuthTokenRequestException(String message, Throwable cause) {
6 | super(message, cause);
7 | }
8 |
9 | public OAuthTokenRequestException(String message) {
10 | super(message);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/subscription/id/SubscriptionIds.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.subscription.id;
2 |
3 | import java.util.Optional;
4 | import pl.allegro.tech.hermes.api.SubscriptionName;
5 |
6 | public interface SubscriptionIds {
7 |
8 | Optional getSubscriptionId(SubscriptionName subscriptionName);
9 |
10 | Optional getSubscriptionId(long id);
11 |
12 | void start();
13 | }
14 |
--------------------------------------------------------------------------------
/hermes-consumers/src/test/resources/schemas/defaults/enum-with-default.avsc:
--------------------------------------------------------------------------------
1 | {
2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools",
3 | "name": "Primitives",
4 | "type": "record",
5 | "fields": [
6 | {
7 | "name": "enum_field",
8 | "type": {
9 | "type": "enum",
10 | "name": "TestEnum",
11 | "symbols": [
12 | "TEST1",
13 | "TEST2"
14 | ]
15 | },
16 | "default": "TEST1"
17 | }
18 | ]
19 | }
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/common/broker/BrokerDetails.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.common.broker;
2 |
3 | public class BrokerDetails {
4 |
5 | private String host;
6 | private int port;
7 |
8 | public BrokerDetails(String host, int port) {
9 | this.host = host;
10 | this.port = port;
11 | }
12 |
13 | public String getHost() {
14 | return host;
15 | }
16 |
17 | public int getPort() {
18 | return port;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/hermes-console/src/api/stats.ts:
--------------------------------------------------------------------------------
1 | export interface Stats {
2 | topicStats: TopicStats;
3 | subscriptionStats: SubscriptionStats;
4 | }
5 |
6 | export interface TopicStats {
7 | topicCount: number;
8 | ackAllTopicCount: number;
9 | trackingEnabledTopicCount: number;
10 | avroTopicCount: number;
11 | }
12 |
13 | export interface SubscriptionStats {
14 | subscriptionCount: number;
15 | trackingEnabledSubscriptionCount: number;
16 | avroSubscriptionCount: number;
17 | }
18 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/converter/NoOperationMessageConverter.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 class NoOperationMessageConverter implements MessageConverter {
7 | @Override
8 | public Message convert(Message message, Topic topic) {
9 | return message;
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/receiver/ConsumerNotInitializedException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.receiver;
2 |
3 | import pl.allegro.tech.hermes.common.exception.InternalProcessingException;
4 |
5 | public class ConsumerNotInitializedException extends InternalProcessingException {
6 | public ConsumerNotInitializedException() {
7 | super("Please make sure that you call initialize first.");
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/CompletableFutureAwareMessageSender.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.sender;
2 |
3 | import java.util.concurrent.CompletableFuture;
4 | import pl.allegro.tech.hermes.consumers.consumer.Message;
5 |
6 | public interface CompletableFutureAwareMessageSender {
7 |
8 | void send(Message message, CompletableFuture resultFuture);
9 |
10 | void stop();
11 | }
12 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/infrastructure/query/matcher/MatcherNotFoundException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.infrastructure.query.matcher;
2 |
3 | public class MatcherNotFoundException extends RuntimeException {
4 |
5 | public MatcherNotFoundException(String message) {
6 | super(message);
7 | }
8 |
9 | public MatcherNotFoundException(String message, Throwable cause) {
10 | super(message, cause);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/infrastructure/query/matcher/NotMatcher.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.infrastructure.query.matcher;
2 |
3 | public class NotMatcher implements Matcher {
4 |
5 | private final Matcher matcher;
6 |
7 | public NotMatcher(Matcher matcher) {
8 | this.matcher = matcher;
9 | }
10 |
11 | @Override
12 | public boolean match(Object value) {
13 | return !matcher.match(value);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/hermes-api/src/main/java/pl/allegro/tech/hermes/api/subscription/metrics/SubscriptionMetricsConfig.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.api.subscription.metrics;
2 |
3 | import jakarta.validation.Valid;
4 |
5 | public record SubscriptionMetricsConfig(
6 | @Valid MessageProcessingDurationMetricOptions messageProcessing) {
7 |
8 | public static final SubscriptionMetricsConfig DISABLED =
9 | new SubscriptionMetricsConfig(MessageProcessingDurationMetricOptions.DISABLED);
10 | }
11 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/domain/notifications/SubscriptionCallback.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.domain.notifications;
2 |
3 | import pl.allegro.tech.hermes.api.Subscription;
4 |
5 | public interface SubscriptionCallback {
6 |
7 | default void onSubscriptionCreated(Subscription subscription) {}
8 |
9 | default void onSubscriptionRemoved(Subscription subscription) {}
10 |
11 | default void onSubscriptionChanged(Subscription subscription) {}
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-consumers/src/test/resources/schemas/nullable-primitives/string.avsc:
--------------------------------------------------------------------------------
1 | {
2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools",
3 | "name": "NullablePrimitives",
4 | "type": "record",
5 | "comment": "Look at https://github.com/apache/avro/blob/master/lang/csharp/src/apache/perf/schema.avsc",
6 | "todo": "Fixed field doesn't work during parsing schema :|",
7 | "fields": [
8 | {
9 | "name": "field",
10 | "type": ["null", "string"]
11 | }
12 | ]
13 | }
14 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/PermissionDeniedException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain;
2 |
3 | import pl.allegro.tech.hermes.api.ErrorCode;
4 |
5 | public class PermissionDeniedException extends ManagementException {
6 | public PermissionDeniedException(String message) {
7 | super(message);
8 | }
9 |
10 | @Override
11 | public ErrorCode getCode() {
12 | return ErrorCode.PERMISSION_DENIED;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/docker/latest/consumers/consumers.yaml:
--------------------------------------------------------------------------------
1 | consumer:
2 | healthCheckPort: 8070
3 | zookeeper:
4 | clusters:
5 | - datacenter: "dc"
6 | root: "/run/hermes"
7 | connectionString: "zk:2181"
8 | kafka:
9 | clusters:
10 | - datacenter: "dc"
11 | brokerList: "kafka:29092"
12 | workload:
13 | consumerPerSubscription: 1
14 | schema:
15 | cache:
16 | refreshAfterWrite: 1m
17 | repository:
18 | serverUrl: "http://schema-registry:8081"
--------------------------------------------------------------------------------
/hermes-api/src/main/java/pl/allegro/tech/hermes/api/SubscriptionSearchItem.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.api;
2 |
3 | public record SubscriptionSearchItem(String name, Subscription subscription) implements SearchItem {
4 | @Override
5 | public SearchItemType type() {
6 | return SearchItemType.SUBSCRIPTION;
7 | }
8 |
9 | public record Subscription(String endpoint, Topic topic) {}
10 |
11 | public record Topic(String name, String qualifiedName, String groupName) {}
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/supervisor/workload/weighted/ConsumerNodeLoadRegistry.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.supervisor.workload.weighted;
2 |
3 | import pl.allegro.tech.hermes.consumers.consumer.load.SubscriptionLoadRecordersRegistry;
4 |
5 | public interface ConsumerNodeLoadRegistry extends SubscriptionLoadRecordersRegistry {
6 |
7 | void start();
8 |
9 | void stop();
10 |
11 | ConsumerNodeLoad get(String consumerId);
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/search/cache/CachedTopicItem.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.search.cache;
2 |
3 | import pl.allegro.tech.hermes.api.Topic;
4 |
5 | public record CachedTopicItem(String name, Topic topic) implements CachedItem {
6 | @Override
7 | public CachedItemType type() {
8 | return CachedItemType.TOPIC;
9 | }
10 |
11 | @Override
12 | public String name() {
13 | return name;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/hermes-console/src/api/message-filters-verification.ts:
--------------------------------------------------------------------------------
1 | import type { PathFilterJson } from '@/api/subscription';
2 |
3 | export interface MessageFiltersVerification {
4 | message: string;
5 | filters: PathFilterJson[];
6 | }
7 |
8 | export enum VerificationStatus {
9 | NOT_MATCHED = 'NOT_MATCHED',
10 | MATCHED = 'MATCHED',
11 | ERROR = 'ERROR',
12 | }
13 |
14 | export interface MessageFiltersVerificationResponse {
15 | status: VerificationStatus;
16 | errorMessage?: string;
17 | }
18 |
--------------------------------------------------------------------------------
/hermes-console/src/dummy/inactiveTopics.ts:
--------------------------------------------------------------------------------
1 | import type { InactiveTopic } from '@/api/inactive-topics';
2 |
3 | export const dummyInactiveTopics: InactiveTopic[] = [
4 | {
5 | topic: 'group.topic1',
6 | lastPublishedTsMs: 1732499845200,
7 | notificationTsMs: [1733499835210, 1733499645212],
8 | whitelisted: false,
9 | },
10 | {
11 | topic: 'group.topic2',
12 | lastPublishedTsMs: 1633928665148,
13 | notificationTsMs: [],
14 | whitelisted: true,
15 | },
16 | ];
17 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/jms/JmsMessageSenderProvider.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.sender.jms;
2 |
3 | import java.net.URI;
4 | import javax.jms.ConnectionFactory;
5 | import pl.allegro.tech.hermes.consumers.consumer.sender.ProtocolMessageSenderProvider;
6 |
7 | public interface JmsMessageSenderProvider extends ProtocolMessageSenderProvider {
8 |
9 | ConnectionFactory createConnectionFactory(URI serverUri);
10 | }
11 |
--------------------------------------------------------------------------------
/hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/publishing/handlers/KeepAliveHeaderHandler.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.frontend.publishing.handlers;
2 |
3 | import io.undertow.server.HttpHandler;
4 | import io.undertow.server.handlers.SetHeaderHandler;
5 |
6 | class KeepAliveHeaderHandler extends SetHeaderHandler {
7 |
8 | KeepAliveHeaderHandler(HttpHandler next, int keepAliveTimeoutSec) {
9 | super(next, "Keep-Alive", "timeout=" + keepAliveTimeoutSec);
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/retransmit/OfflineRetransmissionRepository.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.retransmit;
2 |
3 | import java.util.List;
4 | import pl.allegro.tech.hermes.api.OfflineRetransmissionTask;
5 |
6 | public interface OfflineRetransmissionRepository {
7 | void saveTask(OfflineRetransmissionTask task);
8 |
9 | List getAllTasks();
10 |
11 | void deleteTask(String taskId);
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/subscription/validator/NoOpEndpointOwnershipValidator.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.subscription.validator;
2 |
3 | import pl.allegro.tech.hermes.api.EndpointAddress;
4 | import pl.allegro.tech.hermes.api.OwnerId;
5 |
6 | public class NoOpEndpointOwnershipValidator implements EndpointOwnershipValidator {
7 |
8 | @Override
9 | public void check(OwnerId owner, EndpointAddress endpoint) {}
10 | }
11 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/common/exception/BrokerNotFoundForPartitionException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.common.exception;
2 |
3 | @SuppressWarnings("serial")
4 | public class BrokerNotFoundForPartitionException extends InternalProcessingException {
5 |
6 | public BrokerNotFoundForPartitionException(String topic, int partition, Throwable cause) {
7 | super(String.format("Broker not found for topic %s and partition %d", topic, partition), cause);
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/result/SuccessHandler.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.result;
2 |
3 | import pl.allegro.tech.hermes.api.Subscription;
4 | import pl.allegro.tech.hermes.consumers.consumer.Message;
5 | import pl.allegro.tech.hermes.consumers.consumer.sender.MessageSendingResult;
6 |
7 | public interface SuccessHandler {
8 | void handleSuccess(Message message, Subscription subscription, MessageSendingResult result);
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/buffer/MessageRepository.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.frontend.buffer;
2 |
3 | import java.util.List;
4 | import pl.allegro.tech.hermes.api.Topic;
5 | import pl.allegro.tech.hermes.frontend.publishing.message.Message;
6 |
7 | public interface MessageRepository {
8 |
9 | void save(Message message, Topic topic);
10 |
11 | void delete(String messageId);
12 |
13 | List findAll();
14 |
15 | void close();
16 | }
17 |
--------------------------------------------------------------------------------
/hermes-test-helper/src/main/java/pl/allegro/tech/hermes/test/helper/cache/FakeTicker.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.test.helper.cache;
2 |
3 | import com.google.common.base.Ticker;
4 | import java.time.Duration;
5 |
6 | public class FakeTicker extends Ticker {
7 | private long currentNanos = 0;
8 |
9 | @Override
10 | public long read() {
11 | return currentNanos;
12 | }
13 |
14 | public void advance(Duration duration) {
15 | currentNanos += duration.toNanos();
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/rate/maxrate/SubscriptionIdMapper.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.rate.maxrate;
2 |
3 | import java.util.Optional;
4 | import pl.allegro.tech.hermes.api.SubscriptionName;
5 | import pl.allegro.tech.hermes.consumers.subscription.id.SubscriptionId;
6 |
7 | @FunctionalInterface
8 | interface SubscriptionIdMapper {
9 |
10 | Optional mapToSubscriptionId(SubscriptionName subscriptionName);
11 | }
12 |
--------------------------------------------------------------------------------
/hermes-consumers/src/test/resources/schemas/record-primitives/boolean.avsc:
--------------------------------------------------------------------------------
1 | {
2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools",
3 | "name": "RecordPrimitives",
4 | "type": "record",
5 | "fields": [
6 | {
7 | "name": "field",
8 | "type": {
9 | "name": "boolean",
10 | "type": "record",
11 | "fields": [
12 | {
13 | "name": "value_field",
14 | "type": "boolean"
15 | }
16 | ]
17 | }
18 | }
19 | ]
20 | }
--------------------------------------------------------------------------------
/hermes-consumers/src/test/resources/schemas/record-primitives/bytes.avsc:
--------------------------------------------------------------------------------
1 | {
2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools",
3 | "name": "RecordPrimitives",
4 | "type": "record",
5 | "fields": [
6 | {
7 | "name": "field",
8 | "type": {
9 | "name": "bytes",
10 | "type": "record",
11 | "fields": [
12 | {
13 | "name": "value_field",
14 | "type": "bytes"
15 | }
16 | ]
17 | }
18 | }
19 | ]
20 | }
21 |
--------------------------------------------------------------------------------
/hermes-consumers/src/test/resources/schemas/record-primitives/float.avsc:
--------------------------------------------------------------------------------
1 | {
2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools",
3 | "name": "RecordPrimitives",
4 | "type": "record",
5 | "fields": [
6 | {
7 | "name": "field",
8 | "type": {
9 | "name": "float",
10 | "type": "record",
11 | "fields": [
12 | {
13 | "name": "value_field",
14 | "type": "float"
15 | }
16 | ]
17 | }
18 | }
19 | ]
20 | }
21 |
--------------------------------------------------------------------------------
/hermes-consumers/src/test/resources/schemas/record-primitives/int.avsc:
--------------------------------------------------------------------------------
1 | {
2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools",
3 | "name": "RecordPrimitives",
4 | "type": "record",
5 | "fields": [
6 | {
7 | "name": "field",
8 | "type": {
9 | "name": "string",
10 | "type": "record",
11 | "fields": [
12 | {
13 | "name": "value_field",
14 | "type": "int"
15 | }
16 | ]
17 | }
18 | }
19 | ]
20 | }
21 |
--------------------------------------------------------------------------------
/hermes-consumers/src/test/resources/schemas/record-primitives/long.avsc:
--------------------------------------------------------------------------------
1 | {
2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools",
3 | "name": "RecordPrimitives",
4 | "type": "record",
5 | "fields": [
6 | {
7 | "name": "field",
8 | "type": {
9 | "name": "long",
10 | "type": "record",
11 | "fields": [
12 | {
13 | "name": "value_field",
14 | "type": "long"
15 | }
16 | ]
17 | }
18 | }
19 | ]
20 | }
21 |
--------------------------------------------------------------------------------
/hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/buffer/PersistentBufferExtensionParameters.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.frontend.buffer;
2 |
3 | public interface PersistentBufferExtensionParameters {
4 |
5 | long getBufferedSizeBytes();
6 |
7 | boolean isV2MigrationEnabled();
8 |
9 | boolean isEnabled();
10 |
11 | String getDirectory();
12 |
13 | String getTemporaryDirectory();
14 |
15 | int getAverageMessageSize();
16 |
17 | boolean isSizeReportingEnabled();
18 | }
19 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/GroupNameIsNotAllowedException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain;
2 |
3 | import pl.allegro.tech.hermes.api.ErrorCode;
4 |
5 | public class GroupNameIsNotAllowedException extends ManagementException {
6 | public GroupNameIsNotAllowedException(String message) {
7 | super(message);
8 | }
9 |
10 | @Override
11 | public ErrorCode getCode() {
12 | return ErrorCode.GROUP_NAME_IS_INVALID;
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/hermes-management/src/test/resources/prometheus-stubs/__files/subscription_batches_total.json:
--------------------------------------------------------------------------------
1 | {
2 | "status": "success",
3 | "data": {
4 | "resultType": "vector",
5 | "result": [
6 | {
7 | "metric": {
8 | "group": "pl.allegro.tech.hermes",
9 | "subscription": "hermesSubscription",
10 | "topic": "hermesTopic"
11 | },
12 | "value": [
13 | 1692281425.609,
14 | "5"
15 | ]
16 | }
17 | ]
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/hermes-management/src/test/resources/prometheus-stubs/__files/subscription_delivered_total.json:
--------------------------------------------------------------------------------
1 | {
2 | "status": "success",
3 | "data": {
4 | "resultType": "vector",
5 | "result": [
6 | {
7 | "metric": {
8 | "group": "pl.allegro.tech.hermes",
9 | "subscription": "hermesSubscription",
10 | "topic": "hermesTopic"
11 | },
12 | "value": [
13 | 1692281425.609,
14 | "1"
15 | ]
16 | }
17 | ]
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/hermes-management/src/test/resources/prometheus-stubs/__files/subscription_retries_total.json:
--------------------------------------------------------------------------------
1 | {
2 | "status": "success",
3 | "data": {
4 | "resultType": "vector",
5 | "result": [
6 | {
7 | "metric": {
8 | "group": "pl.allegro.tech.hermes",
9 | "subscription": "hermesSubscription",
10 | "topic": "hermesTopic"
11 | },
12 | "value": [
13 | 1692281425.609,
14 | "1"
15 | ]
16 | }
17 | ]
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/hermes-management/src/test/resources/prometheus-stubs/__files/subscription_timeouts_total.json:
--------------------------------------------------------------------------------
1 | {
2 | "status": "success",
3 | "data": {
4 | "resultType": "vector",
5 | "result": [
6 | {
7 | "metric": {
8 | "group": "pl.allegro.tech.hermes",
9 | "subscription": "hermesSubscription",
10 | "topic": "hermesTopic"
11 | },
12 | "value": [
13 | 1692281425.609,
14 | "2"
15 | ]
16 | }
17 | ]
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/hermes-api/src/main/java/pl/allegro/tech/hermes/api/helpers/Replacer.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.api.helpers;
2 |
3 | import java.util.Arrays;
4 | import java.util.List;
5 | import java.util.stream.Collectors;
6 |
7 | public final class Replacer {
8 |
9 | public static List replaceInAll(String regex, String replacement, String... strings) {
10 | return Arrays.stream(strings)
11 | .map(s -> s.replaceAll(regex, replacement))
12 | .collect(Collectors.toList());
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/hermes-console/tsconfig.app.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "@vue/tsconfig/tsconfig.web.json",
3 | "include": [
4 | "env.d.ts",
5 | "src/**/*",
6 | "src/**/*.vue"
7 | ],
8 | "compilerOptions": {
9 | "composite": true,
10 | "baseUrl": ".",
11 | "paths": {
12 | "@/*": [
13 | "./src/*"
14 | ]
15 | },
16 | "types": [
17 | "node",
18 | "jsdom",
19 | "jest",
20 | "vitest/globals",
21 | "@testing-library/jest-dom"
22 | ]
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/hermes-consumers/src/test/resources/schemas/record-primitives/double.avsc:
--------------------------------------------------------------------------------
1 | {
2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools",
3 | "name": "RecordPrimitives",
4 | "type": "record",
5 | "fields": [
6 | {
7 | "name": "field",
8 | "type": {
9 | "name": "double",
10 | "type": "record",
11 | "fields": [
12 | {
13 | "name": "value_field",
14 | "type": "double"
15 | }
16 | ]
17 | }
18 | }
19 | ]
20 | }
21 |
--------------------------------------------------------------------------------
/hermes-consumers/src/test/resources/schemas/record-primitives/string.avsc:
--------------------------------------------------------------------------------
1 | {
2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools",
3 | "name": "RecordPrimitives",
4 | "type": "record",
5 | "fields": [
6 | {
7 | "name": "field",
8 | "type": {
9 | "name": "string",
10 | "type": "record",
11 | "fields": [
12 | {
13 | "name": "value_field",
14 | "type": "string"
15 | }
16 | ]
17 | }
18 | }
19 | ]
20 | }
21 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/retransmit/RetransmissionMonitoringUrlProvider.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.retransmit;
2 |
3 | import pl.allegro.tech.hermes.api.OfflineRetransmissionTask;
4 |
5 | public interface RetransmissionMonitoringUrlProvider {
6 | String getLogsUrl(OfflineRetransmissionTask task);
7 |
8 | String getMetricsUrl(OfflineRetransmissionTask task);
9 |
10 | String getJobDetailsUrl(OfflineRetransmissionTask task);
11 | }
12 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/infrastructure/zookeeper/ZookeeperClientNotFoundException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.infrastructure.zookeeper;
2 |
3 | public class ZookeeperClientNotFoundException extends RuntimeException {
4 | public ZookeeperClientNotFoundException(String localDcName) {
5 | super(
6 | "No Zookeeper client is configured to connect to cluster on DC (name: "
7 | + localDcName
8 | + ").");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/hermes-management/src/test/resources/prometheus-stubs/__files/subscription_other_errors_total.json:
--------------------------------------------------------------------------------
1 | {
2 | "status": "success",
3 | "data": {
4 | "resultType": "vector",
5 | "result": [
6 | {
7 | "metric": {
8 | "group": "pl.allegro.tech.hermes",
9 | "subscription": "hermesSubscription",
10 | "topic": "hermesTopic"
11 | },
12 | "value": [
13 | 1692281425.609,
14 | "4"
15 | ]
16 | }
17 | ]
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/hermes-management/src/test/resources/prometheus-stubs/__files/subscription_throughput_bytes_total.json:
--------------------------------------------------------------------------------
1 | {
2 | "status": "success",
3 | "data": {
4 | "resultType": "vector",
5 | "result": [
6 | {
7 | "metric": {
8 | "group": "pl.allegro.tech.hermes",
9 | "subscription": "hermesSubscription",
10 | "topic": "hermesTopic"
11 | },
12 | "value": [
13 | 1692281425.609,
14 | "3"
15 | ]
16 | }
17 | ]
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/hermes-test-helper/src/main/resources/schema/user.avsc:
--------------------------------------------------------------------------------
1 | {
2 | "namespace": "pl.allegro",
3 | "type": "record",
4 | "name": "User",
5 | "fields": [
6 | {
7 | "name": "__metadata",
8 | "type": ["null", {"type": "map", "values": "string"}],
9 | "default": null
10 | },
11 | {"name": "name", "type": "string"},
12 | {"name": "age", "type": "int"},
13 | {"name": "favoriteColor", "type": ["null", "string"]}
14 | ]
15 | }
16 |
--------------------------------------------------------------------------------
/hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/publishing/handlers/ThroughputParameters.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.frontend.publishing.handlers;
2 |
3 | import java.time.Duration;
4 |
5 | public interface ThroughputParameters {
6 |
7 | String getType();
8 |
9 | long getFixedMax();
10 |
11 | long getDynamicMax();
12 |
13 | long getDynamicThreshold();
14 |
15 | long getDynamicDesired();
16 |
17 | double getDynamicIdle();
18 |
19 | Duration getDynamicCheckInterval();
20 | }
21 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/config/AvroConfiguration.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.config;
2 |
3 | import org.springframework.context.annotation.Bean;
4 | import org.springframework.context.annotation.Configuration;
5 | import tech.allegro.schema.json2avro.converter.JsonAvroConverter;
6 |
7 | @Configuration
8 | public class AvroConfiguration {
9 |
10 | @Bean
11 | JsonAvroConverter jsonAvroConverter() {
12 | return new JsonAvroConverter();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/hermes-management/src/test/resources/prometheus-stubs/__files/subscription_2xx_http_status_codes_total.json:
--------------------------------------------------------------------------------
1 | {
2 | "status": "success",
3 | "data": {
4 | "resultType": "vector",
5 | "result": [
6 | {
7 | "metric": {
8 | "group": "pl.allegro.tech.hermes",
9 | "subscription": "hermesSubscription",
10 | "topic": "hermesTopic"
11 | },
12 | "value": [
13 | 1692281425.609,
14 | "2"
15 | ]
16 | }
17 | ]
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/hermes-management/src/test/resources/prometheus-stubs/__files/subscription_4xx_http_status_codes_total.json:
--------------------------------------------------------------------------------
1 | {
2 | "status": "success",
3 | "data": {
4 | "resultType": "vector",
5 | "result": [
6 | {
7 | "metric": {
8 | "group": "pl.allegro.tech.hermes",
9 | "subscription": "hermesSubscription",
10 | "topic": "hermesTopic"
11 | },
12 | "value": [
13 | 1692281425.609,
14 | "1"
15 | ]
16 | }
17 | ]
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/hermes-management/src/test/resources/prometheus-stubs/__files/subscription_5xx_http_status_codes_total.json:
--------------------------------------------------------------------------------
1 | {
2 | "status": "success",
3 | "data": {
4 | "resultType": "vector",
5 | "result": [
6 | {
7 | "metric": {
8 | "group": "pl.allegro.tech.hermes",
9 | "subscription": "hermesSubscription",
10 | "topic": "hermesTopic"
11 | },
12 | "value": [
13 | 1692281425.609,
14 | "2"
15 | ]
16 | }
17 | ]
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/hermes-console/src/api/constraints.ts:
--------------------------------------------------------------------------------
1 | export interface ConstraintsConfig {
2 | topicConstraints: Record;
3 | subscriptionConstraints: Record;
4 | }
5 |
6 | export interface Constraint {
7 | consumersNumber: number;
8 | reason: string;
9 | }
10 |
11 | export interface SubscriptionConstraint {
12 | subscriptionName: string;
13 | constraints: Constraint;
14 | }
15 |
16 | export interface TopicConstraint {
17 | topicName: string;
18 | constraints: Constraint;
19 | }
20 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/googlepubsub/CompressionCodec.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.sender.googlepubsub;
2 |
3 | enum CompressionCodec {
4 | DEFLATE("df"),
5 | BZIP2("bz2"),
6 | ZSTANDARD("zstd"),
7 | EMPTY;
8 |
9 | private String header;
10 |
11 | CompressionCodec(String header) {
12 | this.header = header;
13 | }
14 |
15 | CompressionCodec() {}
16 |
17 | String getHeader() {
18 | return header;
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/supervisor/process/ConsumerProcessSupplier.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.supervisor.process;
2 |
3 | import pl.allegro.tech.hermes.api.Subscription;
4 | import pl.allegro.tech.hermes.api.SubscriptionName;
5 |
6 | public interface ConsumerProcessSupplier {
7 | ConsumerProcess createProcess(
8 | Subscription subscription,
9 | Signal startSignal,
10 | java.util.function.Consumer onConsumerStopped);
11 | }
12 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/supervisor/workload/WorkBalancer.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.supervisor.workload;
2 |
3 | import java.util.List;
4 | import pl.allegro.tech.hermes.api.SubscriptionName;
5 |
6 | public interface WorkBalancer {
7 |
8 | WorkBalancingResult balance(
9 | List subscriptions,
10 | List activeConsumerNodes,
11 | SubscriptionAssignmentView currentState,
12 | WorkloadConstraints constraints);
13 | }
14 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/resources/application-local.yaml:
--------------------------------------------------------------------------------
1 | consumer:
2 | healthCheckPort: 8070
3 | zookeeper:
4 | clusters:
5 | - datacenter: "dc"
6 | root: "/run/hermes"
7 | connectionString: "localhost:2181"
8 | kafka:
9 | clusters:
10 | - datacenter: "dc"
11 | brokerList: "localhost:9092"
12 | workload:
13 | consumerPerSubscription: 1
14 | schema:
15 | cache:
16 | refreshAfterWrite: 1m
17 | repository:
18 | serverUrl: "http://localhost:8081"
19 |
--------------------------------------------------------------------------------
/hermes-management/src/test/groovy/pl/allegro/tech/hermes/management/utils/MockAppender.groovy:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.utils
2 |
3 | import ch.qos.logback.classic.spi.LoggingEvent
4 | import ch.qos.logback.core.read.ListAppender
5 |
6 | class MockAppender extends ListAppender {
7 |
8 | @Override
9 | void doAppend(LoggingEvent eventObject) {
10 | list.add(eventObject);
11 | }
12 |
13 | @Override
14 | String getName() {
15 | return "mock"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/receiver/kafka/MessageContentReader.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.receiver.kafka;
2 |
3 | import org.apache.kafka.clients.consumer.ConsumerRecord;
4 | import pl.allegro.tech.hermes.api.ContentType;
5 | import pl.allegro.tech.hermes.common.message.wrapper.UnwrappedMessageContent;
6 |
7 | public interface MessageContentReader {
8 | UnwrappedMessageContent read(ConsumerRecord message, ContentType contentType);
9 | }
10 |
--------------------------------------------------------------------------------
/hermes-consumers/src/test/java/pl/allegro/tech/hermes/consumers/test/Wait.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.test;
2 |
3 | public final class Wait {
4 |
5 | private Wait() {}
6 |
7 | public static void forCacheInvalidation() {
8 | sleep(700);
9 | }
10 |
11 | private static void sleep(int millis) {
12 | try {
13 | Thread.sleep(millis);
14 | } catch (InterruptedException exception) {
15 | throw new RuntimeException("Who dares to interrupt me?", exception);
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/publishing/handlers/end/DefaultTrackingHeaderExtractor.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.frontend.publishing.handlers.end;
2 |
3 | import io.undertow.util.HeaderMap;
4 | import java.util.Collections;
5 | import java.util.Map;
6 |
7 | public class DefaultTrackingHeaderExtractor implements TrackingHeadersExtractor {
8 |
9 | @Override
10 | public Map extractHeadersToLog(HeaderMap headers) {
11 | return Collections.emptyMap();
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/rate/calculator/RateCalculatorParameters.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.rate.calculator;
2 |
3 | import java.time.Duration;
4 |
5 | public interface RateCalculatorParameters {
6 |
7 | Duration getLimiterHeartbeatModeDelay();
8 |
9 | Duration getLimiterSlowModeDelay();
10 |
11 | double getConvergenceFactor();
12 |
13 | double getFailuresNoChangeToleranceRatio();
14 |
15 | double getFailuresSpeedUpToleranceRatio();
16 | }
17 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/SenderClient.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.sender;
2 |
3 | import java.io.IOException;
4 | import java.util.concurrent.CompletableFuture;
5 | import java.util.concurrent.ExecutionException;
6 |
7 | public interface SenderClient {
8 |
9 | void publish(T message, CompletableFuture resultFuture)
10 | throws IOException, ExecutionException, InterruptedException;
11 |
12 | void shutdown();
13 | }
14 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/http/HttpRequestFactory.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.sender.http;
2 |
3 | import java.net.URI;
4 | import org.eclipse.jetty.client.Request;
5 | import pl.allegro.tech.hermes.consumers.consumer.Message;
6 | import pl.allegro.tech.hermes.consumers.consumer.sender.http.headers.HttpRequestHeaders;
7 |
8 | public interface HttpRequestFactory {
9 | Request buildRequest(Message message, URI uri, HttpRequestHeaders headers);
10 | }
11 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/supervisor/workload/NoOpBalancingListener.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.supervisor.workload;
2 |
3 | import java.util.List;
4 |
5 | public class NoOpBalancingListener implements BalancingListener {
6 |
7 | @Override
8 | public void onBeforeBalancing(List activeConsumers) {}
9 |
10 | @Override
11 | public void onAfterBalancing(WorkDistributionChanges changes) {}
12 |
13 | @Override
14 | public void onBalancingSkipped() {}
15 | }
16 |
--------------------------------------------------------------------------------
/hermes-consumers/src/test/resources/schemas/defaults/map-with-default.avsc:
--------------------------------------------------------------------------------
1 | {
2 | "namespace": "pl.allegro.bigdata.avro.gcpavrotools",
3 | "name": "Primitives",
4 | "type": "record",
5 | "fields": [
6 | {
7 | "name": "map_of_ints_field",
8 | "type": {
9 | "type": "map",
10 | "values": {
11 | "type": "int"
12 | }
13 | },
14 | "default": {
15 | "policja": 997,
16 | "straż pożarna": 998,
17 | "pogotowie": 999
18 | }
19 | }
20 | ]
21 | }
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/api/UiResource.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.api;
2 |
3 | import static jakarta.ws.rs.core.MediaType.TEXT_HTML;
4 |
5 | import jakarta.ws.rs.GET;
6 | import jakarta.ws.rs.Path;
7 | import jakarta.ws.rs.Produces;
8 | import org.glassfish.jersey.server.mvc.Viewable;
9 |
10 | @Path("/")
11 | public class UiResource {
12 | @GET
13 | @Produces(TEXT_HTML)
14 | public Viewable getIndex() {
15 | return new Viewable("/index.html");
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/config/AuditProperties.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.config;
2 |
3 | import org.springframework.boot.context.properties.ConfigurationProperties;
4 |
5 | @ConfigurationProperties(prefix = "audit")
6 | class AuditProperties {
7 |
8 | private String eventUrl = null;
9 |
10 | public String getEventUrl() {
11 | return eventUrl;
12 | }
13 |
14 | public void setEventUrl(String eventUrl) {
15 | this.eventUrl = eventUrl;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/search/cache/CachedSubscriptionItem.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.search.cache;
2 |
3 | import pl.allegro.tech.hermes.api.Subscription;
4 |
5 | public record CachedSubscriptionItem(String name, Subscription subscription) implements CachedItem {
6 | @Override
7 | public CachedItemType type() {
8 | return CachedItemType.SUBSCRIPTION;
9 | }
10 |
11 | @Override
12 | public String name() {
13 | return name;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/hermes-tracker/src/main/java/pl/allegro/tech/hermes/tracker/consumers/SendingTracker.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.tracker.consumers;
2 |
3 | public interface SendingTracker {
4 | void logSent(MessageMetadata message, String hostname);
5 |
6 | void logFailed(MessageMetadata message, String reason, String hostname);
7 |
8 | void logDiscarded(MessageMetadata message, String reason);
9 |
10 | void logInflight(MessageMetadata message);
11 |
12 | void logFiltered(MessageMetadata messageMetadata, String reason);
13 | }
14 |
--------------------------------------------------------------------------------
/readthedocs.yml:
--------------------------------------------------------------------------------
1 | # .readthedocs.yaml
2 | # Read the Docs configuration file
3 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
4 |
5 | # Required
6 | version: 2
7 |
8 | # Set the version of Python and other tools you might need
9 | build:
10 | os: ubuntu-20.04
11 | tools:
12 | python: "3.9"
13 |
14 | mkdocs:
15 | configuration: mkdocs.yml
16 |
17 | # Optionally declare the Python requirements required to build your docs
18 | python:
19 | install:
20 | - requirements: requirements.txt
21 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/http/HttpClientParameters.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.sender.http;
2 |
3 | import java.time.Duration;
4 |
5 | public interface HttpClientParameters {
6 |
7 | int getThreadPoolSize();
8 |
9 | boolean isThreadPoolMonitoringEnabled();
10 |
11 | boolean isFollowRedirectsEnabled();
12 |
13 | Duration getIdleTimeout();
14 |
15 | int getMaxRequestsQueuedPerDestination();
16 |
17 | Duration getConnectionTimeout();
18 | }
19 |
--------------------------------------------------------------------------------
/hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/producer/BrokerMessageProducer.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.frontend.producer;
2 |
3 | import pl.allegro.tech.hermes.frontend.metric.CachedTopic;
4 | import pl.allegro.tech.hermes.frontend.publishing.PublishingCallback;
5 | import pl.allegro.tech.hermes.frontend.publishing.message.Message;
6 |
7 | public interface BrokerMessageProducer extends BrokerTopicAvailabilityChecker {
8 |
9 | void send(Message message, CachedTopic topic, PublishingCallback callback);
10 | }
11 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/dc/RepositoryCommand.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.dc;
2 |
3 | public abstract class RepositoryCommand {
4 |
5 | public abstract void backup(DatacenterBoundRepositoryHolder holder);
6 |
7 | public abstract void execute(DatacenterBoundRepositoryHolder holder);
8 |
9 | public abstract void rollback(DatacenterBoundRepositoryHolder holder, Exception exception);
10 |
11 | public abstract Class getRepositoryType();
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-schema/src/main/java/pl/allegro/tech/hermes/schema/CompiledSchemaRepository.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.schema;
2 |
3 | import pl.allegro.tech.hermes.api.Topic;
4 |
5 | public interface CompiledSchemaRepository {
6 |
7 | default CompiledSchema getSchema(Topic topic, SchemaVersion version) {
8 | return getSchema(topic, version, false);
9 | }
10 |
11 | CompiledSchema getSchema(Topic topic, SchemaVersion version, boolean online);
12 |
13 | CompiledSchema getSchema(Topic topic, SchemaId id);
14 | }
15 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/offset/kafka/broker/PartitionNotAssignedException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.offset.kafka.broker;
2 |
3 | import pl.allegro.tech.hermes.common.exception.RetransmissionException;
4 |
5 | public class PartitionNotAssignedException extends RetransmissionException {
6 | public PartitionNotAssignedException() {
7 | super("");
8 | }
9 |
10 | public PartitionNotAssignedException(Throwable cause) {
11 | super(cause);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/supervisor/workload/SubscriptionAssignmentAware.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.supervisor.workload;
2 |
3 | import java.util.Optional;
4 | import pl.allegro.tech.hermes.api.SubscriptionName;
5 |
6 | public interface SubscriptionAssignmentAware {
7 | default void onSubscriptionAssigned(SubscriptionName subscriptionName) {}
8 |
9 | default void onAssignmentRemoved(SubscriptionName subscriptionName) {}
10 |
11 | Optional watchedConsumerId();
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-api/src/main/java/pl/allegro/tech/hermes/api/Query.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.api;
2 |
3 | import java.util.Collection;
4 | import java.util.stream.Stream;
5 |
6 | public interface Query {
7 |
8 | Stream filter(Stream input);
9 |
10 | default Stream filter(Collection input) {
11 | return filter(input.stream());
12 | }
13 |
14 | Stream filterNames(Stream input);
15 |
16 | default Stream filterNames(Collection input) {
17 | return filterNames(input.stream());
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/hermes-client/src/main/java/pl/allegro/tech/hermes/client/MessageDeliveryListener.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.client;
2 |
3 | public interface MessageDeliveryListener {
4 |
5 | void onSend(HermesResponse response, long latency);
6 |
7 | void onFailure(HermesResponse message, int attemptCount);
8 |
9 | void onFailedRetry(HermesResponse message, int attemptCount);
10 |
11 | void onSuccessfulRetry(HermesResponse message, int attemptCount);
12 |
13 | void onMaxRetriesExceeded(HermesResponse message, int attemptCount);
14 | }
15 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/domain/filtering/UnsupportedMatchingStrategyException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.domain.filtering;
2 |
3 | public class UnsupportedMatchingStrategyException extends FilteringException {
4 | public UnsupportedMatchingStrategyException(String filterType, MatchingStrategy strategy) {
5 | super(
6 | "Matching strategy '"
7 | + strategy
8 | + "' is not supported in filters of type '"
9 | + filterType
10 | + "'.");
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-tracker/build.gradle:
--------------------------------------------------------------------------------
1 | dependencies {
2 | implementation project(':hermes-api')
3 | implementation project(':hermes-metrics')
4 | testImplementation project(path: ":hermes-test-helper")
5 | testRuntimeOnly group: 'org.junit.vintage', name: 'junit-vintage-engine', version: versions.junit_jupiter
6 | }
7 |
8 | configurations {
9 | testArtifacts
10 | }
11 |
12 | task testJar (type: Jar) {
13 | archiveClassifier = 'tests'
14 | from sourceSets.test.output
15 | }
16 |
17 | artifacts {
18 | testArtifacts testJar
19 | }
--------------------------------------------------------------------------------
/hermes-console/src/main.scss:
--------------------------------------------------------------------------------
1 | /*
2 | * Vuetify tooltip 100% opacity override
3 | */
4 | .v-overlay, .v-tooltip {
5 | .v-overlay__content {
6 | line-height: 1.25 !important;
7 | max-width: 300px !important;
8 | }
9 | }
10 |
11 | .row-gap-1 {
12 | row-gap: 4px;
13 | }
14 |
15 | .row-gap-2 {
16 | row-gap: 8px;
17 | }
18 |
19 | .row-gap-3 {
20 | row-gap: 12px;
21 | }
22 |
23 | .row-gap-4 {
24 | row-gap: 16px;
25 | }
26 |
27 | .column-gap-2 {
28 | column-gap: 8px;
29 | }
30 |
31 | .column-gap-1 {
32 | column-gap: 4px;
33 | }
34 |
--------------------------------------------------------------------------------
/hermes-console/src/views/topic/messages-preview/types.ts:
--------------------------------------------------------------------------------
1 | import type { MessagePreview } from '@/api/topic';
2 |
3 | export interface ParsedMessagePreview extends MessagePreview {
4 | messageId: string | null;
5 | timestamp: number | null;
6 | parsedContent: MessagePartiallyParsedContent | null;
7 | }
8 |
9 | export interface MessagePartiallyParsedContent {
10 | __metadata: {
11 | messageId: string;
12 | timestamp: string;
13 | };
14 | }
15 |
16 | export interface SelectedRow- {
17 | index: number;
18 | item: Item;
19 | }
20 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/http/headers/DefaultBatchHeadersProvider.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.sender.http.headers;
2 |
3 | import java.util.Collections;
4 | import pl.allegro.tech.hermes.api.EndpointAddress;
5 |
6 | public final class DefaultBatchHeadersProvider implements BatchHttpHeadersProvider {
7 |
8 | @Override
9 | public HttpRequestHeaders getHeaders(EndpointAddress address) {
10 | return new HttpRequestHeaders(Collections.emptyMap());
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-schema/build.gradle:
--------------------------------------------------------------------------------
1 | dependencies {
2 | implementation project(':hermes-api')
3 |
4 | implementation group: 'org.apache.avro', name: 'avro', version: versions.avro
5 | implementation group: 'com.google.guava', name: 'guava', version: versions.guava
6 |
7 | testImplementation project(path: ":hermes-test-helper")
8 |
9 | testImplementation group: 'org.spockframework', name: 'spock-core', version: versions.spock
10 | testImplementation group: 'org.spockframework', name: 'spock-junit4', version: versions.spock
11 |
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/common/exception/InternalProcessingException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.common.exception;
2 |
3 | public class InternalProcessingException extends RuntimeException {
4 | public InternalProcessingException(Throwable throwable) {
5 | super(throwable);
6 | }
7 |
8 | public InternalProcessingException(String message) {
9 | super(message);
10 | }
11 |
12 | public InternalProcessingException(String message, Throwable throwable) {
13 | super(message, throwable);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/common/message/wrapper/AvroMessageContentUnwrapper.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.common.message.wrapper;
2 |
3 | import jakarta.annotation.Nullable;
4 | import pl.allegro.tech.hermes.api.Topic;
5 |
6 | interface AvroMessageContentUnwrapper {
7 |
8 | AvroMessageContentUnwrapperResult unwrap(
9 | byte[] data, Topic topic, @Nullable Integer headerId, @Nullable Integer headerVersion);
10 |
11 | boolean isApplicable(byte[] data, Topic topic, Integer schemaId, Integer schemaVersion);
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/rate/maxrate/MaxRateParameters.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.rate.maxrate;
2 |
3 | import java.time.Duration;
4 |
5 | public interface MaxRateParameters {
6 |
7 | Duration getBalanceInterval();
8 |
9 | Duration getUpdateInterval();
10 |
11 | int getHistorySize();
12 |
13 | double getBusyTolerance();
14 |
15 | double getMinMaxRate();
16 |
17 | double getMinAllowedChangePercent();
18 |
19 | double getMinSignificantUpdatePercent();
20 | }
21 |
--------------------------------------------------------------------------------
/hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/metric/MetersPair.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.frontend.metric;
2 |
3 | import pl.allegro.tech.hermes.metrics.HermesCounter;
4 |
5 | public class MetersPair {
6 | private final HermesCounter meter1;
7 | private final HermesCounter meter2;
8 |
9 | public MetersPair(HermesCounter meter1, HermesCounter meter2) {
10 | this.meter1 = meter1;
11 | this.meter2 = meter2;
12 | }
13 |
14 | void mark() {
15 | meter1.increment(1L);
16 | meter2.increment(1L);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/config/CorsProperties.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.config;
2 |
3 | import org.springframework.boot.context.properties.ConfigurationProperties;
4 |
5 | @ConfigurationProperties("cors")
6 | public class CorsProperties {
7 |
8 | private String allowedOrigin = "*";
9 |
10 | public String getAllowedOrigin() {
11 | return allowedOrigin;
12 | }
13 |
14 | public void setAllowedOrigin(String allowedOrigin) {
15 | this.allowedOrigin = allowedOrigin;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/hermes-schema/src/main/java/pl/allegro/tech/hermes/schema/SchemaException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.schema;
2 |
3 | import pl.allegro.tech.hermes.api.ErrorCode;
4 |
5 | public abstract class SchemaException extends RuntimeException {
6 |
7 | SchemaException(String message) {
8 | super(message);
9 | }
10 |
11 | SchemaException(Throwable cause) {
12 | super(cause);
13 | }
14 |
15 | SchemaException(String message, Throwable cause) {
16 | super(message, cause);
17 | }
18 |
19 | public abstract ErrorCode getCode();
20 | }
21 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/supervisor/monitor/DifferenceCalculator.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.supervisor.monitor;
2 |
3 | import com.google.common.collect.Sets;
4 | import java.util.Set;
5 |
6 | class DifferenceCalculator {
7 |
8 | static SetDifference calculate(Set collection1, Set collection2) {
9 | return new SetDifference<>(
10 | Sets.difference(collection2, collection1).immutableCopy(),
11 | Sets.difference(collection1, collection2).immutableCopy());
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/hermes-frontend/src/main/java/pl/allegro/tech/hermes/frontend/producer/kafka/ChaosException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.frontend.producer.kafka;
2 |
3 | public class ChaosException extends RuntimeException {
4 |
5 | public ChaosException(String datacenter, long delayMs, String messageId) {
6 | super(
7 | "Scheduled failure occurred for datacenter: "
8 | + datacenter
9 | + ", messageId: "
10 | + messageId
11 | + " after "
12 | + delayMs
13 | + "ms");
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/subscription/consumergroup/ConsumerGroupManager.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.subscription.consumergroup;
2 |
3 | import pl.allegro.tech.hermes.api.Subscription;
4 | import pl.allegro.tech.hermes.api.SubscriptionName;
5 | import pl.allegro.tech.hermes.api.Topic;
6 |
7 | public interface ConsumerGroupManager {
8 |
9 | void createConsumerGroup(Topic topic, Subscription subscription);
10 |
11 | void deleteConsumerGroup(SubscriptionName subscriptionName);
12 | }
13 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/subscription/consumergroup/ConsumerGroupToDeleteRepository.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.subscription.consumergroup;
2 |
3 | import java.util.List;
4 |
5 | public interface ConsumerGroupToDeleteRepository {
6 | void scheduleConsumerGroupToDeleteTask(ConsumerGroupToDelete consumerGroupToDelete);
7 |
8 | void deleteConsumerGroupToDeleteTask(ConsumerGroupToDelete consumerGroupToDelete);
9 |
10 | List getAllConsumerGroupsToDelete();
11 | }
12 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/domain/filtering/NoSuchFilterException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.domain.filtering;
2 |
3 | public class NoSuchFilterException extends FilteringException {
4 | public NoSuchFilterException(Throwable throwable) {
5 | super(throwable);
6 | }
7 |
8 | public NoSuchFilterException(String filterType) {
9 | super("Filter of type '" + filterType + "' not found.");
10 | }
11 |
12 | public NoSuchFilterException(String message, Throwable throwable) {
13 | super(message, throwable);
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/CommonConsumerParameters.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers;
2 |
3 | import pl.allegro.tech.hermes.consumers.consumer.SerialConsumerParameters;
4 | import pl.allegro.tech.hermes.consumers.supervisor.SupervisorParameters;
5 |
6 | public interface CommonConsumerParameters {
7 |
8 | SupervisorParameters getBackgroundSupervisor();
9 |
10 | SerialConsumerParameters getSerialConsumer();
11 |
12 | int getSignalProcessingQueueSize();
13 |
14 | boolean isUseTopicMessageSizeEnabled();
15 | }
16 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/http/Http2ClientHolder.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.sender.http;
2 |
3 | import java.util.Optional;
4 | import org.eclipse.jetty.client.HttpClient;
5 |
6 | public class Http2ClientHolder {
7 |
8 | private final HttpClient http2Client;
9 |
10 | public Http2ClientHolder(HttpClient http2Client) {
11 | this.http2Client = http2Client;
12 | }
13 |
14 | Optional getHttp2Client() {
15 | return Optional.ofNullable(http2Client);
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/infrastructure/query/graph/ObjectGraph.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.infrastructure.query.graph;
2 |
3 | public class ObjectGraph {
4 |
5 | private final Object target;
6 |
7 | private ObjectGraph(Object target) {
8 | this.target = target;
9 | }
10 |
11 | public ObjectAttribute navigate(String path) {
12 | return new JXPathAttribute(target, path);
13 | }
14 |
15 | public static ObjectGraph from(Object target) {
16 | return new ObjectGraph(target);
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/hermes-api/src/main/java/pl/allegro/tech/hermes/api/SearchItem.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.api;
2 |
3 | import com.fasterxml.jackson.annotation.JsonSubTypes;
4 | import com.fasterxml.jackson.annotation.JsonTypeInfo;
5 |
6 | @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")
7 | @JsonSubTypes({
8 | @JsonSubTypes.Type(value = TopicSearchItem.class, name = "TOPIC"),
9 | @JsonSubTypes.Type(value = SubscriptionSearchItem.class, name = "SUBSCRIPTION"),
10 | })
11 | public interface SearchItem {
12 | SearchItemType type();
13 |
14 | String name();
15 | }
16 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/common/kafka/KafkaConsumerPoolException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.common.kafka;
2 |
3 | import pl.allegro.tech.hermes.api.ErrorCode;
4 | import pl.allegro.tech.hermes.common.exception.HermesException;
5 |
6 | public class KafkaConsumerPoolException extends HermesException {
7 |
8 | public KafkaConsumerPoolException(String message, Throwable t) {
9 | super(message, t);
10 | }
11 |
12 | @Override
13 | public ErrorCode getCode() {
14 | return ErrorCode.SIMPLE_CONSUMER_POOL_EXCEPTION;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/domain/group/GroupNotEmptyException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.domain.group;
2 |
3 | import pl.allegro.tech.hermes.api.ErrorCode;
4 | import pl.allegro.tech.hermes.common.exception.HermesException;
5 |
6 | public class GroupNotEmptyException extends HermesException {
7 |
8 | public GroupNotEmptyException(String groupName) {
9 | super(String.format("Group %s is not empty", groupName));
10 | }
11 |
12 | @Override
13 | public ErrorCode getCode() {
14 | return ErrorCode.GROUP_NOT_EMPTY;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/hermes-console/src/components/console-footer/ConsoleFooter.spec.ts:
--------------------------------------------------------------------------------
1 | import { createTestingPiniaWithState } from '@/dummy/store';
2 | import { render } from '@/utils/test-utils';
3 | import ConsoleFooter from '@/components/console-footer/ConsoleFooter.vue';
4 |
5 | describe('ConsoleFooter', () => {
6 | it('renders properly', () => {
7 | // when
8 | const { getByText } = render(ConsoleFooter, {
9 | testPinia: createTestingPiniaWithState(),
10 | });
11 | // then
12 | expect(getByText(/allegro tech & contributors/i)).toBeVisible();
13 | });
14 | });
15 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/domain/filtering/FilterableMessage.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.domain.filtering;
2 |
3 | import java.util.Map;
4 | import java.util.Optional;
5 | import org.apache.avro.Schema;
6 | import pl.allegro.tech.hermes.api.ContentType;
7 | import pl.allegro.tech.hermes.schema.CompiledSchema;
8 |
9 | public interface FilterableMessage {
10 |
11 | ContentType getContentType();
12 |
13 | Map getExternalMetadata();
14 |
15 | byte[] getData();
16 |
17 | Optional> getSchema();
18 | }
19 |
--------------------------------------------------------------------------------
/hermes-metrics/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'java-library'
3 | }
4 |
5 | dependencies {
6 | api group: 'io.dropwizard.metrics', name: 'metrics-core', version: versions.dropwizard_metrics
7 | api group: 'org.apache.commons', name: 'commons-text', version: '1.12.0'
8 | api group: 'io.micrometer', name: 'micrometer-core', version: versions.micrometer_metrics
9 |
10 | testImplementation group: 'org.spockframework', name: 'spock-core', version: versions.spock
11 | testImplementation group: 'org.spockframework', name: 'spock-junit4', version: versions.spock
12 | }
--------------------------------------------------------------------------------
/hermes-tracker/src/main/java/pl/allegro/tech/hermes/tracker/management/LogRepository.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.tracker.management;
2 |
3 | import java.util.List;
4 | import pl.allegro.tech.hermes.api.MessageTrace;
5 | import pl.allegro.tech.hermes.api.SentMessageTrace;
6 |
7 | public interface LogRepository {
8 |
9 | List getLastUndeliveredMessages(
10 | String topicName, String subscriptionName, int limit);
11 |
12 | List getMessageStatus(
13 | String qualifiedTopicName, String subscriptionName, String messageId);
14 | }
15 |
--------------------------------------------------------------------------------
/integration-tests/src/common/java/pl/allegro/tech/hermes/integrationtests/prometheus/PrometheusResponse.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.integrationtests.prometheus;
2 |
3 | import com.fasterxml.jackson.annotation.JsonProperty;
4 | import java.util.List;
5 |
6 | record PrometheusResponse(@JsonProperty("status") String status, @JsonProperty("data") Data data) {
7 |
8 | record Data(
9 | @JsonProperty("resultType") String resultType,
10 | @JsonProperty("result") List results) {}
11 |
12 | record Result(@JsonProperty("value") List values) {}
13 | }
14 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'com.autonomousapps.build-health' version '3.0.2'
3 | }
4 |
5 | rootProject.name='hermes'
6 |
7 | include 'hermes-common',
8 | 'hermes-frontend',
9 | 'hermes-management',
10 | 'hermes-consumers',
11 | 'hermes-api',
12 | 'hermes-client',
13 | 'hermes-test-helper',
14 | 'hermes-tracker',
15 | 'hermes-metrics',
16 | 'hermes-tracker-elasticsearch',
17 | 'hermes-schema',
18 | 'hermes-benchmark',
19 | 'hermes-mock',
20 | 'integration-tests'
21 |
22 |
--------------------------------------------------------------------------------
/hermes-common/src/main/java/pl/allegro/tech/hermes/common/exception/HermesException.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.common.exception;
2 |
3 | import pl.allegro.tech.hermes.api.ErrorCode;
4 |
5 | public abstract class HermesException extends RuntimeException {
6 | public HermesException(Throwable t) {
7 | super(t);
8 | }
9 |
10 | public HermesException(String message) {
11 | super(message);
12 | }
13 |
14 | public HermesException(String message, Throwable cause) {
15 | super(message, cause);
16 | }
17 |
18 | public abstract ErrorCode getCode();
19 | }
20 |
--------------------------------------------------------------------------------
/hermes-console/src/utils/topic-utils/topic-utils.ts:
--------------------------------------------------------------------------------
1 | export function groupName(topicName: string): string {
2 | const topicStartIdx = topicName.lastIndexOf('.');
3 | return topicName.substring(0, topicStartIdx);
4 | }
5 |
6 | export function topicName(qualifiedTopicName: string): string {
7 | const topicStartIdx = qualifiedTopicName.lastIndexOf('.');
8 | return qualifiedTopicName.substring(topicStartIdx + 1);
9 | }
10 |
11 | export function topicQualifiedName(
12 | groupName: string,
13 | topicName: string,
14 | ): string {
15 | return `${groupName}.${topicName}`;
16 | }
17 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/rate/ConsumerRateLimiter.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.rate;
2 |
3 | import pl.allegro.tech.hermes.api.Subscription;
4 |
5 | public interface ConsumerRateLimiter {
6 |
7 | void initialize();
8 |
9 | void shutdown();
10 |
11 | void acquire();
12 |
13 | void acquireFiltered();
14 |
15 | void adjustConsumerRate();
16 |
17 | void updateSubscription(Subscription newSubscription);
18 |
19 | void registerSuccessfulSending();
20 |
21 | void registerFailedSending();
22 | }
23 |
--------------------------------------------------------------------------------
/hermes-consumers/src/main/java/pl/allegro/tech/hermes/consumers/consumer/sender/http/EmptyHttpHeadersProvidersFactory.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.consumers.consumer.sender.http;
2 |
3 | import static java.util.Collections.emptySet;
4 |
5 | import java.util.Collection;
6 | import pl.allegro.tech.hermes.consumers.consumer.sender.http.headers.HttpHeadersProvider;
7 |
8 | public class EmptyHttpHeadersProvidersFactory implements HttpHeadersProvidersFactory {
9 |
10 | @Override
11 | public Collection createAll() {
12 | return emptySet();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/hermes-management/src/main/java/pl/allegro/tech/hermes/management/domain/subscription/consumergroup/ConsumerGroupToDelete.java:
--------------------------------------------------------------------------------
1 | package pl.allegro.tech.hermes.management.domain.subscription.consumergroup;
2 |
3 | import com.fasterxml.jackson.annotation.JsonProperty;
4 | import java.time.Instant;
5 | import pl.allegro.tech.hermes.api.SubscriptionName;
6 |
7 | public record ConsumerGroupToDelete(
8 | @JsonProperty("subscriptionName") SubscriptionName subscriptionName,
9 | @JsonProperty("datacenter") String datacenter,
10 | @JsonProperty("requestedAt") Instant requestedAt) {}
11 |
--------------------------------------------------------------------------------
/hermes-console/src/dummy/constraints.ts:
--------------------------------------------------------------------------------
1 | import type { ConstraintsConfig } from '@/api/constraints';
2 |
3 | export const dummyConstraints: ConstraintsConfig = {
4 | topicConstraints: {
5 | 'pl.group.Topic1': {
6 | consumersNumber: 2,
7 | reason: 'Some reason',
8 | },
9 | 'pl.group.Topic2': {
10 | consumersNumber: 4,
11 | },
12 | },
13 | subscriptionConstraints: {
14 | 'pl.group.Topic$subscription1': {
15 | consumersNumber: 6,
16 | },
17 | 'pl.group.Topic$subscription2': {
18 | consumersNumber: 8,
19 | },
20 | },
21 | };
22 |
--------------------------------------------------------------------------------