diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerMetrics.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerMetrics.java index e95949a4e4c..99e9206987b 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerMetrics.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/ServerMetrics.java @@ -134,6 +134,9 @@ private ServerMetrics(MetricsProvider metricsProvider) { SESSIONLESS_CONNECTIONS_EXPIRED = metricsContext.getCounter("sessionless_connections_expired"); STALE_SESSIONS_EXPIRED = metricsContext.getCounter("stale_sessions_expired"); + UNAVAILABLE_TIME = metricsContext.getSummary("unavailable_time", DetailLevel.BASIC); + LEADER_UNAVAILABLE_TIME = metricsContext.getSummary("leader_unavailable_time", DetailLevel.BASIC); + /* * Number of requests that are in the session queue. */ @@ -310,6 +313,9 @@ private ServerMetrics(MetricsProvider metricsProvider) { public final Counter SESSIONLESS_CONNECTIONS_EXPIRED; public final Counter STALE_SESSIONS_EXPIRED; + public final Summary UNAVAILABLE_TIME; + public final Summary LEADER_UNAVAILABLE_TIME; + // Connection throttling related public final Summary CONNECTION_TOKEN_DEFICIT; public final Counter CONNECTION_REJECTED; diff --git a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeer.java b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeer.java index c0a3dece0c1..e56c03ddf80 100644 --- a/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeer.java +++ b/zookeeper-server/src/main/java/org/apache/zookeeper/server/quorum/QuorumPeer.java @@ -54,6 +54,7 @@ import org.apache.zookeeper.common.AtomicFileWritingIdiom; import org.apache.zookeeper.common.AtomicFileWritingIdiom.WriterStatement; import org.apache.zookeeper.common.QuorumX509Util; +import org.apache.zookeeper.common.Time; import org.apache.zookeeper.common.X509Exception; import org.apache.zookeeper.jmx.MBeanRegistry; import org.apache.zookeeper.jmx.ZKMBeanInfo; @@ -530,6 +531,7 @@ public enum LearnerType { */ public long start_fle, end_fle; // fle = fast leader election public static final String FLE_TIME_UNIT = "MS"; + private long unavailableStartTime; /* * Default value of peer is participant @@ -859,6 +861,14 @@ public synchronized void setPeerState(ServerState newState) { } public void setZabState(ZabState zabState) { + if ((zabState == ZabState.BROADCAST) && (unavailableStartTime != 0)) { + long unavailableTime = Time.currentElapsedTime() - unavailableStartTime; + ServerMetrics.getMetrics().UNAVAILABLE_TIME.add(unavailableTime); + if (getPeerState() == ServerState.LEADING) { + ServerMetrics.getMetrics().LEADER_UNAVAILABLE_TIME.add(unavailableTime); + } + unavailableStartTime = 0; + } this.zabState.set(zabState); LOG.info("Peer state changed: {}", getDetailedPeerState()); } @@ -1369,6 +1379,10 @@ public void run() { * Main loop */ while (running) { + if (unavailableStartTime == 0) { + unavailableStartTime = Time.currentElapsedTime(); + } + switch (getPeerState()) { case LOOKING: LOG.info("LOOKING");