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;
   }
 }
