Broker publisher metric for number of message published
This metric will help us to monitor if publisher
is working properly
Feature: Issue 10872
Change-Id: I92712a42e5e80d0ab1bd8bc98a207d8ae0db23bb
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerMetrics.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerMetrics.java
new file mode 100644
index 0000000..f6be65a
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerMetrics.java
@@ -0,0 +1,58 @@
+// Copyright (C) 2019 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.multisite.broker;
+
+import com.google.gerrit.metrics.Counter1;
+import com.google.gerrit.metrics.Description;
+import com.google.gerrit.metrics.Field;
+import com.google.gerrit.metrics.MetricMaker;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+
+@Singleton
+public class BrokerMetrics {
+ private static final String PUBLISHER_SUCCESS_COUNTER = "broker_msg_publisher_counter";
+ private static final String PUBLISHER_FAILURE_COUNTER = "broker_msg_publisher_failure_counter";
+
+ private final Counter1<String> brokerPublisherSuccessCounter;
+ private final Counter1<String> brokerPublisherFailureCounter;
+
+ @Inject
+ public BrokerMetrics(MetricMaker metricMaker) {
+
+ this.brokerPublisherSuccessCounter =
+ metricMaker.newCounter(
+ "multi_site/broker/broker_message_publisher_counter",
+ new Description("Number of messages published by the broker publisher")
+ .setRate()
+ .setUnit("messages"),
+ Field.ofString(PUBLISHER_SUCCESS_COUNTER, "Broker message published count"));
+ this.brokerPublisherFailureCounter =
+ metricMaker.newCounter(
+ "multi_site/broker/broker_message_publisher_failure_counter",
+ new Description("Number of messages failed to publish by the broker publisher")
+ .setRate()
+ .setUnit("errors"),
+ Field.ofString(PUBLISHER_FAILURE_COUNTER, "Broker failed to publish message count"));
+ }
+
+ public void incrementBrokerPublishedMessage() {
+ brokerPublisherSuccessCounter.increment(PUBLISHER_SUCCESS_COUNTER);
+ }
+
+ public void incrementBrokerFailedToPublishMessage() {
+ brokerPublisherFailureCounter.increment(PUBLISHER_FAILURE_COUNTER);
+ }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerPublisher.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerPublisher.java
index 4dca9e9..62716e6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerPublisher.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/broker/BrokerPublisher.java
@@ -39,17 +39,20 @@
private final Gson gson;
private final UUID instanceId;
private final MessageLogger msgLog;
+ private final BrokerMetrics brokerMetrics;
@Inject
public BrokerPublisher(
BrokerSession session,
@BrokerGson Gson gson,
@InstanceId UUID instanceId,
- MessageLogger msgLog) {
+ MessageLogger msgLog,
+ BrokerMetrics brokerMetrics) {
this.session = session;
this.gson = gson;
this.instanceId = instanceId;
this.msgLog = msgLog;
+ this.brokerMetrics = brokerMetrics;
}
@Override
@@ -73,7 +76,13 @@
SourceAwareEventWrapper brokerEvent = toBrokerEvent(event);
msgLog.log(Direction.PUBLISH, brokerEvent);
- return session.publishEvent(eventType, getPayload(brokerEvent));
+ Boolean eventPublished = session.publishEvent(eventType, getPayload(brokerEvent));
+ if (eventPublished) {
+ brokerMetrics.incrementBrokerPublishedMessage();
+ } else {
+ brokerMetrics.incrementBrokerFailedToPublishMessage();
+ }
+ return eventPublished;
}
private String getPayload(SourceAwareEventWrapper event) {
diff --git a/src/main/resources/Documentation/about.md b/src/main/resources/Documentation/about.md
index 93154d6..a1db9d4 100644
--- a/src/main/resources/Documentation/about.md
+++ b/src/main/resources/Documentation/about.md
@@ -87,3 +87,16 @@
For further information and supported options, refer to [config](config.md)
documentation.
+
+## Metrics
+
+@PLUGIN@ plugin exposes following metrics:
+
+### Broker message publisher
+* Broker message published count
+
+`metric=multi_site/broker/broker_message_publisher_counter/broker_msg_publisher_counter, type=com.codahale.metrics.Meter`
+
+* Broker failed to publish message count
+
+`metric=multi_site/broker/broker_message_publisher_failure_counter/broker_msg_publisher_failure_counter, type=com.codahale.metrics.Meter`
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/broker/kafka/BrokerPublisherTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/broker/kafka/BrokerPublisherTest.java
index 8131a3f..36408ba 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/broker/kafka/BrokerPublisherTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/broker/kafka/BrokerPublisherTest.java
@@ -15,6 +15,10 @@
package com.googlesource.gerrit.plugins.multisite.broker.kafka;
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.only;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
import com.google.gerrit.extensions.client.ChangeKind;
import com.google.gerrit.reviewdb.client.Account;
@@ -23,12 +27,14 @@
import com.google.gerrit.server.data.AccountAttribute;
import com.google.gerrit.server.data.ApprovalAttribute;
import com.google.gerrit.server.events.CommentAddedEvent;
+import com.google.gerrit.server.events.Event;
import com.google.gerrit.server.util.time.TimeUtil;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.googlesource.gerrit.plugins.multisite.DisabledMessageLogger;
import com.googlesource.gerrit.plugins.multisite.MessageLogger;
+import com.googlesource.gerrit.plugins.multisite.broker.BrokerMetrics;
import com.googlesource.gerrit.plugins.multisite.broker.BrokerPublisher;
import com.googlesource.gerrit.plugins.multisite.broker.BrokerSession;
import com.googlesource.gerrit.plugins.multisite.broker.GsonProvider;
@@ -36,65 +42,44 @@
import java.util.UUID;
import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+@RunWith(MockitoJUnitRunner.class)
public class BrokerPublisherTest {
+
+ @Mock private BrokerMetrics brokerMetrics;
+ @Mock private BrokerSession session;
private BrokerPublisher publisher;
+
private MessageLogger NO_MSG_LOG = new DisabledMessageLogger();
private Gson gson = new GsonProvider().get();
+ private String accountName = "Foo Bar";
+ private String accountEmail = "foo@bar.com";
+ private String accountUsername = "foobar";
+ private String approvalType = ChangeKind.REWORK.toString();
+
+ private String approvalDescription = "ApprovalDescription";
+ private String approvalValue = "+2";
+ private String oldApprovalValue = "+1";
+ private Long approvalGrantedOn = 123L;
+ private String commentDescription = "Patch Set 1: Code-Review+2";
+ private String projectName = "project";
+ private String refName = "refs/heads/master";
+ private String changeId = "Iabcd1234abcd1234abcd1234abcd1234abcd1234";
+ private Long eventCreatedOn = 123L;
+
@Before
public void setUp() {
- publisher = new BrokerPublisher(new TestBrokerSession(), gson, UUID.randomUUID(), NO_MSG_LOG);
+ publisher = new BrokerPublisher(session, gson, UUID.randomUUID(), NO_MSG_LOG, brokerMetrics);
}
@Test
public void shouldSerializeCommentAddedEvent() {
- final String accountName = "Foo Bar";
- final String accountEmail = "foo@bar.com";
- final String accountUsername = "foobar";
- final String approvalType = ChangeKind.REWORK.toString();
-
- final String approvalDescription = "ApprovalDescription";
- final String approvalValue = "+2";
- final String oldApprovalValue = "+1";
- final Long approvalGrantedOn = 123L;
- final String commentDescription = "Patch Set 1: Code-Review+2";
- final String projectName = "project";
- final String refName = "refs/heads/master";
- final String changeId = "Iabcd1234abcd1234abcd1234abcd1234abcd1234";
- final Long eventCreatedOn = 123L;
-
- final Change change =
- new Change(
- new Change.Key(changeId),
- new Change.Id(1),
- new Account.Id(1),
- new Branch.NameKey(projectName, refName),
- TimeUtil.nowTs());
-
- CommentAddedEvent event = new CommentAddedEvent(change);
- AccountAttribute accountAttribute = new AccountAttribute();
- accountAttribute.email = accountEmail;
- accountAttribute.name = accountName;
- accountAttribute.username = accountUsername;
-
- event.eventCreatedOn = eventCreatedOn;
- event.approvals =
- () -> {
- ApprovalAttribute approvalAttribute = new ApprovalAttribute();
- approvalAttribute.value = approvalValue;
- approvalAttribute.oldValue = oldApprovalValue;
- approvalAttribute.description = approvalDescription;
- approvalAttribute.by = accountAttribute;
- approvalAttribute.type = ChangeKind.REWORK.toString();
- approvalAttribute.grantedOn = approvalGrantedOn;
-
- return new ApprovalAttribute[] {approvalAttribute};
- };
-
- event.author = () -> accountAttribute;
- event.comment = commentDescription;
+ Event event = createSampleEvent();
String expectedSerializedCommentEvent =
"{\"author\": {\"name\": \""
@@ -140,22 +125,55 @@
assertThat(publisher.eventToJson(event).equals(expectedCommentEventJsonObject)).isTrue();
}
- private static class TestBrokerSession implements BrokerSession {
+ @Test
+ public void shouldIncrementBrokerMetricCounterWhenMessagePublished() {
+ Event event = createSampleEvent();
+ when(session.publishEvent(any(), any())).thenReturn(true);
+ publisher.publishEvent(EventFamily.INDEX_EVENT, event);
+ verify(brokerMetrics, only()).incrementBrokerPublishedMessage();
+ }
- @Override
- public boolean isOpen() {
- return false;
- }
+ @Test
+ public void shouldIncrementBrokerFailedMetricCounterWhenMessagePublished() {
+ Event event = createSampleEvent();
+ when(session.publishEvent(any(), any())).thenReturn(false);
- @Override
- public void connect() {}
+ publisher.publishEvent(EventFamily.INDEX_EVENT, event);
+ verify(brokerMetrics, only()).incrementBrokerFailedToPublishMessage();
+ }
- @Override
- public void disconnect() {}
+ private Event createSampleEvent() {
+ final Change change =
+ new Change(
+ new Change.Key(changeId),
+ new Change.Id(1),
+ new Account.Id(1),
+ new Branch.NameKey(projectName, refName),
+ TimeUtil.nowTs());
- @Override
- public boolean publishEvent(EventFamily eventFamily, String payload) {
- return false;
- }
+ CommentAddedEvent event = new CommentAddedEvent(change);
+ AccountAttribute accountAttribute = new AccountAttribute();
+ accountAttribute.email = accountEmail;
+ accountAttribute.name = accountName;
+ accountAttribute.username = accountUsername;
+
+ event.eventCreatedOn = eventCreatedOn;
+ event.approvals =
+ () -> {
+ ApprovalAttribute approvalAttribute = new ApprovalAttribute();
+ approvalAttribute.value = approvalValue;
+ approvalAttribute.oldValue = oldApprovalValue;
+ approvalAttribute.description = approvalDescription;
+ approvalAttribute.by = accountAttribute;
+ approvalAttribute.type = ChangeKind.REWORK.toString();
+ approvalAttribute.grantedOn = approvalGrantedOn;
+
+ return new ApprovalAttribute[] {approvalAttribute};
+ };
+
+ event.author = () -> accountAttribute;
+ event.comment = commentDescription;
+
+ return event;
}
}