소스 검색

ZOOKEEPER-3856: Add a couple metrics to track inflight diff syncs and snap syncs

There are useful metrics in a cluster with a large number of observes:
INFLIGHT_SNAP_COUNT
INFLIGHT_DIFF_COUNT

Author: Jie Huang <jiehuang@fb.com>

Reviewers: Enrico Olivelli <eolivelli@apache.org>, Mate Szalay-Beko <symat@apache.org>

Closes #1374 from jhuan31/ZOOKEEPER-3856
Jie Huang 5 년 전
부모
커밋
5011255880

+ 6 - 0
zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerMetrics.java

@@ -84,6 +84,9 @@ public final class ServerMetrics {
         CONNECTION_TOKEN_DEFICIT = metricsContext.getSummary("connection_token_deficit", DetailLevel.BASIC);
         CONNECTION_TOKEN_DEFICIT = metricsContext.getSummary("connection_token_deficit", DetailLevel.BASIC);
         CONNECTION_REJECTED = metricsContext.getCounter("connection_rejected");
         CONNECTION_REJECTED = metricsContext.getCounter("connection_rejected");
 
 
+        INFLIGHT_SNAP_COUNT = metricsContext.getSummary("inflight_snap_count", DetailLevel.BASIC);
+        INFLIGHT_DIFF_COUNT = metricsContext.getSummary("inflight_diff_count", DetailLevel.BASIC);
+
         WRITE_PER_NAMESPACE = metricsContext.getSummarySet("write_per_namespace", DetailLevel.BASIC);
         WRITE_PER_NAMESPACE = metricsContext.getSummarySet("write_per_namespace", DetailLevel.BASIC);
         READ_PER_NAMESPACE = metricsContext.getSummarySet("read_per_namespace", DetailLevel.BASIC);
         READ_PER_NAMESPACE = metricsContext.getSummarySet("read_per_namespace", DetailLevel.BASIC);
 
 
@@ -308,6 +311,9 @@ public final class ServerMetrics {
     public final Summary CONNECTION_TOKEN_DEFICIT;
     public final Summary CONNECTION_TOKEN_DEFICIT;
     public final Counter CONNECTION_REJECTED;
     public final Counter CONNECTION_REJECTED;
 
 
+    public final Summary INFLIGHT_SNAP_COUNT;
+    public final Summary INFLIGHT_DIFF_COUNT;
+
     public final Counter UNRECOVERABLE_ERROR_COUNT;
     public final Counter UNRECOVERABLE_ERROR_COUNT;
     public final SummarySet WRITE_PER_NAMESPACE;
     public final SummarySet WRITE_PER_NAMESPACE;
     public final SummarySet READ_PER_NAMESPACE;
     public final SummarySet READ_PER_NAMESPACE;

+ 7 - 0
zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/LearnerHandler.java

@@ -556,6 +556,7 @@ public class LearnerHandler extends ZooKeeperThread {
             if (needSnap) {
             if (needSnap) {
                 syncThrottler = learnerMaster.getLearnerSnapSyncThrottler();
                 syncThrottler = learnerMaster.getLearnerSnapSyncThrottler();
                 syncThrottler.beginSync(exemptFromThrottle);
                 syncThrottler.beginSync(exemptFromThrottle);
+                ServerMetrics.getMetrics().INFLIGHT_SNAP_COUNT.add(syncThrottler.getSyncInProgress());
                 try {
                 try {
                     long zxidToSend = learnerMaster.getZKDatabase().getDataTreeLastProcessedZxid();
                     long zxidToSend = learnerMaster.getZKDatabase().getDataTreeLastProcessedZxid();
                     oa.writeRecord(new QuorumPacket(Leader.SNAP, zxidToSend, null, null), "packet");
                     oa.writeRecord(new QuorumPacket(Leader.SNAP, zxidToSend, null, null), "packet");
@@ -581,6 +582,7 @@ public class LearnerHandler extends ZooKeeperThread {
             } else {
             } else {
                 syncThrottler = learnerMaster.getLearnerDiffSyncThrottler();
                 syncThrottler = learnerMaster.getLearnerDiffSyncThrottler();
                 syncThrottler.beginSync(exemptFromThrottle);
                 syncThrottler.beginSync(exemptFromThrottle);
+                ServerMetrics.getMetrics().INFLIGHT_DIFF_COUNT.add(syncThrottler.getSyncInProgress());
                 ServerMetrics.getMetrics().DIFF_COUNT.add(1);
                 ServerMetrics.getMetrics().DIFF_COUNT.add(1);
             }
             }
 
 
@@ -621,6 +623,11 @@ public class LearnerHandler extends ZooKeeperThread {
             syncLimitCheck.start();
             syncLimitCheck.start();
             // sync ends when NEWLEADER-ACK is received
             // sync ends when NEWLEADER-ACK is received
             syncThrottler.endSync();
             syncThrottler.endSync();
+            if (needSnap) {
+                ServerMetrics.getMetrics().INFLIGHT_SNAP_COUNT.add(syncThrottler.getSyncInProgress());
+            } else {
+                ServerMetrics.getMetrics().INFLIGHT_DIFF_COUNT.add(syncThrottler.getSyncInProgress());
+            }
             syncThrottler = null;
             syncThrottler = null;
 
 
             // now that the ack has been processed expect the syncLimit
             // now that the ack has been processed expect the syncLimit