commit | 32c83ad1aedaa2f389893de70561f74f683afe57 | [log] [tgz] |
---|---|---|
author | Christoforos Miliotis <christoforos.miliotis.dev@gmail.com> | Thu Nov 02 11:53:28 2023 +0000 |
committer | Christoforos Miliotis <christoforos.miliotis.dev@gmail.com> | Mon Nov 20 19:15:27 2023 +0000 |
tree | 427cc8828f6420cea2da364135dc55745c29bd8d | |
parent | fec27cee2d281e6b22974fe75e73a988b749fdb0 [diff] |
Move message logging to events broker The message log file is currently populated in an inconsistent way when it comes to publishing messages. Publishing of some messages, like index events, are still logged, however anything related to the stream events topic is not, since this functionality was moved from multi-site to events-broker. But it looks like the logging aspect was left out at the time. It makes sense to move all the message logging classes to the `events- broker`, so they are together with the logic that publishes the stream events, and used directly. This way, the clients of the library will not even need to worry (or care) about updating the message log, this will happen transparently. The logic in `StreamEventPublisher` was already dealing with updating the metrics. Incrementing the metrics is another feature that should be tightly coupled with the publishing of the messages, however it looks like some changes are required to allow each client of the library to inject their own broker metrics. This will be done in a separate change. Bug: Issue 294904654 Change-Id: I4e27619a0dde52c29626a33d2bcfb93d5945d509
API of a generic events broker for use with Gerrit Code Review.
Enables the de-coupling between Gerrit, plugins and the different implementations of a generic events broker.
It is a quite common use case for consumers of this library to listen for Gerrit events and to stream them on a specific topic.
Since the implementation of such logic is always the same, this library provides a generic stream events publisher which will perform the relevant operations.
In order to listen and stream gerrit events, consumers of this API need to provide a binding for the StreamEventPublisherConfig
configuration and java.util.concurrent.Executor
binding annotated with StreamEventPublisherExecutor
annotation. A default single threaded implementation (StreamEventPublisherExecutor
) is provided by the library. The last step is to explicitly bind the Stream Events Publisher, as such:
import java.util.concurrent.Executor; import com.gerritforge.gerrit.eventbroker.publisher.StreamEventPublisher; import com.gerritforge.gerrit.eventbroker.publisher.StreamEventPublisherConfig; import com.gerritforge.gerrit.eventbroker.publisher.executor.StreamEventPublisherExecutor; import com.gerritforge.gerrit.eventbroker.publisher.executor.StreamEventPublisherExecutorProvider; import com.google.gerrit.extensions.registration.DynamicSet; import com.google.gerrit.server.events.EventListener; import com.google.inject.AbstractModule; public class SomeModule extends AbstractModule { @Override protected void configure() { long messagePublishingTimeout = 1000L; bind(StreamEventPublisherConfig.class) .toInstance(new StreamEventPublisherConfig( "name_of_the_stream_events_topic", messagePublishingTimeout)); bind(Executor.class).annotatedWith(StreamEventPublisherExecutor.class).toProvider(StreamEventPublisherExecutorProvider.class); DynamicSet.bind(binder(), EventListener.class).to(StreamEventPublisher.class); } }
Alternative way to setup Stream Event Publisher is to use default Guice module StreamEventPublisherModule
:
import com.gerritforge.gerrit.eventbroker.publisher.StreamEventPublisherConfig; import com.gerritforge.gerrit.eventbroker.publisher.StreamEventPublisherModule; import com.google.inject.AbstractModule; import com.google.inject.TypeLiteral; import com.google.inject.name.Names; public class SomeModule extends AbstractModule { @Override protected void configure() { long messagePublishingTimeout = 1000L; bind(StreamEventPublisherConfig.class) .toInstance(new StreamEventPublisherConfig( "name_of_the_stream_events_topic", messagePublishingTimeout)); install(new StreamEventPublisherModule()); } }
Note: To avoid message duplication Stream Events Publisher uses gerrit.instanceId and Event.instanceId to filter out forwarded events.
When StreamEventPublisher
is used user can optionally bind an implementation of the BrokerMetrics` interface. This will allow to collect metrics about successful/failure stream events publishing. If no binding is provided default implementation will skip collecting metrics:
import com.google.gerrit.extensions.registration.DynamicItem; import com.google.inject.AbstractModule; public class SomeModule extends AbstractModule { @Override protected void configure() { DynamicItem.bind(binder(), BrokerMetrics.class) .to(BrokerMetricsImpl.class) .in(Scopes.SINGLETON); } }
Note: BrokerMetrics
implementation must be bound in a plugin module.