This is an automated email from the ASF dual-hosted git repository.

dragonyliu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ratis.git


The following commit(s) were added to refs/heads/master by this push:
     new 8fbe434ef RATIS-1704. Fix SuppressWarnings("VisibilityModifier") in 
RatisMetrics. (#742)
8fbe434ef is described below

commit 8fbe434efad64436e5505f5a03a4ef048a425a0a
Author: Tsz-Wo Nicholas Sze <[email protected]>
AuthorDate: Fri Sep 16 10:12:25 2022 +0800

    RATIS-1704. Fix SuppressWarnings("VisibilityModifier") in RatisMetrics. 
(#742)
    
    * RATIS-1704. Fix SuppressWarnings("VisibilityModifier") in RatisMetrics.
    
    * Address review comments.
---
 .../ratis/grpc/metrics/GrpcServerMetrics.java      | 34 +++------
 .../apache/ratis/grpc/metrics/MessageMetrics.java  | 65 +++++++++++-----
 .../org/apache/ratis/metrics/RatisMetrics.java     | 46 +++++++++--
 .../ratis/metrics/impl/MetricRegistriesImpl.java   |  5 +-
 .../metrics/impl/MetricRegistryFactoryImpl.java    |  3 +-
 .../netty/metrics/NettyServerStreamRpcMetrics.java | 41 ++++++++--
 .../ratis/server/impl/StateMachineMetrics.java     | 13 ++--
 .../server/metrics/LeaderElectionMetrics.java      | 25 ++++--
 .../ratis/server/metrics/LogAppenderMetrics.java   | 10 +--
 .../ratis/server/metrics/RaftLogMetricsBase.java   | 15 ++--
 .../server/metrics/RaftServerMetricsImpl.java      | 89 ++++++++++------------
 .../server/metrics/SegmentedRaftLogMetrics.java    | 60 +++++++++------
 .../ratis/server/impl/LeaderElectionTests.java     |  2 +-
 .../apache/ratis/grpc/TestRaftServerWithGrpc.java  | 12 +--
 .../ratis/server/raftlog/TestRaftLogMetrics.java   |  2 +-
 .../raftlog/segmented/TestSegmentedRaftLog.java    |  4 +-
 16 files changed, 259 insertions(+), 167 deletions(-)

diff --git 
a/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/GrpcServerMetrics.java 
b/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/GrpcServerMetrics.java
index 1ffe2ee4a..785e308d7 100644
--- 
a/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/GrpcServerMetrics.java
+++ 
b/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/GrpcServerMetrics.java
@@ -51,10 +51,10 @@ public class GrpcServerMetrics extends RatisMetrics {
   public static final String RATIS_GRPC_METRICS_REQUESTS_COUNT = 
"num_requests";
   public static final String RATIS_GRPC_INSTALL_SNAPSHOT_COUNT = 
"num_install_snapshot";
 
-  private final LongCounter requestRetry;
-  private final LongCounter requestInstallSnapshot;
+  private final LongCounter requestRetry = 
getRegistry().counter(RATIS_GRPC_METRICS_REQUEST_RETRY_COUNT);
+  private final LongCounter requestInstallSnapshot = 
getRegistry().counter(RATIS_GRPC_INSTALL_SNAPSHOT_COUNT);
 
-  private final Function<Boolean, LongCounter> requestCreate;
+  private final Function<Boolean, LongCounter> requestCreate = 
newHeartbeatCounter(RATIS_GRPC_METRICS_REQUESTS_COUNT);
 
   private final Map<String, Function<Boolean, LongCounter>> requestSuccess = 
new ConcurrentHashMap<>();
   private final Map<String, Function<Boolean, LongCounter>> requestTimeout = 
new ConcurrentHashMap<>();
@@ -66,15 +66,10 @@ public class GrpcServerMetrics extends RatisMetrics {
   private final Map<String, String> appendLogLatency = new 
ConcurrentHashMap<>();
 
   public GrpcServerMetrics(String serverId) {
-    registry = getMetricRegistryForGrpcServer(serverId);
-
-    requestRetry = registry.counter(RATIS_GRPC_METRICS_REQUEST_RETRY_COUNT);
-    requestInstallSnapshot = 
registry.counter(RATIS_GRPC_INSTALL_SNAPSHOT_COUNT);
-
-    requestCreate = newHeartbeatCounter(RATIS_GRPC_METRICS_REQUESTS_COUNT);
+    super(createRegistry(serverId));
   }
 
-  private RatisMetricRegistry getMetricRegistryForGrpcServer(String serverId) {
+  private static RatisMetricRegistry createRegistry(String serverId) {
     return create(new MetricRegistryInfo(serverId,
         RATIS_GRPC_METRICS_APP_NAME,
         RATIS_GRPC_METRICS_COMP_NAME, RATIS_GRPC_METRICS_DESC));
@@ -84,7 +79,7 @@ public class GrpcServerMetrics extends RatisMetrics {
     final Map<String, String> map = isHeartbeat ? heartbeatLatency : 
appendLogLatency;
     final String name = map.computeIfAbsent(follower,
         key -> String.format(RATIS_GRPC_METRICS_LOG_APPENDER_LATENCY + 
getHeartbeatSuffix(isHeartbeat), key));
-    return registry.timer(name);
+    return getRegistry().timer(name);
   }
 
   public void onRequestRetry() {
@@ -105,7 +100,7 @@ public class GrpcServerMetrics extends RatisMetrics {
   }
 
   private LongCounter newRequestNotLeader(String follower) {
-    return 
registry.counter(String.format(RATIS_GRPC_METRICS_LOG_APPENDER_NOT_LEADER, 
follower));
+    return 
getRegistry().counter(String.format(RATIS_GRPC_METRICS_LOG_APPENDER_NOT_LEADER, 
follower));
   }
 
   public void onRequestNotLeader(String follower) {
@@ -113,7 +108,7 @@ public class GrpcServerMetrics extends RatisMetrics {
   }
 
   private LongCounter newRequestInconsistency(String follower) {
-    return 
registry.counter(String.format(RATIS_GRPC_METRICS_LOG_APPENDER_INCONSISTENCY, 
follower));
+    return 
getRegistry().counter(String.format(RATIS_GRPC_METRICS_LOG_APPENDER_INCONSISTENCY,
 follower));
   }
 
   public void onRequestInconsistency(String follower) {
@@ -130,20 +125,11 @@ public class GrpcServerMetrics extends RatisMetrics {
   }
 
   public void addPendingRequestsCount(String follower, Supplier<Integer> 
pendinglogQueueSize) {
-    
registry.gauge(String.format(RATIS_GRPC_METRICS_LOG_APPENDER_PENDING_COUNT, 
follower), () -> pendinglogQueueSize);
+    final String name = 
String.format(RATIS_GRPC_METRICS_LOG_APPENDER_PENDING_COUNT, follower);
+    getRegistry().gauge(name, () -> pendinglogQueueSize);
   }
 
   public void onInstallSnapshot() {
     requestInstallSnapshot.inc();
   }
-
-  private Function<Boolean, LongCounter> newHeartbeatCounter(String prefix) {
-    final LongCounter trueCounter = registry.counter(prefix + 
getHeartbeatSuffix(true));
-    final LongCounter falseCounter = registry.counter(prefix + 
getHeartbeatSuffix(false));
-    return b -> b? trueCounter : falseCounter;
-  }
-
-  public static String getHeartbeatSuffix(boolean heartbeat) {
-    return heartbeat ? "_heartbeat" : "";
-  }
 }
diff --git 
a/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/MessageMetrics.java 
b/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/MessageMetrics.java
index 4056c7ae7..b152c6709 100644
--- a/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/MessageMetrics.java
+++ b/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/MessageMetrics.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -17,49 +17,72 @@
  */
 package org.apache.ratis.grpc.metrics;
 
+import org.apache.ratis.metrics.LongCounter;
 import org.apache.ratis.metrics.MetricRegistryInfo;
+import org.apache.ratis.metrics.RatisMetricRegistry;
 import org.apache.ratis.metrics.RatisMetrics;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
+import java.util.Map;
 
 public class MessageMetrics extends RatisMetrics {
-  static final Logger LOG = LoggerFactory.getLogger(MessageMetrics.class);
   public static final String GRPC_MESSAGE_METRICS = "%s_message_metrics";
   public static final String GRPC_MESSAGE_METRICS_DESC = "Outbound/Inbound 
message counters";
 
+  private enum Type {
+    STARTED("_started_total"),
+    COMPLETED("_completed_total"),
+    RECEIVED("_received_executed");
+
+    private final String suffix;
+
+    Type(String suffix) {
+      this.suffix = suffix;
+    }
+
+    String getSuffix() {
+      return suffix;
+    }
+  }
+
+  private final Map<Type, Map<String, LongCounter>> types;
+
   public MessageMetrics(String endpointId, String endpointType) {
-    this.registry = create(
-        new MetricRegistryInfo(endpointId,
-            RATIS_APPLICATION_NAME_METRICS,
-            String.format(GRPC_MESSAGE_METRICS, endpointType),
-            GRPC_MESSAGE_METRICS_DESC)
-    );
+    super(createRegistry(endpointId, endpointType));
+    this.types = newCounterMaps(Type.class);
+  }
+
+  private static RatisMetricRegistry createRegistry(String endpointId, String 
endpointType) {
+    final String name = String.format(GRPC_MESSAGE_METRICS, endpointType);
+    return create(new MetricRegistryInfo(endpointId,
+        RATIS_APPLICATION_NAME_METRICS, name, GRPC_MESSAGE_METRICS_DESC));
+  }
+
+  private void inc(String metricNamePrefix, Type t) {
+    types.get(t)
+        .computeIfAbsent(metricNamePrefix, prefix -> 
getRegistry().counter(prefix + t.getSuffix()))
+        .inc();
   }
 
   /**
    * Increments the count of RPCs that are started.
    * Both client and server use this.
-   * @param rpcType
    */
-  public void rpcStarted(String rpcType){
-    registry.counter(rpcType + "_started_total").inc();
+  public void rpcStarted(String metricNamePrefix){
+    inc(metricNamePrefix, Type.STARTED);
   }
 
   /**
    * Increments the count of RPCs that were started and got completed.
    * Both client and server use this.
-   * @param rpcType
    */
-  public void rpcCompleted(String rpcType){
-    registry.counter(rpcType + "_completed_total").inc();
+  public void rpcCompleted(String metricNamePrefix){
+    inc(metricNamePrefix, Type.COMPLETED);
   }
 
   /**
-   * increments the count of RPCs recived on the server.
-   * @param rpcType
+   * Increments the count of RPCs received on the server.
    */
-  public void rpcReceived(String rpcType){
-    registry.counter(rpcType + "_received_executed").inc();
+  public void rpcReceived(String metricNamePrefix){
+    inc(metricNamePrefix, Type.RECEIVED);
   }
-
 }
diff --git 
a/ratis-metrics/src/main/java/org/apache/ratis/metrics/RatisMetrics.java 
b/ratis-metrics/src/main/java/org/apache/ratis/metrics/RatisMetrics.java
index 2793797a1..7481394ee 100644
--- a/ratis-metrics/src/main/java/org/apache/ratis/metrics/RatisMetrics.java
+++ b/ratis-metrics/src/main/java/org/apache/ratis/metrics/RatisMetrics.java
@@ -18,7 +18,13 @@
 
 package org.apache.ratis.metrics;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.Map;
 import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -27,8 +33,28 @@ public class RatisMetrics {
   static final Logger LOG = LoggerFactory.getLogger(RatisMetrics.class);
   public static final String RATIS_APPLICATION_NAME_METRICS = "ratis";
 
-  @SuppressWarnings("VisibilityModifier")
-  protected RatisMetricRegistry registry;
+  public static String getHeartbeatSuffix(boolean heartbeat) {
+    return heartbeat ? "_heartbeat" : "";
+  }
+
+  private static <T> Function<Boolean, T> newHeartbeatFunction(String prefix, 
Function<String, T> function) {
+    final T trueValue = function.apply(prefix + getHeartbeatSuffix(true));
+    final T falseValue = function.apply(prefix + getHeartbeatSuffix(false));
+    return b -> b? trueValue: falseValue;
+  }
+
+  protected static <T extends Enum<T>> Map<T, Map<String, LongCounter>> 
newCounterMaps(Class<T> clazz) {
+    final EnumMap<T,Map<String, LongCounter>> maps = new EnumMap<>(clazz);
+    Arrays.stream(clazz.getEnumConstants()).forEach(t -> maps.put(t, new 
ConcurrentHashMap<>()));
+    return Collections.unmodifiableMap(maps);
+  }
+
+  protected static <T extends Enum<T>> Map<T, Timekeeper> newTimerMap(
+      Class<T> clazz, Function<T, Timekeeper> constructor) {
+    final EnumMap<T, Timekeeper> map = new EnumMap<>(clazz);
+    Arrays.stream(clazz.getEnumConstants()).forEach(t -> map.put(t, 
constructor.apply(t)));
+    return Collections.unmodifiableMap(map);
+  }
 
   protected static RatisMetricRegistry create(MetricRegistryInfo info) {
     Optional<RatisMetricRegistry> metricRegistry = 
MetricRegistries.global().get(info);
@@ -40,6 +66,12 @@ public class RatisMetrics {
     });
   }
 
+  private final RatisMetricRegistry registry;
+
+  protected RatisMetrics(RatisMetricRegistry registry) {
+    this.registry = registry;
+  }
+
   public void unregister() {
     MetricRegistryInfo info = registry.getMetricRegistryInfo();
     if (LOG.isDebugEnabled()) {
@@ -51,11 +83,15 @@ public class RatisMetrics {
     }
   }
 
-  public RatisMetricRegistry getRegistry() {
+  public final RatisMetricRegistry getRegistry() {
     return registry;
   }
 
-  protected Timekeeper getTimer(String timerName) {
-    return getRegistry().timer(timerName);
+  protected Function<Boolean, Timekeeper> newHeartbeatTimer(String prefix) {
+    return newHeartbeatFunction(prefix, getRegistry()::timer);
+  }
+
+  protected Function<Boolean, LongCounter> newHeartbeatCounter(String prefix) {
+    return newHeartbeatFunction(prefix, getRegistry()::counter);
   }
 }
diff --git 
a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistriesImpl.java
 
b/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistriesImpl.java
index f4ec686fd..e4822a968 100644
--- 
a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistriesImpl.java
+++ 
b/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistriesImpl.java
@@ -26,7 +26,6 @@ import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.function.Consumer;
 
 import org.apache.ratis.metrics.MetricRegistries;
-import org.apache.ratis.metrics.MetricRegistryFactory;
 import org.apache.ratis.metrics.MetricRegistryInfo;
 import org.apache.ratis.metrics.RatisMetricRegistry;
 import org.apache.ratis.util.TimeDuration;
@@ -44,7 +43,7 @@ public class MetricRegistriesImpl extends MetricRegistries {
 
   private final List<Consumer<RatisMetricRegistry>> stopReporters = new 
CopyOnWriteArrayList<>();
 
-  private final MetricRegistryFactory factory;
+  private final MetricRegistryFactoryImpl factory;
 
   private final RefCountingMap<MetricRegistryInfo, RatisMetricRegistry> 
registries;
 
@@ -52,7 +51,7 @@ public class MetricRegistriesImpl extends MetricRegistries {
     this(new MetricRegistryFactoryImpl());
   }
 
-  public MetricRegistriesImpl(MetricRegistryFactory factory) {
+  MetricRegistriesImpl(MetricRegistryFactoryImpl factory) {
     this.factory = factory;
     this.registries = new RefCountingMap<>();
   }
diff --git 
a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistryFactoryImpl.java
 
b/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistryFactoryImpl.java
index ae33e6256..124467d58 100644
--- 
a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistryFactoryImpl.java
+++ 
b/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/MetricRegistryFactoryImpl.java
@@ -19,11 +19,10 @@ package org.apache.ratis.metrics.impl;
 
 import org.apache.ratis.metrics.MetricRegistryFactory;
 import org.apache.ratis.metrics.MetricRegistryInfo;
-import org.apache.ratis.metrics.RatisMetricRegistry;
 
 public class MetricRegistryFactoryImpl implements MetricRegistryFactory {
   @Override
-  public RatisMetricRegistry create(MetricRegistryInfo info) {
+  public RatisMetricRegistryImpl create(MetricRegistryInfo info) {
     return new RatisMetricRegistryImpl(info);
   }
 }
diff --git 
a/ratis-netty/src/main/java/org/apache/ratis/netty/metrics/NettyServerStreamRpcMetrics.java
 
b/ratis-netty/src/main/java/org/apache/ratis/netty/metrics/NettyServerStreamRpcMetrics.java
index a613acb9e..d29dadab9 100644
--- 
a/ratis-netty/src/main/java/org/apache/ratis/netty/metrics/NettyServerStreamRpcMetrics.java
+++ 
b/ratis-netty/src/main/java/org/apache/ratis/netty/metrics/NettyServerStreamRpcMetrics.java
@@ -17,12 +17,16 @@
  */
 package org.apache.ratis.netty.metrics;
 
+import org.apache.ratis.metrics.LongCounter;
 import org.apache.ratis.metrics.MetricRegistryInfo;
 import org.apache.ratis.metrics.RatisMetricRegistry;
 import org.apache.ratis.metrics.RatisMetrics;
 import org.apache.ratis.metrics.Timekeeper;
 
 import java.util.Locale;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Function;
 
 public class NettyServerStreamRpcMetrics extends RatisMetrics {
   private static final String METRICS_APP_NAME = "ratis_netty";
@@ -88,11 +92,32 @@ public class NettyServerStreamRpcMetrics extends 
RatisMetrics {
     }
   }
 
+  private enum Op {
+    Create(RequestType::getNumRequestsString),
+    Success(RequestType::getSuccessCountString),
+    Fail(RequestType::getFailCountString);
+
+    private final Function<RequestType, String> stringFunction;
+
+    Op(Function<RequestType, String> stringFunction) {
+      this.stringFunction = stringFunction;
+    }
+
+    String getString(RequestType type) {
+      return stringFunction.apply(type);
+    }
+  }
+
+  private final Map<String, Timekeeper> latencyTimers = new 
ConcurrentHashMap<>();
+  private final Map<Op, Map<String, LongCounter>> ops;
+
   public NettyServerStreamRpcMetrics(String serverId) {
-    registry = getMetricRegistryForGrpcServer(serverId);
+    super(createRegistry(serverId));
+
+    this.ops = newCounterMaps(Op.class);
   }
 
-  private RatisMetricRegistry getMetricRegistryForGrpcServer(String serverId) {
+  private static RatisMetricRegistry createRegistry(String serverId) {
     return create(new MetricRegistryInfo(serverId,
         METRICS_APP_NAME, METRICS_COMP_NAME, METRICS_DESC));
   }
@@ -102,18 +127,22 @@ public class NettyServerStreamRpcMetrics extends 
RatisMetrics {
   }
 
   public Timekeeper getLatencyTimer(RequestType type) {
-    return registry.timer(type.getLatencyString());
+    return latencyTimers.computeIfAbsent(type.getLatencyString(), 
getRegistry()::timer);
+  }
+
+  private void inc(Op op, RequestType type) {
+    ops.get(op).computeIfAbsent(op.getString(type), 
getRegistry()::counter).inc();
   }
 
   public void onRequestCreate(RequestType type) {
-    registry.counter(type.getNumRequestsString()).inc();
+    inc(Op.Create, type);
   }
 
   public void onRequestSuccess(RequestType type) {
-    registry.counter(type.getSuccessCountString()).inc();
+    inc(Op.Success, type);
   }
 
   public void onRequestFail(RequestType type) {
-    registry.counter(type.getFailCountString()).inc();
+    inc(Op.Fail, type);
   }
 }
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineMetrics.java
 
b/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineMetrics.java
index 690faad47..2b316977d 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineMetrics.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineMetrics.java
@@ -52,21 +52,24 @@ public final class StateMachineMetrics extends RatisMetrics 
{
     return new StateMachineMetrics(serverId, getApplied, getApplyCompleted);
   }
 
+  private final Timekeeper takeSnapshotTimer = 
getRegistry().timer(STATEMACHINE_TAKE_SNAPSHOT_TIMER);
+
   private StateMachineMetrics(String serverId, LongSupplier getApplied,
       LongSupplier getApplyCompleted) {
-    registry = getMetricRegistryForStateMachine(serverId);
-    registry.gauge(STATEMACHINE_APPLIED_INDEX_GAUGE, () -> 
getApplied::getAsLong);
-    registry.gauge(STATEMACHINE_APPLY_COMPLETED_GAUGE, () -> 
getApplyCompleted::getAsLong);
+    super(createRegistry(serverId));
+
+    getRegistry().gauge(STATEMACHINE_APPLIED_INDEX_GAUGE, () -> 
getApplied::getAsLong);
+    getRegistry().gauge(STATEMACHINE_APPLY_COMPLETED_GAUGE, () -> 
getApplyCompleted::getAsLong);
   }
 
-  private RatisMetricRegistry getMetricRegistryForStateMachine(String 
serverId) {
+  private static RatisMetricRegistry createRegistry(String serverId) {
     return create(new MetricRegistryInfo(serverId,
         RATIS_APPLICATION_NAME_METRICS,
         RATIS_STATEMACHINE_METRICS, RATIS_STATEMACHINE_METRICS_DESC));
   }
 
   public Timekeeper getTakeSnapshotTimer() {
-    return registry.timer(STATEMACHINE_TAKE_SNAPSHOT_TIMER);
+    return takeSnapshotTimer;
   }
 
 }
\ No newline at end of file
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/metrics/LeaderElectionMetrics.java
 
b/ratis-server/src/main/java/org/apache/ratis/server/metrics/LeaderElectionMetrics.java
index 77083106f..7447498d4 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/metrics/LeaderElectionMetrics.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/metrics/LeaderElectionMetrics.java
@@ -18,6 +18,7 @@
 
 package org.apache.ratis.server.metrics;
 
+import org.apache.ratis.metrics.LongCounter;
 import org.apache.ratis.metrics.MetricRegistryInfo;
 import org.apache.ratis.metrics.RatisMetricRegistry;
 import org.apache.ratis.metrics.RatisMetrics;
@@ -43,16 +44,24 @@ public final class LeaderElectionMetrics extends 
RatisMetrics {
   public static final String TRANSFER_LEADERSHIP_COUNT_METRIC = 
"transferLeadershipCount";
 
   public static final String LAST_LEADER_ELECTION_ELAPSED_TIME = 
"lastLeaderElectionElapsedTime";
+
+  private final LongCounter electionCount = 
getRegistry().counter(LEADER_ELECTION_COUNT_METRIC);
+  private final LongCounter timeoutCount = 
getRegistry().counter(LEADER_ELECTION_TIMEOUT_COUNT_METRIC);
+  private final LongCounter transferLeadershipCount = 
getRegistry().counter(TRANSFER_LEADERSHIP_COUNT_METRIC);
+
+  private final Timekeeper electionTime = 
getRegistry().timer(LEADER_ELECTION_TIME_TAKEN);
+
   private volatile Timestamp lastElectionTime;
 
   private LeaderElectionMetrics(RaftGroupMemberId serverId, LongSupplier 
getLastLeaderElapsedTimeMs) {
-    this.registry = getMetricRegistryForLeaderElection(serverId);
-    registry.gauge(LAST_LEADER_ELAPSED_TIME, () -> 
getLastLeaderElapsedTimeMs::getAsLong);
-    registry.gauge(LAST_LEADER_ELECTION_ELAPSED_TIME,
+    super(createRegistry(serverId));
+
+    getRegistry().gauge(LAST_LEADER_ELAPSED_TIME, () -> 
getLastLeaderElapsedTimeMs::getAsLong);
+    getRegistry().gauge(LAST_LEADER_ELECTION_ELAPSED_TIME,
         () -> () -> 
Optional.ofNullable(lastElectionTime).map(Timestamp::elapsedTimeMs).orElse(-1L));
   }
 
-  public static RatisMetricRegistry 
getMetricRegistryForLeaderElection(RaftGroupMemberId serverId) {
+  public static RatisMetricRegistry createRegistry(RaftGroupMemberId serverId) 
{
     return create(new MetricRegistryInfo(serverId.toString(),
         RATIS_APPLICATION_NAME_METRICS, RATIS_LEADER_ELECTION_METRICS,
         RATIS_LEADER_ELECTION_METRICS_DESC));
@@ -64,19 +73,19 @@ public final class LeaderElectionMetrics extends 
RatisMetrics {
   }
 
   public void onNewLeaderElectionCompletion() {
-    registry.counter(LEADER_ELECTION_COUNT_METRIC).inc();
+    electionCount.inc();
     lastElectionTime = Timestamp.currentTime();
   }
 
   public Timekeeper getLeaderElectionTimer() {
-    return registry.timer(LEADER_ELECTION_TIME_TAKEN);
+    return electionTime;
   }
 
   public void onLeaderElectionTimeout() {
-    registry.counter(LEADER_ELECTION_TIMEOUT_COUNT_METRIC).inc();
+    timeoutCount.inc();
   }
 
   public void onTransferLeadership() {
-    registry.counter(TRANSFER_LEADERSHIP_COUNT_METRIC).inc();
+    transferLeadershipCount.inc();
   }
 }
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/metrics/LogAppenderMetrics.java
 
b/ratis-server/src/main/java/org/apache/ratis/server/metrics/LogAppenderMetrics.java
index a8f03ecff..f38d1b1c9 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/metrics/LogAppenderMetrics.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/metrics/LogAppenderMetrics.java
@@ -36,10 +36,10 @@ public final class LogAppenderMetrics extends RatisMetrics {
   public static final String FOLLOWER_RPC_RESP_TIME = 
"follower_%s_rpc_response_time";
 
   public LogAppenderMetrics(RaftGroupMemberId groupMemberId) {
-    registry = getMetricRegistryForLogAppender(groupMemberId.toString());
+    super(createRegistry(groupMemberId.toString()));
   }
 
-  private RatisMetricRegistry getMetricRegistryForLogAppender(String serverId) 
{
+  private static RatisMetricRegistry createRegistry(String serverId) {
     return create(new MetricRegistryInfo(serverId,
         RATIS_APPLICATION_NAME_METRICS,
         RATIS_LOG_APPENDER_METRICS, RATIS_LOG_APPENDER_METRICS_DESC));
@@ -47,8 +47,8 @@ public final class LogAppenderMetrics extends RatisMetrics {
 
   public void addFollowerGauges(RaftPeerId id, LongSupplier getNextIndex, 
LongSupplier getMatchIndex,
       Supplier<Timestamp> getLastRpcTime) {
-    registry.gauge(String.format(FOLLOWER_NEXT_INDEX, id), () -> 
getNextIndex::getAsLong);
-    registry.gauge(String.format(FOLLOWER_MATCH_INDEX, id), () -> 
getMatchIndex::getAsLong);
-    registry.gauge(String.format(FOLLOWER_RPC_RESP_TIME, id), () -> () -> 
getLastRpcTime.get().elapsedTimeMs());
+    getRegistry().gauge(String.format(FOLLOWER_NEXT_INDEX, id), () -> 
getNextIndex::getAsLong);
+    getRegistry().gauge(String.format(FOLLOWER_MATCH_INDEX, id), () -> 
getMatchIndex::getAsLong);
+    getRegistry().gauge(String.format(FOLLOWER_RPC_RESP_TIME, id), () -> () -> 
getLastRpcTime.get().elapsedTimeMs());
   }
 }
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftLogMetricsBase.java
 
b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftLogMetricsBase.java
index 7c1eb09cb..17a200f00 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftLogMetricsBase.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftLogMetricsBase.java
@@ -18,6 +18,7 @@
 
 package org.apache.ratis.server.metrics;
 
+import org.apache.ratis.metrics.LongCounter;
 import org.apache.ratis.metrics.MetricRegistryInfo;
 import org.apache.ratis.metrics.RatisMetricRegistry;
 import org.apache.ratis.metrics.RatisMetrics;
@@ -33,11 +34,15 @@ public class RaftLogMetricsBase extends RatisMetrics 
implements RaftLogMetrics {
   public static final String CONFIG_LOG_ENTRY_COUNT = "configLogEntryCount";
   public static final String STATE_MACHINE_LOG_ENTRY_COUNT = 
"stateMachineLogEntryCount";
 
+  private final LongCounter configLogEntryCount = 
getRegistry().counter(CONFIG_LOG_ENTRY_COUNT);
+  private final LongCounter metadataLogEntryCount = 
getRegistry().counter(METADATA_LOG_ENTRY_COUNT);
+  private final LongCounter stateMachineLogEntryCount = 
getRegistry().counter(STATE_MACHINE_LOG_ENTRY_COUNT);
+
   public RaftLogMetricsBase(RaftGroupMemberId serverId) {
-    this.registry = getLogWorkerMetricRegistry(serverId);
+    super(createRegistry(serverId));
   }
 
-  public static RatisMetricRegistry 
getLogWorkerMetricRegistry(RaftGroupMemberId serverId) {
+  public static RatisMetricRegistry createRegistry(RaftGroupMemberId serverId) 
{
     return create(new MetricRegistryInfo(serverId.toString(),
         RATIS_APPLICATION_NAME_METRICS,
         RATIS_LOG_WORKER_METRICS, RATIS_LOG_WORKER_METRICS_DESC));
@@ -47,13 +52,13 @@ public class RaftLogMetricsBase extends RatisMetrics 
implements RaftLogMetrics {
   public void onLogEntryCommitted(LogEntryHeader header) {
     switch (header.getLogEntryBodyCase()) {
       case CONFIGURATIONENTRY:
-        registry.counter(CONFIG_LOG_ENTRY_COUNT).inc();
+        configLogEntryCount.inc();
         return;
       case METADATAENTRY:
-        registry.counter(METADATA_LOG_ENTRY_COUNT).inc();
+        metadataLogEntryCount.inc();
         return;
       case STATEMACHINELOGENTRY:
-        registry.counter(STATE_MACHINE_LOG_ENTRY_COUNT).inc();
+        stateMachineLogEntryCount.inc();
         return;
       default:
     }
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftServerMetricsImpl.java
 
b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftServerMetricsImpl.java
index 45137cdf3..f37cfd464 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftServerMetricsImpl.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftServerMetricsImpl.java
@@ -30,6 +30,7 @@ import org.apache.ratis.metrics.Timekeeper;
 
 import org.apache.ratis.metrics.MetricRegistryInfo;
 import org.apache.ratis.metrics.RatisMetricRegistry;
+import org.apache.ratis.proto.RaftProtos.ReplicationLevel;
 import org.apache.ratis.proto.RaftProtos.CommitInfoProto;
 import org.apache.ratis.proto.RaftProtos.RaftClientRequestProto.TypeCase;
 import org.apache.ratis.protocol.RaftClientRequest.Type;
@@ -74,17 +75,27 @@ public final class RaftServerMetricsImpl extends 
RatisMetrics implements RaftSer
   public static final String RATIS_SERVER_FAILED_CLIENT_STREAM_COUNT     = 
"numFailedClientStreamOnServer";
   public static final String RATIS_SERVER_INSTALL_SNAPSHOT_COUNT = 
"numInstallSnapshot";
 
-  private final LongCounter numRequestQueueLimitHits;
-  private final LongCounter numRequestsByteSizeLimitHits;
-  private final LongCounter numResourceLimitHits;
+  private final LongCounter numRequestQueueLimitHits = 
getRegistry().counter(REQUEST_QUEUE_LIMIT_HIT_COUNTER);
+  private final LongCounter numRequestsByteSizeLimitHits = 
getRegistry().counter(REQUEST_BYTE_SIZE_LIMIT_HIT_COUNTER);
+  private final LongCounter numResourceLimitHits = 
getRegistry().counter(RESOURCE_LIMIT_HIT_COUNTER);
 
-  private final LongCounter numFailedClientStaleRead;
-  private final LongCounter numFailedClientRead;
-  private final LongCounter numFailedClientWrite;
-  private final LongCounter numFailedClientWatch;
-  private final LongCounter numFailedClientStream;
+  private final LongCounter numFailedClientStaleRead
+      = getRegistry().counter(RATIS_SERVER_FAILED_CLIENT_STALE_READ_COUNT);
+  private final LongCounter numFailedClientRead = 
getRegistry().counter(RATIS_SERVER_FAILED_CLIENT_READ_COUNT);
+  private final LongCounter numFailedClientWrite = 
getRegistry().counter(RATIS_SERVER_FAILED_CLIENT_WRITE_COUNT);
+  private final LongCounter numFailedClientWatch = 
getRegistry().counter(RATIS_SERVER_FAILED_CLIENT_WATCH_COUNT);
+  private final LongCounter numFailedClientStream = 
getRegistry().counter(RATIS_SERVER_FAILED_CLIENT_STREAM_COUNT);
 
-  private final LongCounter numInstallSnapshot;
+  private final LongCounter numInstallSnapshot = 
getRegistry().counter(RATIS_SERVER_INSTALL_SNAPSHOT_COUNT);
+
+  private final Timekeeper readTimer = 
getRegistry().timer(RAFT_CLIENT_READ_REQUEST);
+  private final Timekeeper staleReadTimer = 
getRegistry().timer(RAFT_CLIENT_STALE_READ_REQUEST);
+  private final Timekeeper writeTimer = 
getRegistry().timer(RAFT_CLIENT_WRITE_REQUEST);
+  private final Map<ReplicationLevel, Timekeeper> watchTimers = 
newTimerMap(ReplicationLevel.class,
+      replication -> 
getRegistry().timer(String.format(RAFT_CLIENT_WATCH_REQUEST, 
Type.toString(replication))));
+
+  private final Function<Boolean, Timekeeper> followerAppendEntryLatency
+      = newHeartbeatTimer(FOLLOWER_APPEND_ENTRIES_LATENCY);
 
   /** Follower Id -> heartbeat elapsed */
   private final Map<RaftPeerId, Long> followerLastHeartbeatElapsedTimeMap = 
new HashMap<>();
@@ -114,21 +125,9 @@ public final class RaftServerMetricsImpl extends 
RatisMetrics implements RaftSer
   public RaftServerMetricsImpl(RaftGroupMemberId serverId,
       Supplier<Function<RaftPeerId, CommitInfoProto>> commitInfoCache,
       Supplier<RetryCache.Statistics> retryCacheStatistics) {
-    this.registry = getMetricRegistryForRaftServer(serverId.toString());
+    super(createRegistry(serverId.toString()));
     this.commitInfoCache = commitInfoCache;
 
-    numRequestQueueLimitHits = 
registry.counter(REQUEST_QUEUE_LIMIT_HIT_COUNTER);
-    numRequestsByteSizeLimitHits = 
registry.counter(REQUEST_BYTE_SIZE_LIMIT_HIT_COUNTER);
-    numResourceLimitHits = registry.counter(RESOURCE_LIMIT_HIT_COUNTER);
-
-    numFailedClientStaleRead = 
registry.counter(RATIS_SERVER_FAILED_CLIENT_STALE_READ_COUNT);
-    numFailedClientRead      = 
registry.counter(RATIS_SERVER_FAILED_CLIENT_READ_COUNT);
-    numFailedClientWrite     = 
registry.counter(RATIS_SERVER_FAILED_CLIENT_WRITE_COUNT);
-    numFailedClientWatch     = 
registry.counter(RATIS_SERVER_FAILED_CLIENT_WATCH_COUNT);
-    numFailedClientStream    = 
registry.counter(RATIS_SERVER_FAILED_CLIENT_STREAM_COUNT);
-
-    numInstallSnapshot = registry.counter(RATIS_SERVER_INSTALL_SNAPSHOT_COUNT);
-
     addPeerCommitIndexGauge(serverId.getPeerId());
     addRetryCacheMetric(retryCacheStatistics);
   }
@@ -153,18 +152,18 @@ public final class RaftServerMetricsImpl extends 
RatisMetrics implements RaftSer
     return numInstallSnapshot;
   }
 
-  private RatisMetricRegistry getMetricRegistryForRaftServer(String serverId) {
+  private static RatisMetricRegistry createRegistry(String serverId) {
     return create(new MetricRegistryInfo(serverId,
         RATIS_APPLICATION_NAME_METRICS, RATIS_SERVER_METRICS,
         RATIS_SERVER_METRICS_DESC));
   }
 
   private void addRetryCacheMetric(Supplier<RetryCache.Statistics> 
retryCacheStatistics) {
-    registry.gauge(RETRY_CACHE_ENTRY_COUNT_METRIC, () -> () -> 
retryCacheStatistics.get().size());
-    registry.gauge(RETRY_CACHE_HIT_COUNT_METRIC  , () -> () -> 
retryCacheStatistics.get().hitCount());
-    registry.gauge(RETRY_CACHE_HIT_RATE_METRIC   , () -> () -> 
retryCacheStatistics.get().hitRate());
-    registry.gauge(RETRY_CACHE_MISS_COUNT_METRIC , () -> () -> 
retryCacheStatistics.get().missCount());
-    registry.gauge(RETRY_CACHE_MISS_RATE_METRIC  , () -> () -> 
retryCacheStatistics.get().missRate());
+    getRegistry().gauge(RETRY_CACHE_ENTRY_COUNT_METRIC, () -> () -> 
retryCacheStatistics.get().size());
+    getRegistry().gauge(RETRY_CACHE_HIT_COUNT_METRIC  , () -> () -> 
retryCacheStatistics.get().hitCount());
+    getRegistry().gauge(RETRY_CACHE_HIT_RATE_METRIC   , () -> () -> 
retryCacheStatistics.get().hitRate());
+    getRegistry().gauge(RETRY_CACHE_MISS_COUNT_METRIC , () -> () -> 
retryCacheStatistics.get().missCount());
+    getRegistry().gauge(RETRY_CACHE_MISS_RATE_METRIC  , () -> () -> 
retryCacheStatistics.get().missRate());
   }
 
   /**
@@ -176,8 +175,7 @@ public final class RaftServerMetricsImpl extends 
RatisMetrics implements RaftSer
         followerName);
 
     followerLastHeartbeatElapsedTimeMap.put(followerName, 0L);
-    registry.gauge(followerHbMetricKey,
-        () -> () -> followerLastHeartbeatElapsedTimeMap.get(followerName));
+    getRegistry().gauge(followerHbMetricKey, () -> () -> 
followerLastHeartbeatElapsedTimeMap.get(followerName));
 
     addPeerCommitIndexGauge(followerName);
   }
@@ -185,8 +183,8 @@ public final class RaftServerMetricsImpl extends 
RatisMetrics implements RaftSer
   /**
    * Register a commit index tracker for the peer in cluster.
    */
-  public void addPeerCommitIndexGauge(RaftPeerId peerId) {
-    registry.gauge(getPeerCommitIndexGaugeKey(peerId), () -> () -> 
Optional.ofNullable(commitInfoCache.get())
+  private void addPeerCommitIndexGauge(RaftPeerId peerId) {
+    getRegistry().gauge(getPeerCommitIndexGaugeKey(peerId), () -> () -> 
Optional.ofNullable(commitInfoCache.get())
         .map(cache -> cache.apply(peerId))
         .map(CommitInfoProto::getCommitIndex)
         .orElse(0L));
@@ -207,23 +205,18 @@ public final class RaftServerMetricsImpl extends 
RatisMetrics implements RaftSer
   }
 
   public Timekeeper getFollowerAppendEntryTimer(boolean isHeartbeat) {
-    return registry.timer(FOLLOWER_APPEND_ENTRIES_LATENCY + (isHeartbeat ? 
"_heartbeat" : ""));
-  }
-
-  public Timekeeper getTimer(String timerName) {
-    return registry.timer(timerName);
+    return followerAppendEntryLatency.apply(isHeartbeat);
   }
 
   public Timekeeper getClientRequestTimer(Type request) {
     if (request.is(TypeCase.READ)) {
-      return getTimer(RAFT_CLIENT_READ_REQUEST);
+      return readTimer;
     } else if (request.is(TypeCase.STALEREAD)) {
-      return getTimer(RAFT_CLIENT_STALE_READ_REQUEST);
+      return staleReadTimer;
     } else if (request.is(TypeCase.WATCH)) {
-      String watchType = Type.toString(request.getWatch().getReplication());
-      return getTimer(String.format(RAFT_CLIENT_WATCH_REQUEST, watchType));
+      return watchTimers.get(request.getWatch().getReplication());
     } else if (request.is(TypeCase.WRITE)) {
-      return getTimer(RAFT_CLIENT_WRITE_REQUEST);
+      return writeTimer;
     }
     return null;
   }
@@ -233,19 +226,19 @@ public final class RaftServerMetricsImpl extends 
RatisMetrics implements RaftSer
   }
 
   public void addNumPendingRequestsGauge(Supplier<Integer> queueSize) {
-    registry.gauge(REQUEST_QUEUE_SIZE, () -> queueSize);
+    getRegistry().gauge(REQUEST_QUEUE_SIZE, () -> queueSize);
   }
 
   public boolean removeNumPendingRequestsGauge() {
-    return registry.remove(REQUEST_QUEUE_SIZE);
+    return getRegistry().remove(REQUEST_QUEUE_SIZE);
   }
 
   public void addNumPendingRequestsMegaByteSize(Supplier<Integer> 
megabyteSize) {
-    registry.gauge(REQUEST_MEGA_BYTE_SIZE, () -> megabyteSize);
+    getRegistry().gauge(REQUEST_MEGA_BYTE_SIZE, () -> megabyteSize);
   }
 
   public boolean removeNumPendingRequestsByteSize() {
-    return registry.remove(REQUEST_MEGA_BYTE_SIZE);
+    return getRegistry().remove(REQUEST_MEGA_BYTE_SIZE);
   }
 
   public void onRequestByteSizeLimitHit() {
@@ -294,8 +287,4 @@ public final class RaftServerMetricsImpl extends 
RatisMetrics implements RaftSer
   public void onSnapshotInstalled() {
     numInstallSnapshot.inc();
   }
-
-  public RatisMetricRegistry getRegistry() {
-    return registry;
-  }
 }
\ No newline at end of file
diff --git 
a/ratis-server/src/main/java/org/apache/ratis/server/metrics/SegmentedRaftLogMetrics.java
 
b/ratis-server/src/main/java/org/apache/ratis/server/metrics/SegmentedRaftLogMetrics.java
index 4e25f20cb..a6a1af0ac 100644
--- 
a/ratis-server/src/main/java/org/apache/ratis/server/metrics/SegmentedRaftLogMetrics.java
+++ 
b/ratis-server/src/main/java/org/apache/ratis/server/metrics/SegmentedRaftLogMetrics.java
@@ -18,6 +18,7 @@
 
 package org.apache.ratis.server.metrics;
 
+import org.apache.ratis.metrics.LongCounter;
 import org.apache.ratis.metrics.Timekeeper;
 import org.apache.ratis.protocol.RaftGroupMemberId;
 import org.apache.ratis.util.JavaUtils;
@@ -80,42 +81,54 @@ public class SegmentedRaftLogMetrics extends 
RaftLogMetricsBase {
   /** Time required to load and process raft log segments during restart */
   public static final String RAFT_LOG_LOAD_SEGMENT_LATENCY = 
"segmentLoadLatency";
 
-  private final Timekeeper flushTimer = getTimer(RAFT_LOG_FLUSH_TIME);
-  private final Timekeeper syncTimer = getTimer(RAFT_LOG_SYNC_TIME);
-  private final Timekeeper enqueuedTimer = getTimer(RAFT_LOG_TASK_QUEUE_TIME);
-  private final Timekeeper queuingDelayTimer = 
getTimer(RAFT_LOG_TASK_ENQUEUE_DELAY);;
+  private final Timekeeper flushTimer = 
getRegistry().timer(RAFT_LOG_FLUSH_TIME);
+  private final Timekeeper syncTimer = getRegistry().timer(RAFT_LOG_SYNC_TIME);
+  private final Timekeeper enqueuedTimer = 
getRegistry().timer(RAFT_LOG_TASK_QUEUE_TIME);
+  private final Timekeeper queuingDelayTimer = 
getRegistry().timer(RAFT_LOG_TASK_ENQUEUE_DELAY);
 
-  private final Timekeeper appendEntryTimer = 
getTimer(RAFT_LOG_APPEND_ENTRY_LATENCY);
-  private final Timekeeper readEntryTimer = 
getTimer(RAFT_LOG_READ_ENTRY_LATENCY);
-  private final Timekeeper loadSegmentTimer = 
getTimer(RAFT_LOG_LOAD_SEGMENT_LATENCY);
-  private final Timekeeper purgeTimer = getTimer(RAFT_LOG_PURGE_METRIC);
+  private final Timekeeper appendEntryTimer = 
getRegistry().timer(RAFT_LOG_APPEND_ENTRY_LATENCY);
+  private final Timekeeper readEntryTimer = 
getRegistry().timer(RAFT_LOG_READ_ENTRY_LATENCY);
+  private final Timekeeper loadSegmentTimer = 
getRegistry().timer(RAFT_LOG_LOAD_SEGMENT_LATENCY);
+  private final Timekeeper purgeTimer = 
getRegistry().timer(RAFT_LOG_PURGE_METRIC);
+
+  private final LongCounter cacheHitCount = 
getRegistry().counter(RAFT_LOG_CACHE_HIT_COUNT);
+  private final LongCounter cacheMissCount= 
getRegistry().counter(RAFT_LOG_CACHE_MISS_COUNT);
+  private final LongCounter appendEntryCount = 
getRegistry().counter(RAFT_LOG_APPEND_ENTRY_COUNT);
+  private final LongCounter flushCount = 
getRegistry().counter(RAFT_LOG_FLUSH_COUNT);
+
+  private final LongCounter numStateMachineDataWriteTimeout = 
getRegistry().counter(
+      RAFT_LOG_STATEMACHINE_DATA_WRITE_TIMEOUT_COUNT);
+  private final LongCounter numStateMachineDataReadTimeout = 
getRegistry().counter(
+      RAFT_LOG_STATEMACHINE_DATA_READ_TIMEOUT_COUNT);
+
+  private final Map<Class<?>, Timekeeper> taskClassTimers = new 
ConcurrentHashMap<>();
 
   public SegmentedRaftLogMetrics(RaftGroupMemberId serverId) {
     super(serverId);
   }
 
   public void addDataQueueSizeGauge(Supplier<Integer> numElements) {
-    registry.gauge(RAFT_LOG_DATA_QUEUE_SIZE, () -> numElements);
+    getRegistry().gauge(RAFT_LOG_DATA_QUEUE_SIZE, () -> numElements);
   }
 
   public void addClosedSegmentsNum(Supplier<Long> cachedSegmentNum) {
-    registry.gauge(RAFT_LOG_CACHE_CLOSED_SEGMENTS_NUM, () -> cachedSegmentNum);
+    getRegistry().gauge(RAFT_LOG_CACHE_CLOSED_SEGMENTS_NUM, () -> 
cachedSegmentNum);
   }
 
   public void addClosedSegmentsSizeInBytes(Supplier<Long> 
closedSegmentsSizeInBytes) {
-    registry.gauge(RAFT_LOG_CACHE_CLOSED_SEGMENTS_SIZE_IN_BYTES, () -> 
closedSegmentsSizeInBytes);
+    getRegistry().gauge(RAFT_LOG_CACHE_CLOSED_SEGMENTS_SIZE_IN_BYTES, () -> 
closedSegmentsSizeInBytes);
   }
 
   public void addOpenSegmentSizeInBytes(Supplier<Long> openSegmentSizeInBytes) 
{
-    registry.gauge(RAFT_LOG_CACHE_OPEN_SEGMENT_SIZE_IN_BYTES, () -> 
openSegmentSizeInBytes);
+    getRegistry().gauge(RAFT_LOG_CACHE_OPEN_SEGMENT_SIZE_IN_BYTES, () -> 
openSegmentSizeInBytes);
   }
 
   public void addLogWorkerQueueSizeGauge(Supplier<Integer> queueSize) {
-    registry.gauge(RAFT_LOG_WORKER_QUEUE_SIZE, () -> queueSize);
+    getRegistry().gauge(RAFT_LOG_WORKER_QUEUE_SIZE, () -> queueSize);
   }
 
   public void addFlushBatchSizeGauge(Supplier<Integer> flushBatchSize) {
-    registry.gauge(RAFT_LOG_SYNC_BATCH_SIZE, () -> flushBatchSize);
+    getRegistry().gauge(RAFT_LOG_SYNC_BATCH_SIZE, () -> flushBatchSize);
   }
 
   public UncheckedAutoCloseable startFlushTimer() {
@@ -127,19 +140,19 @@ public class SegmentedRaftLogMetrics extends 
RaftLogMetricsBase {
   }
 
   public void onRaftLogCacheHit() {
-    registry.counter(RAFT_LOG_CACHE_HIT_COUNT).inc();
+    cacheHitCount.inc();
   }
 
   public void onRaftLogCacheMiss() {
-    registry.counter(RAFT_LOG_CACHE_MISS_COUNT).inc();
+    cacheMissCount.inc();
   }
 
   public void onRaftLogFlush() {
-    registry.counter(RAFT_LOG_FLUSH_COUNT).inc();
+    flushCount.inc();
   }
 
   public void onRaftLogAppendEntry() {
-    registry.counter(RAFT_LOG_APPEND_ENTRY_COUNT).inc();
+    appendEntryCount.inc();
   }
 
   public UncheckedAutoCloseable startAppendEntryTimer() {
@@ -154,13 +167,12 @@ public class SegmentedRaftLogMetrics extends 
RaftLogMetricsBase {
     return Timekeeper.start(queuingDelayTimer);
   }
 
-  private final Map<Class<?>, Timekeeper> classMap = new ConcurrentHashMap<>();
-  private Timekeeper getTaskExecutionTimer(Class<?> taskClass) {
-    return getTimer(String.format(RAFT_LOG_TASK_EXECUTION_TIME,
+  private Timekeeper newTaskExecutionTimer(Class<?> taskClass) {
+    return getRegistry().timer(String.format(RAFT_LOG_TASK_EXECUTION_TIME,
         JavaUtils.getClassSimpleName(taskClass).toLowerCase()));
   }
   public UncheckedAutoCloseable startTaskExecutionTimer(Class<?> taskClass) {
-    return Timekeeper.start(classMap.computeIfAbsent(taskClass, 
this::getTaskExecutionTimer));
+    return Timekeeper.start(taskClassTimers.computeIfAbsent(taskClass, 
this::newTaskExecutionTimer));
   }
 
   public Timekeeper getReadEntryTimer() {
@@ -176,11 +188,11 @@ public class SegmentedRaftLogMetrics extends 
RaftLogMetricsBase {
   }
 
   public void onStateMachineDataWriteTimeout() {
-    registry.counter(RAFT_LOG_STATEMACHINE_DATA_WRITE_TIMEOUT_COUNT).inc();
+    numStateMachineDataWriteTimeout.inc();
   }
 
   @Override
   public void onStateMachineDataReadTimeout() {
-    registry.counter(RAFT_LOG_STATEMACHINE_DATA_READ_TIMEOUT_COUNT).inc();
+    numStateMachineDataReadTimeout.inc();
   }
 }
diff --git 
a/ratis-server/src/test/java/org/apache/ratis/server/impl/LeaderElectionTests.java
 
b/ratis-server/src/test/java/org/apache/ratis/server/impl/LeaderElectionTests.java
index a88f2b018..68b23a492 100644
--- 
a/ratis-server/src/test/java/org/apache/ratis/server/impl/LeaderElectionTests.java
+++ 
b/ratis-server/src/test/java/org/apache/ratis/server/impl/LeaderElectionTests.java
@@ -452,7 +452,7 @@ public abstract class LeaderElectionTests<CLUSTER extends 
MiniRaftCluster>
     final RaftServer.Division leaderServer = waitForLeader(cluster);
 
     final RatisMetricRegistryImpl ratisMetricRegistry = 
(RatisMetricRegistryImpl)
-        
LeaderElectionMetrics.getMetricRegistryForLeaderElection(leaderServer.getMemberId());
+        LeaderElectionMetrics.createRegistry(leaderServer.getMemberId());
 
     // Verify each metric individually.
     long numLeaderElections = 
ratisMetricRegistry.counter(LEADER_ELECTION_COUNT_METRIC).getCount();
diff --git 
a/ratis-test/src/test/java/org/apache/ratis/grpc/TestRaftServerWithGrpc.java 
b/ratis-test/src/test/java/org/apache/ratis/grpc/TestRaftServerWithGrpc.java
index d4dce4b2f..dd36b0032 100644
--- a/ratis-test/src/test/java/org/apache/ratis/grpc/TestRaftServerWithGrpc.java
+++ b/ratis-test/src/test/java/org/apache/ratis/grpc/TestRaftServerWithGrpc.java
@@ -22,6 +22,7 @@ import static 
org.apache.ratis.server.metrics.RaftServerMetricsImpl.RAFT_CLIENT_
 import static 
org.apache.ratis.server.metrics.RaftServerMetricsImpl.RAFT_CLIENT_WATCH_REQUEST;
 import static 
org.apache.ratis.server.metrics.RaftServerMetricsImpl.RAFT_CLIENT_WRITE_REQUEST;
 
+import org.apache.ratis.metrics.RatisMetricRegistry;
 import org.apache.ratis.server.storage.RaftStorage;
 import org.apache.log4j.Level;
 import org.apache.ratis.BaseTest;
@@ -302,33 +303,34 @@ public class TestRaftServerWithGrpc extends BaseTest 
implements MiniRaftClusterW
       ExecutionException, InterruptedException {
     final RaftServer.Division leader = RaftTestUtil.waitForLeader(cluster);
     final RaftServerMetricsImpl raftServerMetrics = 
getRaftServerMetrics(leader);
+    final RatisMetricRegistry registry = raftServerMetrics.getRegistry();
 
     try (final RaftClient client = cluster.createClient()) {
       final CompletableFuture<RaftClientReply> f1 = client.async().send(new 
SimpleMessage("testing"));
       Assert.assertTrue(f1.get().isSuccess());
-      final DefaultTimekeeperImpl write = (DefaultTimekeeperImpl) 
raftServerMetrics.getTimer(RAFT_CLIENT_WRITE_REQUEST);
+      final DefaultTimekeeperImpl write = (DefaultTimekeeperImpl) 
registry.timer(RAFT_CLIENT_WRITE_REQUEST);
       Assert.assertTrue(write.getTimer().getCount() > 0);
 
       final CompletableFuture<RaftClientReply> f2 = 
client.async().sendReadOnly(new SimpleMessage("testing"));
       Assert.assertTrue(f2.get().isSuccess());
-      final DefaultTimekeeperImpl read = (DefaultTimekeeperImpl) 
raftServerMetrics.getTimer(RAFT_CLIENT_READ_REQUEST);
+      final DefaultTimekeeperImpl read = (DefaultTimekeeperImpl) 
registry.timer(RAFT_CLIENT_READ_REQUEST);
       Assert.assertTrue(read.getTimer().getCount() > 0);
 
       final CompletableFuture<RaftClientReply> f3 = 
client.async().sendStaleRead(new SimpleMessage("testing"),
           0, leader.getId());
       Assert.assertTrue(f3.get().isSuccess());
-      final DefaultTimekeeperImpl staleRead = (DefaultTimekeeperImpl) 
raftServerMetrics.getTimer(RAFT_CLIENT_STALE_READ_REQUEST);
+      final DefaultTimekeeperImpl staleRead = (DefaultTimekeeperImpl) 
registry.timer(RAFT_CLIENT_STALE_READ_REQUEST);
       Assert.assertTrue(staleRead.getTimer().getCount() > 0);
 
       final CompletableFuture<RaftClientReply> f4 = client.async().watch(0, 
RaftProtos.ReplicationLevel.ALL);
       Assert.assertTrue(f4.get().isSuccess());
-      final DefaultTimekeeperImpl watchAll = (DefaultTimekeeperImpl) 
raftServerMetrics.getTimer(
+      final DefaultTimekeeperImpl watchAll = (DefaultTimekeeperImpl) 
registry.timer(
           String.format(RAFT_CLIENT_WATCH_REQUEST, "-ALL"));
       Assert.assertTrue(watchAll.getTimer().getCount() > 0);
 
       final CompletableFuture<RaftClientReply> f5 = client.async().watch(0, 
RaftProtos.ReplicationLevel.MAJORITY);
       Assert.assertTrue(f5.get().isSuccess());
-      final DefaultTimekeeperImpl watch = (DefaultTimekeeperImpl) 
raftServerMetrics.getTimer(
+      final DefaultTimekeeperImpl watch = (DefaultTimekeeperImpl) 
registry.timer(
           String.format(RAFT_CLIENT_WATCH_REQUEST, ""));
       Assert.assertTrue(watch.getTimer().getCount() > 0);
     }
diff --git 
a/ratis-test/src/test/java/org/apache/ratis/server/raftlog/TestRaftLogMetrics.java
 
b/ratis-test/src/test/java/org/apache/ratis/server/raftlog/TestRaftLogMetrics.java
index a408216a0..70b185e55 100644
--- 
a/ratis-test/src/test/java/org/apache/ratis/server/raftlog/TestRaftLogMetrics.java
+++ 
b/ratis-test/src/test/java/org/apache/ratis/server/raftlog/TestRaftLogMetrics.java
@@ -120,7 +120,7 @@ public class TestRaftLogMetrics extends BaseTest
   }
 
   static RatisMetricRegistryImpl getRegistry(RaftGroupMemberId memberId) {
-    return (RatisMetricRegistryImpl) 
RaftLogMetricsBase.getLogWorkerMetricRegistry(memberId);
+    return (RatisMetricRegistryImpl) 
RaftLogMetricsBase.createRegistry(memberId);
   }
 
   static void assertFlushCount(RaftServer.Division server) throws Exception {
diff --git 
a/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLog.java
 
b/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLog.java
index 2a600570f..f8b9c960d 100644
--- 
a/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLog.java
+++ 
b/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLog.java
@@ -232,7 +232,7 @@ public class TestSegmentedRaftLog extends BaseTest {
       Assert.assertArrayEquals(entries, entriesFromLog);
       Assert.assertEquals(entries[entries.length - 1], getLastEntry(raftLog));
 
-      final RatisMetricRegistry metricRegistryForLogWorker = 
RaftLogMetricsBase.getLogWorkerMetricRegistry(memberId);
+      final RatisMetricRegistry metricRegistryForLogWorker = 
RaftLogMetricsBase.createRegistry(memberId);
 
       final DefaultTimekeeperImpl load = (DefaultTimekeeperImpl) 
metricRegistryForLogWorker.timer("segmentLoadLatency");
       assertTrue(load.getTimer().getMeanRate() > 0);
@@ -482,7 +482,7 @@ public class TestSegmentedRaftLog extends BaseTest {
     int segmentSize = 200;
     long endIndexOfClosedSegment = segmentSize * (endTerm - startTerm - 1) - 1;
     long expectedIndex = segmentSize * (endTerm - startTerm - 1);
-    final RatisMetricRegistry metricRegistryForLogWorker = 
RaftLogMetricsBase.getLogWorkerMetricRegistry(memberId);
+    final RatisMetricRegistry metricRegistryForLogWorker = 
RaftLogMetricsBase.createRegistry(memberId);
     purgeAndVerify(startTerm, endTerm, segmentSize, 1, 
endIndexOfClosedSegment, expectedIndex);
     final DefaultTimekeeperImpl purge = (DefaultTimekeeperImpl) 
metricRegistryForLogWorker.timer("purgeLog");
     assertTrue(purge.getTimer().getCount() > 0);

Reply via email to