You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ratis.apache.org by sh...@apache.org on 2020/01/30 14:56:27 UTC

[incubator-ratis] branch master updated: Test and cleanup Ratis Metrics work. Contribured by Aravindan Vijayan.

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 38d55c4  Test and cleanup Ratis Metrics work. Contribured by Aravindan Vijayan.
38d55c4 is described below

commit 38d55c471d4cb6118a98943d6b8d8abd34a67a0a
Author: Shashikant Banerjee <sh...@apache.org>
AuthorDate: Thu Jan 30 20:25:46 2020 +0530

    Test and cleanup Ratis Metrics work. Contribured by Aravindan Vijayan.
---
 .../apache/ratis/server/impl/FollowerState.java    |   2 +-
 .../apache/ratis/server/impl/LeaderElection.java   |   2 +-
 .../org/apache/ratis/server/impl/LeaderState.java  |   1 +
 .../org/apache/ratis/server/impl/LogAppender.java  |   2 +-
 .../apache/ratis/server/impl/RaftServerImpl.java   |  13 ++-
 .../ratis/server/impl/RaftServerMetrics.java       |  39 ++++---
 .../ratis/server/impl/StateMachineMetrics.java     |  26 +++--
 .../ratis/server/impl/StateMachineUpdater.java     |   1 +
 .../server/metrics/LeaderElectionMetrics.java      |  33 ++++--
 .../ratis/server/metrics/LogAppenderMetrics.java   |  27 +++--
 .../ratis/server/metrics/RaftLogMetrics.java       |  71 ++++++++++--
 .../ratis/server/metrics/RatisMetricNames.java     | 125 ---------------------
 .../apache/ratis/server/metrics/RatisMetrics.java  |  69 ++++--------
 .../server/raftlog/segmented/SegmentedRaftLog.java |  18 +--
 .../java/org/apache/ratis/LogAppenderTests.java    |   8 +-
 .../test/java/org/apache/ratis/RaftBasicTests.java |  25 +++--
 .../ratis/server/impl/LeaderElectionTests.java     |  12 +-
 .../ratis/server/impl/TestLogAppenderMetrics.java  |   8 +-
 .../server/metrics/TestLeaderElectionMetrics.java  |   8 +-
 .../ratis/server/storage/RaftStorageTestUtils.java |   5 +-
 .../ratis/statemachine/RaftSnapshotBaseTest.java   |  18 ++-
 .../ratis/TestRaftServerSlownessDetection.java     |   5 +-
 .../apache/ratis/grpc/TestRaftServerWithGrpc.java  |   8 +-
 .../ratis/server/raftlog/TestRaftLogMetrics.java   |  30 +++--
 .../server/raftlog/segmented/TestLogSegment.java   |   3 +-
 .../raftlog/segmented/TestSegmentedRaftLog.java    |   6 +-
 26 files changed, 261 insertions(+), 304 deletions(-)

diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/FollowerState.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/FollowerState.java
index d82af65..13ef103 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/FollowerState.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/FollowerState.java
@@ -107,7 +107,7 @@ class FollowerState extends Daemon {
           if (outstandingOp.get() == 0 && lastRpcTime.elapsedTimeMs() >= electionTimeout) {
             LOG.info("{}: change to CANDIDATE, lastRpcTime:{}ms, electionTimeout:{}ms",
                 this, lastRpcTime.elapsedTimeMs(), electionTimeout);
-            server.getLeaderElectionMetricsRegistry().onLeaderElectionTimeout(); // Update timeout metric counters.
+            server.getLeaderElectionMetrics().onLeaderElectionTimeout(); // Update timeout metric counters.
             // election timeout, should become a candidate
             server.changeToCandidate();
             break;
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderElection.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderElection.java
index e689e48..1148db8 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderElection.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderElection.java
@@ -175,7 +175,7 @@ class LeaderElection implements Runnable {
       }
     } finally {
       // Update leader election completion metric(s).
-      server.getLeaderElectionMetricsRegistry().onLeaderElectionCompletion(electionStartTime.elapsedTimeMs());
+      server.getLeaderElectionMetrics().onLeaderElectionCompletion(electionStartTime.elapsedTimeMs());
       lifeCycle.checkStateAndClose(() -> {});
     }
   }
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderState.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderState.java
index 9618652..a189d5d 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderState.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderState.java
@@ -263,6 +263,7 @@ public class LeaderState {
       LOG.warn("{}: Caught exception in sendNotLeaderResponses", this, e);
     }
     server.getServerRpc().notifyNotLeader(server.getMemberId().getGroupId());
+    logAppenderMetrics.unregister();
   }
 
   void notifySenders() {
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/LogAppender.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/LogAppender.java
index 98aad61..32339f2 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/LogAppender.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/LogAppender.java
@@ -40,7 +40,7 @@ import java.nio.file.Path;
 import java.util.*;
 
 import static org.apache.ratis.server.impl.RaftServerConstants.DEFAULT_CALLID;
-import static org.apache.ratis.server.metrics.RatisMetricNames.LOG_APPENDER_INSTALL_SNAPSHOT_METRIC;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.LOG_APPENDER_INSTALL_SNAPSHOT_METRIC;
 import static org.apache.ratis.util.LifeCycle.State.CLOSED;
 import static org.apache.ratis.util.LifeCycle.State.CLOSING;
 import static org.apache.ratis.util.LifeCycle.State.EXCEPTION;
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java
index 0e62970..6a3506c 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerImpl.java
@@ -55,7 +55,6 @@ import java.util.stream.Collectors;
 import static org.apache.ratis.proto.RaftProtos.AppendEntriesReplyProto.AppendResult.INCONSISTENCY;
 import static org.apache.ratis.proto.RaftProtos.AppendEntriesReplyProto.AppendResult.NOT_LEADER;
 import static org.apache.ratis.proto.RaftProtos.AppendEntriesReplyProto.AppendResult.SUCCESS;
-import static org.apache.ratis.server.metrics.LeaderElectionMetrics.getLeaderElectionMetrics;
 import static org.apache.ratis.util.LifeCycle.State.NEW;
 import static org.apache.ratis.util.LifeCycle.State.RUNNING;
 import static org.apache.ratis.util.LifeCycle.State.STARTING;
@@ -88,7 +87,7 @@ public class RaftServerImpl implements RaftServerProtocol, RaftServerAsynchronou
   private final CommitInfoCache commitInfoCache = new CommitInfoCache();
 
   private final RaftServerJmxAdapter jmxAdapter;
-  private final LeaderElectionMetrics leaderElectionMetricsRegistry;
+  private final LeaderElectionMetrics leaderElectionMetrics;
   private final RaftServerMetrics raftServerMetrics;
 
   private AtomicReference<TermIndex> inProgressInstallSnapshotRequest;
@@ -115,7 +114,7 @@ public class RaftServerImpl implements RaftServerProtocol, RaftServerAsynchronou
     this.inProgressInstallSnapshotRequest = new AtomicReference<>(null);
 
     this.jmxAdapter = new RaftServerJmxAdapter();
-    this.leaderElectionMetricsRegistry = getLeaderElectionMetrics(this);
+    this.leaderElectionMetrics = LeaderElectionMetrics.getLeaderElectionMetrics(this);
     this.raftServerMetrics = RaftServerMetrics.getRaftServerMetrics(this);
   }
 
@@ -273,6 +272,8 @@ public class RaftServerImpl implements RaftServerProtocol, RaftServerAsynchronou
       } catch (Exception ignored) {
         LOG.warn("{}: Failed to close state", getMemberId(), ignored);
       }
+      leaderElectionMetrics.unregister();
+      raftServerMetrics.unregister();
       if (deleteDirectory) {
         final RaftStorageDirectory dir = state.getStorage().getStorageDir();
         try {
@@ -422,7 +423,7 @@ public class RaftServerImpl implements RaftServerProtocol, RaftServerAsynchronou
     }
     // start election
     role.startLeaderElection(this);
-    leaderElectionMetricsRegistry.onNewLeaderElection();
+    leaderElectionMetrics.onNewLeaderElection();
   }
 
   @Override
@@ -1338,8 +1339,8 @@ public class RaftServerImpl implements RaftServerProtocol, RaftServerAsynchronou
     }
   }
 
-  public LeaderElectionMetrics getLeaderElectionMetricsRegistry() {
-    return leaderElectionMetricsRegistry;
+  public LeaderElectionMetrics getLeaderElectionMetrics() {
+    return leaderElectionMetrics;
   }
 
   public RaftServerMetrics getRaftServerMetrics() {
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerMetrics.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerMetrics.java
index c013406..0689496 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerMetrics.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/RaftServerMetrics.java
@@ -18,16 +18,7 @@
 
 package org.apache.ratis.server.impl;
 
-import static org.apache.ratis.server.metrics.RatisMetricNames.FOLLOWER_APPEND_ENTRIES_LATENCY;
-import static org.apache.ratis.server.metrics.RatisMetricNames.LEADER_METRIC_PEER_COMMIT_INDEX;
-import static org.apache.ratis.server.metrics.RatisMetricNames.LEADER_METRIC_FOLLOWER_LAST_HEARTBEAT_ELAPSED_TIME_METRIC;
-import static org.apache.ratis.server.metrics.RatisMetricNames.RAFT_CLIENT_READ_REQUEST;
-import static org.apache.ratis.server.metrics.RatisMetricNames.RAFT_CLIENT_STALE_READ_REQUEST;
-import static org.apache.ratis.server.metrics.RatisMetricNames.RAFT_CLIENT_WATCH_REQUEST;
-import static org.apache.ratis.server.metrics.RatisMetricNames.RAFT_CLIENT_WRITE_REQUEST;
-import static org.apache.ratis.server.metrics.RatisMetricNames.REQUEST_QUEUE_LIMIT_HIT_COUNTER;
-import static org.apache.ratis.server.metrics.RatisMetricNames.REQUEST_QUEUE_SIZE;
-import static org.apache.ratis.server.metrics.RatisMetricNames.RETRY_REQUEST_CACHE_HIT_COUNTER;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.FOLLOWER_APPEND_ENTRIES_LATENCY;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -37,6 +28,7 @@ import com.codahale.metrics.Counter;
 import com.codahale.metrics.Gauge;
 import com.codahale.metrics.Timer;
 
+import org.apache.ratis.metrics.MetricRegistryInfo;
 import org.apache.ratis.metrics.RatisMetricRegistry;
 import org.apache.ratis.proto.RaftProtos;
 import org.apache.ratis.proto.RaftProtos.RaftClientRequestProto.TypeCase;
@@ -50,9 +42,22 @@ import org.apache.ratis.util.Preconditions;
 /**
  * Metric Registry for Raft Group Server. One instance per leader/follower.
  */
-public final class RaftServerMetrics {
+public final class RaftServerMetrics extends RatisMetrics {
+
+  public static final String RATIS_SERVER_METRICS = "server";
+  public static final String RATIS_SERVER_METRICS_DESC = "Metrics for Raft server";
+
+  public static final String
+      FOLLOWER_LAST_HEARTBEAT_ELAPSED_TIME_METRIC = "%s_lastHeartbeatElapsedTime";
+  public static final String LEADER_METRIC_PEER_COMMIT_INDEX = "%s_peerCommitIndex";
+  public static final String RAFT_CLIENT_READ_REQUEST = "clientReadRequest";
+  public static final String RAFT_CLIENT_STALE_READ_REQUEST = "clientStaleReadRequest";
+  public static final String RAFT_CLIENT_WRITE_REQUEST = "clientWriteRequest";
+  public static final String RAFT_CLIENT_WATCH_REQUEST = "clientWatch%sRequest";
+  public static final String RETRY_REQUEST_CACHE_HIT_COUNTER = "numRetryCacheHits";
+  public static final String REQUEST_QUEUE_LIMIT_HIT_COUNTER = "numRequestQueueLimitHits";
+  public static final String REQUEST_QUEUE_SIZE = "numPendingRequestInQueue";
 
-  private RatisMetricRegistry registry = null;
   private Map<String, Long> followerLastHeartbeatElapsedTimeMap = new HashMap<>();
   private CommitInfoCache commitInfoCache;
 
@@ -66,11 +71,17 @@ public final class RaftServerMetrics {
   }
 
   private RaftServerMetrics(RaftServerImpl server) {
-    registry = RatisMetrics.getMetricRegistryForRaftServer(server.getMemberId().toString());
+    registry = getMetricRegistryForRaftServer(server.getMemberId().toString());
     commitInfoCache = server.getCommitInfoCache();
     addPeerCommitIndexGauge(server.getId());
   }
 
+  private RatisMetricRegistry getMetricRegistryForRaftServer(String serverId) {
+    return create(new MetricRegistryInfo(serverId,
+        RATIS_APPLICATION_NAME_METRICS, RATIS_SERVER_METRICS,
+        RATIS_SERVER_METRICS_DESC));
+  }
+
   /**
    * Register a follower with this Leader Metrics registry instance.
    * @param peer {@Link RaftPeer} representing the follower
@@ -78,7 +89,7 @@ public final class RaftServerMetrics {
   public void addFollower(RaftPeer peer) {
     String followerName = peer.getId().toString();
     String followerHbMetricKey = String.format(
-        LEADER_METRIC_FOLLOWER_LAST_HEARTBEAT_ELAPSED_TIME_METRIC,
+        FOLLOWER_LAST_HEARTBEAT_ELAPSED_TIME_METRIC,
         followerName);
 
     followerLastHeartbeatElapsedTimeMap.put(followerName, 0L);
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 abeea14..ad0a44c 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
@@ -18,10 +18,8 @@
 
 package org.apache.ratis.server.impl;
 
-import static org.apache.ratis.server.metrics.RatisMetricNames.STATEMACHINE_TAKE_SNAPSHOT_TIMER;
-
+import org.apache.ratis.metrics.MetricRegistryInfo;
 import org.apache.ratis.metrics.RatisMetricRegistry;
-import org.apache.ratis.server.metrics.RatisMetricNames;
 import org.apache.ratis.server.metrics.RatisMetrics;
 import org.apache.ratis.server.raftlog.RaftLogIndex;
 import org.apache.ratis.statemachine.StateMachine;
@@ -33,8 +31,14 @@ import com.codahale.metrics.Timer;
 /**
  * Metrics Registry for the State Machine Updater. One instance per group.
  */
-public final class StateMachineMetrics {
-  private RatisMetricRegistry registry = null;
+public final class StateMachineMetrics extends RatisMetrics {
+
+  public static final String RATIS_STATEMACHINE_METRICS = "state_machine";
+  public static final String RATIS_STATEMACHINE_METRICS_DESC = "Metrics for State Machine Updater";
+
+  public static final String STATEMACHINE_APPLIED_INDEX_GAUGE = "appliedIndex";
+  public static final String STATEMACHINE_APPLY_COMPLETED_GAUGE = "applyCompletedIndex";
+  public static final String STATEMACHINE_TAKE_SNAPSHOT_TIMER = "takeSnapshot";
 
   public static StateMachineMetrics getStateMachineMetrics(
       RaftServerImpl server, RaftLogIndex appliedIndex,
@@ -51,14 +55,18 @@ public final class StateMachineMetrics {
 
   private StateMachineMetrics(String serverId, LongSupplier getApplied,
       LongSupplier getApplyCompleted) {
-
-    registry = RatisMetrics.getMetricRegistryForStateMachine(serverId);
-    registry.gauge(RatisMetricNames.STATEMACHINE_APPLIED_INDEX_GAUGE,
+    registry = getMetricRegistryForStateMachine(serverId);
+    registry.gauge(STATEMACHINE_APPLIED_INDEX_GAUGE,
         () -> () -> getApplied.getAsLong());
-    registry.gauge(RatisMetricNames.STATEMACHINE_APPLY_COMPLETED_GAUGE,
+    registry.gauge(STATEMACHINE_APPLY_COMPLETED_GAUGE,
         () -> () -> getApplyCompleted.getAsLong());
   }
 
+  private RatisMetricRegistry getMetricRegistryForStateMachine(String serverId) {
+    return create(new MetricRegistryInfo(serverId,
+        RATIS_APPLICATION_NAME_METRICS,
+        RATIS_STATEMACHINE_METRICS, RATIS_STATEMACHINE_METRICS_DESC));
+  }
 
   public Timer getTakeSnapshotTimer() {
     return registry.timer(STATEMACHINE_TAKE_SNAPSHOT_TIMER);
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineUpdater.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineUpdater.java
index 1f47447..fbfc75a 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineUpdater.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/StateMachineUpdater.java
@@ -123,6 +123,7 @@ class StateMachineUpdater implements Runnable {
     state = State.STOP;
     try {
       stateMachine.close();
+      stateMachineMetrics.unregister();
     } catch(Throwable t) {
       LOG.warn(name + ": Failed to close " + stateMachine.getClass().getSimpleName() + " " + stateMachine, t);
     }
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 b6b1f65..c9a90e1 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,26 +18,35 @@
 
 package org.apache.ratis.server.metrics;
 
-import static org.apache.ratis.server.metrics.RatisMetricNames.LAST_LEADER_ELAPSED_TIME;
-import static org.apache.ratis.server.metrics.RatisMetricNames.LEADER_ELECTION_COUNT_METRIC;
-import static org.apache.ratis.server.metrics.RatisMetricNames.LEADER_ELECTION_LATENCY;
-import static org.apache.ratis.server.metrics.RatisMetricNames.LEADER_ELECTION_TIMEOUT_COUNT_METRIC;
-
+import org.apache.ratis.metrics.MetricRegistryInfo;
 import org.apache.ratis.metrics.RatisMetricRegistry;
 import org.apache.ratis.server.impl.RaftServerImpl;
 
 /**
  * Class to update the metrics related to Leader Election.
  */
-public final class LeaderElectionMetrics {
+public final class LeaderElectionMetrics extends RatisMetrics {
+
+  public static final String RATIS_LEADER_ELECTION_METRICS = "leader_election";
+  public static final String RATIS_LEADER_ELECTION_METRICS_DESC = "Metrics for Ratis Leader Election.";
+
+  public static final String LEADER_ELECTION_COUNT_METRIC = "electionCount";
+  public static final String LEADER_ELECTION_TIMEOUT_COUNT_METRIC = "electionTimeoutCount";
+  public static final String LEADER_ELECTION_LATENCY = "electionLatency";
+  public static final String LAST_LEADER_ELAPSED_TIME = "lastLeaderElapsedTime";
 
   private long leaderElectionCompletionLatency = 0L;
-  private RatisMetricRegistry ratisMetricRegistry;
 
   private LeaderElectionMetrics(RaftServerImpl raftServer) {
-    this.ratisMetricRegistry = RatisMetrics.getMetricRegistryForLeaderElection(raftServer.getMemberId().toString());
-    ratisMetricRegistry.gauge(LEADER_ELECTION_LATENCY, () -> () -> leaderElectionCompletionLatency);
-    ratisMetricRegistry.gauge(LAST_LEADER_ELAPSED_TIME, () -> () -> raftServer.getState().getLastLeaderElapsedTimeMs());
+    this.registry = getMetricRegistryForLeaderElection(raftServer.getMemberId().toString());
+    registry.gauge(LEADER_ELECTION_LATENCY, () -> () -> leaderElectionCompletionLatency);
+    registry.gauge(LAST_LEADER_ELAPSED_TIME, () -> () -> raftServer.getState().getLastLeaderElapsedTimeMs());
+  }
+
+  private RatisMetricRegistry getMetricRegistryForLeaderElection(String serverId) {
+    return create(new MetricRegistryInfo(serverId,
+        RATIS_APPLICATION_NAME_METRICS, RATIS_LEADER_ELECTION_METRICS,
+        RATIS_LEADER_ELECTION_METRICS_DESC));
   }
 
   public static LeaderElectionMetrics getLeaderElectionMetrics(RaftServerImpl raftServer) {
@@ -45,7 +54,7 @@ public final class LeaderElectionMetrics {
   }
 
   public void onNewLeaderElection() {
-    ratisMetricRegistry.counter(LEADER_ELECTION_COUNT_METRIC).inc();
+    registry.counter(LEADER_ELECTION_COUNT_METRIC).inc();
   }
 
   public void onLeaderElectionCompletion(long elapsedTime) {
@@ -53,6 +62,6 @@ public final class LeaderElectionMetrics {
   }
 
   public void onLeaderElectionTimeout() {
-    ratisMetricRegistry.counter(LEADER_ELECTION_TIMEOUT_COUNT_METRIC).inc();
+    registry.counter(LEADER_ELECTION_TIMEOUT_COUNT_METRIC).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 6e48138..9fc44be 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
@@ -17,31 +17,36 @@
  */
 package org.apache.ratis.server.metrics;
 
-import static org.apache.ratis.server.metrics.RatisMetricNames.FOLLOWER_MATCH_INDEX;
-import static org.apache.ratis.server.metrics.RatisMetricNames.FOLLOWER_NEXT_INDEX;
-import static org.apache.ratis.server.metrics.RatisMetricNames.FOLLOWER_RPC_RESP_TIME;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.FOLLOWER_MATCH_INDEX;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.FOLLOWER_NEXT_INDEX;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.FOLLOWER_RPC_RESP_TIME;
 
+import org.apache.ratis.metrics.MetricRegistryInfo;
 import org.apache.ratis.metrics.RatisMetricRegistry;
 import org.apache.ratis.protocol.RaftGroupMemberId;
 import org.apache.ratis.server.impl.FollowerInfo;
 
-public final class LogAppenderMetrics {
-  private RatisMetricRegistry ratisMetricRegistry;
+public final class LogAppenderMetrics extends RatisMetrics {
+  public static final String RATIS_LOG_APPENDER_METRICS = "log_appender";
+  public static final String RATIS_LOG_APPENDER_METRICS_DESC = "Metrics for log appender";
 
   public LogAppenderMetrics(RaftGroupMemberId groupMemberId) {
-    ratisMetricRegistry = RatisMetrics.getMetricRegistryForLogAppender(groupMemberId.toString());
+    registry = getMetricRegistryForLogAppender(groupMemberId.toString());
   }
 
-  public RatisMetricRegistry getRatisMetricRegistry() {
-    return ratisMetricRegistry;
+  private RatisMetricRegistry getMetricRegistryForLogAppender(String serverId) {
+    return create(new MetricRegistryInfo(serverId,
+        RATIS_APPLICATION_NAME_METRICS,
+        RATIS_LOG_APPENDER_METRICS, RATIS_LOG_APPENDER_METRICS_DESC));
   }
 
   public void addFollowerGauges(FollowerInfo followerInfo) {
-    ratisMetricRegistry.gauge(String.format(FOLLOWER_NEXT_INDEX, followerInfo.getPeer().getId().toString()),
+    registry.gauge(String.format(FOLLOWER_NEXT_INDEX,
+        followerInfo.getPeer().getId().toString()),
         () -> followerInfo::getNextIndex);
-    ratisMetricRegistry.gauge(String.format(FOLLOWER_MATCH_INDEX, followerInfo.getPeer().getId().toString()),
+    registry.gauge(String.format(FOLLOWER_MATCH_INDEX, followerInfo.getPeer().getId().toString()),
         () -> followerInfo::getMatchIndex);
-    ratisMetricRegistry.gauge(String.format(FOLLOWER_RPC_RESP_TIME, followerInfo.getPeer().getId().toString()),
+    registry.gauge(String.format(FOLLOWER_RPC_RESP_TIME, followerInfo.getPeer().getId().toString()),
         () -> () -> followerInfo.getLastRpcTime().elapsedTimeMs());
   }
 }
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftLogMetrics.java b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftLogMetrics.java
index a65817e..5eb2a85 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftLogMetrics.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftLogMetrics.java
@@ -20,6 +20,7 @@ package org.apache.ratis.server.metrics;
 
 import java.util.Queue;
 
+import org.apache.ratis.metrics.MetricRegistryInfo;
 import org.apache.ratis.metrics.RatisMetricRegistry;
 import org.apache.ratis.util.DataQueue;
 
@@ -27,18 +28,64 @@ import com.codahale.metrics.Gauge;
 import com.codahale.metrics.MetricRegistry;
 import com.codahale.metrics.Timer;
 
-import static org.apache.ratis.server.metrics.RatisMetricNames.*;
-
-public class RaftLogMetrics {
-
-  private RatisMetricRegistry registry = null;
-
-  RaftLogMetrics(RatisMetricRegistry ratisMetricRegistry) {
-    this.registry = ratisMetricRegistry;
-  }
-
-  public RatisMetricRegistry getRegistry() {
-    return registry;
+public class RaftLogMetrics extends RatisMetrics {
+
+  public static final String RATIS_LOG_WORKER_METRICS_DESC = "Metrics for Log Worker";
+  public static final String RATIS_LOG_WORKER_METRICS = "log_worker";
+
+  //////////////////////////////
+  // Raft Log Write Path Metrics
+  /////////////////////////////
+  // Time taken to flush log.
+  public static final String RAFT_LOG_FLUSH_TIME = "flushTime";
+  // Number of times raft log is flushed
+  public static final String RAFT_LOG_FLUSH_COUNT = "flushCount";
+  // Time taken to sync raft log.
+  public static final String RAFT_LOG_SYNC_TIME = "syncTime";
+  // Raft log data queue size which at any time gives the number of raft log related operations in the queue.
+  public static final String RAFT_LOG_DATA_QUEUE_SIZE = "dataQueueSize";
+  // Raft log worker queue size which at any time gives number of committed entries that are to be synced.
+  public static final String RAFT_LOG_WORKER_QUEUE_SIZE = "workerQueueSize";
+  // No. of raft log entries synced with each flush call
+  public static final String RAFT_LOG_SYNC_BATCH_SIZE = "syncBatchSize";
+  // Count of RaftLogCache Misses
+  public static final String RAFT_LOG_CACHE_MISS_COUNT = "cacheMissCount";
+  // Count of RaftLogCache Hits
+  public static final String RAFT_LOG_CACHE_HIT_COUNT = "cacheHitCount";
+  // Total time taken to append a raft log entry
+  public static final String RAFT_LOG_APPEND_ENTRY_LATENCY = "appendEntryLatency";
+  // Time spent by a Raft log operation in the queue.
+  public static final String RAFT_LOG_TASK_QUEUE_TIME = "enqueuedTime";
+  // Time taken for a Raft log operation to get into the queue after being requested. This will be the time it has to
+  // wait for the queue to be non-full.
+  public static final String RAFT_LOG_TASK_ENQUEUE_DELAY = "queueingDelay";
+  // Time taken for a Raft log operation to complete execution.
+  public static final String RAFT_LOG_TASK_EXECUTION_TIME = "%sExecutionTime";
+  // Number of entries appended to the raft log
+  public static final String RAFT_LOG_APPEND_ENTRY_COUNT = "appendEntryCount";
+  public static final String RAFT_LOG_PURGE_METRIC = "purgeLog";
+  public static final String LOG_APPENDER_INSTALL_SNAPSHOT_METRIC = "numInstallSnapshot";
+
+  //////////////////////////////
+  // Raft Log Read Path Metrics
+  /////////////////////////////
+  // Time required to read a raft log entry from actual raft log file and create a raft log entry
+  public static final String RAFT_LOG_READ_ENTRY_LATENCY = "readEntryLatency";
+  // Time required to load and process raft log segments during restart
+  public static final String RAFT_LOG_LOAD_SEGMENT_LATENCY = "segmentLoadLatency";
+  public static final String FOLLOWER_APPEND_ENTRIES_LATENCY = "follower_append_entry_latency";
+  public static final String FOLLOWER_NEXT_INDEX = "follower_%s_next_index";
+  public static final String FOLLOWER_MATCH_INDEX = "follower_%s_match_index";
+  public static final String FOLLOWER_RPC_RESP_TIME = "follower_%s_rpc_response_time";
+
+  public RaftLogMetrics(String serverId) {
+    this.registry = getMetricRegistryForLogWorker(serverId);
+  }
+
+  private RatisMetricRegistry getMetricRegistryForLogWorker(String serverId) {
+    return create(new MetricRegistryInfo(serverId,
+        RATIS_APPLICATION_NAME_METRICS,
+        RATIS_LOG_WORKER_METRICS, RATIS_LOG_WORKER_METRICS_DESC));
   }
 
   public void addDataQueueSizeGauge(DataQueue queue) {
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RatisMetricNames.java b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RatisMetricNames.java
deleted file mode 100644
index 16ddf62..0000000
--- a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RatisMetricNames.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * 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
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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 org.apache.ratis.server.metrics;
-
-public final class RatisMetricNames {
-
-  private RatisMetricNames() {
-  }
-
-  public static final String LEADER_ELECTION_COUNT_METRIC = "leaderElectionCount";
-  public static final String LEADER_ELECTION_TIMEOUT_COUNT_METRIC = "leaderElectionTimeoutCount";
-  public static final String LEADER_ELECTION_LATENCY = "leaderElectionLatency";
-  public static final String LAST_LEADER_ELAPSED_TIME = "lastLeaderElapsedTime";
-
-  public static final String
-      LEADER_METRIC_FOLLOWER_LAST_HEARTBEAT_ELAPSED_TIME_METRIC = "%s_lastHeartbeatElapsedTime";
-  public static final String LEADER_METRIC_PEER_COMMIT_INDEX = "%s_peerCommitIndex";
-
-  //////////////////////////////
-  // Raft State Machine Metrics
-  /////////////////////////////
-
-  public static final String STATEMACHINE_APPLIED_INDEX_GAUGE = "statemachineAppliedIndex";
-  public static final String STATEMACHINE_APPLY_COMPLETED_GAUGE = "statemachineApplyCompletedIndex";
-  public static final String STATEMACHINE_TAKE_SNAPSHOT_TIMER = "stateMachineTakeSnapshot";
-
-  //////////////////////////////
-  // Raft Client Metrics
-  /////////////////////////////
-  public static final String RAFT_CLIENT_READ_REQUEST = "clientReadRequest";
-
-  public static final String RAFT_CLIENT_STALE_READ_REQUEST = "clientStaleReadRequest";
-
-  public static final String RAFT_CLIENT_WRITE_REQUEST = "clientWriteRequest";
-
-  public static final String RAFT_CLIENT_WATCH_REQUEST = "clientWatch%sRequest";
-
-  public static final String RETRY_REQUEST_CACHE_HIT_COUNTER = "numRetryCacheHits";
-
-  public static final String REQUEST_QUEUE_LIMIT_HIT_COUNTER = "numRequestQueueLimitHits";
-
-  public static final String REQUEST_QUEUE_SIZE = "numPendingRequestInQueue";
-
-  //////////////////////////////
-  // Raft Log Write Path Metrics
-  /////////////////////////////
-
-  // Time taken to flush log.
-  public static final String RAFT_LOG_FLUSH_TIME = "flushTime";
-
-  // Number of times raft log is flushed
-  public static final String RAFT_LOG_FLUSH_COUNT = "flushCount";
-
-  // Time taken to sync raft log.
-  public static final String RAFT_LOG_SYNC_TIME = "syncTime";
-
-  // Raft log data queue size which at any time gives the number of raft log related operations in the queue.
-  public static final String RAFT_LOG_DATA_QUEUE_SIZE = "dataQueueSize";
-
-  // Raft log worker queue size which at any time gives number of committed entries that are to be synced.
-  public static final String RAFT_LOG_WORKER_QUEUE_SIZE = "workerQueueSize";
-
-  // No. of raft log entries synced with each flush call
-  public static final String RAFT_LOG_SYNC_BATCH_SIZE = "syncBatchSize";
-
-  // Count of RaftLogCache Misses
-  public static final String RAFT_LOG_CACHE_MISS_COUNT = "cacheMissCount";
-
-  // Count of RaftLogCache Hits
-  public static final String RAFT_LOG_CACHE_HIT_COUNT = "cacheHitCount";
-
-  // Total time taken to append a raft log entry
-  public static final String RAFT_LOG_APPEND_ENTRY_LATENCY = "appendEntryLatency";
-
-  // Time spent by a Raft log operation in the queue.
-  public static final String RAFT_LOG_TASK_QUEUE_TIME = "enqueuedTime";
-
-  // Time taken for a Raft log operation to get into the queue after being requested. This will be the time it has to
-  // wait for the queue to be non-full.
-  public static final String RAFT_LOG_TASK_ENQUEUE_DELAY = "queueingDelay";
-
-  // Time taken for a Raft log operation to complete execution.
-  public static final String RAFT_LOG_TASK_EXECUTION_TIME = "%sExecutionTime";
-
-  // Number of entries appended to the raft log
-  public static final String RAFT_LOG_APPEND_ENTRY_COUNT = "appendEntryCount";
-
-  public static final String RAFT_LOG_PURGE_METRIC = "purgeLog";
-
-  public static final String LOG_APPENDER_INSTALL_SNAPSHOT_METRIC = "numInstallSnapshot";
-
-  //////////////////////////////
-  // Raft Log Read Path Metrics
-  /////////////////////////////
-
-  // Time required to read a raft log entry from actual raft log file and create a raft log entry
-  public static final String RAFT_LOG_READ_ENTRY_LATENCY = "readEntryLatency";
-
-  // Time required to load and process raft log segments during restart
-  public static final String RAFT_LOG_LOAD_SEGMENT_LATENCY = "segmentLoadLatency";
-
-  public static final String FOLLOWER_APPEND_ENTRIES_LATENCY = "follower_append_entry_latency";
-
-  public static final String FOLLOWER_NEXT_INDEX = "follower_%s_next_index";
-
-  public static final String FOLLOWER_MATCH_INDEX = "follower_%s_match_index";
-
-  public static final String FOLLOWER_RPC_RESP_TIME = "follower_%s_rpc_response_time";
-}
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RatisMetrics.java b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RatisMetrics.java
index 3122b8b..0ca63ba 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RatisMetrics.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RatisMetrics.java
@@ -23,63 +23,34 @@ import java.util.Optional;
 import org.apache.ratis.metrics.MetricRegistries;
 import org.apache.ratis.metrics.MetricRegistryInfo;
 import org.apache.ratis.metrics.RatisMetricRegistry;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class RatisMetrics {
-  public static final String RATIS_APPLICATION_NAME_METRICS = "ratis_core";
-  public static final String RATIS_LOG_WORKER_METRICS_DESC = "Metrics for Log Worker";
-  public static final String RATIS_LOG_WORKER_METRICS = "log_worker";
-  public static final String RATIS_LEADER_ELECTION_METRICS = "leader_election";
-  public static final String RATIS_LEADER_ELECTION_METRICS_DESC = "Metrics for Ratis Leader Election.";
-  public static final String RATIS_STATEMACHINE_METRICS = "state_machine";
-  public static final String RATIS_STATEMACHINE_METRICS_DESC = "Metrics for State Machine Updater";
-  public static final String RATIS_SERVER_METRICS = "server";
-  public static final String RATIS_SERVER_METRICS_DESC = "Metrics for Raft server";
-  public static final String RATIS_LOG_APPENDER_METRICS = "log_appender";
-  public static final String RATIS_LOG_APPENDER_METRICS_DESC = "Metrics for log appender";
+  static final Logger LOG = LoggerFactory.getLogger(RatisMetrics.class);
+  public static final String RATIS_APPLICATION_NAME_METRICS = "ratis";
 
-  private static RatisMetricRegistry create(MetricRegistryInfo info) {
-    Optional<RatisMetricRegistry> metricRegistry = MetricRegistries.global().get(info);
-    if (metricRegistry.isPresent()) {
-      return metricRegistry.get();
-    }
-    RatisMetricRegistry registry = MetricRegistries.global().create(info);
-    return registry;
-  }
-
-  public static RatisMetricRegistry getMetricRegistryForLeaderElection(String serverId) {
-    return create(new MetricRegistryInfo(serverId, RATIS_APPLICATION_NAME_METRICS, RATIS_LEADER_ELECTION_METRICS,
-        RATIS_LEADER_ELECTION_METRICS_DESC));
-  }
+  @SuppressWarnings("VisibilityModifier")
+  protected RatisMetricRegistry registry;
 
-  public static RatisMetricRegistry getMetricRegistryForRaftServer(String serverId) {
-    return create(new MetricRegistryInfo(serverId,
-        RATIS_APPLICATION_NAME_METRICS, RATIS_SERVER_METRICS,
-        RATIS_SERVER_METRICS_DESC));
-  }
-
-  public static RatisMetricRegistry getMetricRegistryForStateMachine(String serverId) {
-    return create(new MetricRegistryInfo(serverId, RATIS_APPLICATION_NAME_METRICS,
-        RATIS_STATEMACHINE_METRICS, RATIS_STATEMACHINE_METRICS_DESC));
+  protected RatisMetricRegistry create(MetricRegistryInfo info) {
+    Optional<RatisMetricRegistry> metricRegistry = MetricRegistries.global().get(info);
+    return metricRegistry.orElseGet(() -> {
+      LOG.info("Creating Metrics Registry : {}", info.getName());
+      return MetricRegistries.global().create(info);
+    });
   }
 
-  public static RaftLogMetrics createMetricRegistryForLogWorker(String name) {
-    RatisMetricRegistry ratisMetricRegistry = getMetricRegistryForLogWorker(name);
-    if (ratisMetricRegistry == null) {
-      ratisMetricRegistry = create(new MetricRegistryInfo(name, RATIS_APPLICATION_NAME_METRICS,
-          RATIS_LOG_WORKER_METRICS, RATIS_LOG_WORKER_METRICS_DESC));
+  public void unregister() {
+    MetricRegistryInfo info = registry.getMetricRegistryInfo();
+    LOG.info("Unregistering Metrics Registry : {}", info.getName());
+    Optional<RatisMetricRegistry> metricRegistry = MetricRegistries.global().get(info);
+    if (metricRegistry.isPresent()) {
+      MetricRegistries.global().remove(info);
     }
-    return new RaftLogMetrics(ratisMetricRegistry);
   }
 
-  public static RatisMetricRegistry getMetricRegistryForLogWorker(String name) {
-    Optional<RatisMetricRegistry> ratisMetricRegistry = MetricRegistries.global().get(
-        new MetricRegistryInfo(name, RATIS_APPLICATION_NAME_METRICS, RATIS_LOG_WORKER_METRICS,
-            RATIS_LOG_WORKER_METRICS_DESC));
-    return ratisMetricRegistry.orElse(null);
-  }
-
-  public static RatisMetricRegistry getMetricRegistryForLogAppender(String serverId) {
-    return create(new MetricRegistryInfo(serverId, RATIS_APPLICATION_NAME_METRICS,
-        RATIS_LOG_APPENDER_METRICS, RATIS_LOG_APPENDER_METRICS_DESC));
+  public RatisMetricRegistry getRegistry() {
+    return registry;
   }
 }
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLog.java b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLog.java
index 569062c..eb91182 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLog.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLog.java
@@ -24,7 +24,6 @@ import org.apache.ratis.server.RaftServerConfigKeys;
 import org.apache.ratis.server.impl.RaftServerImpl;
 import org.apache.ratis.server.impl.ServerProtoUtils;
 import org.apache.ratis.server.metrics.RaftLogMetrics;
-import org.apache.ratis.server.metrics.RatisMetrics;
 import org.apache.ratis.server.protocol.TermIndex;
 import org.apache.ratis.server.raftlog.RaftLog;
 import org.apache.ratis.server.raftlog.RaftLogIOException;
@@ -192,7 +191,7 @@ public class SegmentedRaftLog extends RaftLog {
   private final SegmentedRaftLogWorker fileLogWorker;
   private final long segmentMaxSize;
   private final boolean stateMachineCachingEnabled;
-  private final RaftLogMetrics metricRegistry;
+  private final RaftLogMetrics raftLogMetrics;
 
   public SegmentedRaftLog(RaftGroupMemberId memberId, RaftServerImpl server,
       RaftStorage storage, long lastIndexInSnapshot, RaftProperties properties) {
@@ -209,10 +208,10 @@ public class SegmentedRaftLog extends RaftLog {
     this.storage = storage;
     this.stateMachine = stateMachine;
     segmentMaxSize = RaftServerConfigKeys.Log.segmentSizeMax(properties).getSize();
-    this.metricRegistry = RatisMetrics.createMetricRegistryForLogWorker(memberId.getPeerId().toString());
-    this.cache = new SegmentedRaftLogCache(memberId, storage, properties, metricRegistry);
+    this.raftLogMetrics = new RaftLogMetrics(memberId.getPeerId().toString());
+    this.cache = new SegmentedRaftLogCache(memberId, storage, properties, raftLogMetrics);
     this.fileLogWorker = new SegmentedRaftLogWorker(memberId, stateMachine,
-        submitUpdateCommitEvent, server, storage, properties, metricRegistry);
+        submitUpdateCommitEvent, server, storage, properties, raftLogMetrics);
     stateMachineCachingEnabled = RaftServerConfigKeys.Log.StateMachineData.cachingEnabled(properties);
   }
 
@@ -248,7 +247,7 @@ public class SegmentedRaftLog extends RaftLog {
         // so that during the initial loading we can apply part of the log
         // entries to the state machine
         boolean keepEntryInCache = (paths.size() - i++) <= cache.getMaxCachedSegments();
-        final Timer.Context loadSegmentContext = metricRegistry.getRaftLogLoadSegmentTimer().time();
+        final Timer.Context loadSegmentContext = raftLogMetrics.getRaftLogLoadSegmentTimer().time();
         cache.loadSegment(pi, keepEntryInCache, logConsumer);
         loadSegmentContext.stop();
       }
@@ -282,13 +281,13 @@ public class SegmentedRaftLog extends RaftLog {
       }
       final LogEntryProto entry = segment.getEntryFromCache(record.getTermIndex());
       if (entry != null) {
-        metricRegistry.onRaftLogCacheHit();
+        raftLogMetrics.onRaftLogCacheHit();
         return entry;
       }
     }
 
     // the entry is not in the segment's cache. Load the cache without holding the lock.
-    metricRegistry.onRaftLogCacheMiss();
+    raftLogMetrics.onRaftLogCacheMiss();
     checkAndEvictCache();
     return segment.loadCache(record);
   }
@@ -383,7 +382,7 @@ public class SegmentedRaftLog extends RaftLog {
 
   @Override
   protected CompletableFuture<Long> appendEntryImpl(LogEntryProto entry) {
-    final Timer.Context context = metricRegistry.getRaftLogAppendEntryTimer().time();
+    final Timer.Context context = raftLogMetrics.getRaftLogAppendEntryTimer().time();
     checkLogState();
     if (LOG.isTraceEnabled()) {
       LOG.trace("{}: appendEntry {}", getName(), ServerProtoUtils.toLogEntryString(entry));
@@ -508,6 +507,7 @@ public class SegmentedRaftLog extends RaftLog {
     }
     fileLogWorker.close();
     storage.close();
+    raftLogMetrics.unregister();
   }
 
   SegmentedRaftLogCache getRaftLogCache() {
diff --git a/ratis-server/src/test/java/org/apache/ratis/LogAppenderTests.java b/ratis-server/src/test/java/org/apache/ratis/LogAppenderTests.java
index d73268d..fb09542 100644
--- a/ratis-server/src/test/java/org/apache/ratis/LogAppenderTests.java
+++ b/ratis-server/src/test/java/org/apache/ratis/LogAppenderTests.java
@@ -31,9 +31,9 @@ import org.apache.ratis.protocol.RaftPeerId;
 import org.apache.ratis.server.RaftServerConfigKeys;
 import org.apache.ratis.server.impl.LogAppender;
 import org.apache.ratis.server.impl.RaftServerImpl;
+import org.apache.ratis.server.impl.RaftServerMetrics;
 import org.apache.ratis.server.impl.ServerProtoUtils;
 import org.apache.ratis.server.impl.ServerState;
-import org.apache.ratis.server.metrics.RatisMetrics;
 import org.apache.ratis.server.raftlog.RaftLog;
 import org.apache.ratis.statemachine.SimpleStateMachine4Testing;
 import org.apache.ratis.statemachine.StateMachine;
@@ -142,8 +142,7 @@ public abstract class LogAppenderTests<CLUSTER extends MiniRaftCluster>
     }
 
     RatisMetricRegistry ratisMetricRegistry =
-        RatisMetrics.getMetricRegistryForRaftServer(
-            leaderServer.getMemberId().toString());
+        RaftServerMetrics.getRaftServerMetrics(leaderServer).getRegistry();
 
     // Get all last_heartbeat_elapsed_time metric gauges. Should be equal to number of followers.
     SortedMap<String, Gauge> heartbeatElapsedTimeGauges = ratisMetricRegistry.getGauges((s, metric) ->
@@ -160,8 +159,7 @@ public abstract class LogAppenderTests<CLUSTER extends MiniRaftCluster>
       assertTrue((long)metric.getValue() > 0);
       // Try to get Heartbeat metrics for follower.
       RatisMetricRegistry followerMetricsRegistry =
-          RatisMetrics.getMetricRegistryForRaftServer(
-              followerServer.getMemberId().toString());
+          RaftServerMetrics.getRaftServerMetrics(followerServer).getRegistry();
       // Metric should not exist. It only exists in leader.
       assertTrue(followerMetricsRegistry.getGauges((s, m) -> s.contains("last_heartbeat_elapsed_time")).isEmpty());
     }
diff --git a/ratis-server/src/test/java/org/apache/ratis/RaftBasicTests.java b/ratis-server/src/test/java/org/apache/ratis/RaftBasicTests.java
index 04111ff..a550df7 100644
--- a/ratis-server/src/test/java/org/apache/ratis/RaftBasicTests.java
+++ b/ratis-server/src/test/java/org/apache/ratis/RaftBasicTests.java
@@ -18,18 +18,19 @@
 package org.apache.ratis;
 
 import com.codahale.metrics.Gauge;
+
 import org.apache.log4j.Level;
 import org.apache.ratis.RaftTestUtil.SimpleMessage;
 import org.apache.ratis.client.RaftClient;
 import org.apache.ratis.client.impl.RaftClientTestUtil;
+import org.apache.ratis.metrics.MetricRegistries;
+import org.apache.ratis.metrics.MetricRegistryInfo;
 import org.apache.ratis.metrics.RatisMetricRegistry;
 import org.apache.ratis.protocol.RaftClientReply;
 import org.apache.ratis.protocol.RaftPeerId;
 import org.apache.ratis.server.RaftServer;
 import org.apache.ratis.server.RaftServerConfigKeys;
 import org.apache.ratis.server.impl.*;
-import org.apache.ratis.server.metrics.RatisMetricNames;
-import org.apache.ratis.server.metrics.RatisMetrics;
 import org.apache.ratis.server.raftlog.RaftLog;
 import org.apache.ratis.proto.RaftProtos.LogEntryProto;
 import org.apache.ratis.util.ExitUtils;
@@ -43,6 +44,7 @@ import org.slf4j.Logger;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Optional;
 import java.util.SortedMap;
 import java.util.Timer;
 import java.util.TimerTask;
@@ -56,6 +58,11 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 import static org.apache.ratis.RaftTestUtil.waitForLeader;
+import static org.apache.ratis.server.impl.StateMachineMetrics.RATIS_STATEMACHINE_METRICS;
+import static org.apache.ratis.server.impl.StateMachineMetrics.RATIS_STATEMACHINE_METRICS_DESC;
+import static org.apache.ratis.server.impl.StateMachineMetrics.STATEMACHINE_APPLIED_INDEX_GAUGE;
+import static org.apache.ratis.server.impl.StateMachineMetrics.STATEMACHINE_APPLY_COMPLETED_GAUGE;
+import static org.apache.ratis.server.metrics.RatisMetrics.RATIS_APPLICATION_NAME_METRICS;
 
 public abstract class RaftBasicTests<CLUSTER extends MiniRaftCluster>
     extends BaseTest
@@ -442,9 +449,9 @@ public abstract class RaftBasicTests<CLUSTER extends MiniRaftCluster>
       Assert.assertTrue(leader.isLeader());
 
       Gauge appliedIndexGauge = getStatemachineGaugeWithName(leader,
-          RatisMetricNames.STATEMACHINE_APPLIED_INDEX_GAUGE);
+          STATEMACHINE_APPLIED_INDEX_GAUGE);
       Gauge smAppliedIndexGauge = getStatemachineGaugeWithName(leader,
-          RatisMetricNames.STATEMACHINE_APPLY_COMPLETED_GAUGE);
+          STATEMACHINE_APPLY_COMPLETED_GAUGE);
 
       long appliedIndexBefore = (Long) appliedIndexGauge.getValue();
       long smAppliedIndexBefore = (Long) smAppliedIndexGauge.getValue();
@@ -491,9 +498,13 @@ public abstract class RaftBasicTests<CLUSTER extends MiniRaftCluster>
   private static Gauge getStatemachineGaugeWithName(RaftServerImpl server,
       String gaugeName) {
 
-    RatisMetricRegistry ratisStateMachineMetricRegistry =
-        RatisMetrics.getMetricRegistryForStateMachine(
-            server.getMemberId().toString());
+    MetricRegistryInfo info = new MetricRegistryInfo(server.getMemberId().toString(),
+        RATIS_APPLICATION_NAME_METRICS,
+        RATIS_STATEMACHINE_METRICS, RATIS_STATEMACHINE_METRICS_DESC);
+
+    Optional<RatisMetricRegistry> metricRegistry = MetricRegistries.global().get(info);
+    Assert.assertTrue(metricRegistry.isPresent());
+    RatisMetricRegistry ratisStateMachineMetricRegistry = metricRegistry.get();
 
     SortedMap<String, Gauge> gaugeMap =
         ratisStateMachineMetricRegistry.getGauges((s, metric) ->
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 5448306..814416d 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
@@ -27,7 +27,6 @@ import org.apache.ratis.protocol.RaftGroupId;
 import org.apache.ratis.protocol.RaftGroupMemberId;
 import org.apache.ratis.protocol.RaftPeerId;
 import org.apache.ratis.server.metrics.LeaderElectionMetrics;
-import org.apache.ratis.server.metrics.RatisMetrics;
 import org.apache.ratis.server.raftlog.segmented.SegmentedRaftLogTestUtils;
 import org.apache.ratis.util.ExitUtils;
 import org.apache.ratis.util.JavaUtils;
@@ -46,9 +45,9 @@ import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 
 import static org.apache.ratis.RaftTestUtil.waitForLeader;
-import static org.apache.ratis.server.metrics.RatisMetricNames.LEADER_ELECTION_COUNT_METRIC;
-import static org.apache.ratis.server.metrics.RatisMetricNames.LEADER_ELECTION_LATENCY;
-import static org.apache.ratis.server.metrics.RatisMetricNames.LEADER_ELECTION_TIMEOUT_COUNT_METRIC;
+import static org.apache.ratis.server.metrics.LeaderElectionMetrics.LEADER_ELECTION_COUNT_METRIC;
+import static org.apache.ratis.server.metrics.LeaderElectionMetrics.LEADER_ELECTION_LATENCY;
+import static org.apache.ratis.server.metrics.LeaderElectionMetrics.LEADER_ELECTION_TIMEOUT_COUNT_METRIC;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -161,8 +160,7 @@ public abstract class LeaderElectionTests<CLUSTER extends MiniRaftCluster>
     cluster.start();
     RaftServerImpl leaderServer = waitForLeader(cluster);
 
-    RatisMetricRegistry ratisMetricRegistry = RatisMetrics.getMetricRegistryForLeaderElection(leaderServer
-        .getMemberId().toString());
+    RatisMetricRegistry ratisMetricRegistry = LeaderElectionMetrics.getLeaderElectionMetrics(leaderServer).getRegistry();
 
     // Verify each metric individually.
     long numLeaderElections = ratisMetricRegistry.counter(LEADER_ELECTION_COUNT_METRIC).getCount();
@@ -211,7 +209,7 @@ public abstract class LeaderElectionTests<CLUSTER extends MiniRaftCluster>
     when(server.isCandidate()).thenReturn(false);
     when(server.getMemberId()).thenReturn(RaftGroupMemberId.valueOf(RaftPeerId.valueOf("any"), RaftGroupId.randomId()));
     LeaderElectionMetrics leaderElectionMetrics = LeaderElectionMetrics.getLeaderElectionMetrics(server);
-    when(server.getLeaderElectionMetricsRegistry()).thenReturn(leaderElectionMetrics);
+    when(server.getLeaderElectionMetrics()).thenReturn(leaderElectionMetrics);
     return server;
   }
 }
diff --git a/ratis-server/src/test/java/org/apache/ratis/server/impl/TestLogAppenderMetrics.java b/ratis-server/src/test/java/org/apache/ratis/server/impl/TestLogAppenderMetrics.java
index 42d8a2c..47a430b 100644
--- a/ratis-server/src/test/java/org/apache/ratis/server/impl/TestLogAppenderMetrics.java
+++ b/ratis-server/src/test/java/org/apache/ratis/server/impl/TestLogAppenderMetrics.java
@@ -17,9 +17,9 @@
  */
 package org.apache.ratis.server.impl;
 
-import static org.apache.ratis.server.metrics.RatisMetricNames.FOLLOWER_MATCH_INDEX;
-import static org.apache.ratis.server.metrics.RatisMetricNames.FOLLOWER_NEXT_INDEX;
-import static org.apache.ratis.server.metrics.RatisMetricNames.FOLLOWER_RPC_RESP_TIME;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.FOLLOWER_MATCH_INDEX;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.FOLLOWER_NEXT_INDEX;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.FOLLOWER_RPC_RESP_TIME;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -52,7 +52,7 @@ public class TestLogAppenderMetrics {
     followerInfo = new TestFollowerInfo(raftGroupMemberId, raftPeer, Timestamp.currentTime(), 100L, true, 1000);
     when(logAppender.getFollower()).thenReturn(followerInfo);
     LogAppenderMetrics logAppenderMetrics = new LogAppenderMetrics(raftGroupMemberId);
-    ratisMetricRegistry = logAppenderMetrics.getRatisMetricRegistry();
+    ratisMetricRegistry = logAppenderMetrics.getRegistry();
     logAppenderMetrics.addFollowerGauges(followerInfo);
   }
 
diff --git a/ratis-server/src/test/java/org/apache/ratis/server/metrics/TestLeaderElectionMetrics.java b/ratis-server/src/test/java/org/apache/ratis/server/metrics/TestLeaderElectionMetrics.java
index 44750a1..e1e3d4b 100644
--- a/ratis-server/src/test/java/org/apache/ratis/server/metrics/TestLeaderElectionMetrics.java
+++ b/ratis-server/src/test/java/org/apache/ratis/server/metrics/TestLeaderElectionMetrics.java
@@ -18,9 +18,9 @@
 
 package org.apache.ratis.server.metrics;
 
-import static org.apache.ratis.server.metrics.RatisMetricNames.LEADER_ELECTION_COUNT_METRIC;
-import static org.apache.ratis.server.metrics.RatisMetricNames.LEADER_ELECTION_LATENCY;
-import static org.apache.ratis.server.metrics.RatisMetricNames.LEADER_ELECTION_TIMEOUT_COUNT_METRIC;
+import static org.apache.ratis.server.metrics.LeaderElectionMetrics.LEADER_ELECTION_COUNT_METRIC;
+import static org.apache.ratis.server.metrics.LeaderElectionMetrics.LEADER_ELECTION_LATENCY;
+import static org.apache.ratis.server.metrics.LeaderElectionMetrics.LEADER_ELECTION_TIMEOUT_COUNT_METRIC;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
@@ -54,7 +54,7 @@ public class TestLeaderElectionMetrics {
     RaftGroupMemberId raftGroupMemberId = RaftGroupMemberId.valueOf(raftPeerId, raftGroupId);
     when(raftServer.getMemberId()).thenReturn(raftGroupMemberId);
     leaderElectionMetrics = LeaderElectionMetrics.getLeaderElectionMetrics(raftServer);
-    ratisMetricRegistry = RatisMetrics.getMetricRegistryForLeaderElection(raftServer.getMemberId().toString());
+    ratisMetricRegistry = leaderElectionMetrics.getRegistry();
   }
 
   @Test
diff --git a/ratis-server/src/test/java/org/apache/ratis/server/storage/RaftStorageTestUtils.java b/ratis-server/src/test/java/org/apache/ratis/server/storage/RaftStorageTestUtils.java
index 7ad23b7..b8c3677 100644
--- a/ratis-server/src/test/java/org/apache/ratis/server/storage/RaftStorageTestUtils.java
+++ b/ratis-server/src/test/java/org/apache/ratis/server/storage/RaftStorageTestUtils.java
@@ -17,7 +17,8 @@
  */
 package org.apache.ratis.server.storage;
 
-import static org.apache.ratis.server.metrics.RatisMetricNames.RAFT_LOG_FLUSH_TIME;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.RAFT_LOG_FLUSH_TIME;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.RATIS_LOG_WORKER_METRICS;
 
 import org.apache.ratis.protocol.RaftPeerId;
 import org.apache.ratis.server.impl.ServerProtoUtils;
@@ -36,7 +37,7 @@ public interface RaftStorageTestUtils {
   }
 
   static String getRaftLogFullMetric(RaftPeerId serverId, String metricName) {
-    return RatisMetrics.RATIS_APPLICATION_NAME_METRICS + "." + RatisMetrics.RATIS_LOG_WORKER_METRICS
+    return RatisMetrics.RATIS_APPLICATION_NAME_METRICS + "." + RATIS_LOG_WORKER_METRICS
         + "." + serverId + "." + metricName;
   }
 
diff --git a/ratis-server/src/test/java/org/apache/ratis/statemachine/RaftSnapshotBaseTest.java b/ratis-server/src/test/java/org/apache/ratis/statemachine/RaftSnapshotBaseTest.java
index b1f7ef7..9b36ec6 100644
--- a/ratis-server/src/test/java/org/apache/ratis/statemachine/RaftSnapshotBaseTest.java
+++ b/ratis-server/src/test/java/org/apache/ratis/statemachine/RaftSnapshotBaseTest.java
@@ -17,8 +17,11 @@
  */
 package org.apache.ratis.statemachine;
 
-import static org.apache.ratis.server.metrics.RatisMetricNames.LOG_APPENDER_INSTALL_SNAPSHOT_METRIC;
-import static org.apache.ratis.server.metrics.RatisMetricNames.STATEMACHINE_TAKE_SNAPSHOT_TIMER;
+import static org.apache.ratis.server.impl.StateMachineMetrics.RATIS_STATEMACHINE_METRICS;
+import static org.apache.ratis.server.impl.StateMachineMetrics.RATIS_STATEMACHINE_METRICS_DESC;
+import static org.apache.ratis.server.impl.StateMachineMetrics.STATEMACHINE_TAKE_SNAPSHOT_TIMER;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.LOG_APPENDER_INSTALL_SNAPSHOT_METRIC;
+import static org.apache.ratis.server.metrics.RatisMetrics.RATIS_APPLICATION_NAME_METRICS;
 
 import org.apache.log4j.Level;
 import org.apache.ratis.BaseTest;
@@ -27,13 +30,14 @@ import org.apache.ratis.RaftTestUtil;
 import org.apache.ratis.RaftTestUtil.SimpleMessage;
 import org.apache.ratis.client.RaftClient;
 import org.apache.ratis.conf.RaftProperties;
+import org.apache.ratis.metrics.MetricRegistries;
+import org.apache.ratis.metrics.MetricRegistryInfo;
 import org.apache.ratis.metrics.RatisMetricRegistry;
 import org.apache.ratis.protocol.RaftClientReply;
 import org.apache.ratis.protocol.RaftPeerId;
 import org.apache.ratis.server.RaftServerConfigKeys;
 import org.apache.ratis.server.impl.RaftServerImpl;
 import org.apache.ratis.server.impl.RaftServerTestUtil;
-import org.apache.ratis.server.metrics.RatisMetrics;
 import org.apache.ratis.server.raftlog.RaftLog;
 import org.apache.ratis.server.storage.RaftStorageDirectory;
 import org.apache.ratis.server.storage.RaftStorageDirectory.LogPathAndIndex;
@@ -52,6 +56,7 @@ import org.slf4j.LoggerFactory;
 import java.io.File;
 import java.io.IOException;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 import java.util.stream.LongStream;
 
@@ -241,7 +246,12 @@ public abstract class RaftSnapshotBaseTest extends BaseTest {
   }
 
   private static void verifyTakeSnapshotMetric(RaftServerImpl leader) {
-    RatisMetricRegistry metricRegistry = RatisMetrics.getMetricRegistryForStateMachine(leader.getMemberId().toString());
+    MetricRegistryInfo info = new MetricRegistryInfo(leader.getMemberId().toString(),
+        RATIS_APPLICATION_NAME_METRICS,
+        RATIS_STATEMACHINE_METRICS, RATIS_STATEMACHINE_METRICS_DESC);
+    Optional<RatisMetricRegistry> opt = MetricRegistries.global().get(info);
+    Assert.assertTrue(opt.isPresent());
+    RatisMetricRegistry metricRegistry = opt.get();
     Assert.assertNotNull(metricRegistry);
     Timer timer = metricRegistry.timer(STATEMACHINE_TAKE_SNAPSHOT_TIMER);
     Assert.assertTrue(timer.getCount() > 0);
diff --git a/ratis-test/src/test/java/org/apache/ratis/TestRaftServerSlownessDetection.java b/ratis-test/src/test/java/org/apache/ratis/TestRaftServerSlownessDetection.java
index d162191..e3152ad 100644
--- a/ratis-test/src/test/java/org/apache/ratis/TestRaftServerSlownessDetection.java
+++ b/ratis-test/src/test/java/org/apache/ratis/TestRaftServerSlownessDetection.java
@@ -23,7 +23,7 @@ import org.apache.ratis.metrics.RatisMetricRegistry;
 import org.apache.ratis.protocol.RaftPeerId;
 import org.apache.ratis.server.RaftServerConfigKeys;
 import org.apache.ratis.server.impl.RaftServerImpl;
-import org.apache.ratis.server.metrics.RatisMetrics;
+import org.apache.ratis.server.impl.RaftServerMetrics;
 import org.apache.ratis.server.simulation.MiniRaftClusterWithSimulatedRpc;
 import org.apache.ratis.proto.RaftProtos;
 import org.apache.ratis.statemachine.SimpleStateMachine4Testing;
@@ -90,8 +90,7 @@ public class TestRaftServerSlownessDetection extends BaseTest {
     RaftServerImpl failedFollower = cluster.getFollowers().get(0);
 
     RatisMetricRegistry ratisMetricRegistry =
-        RatisMetrics.getMetricRegistryForRaftServer(
-            leaderServer.getMemberId().toString());
+        RaftServerMetrics.getRaftServerMetrics(leaderServer).getRegistry();
     SortedMap<String, Gauge> heartbeatElapsedTimeGauges =
         ratisMetricRegistry.getGauges((s, metric) ->
             s.contains("lastHeartbeatElapsedTime"));
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 488b523..f79149d 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
@@ -17,10 +17,10 @@
  */
 package org.apache.ratis.grpc;
 
-import static org.apache.ratis.server.metrics.RatisMetricNames.RAFT_CLIENT_READ_REQUEST;
-import static org.apache.ratis.server.metrics.RatisMetricNames.RAFT_CLIENT_STALE_READ_REQUEST;
-import static org.apache.ratis.server.metrics.RatisMetricNames.RAFT_CLIENT_WATCH_REQUEST;
-import static org.apache.ratis.server.metrics.RatisMetricNames.RAFT_CLIENT_WRITE_REQUEST;
+import static org.apache.ratis.server.impl.RaftServerMetrics.RAFT_CLIENT_READ_REQUEST;
+import static org.apache.ratis.server.impl.RaftServerMetrics.RAFT_CLIENT_STALE_READ_REQUEST;
+import static org.apache.ratis.server.impl.RaftServerMetrics.RAFT_CLIENT_WATCH_REQUEST;
+import static org.apache.ratis.server.impl.RaftServerMetrics.RAFT_CLIENT_WRITE_REQUEST;
 
 import org.apache.log4j.Level;
 import org.apache.ratis.BaseTest;
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 510c1ab..e8dcf30 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
@@ -17,8 +17,22 @@
  */
 package org.apache.ratis.server.raftlog;
 
+import static org.apache.ratis.server.metrics.RaftLogMetrics.RAFT_LOG_APPEND_ENTRY_COUNT;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.RAFT_LOG_APPEND_ENTRY_LATENCY;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.RAFT_LOG_CACHE_HIT_COUNT;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.RAFT_LOG_CACHE_MISS_COUNT;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.RAFT_LOG_DATA_QUEUE_SIZE;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.RAFT_LOG_FLUSH_COUNT;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.RAFT_LOG_FLUSH_TIME;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.RAFT_LOG_SYNC_BATCH_SIZE;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.RAFT_LOG_SYNC_TIME;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.RAFT_LOG_TASK_ENQUEUE_DELAY;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.RAFT_LOG_TASK_EXECUTION_TIME;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.RAFT_LOG_TASK_QUEUE_TIME;
+import static org.apache.ratis.server.metrics.RaftLogMetrics.RAFT_LOG_WORKER_QUEUE_SIZE;
+import static org.apache.ratis.server.metrics.RatisMetrics.RATIS_APPLICATION_NAME_METRICS;
+
 import com.codahale.metrics.Timer;
-import org.apache.log4j.Level;
 import org.apache.ratis.BaseTest;
 import org.apache.ratis.MiniRaftCluster;
 import org.apache.ratis.RaftTestUtil;
@@ -26,7 +40,7 @@ import org.apache.ratis.client.RaftClient;
 import org.apache.ratis.metrics.JVMMetrics;
 import org.apache.ratis.metrics.RatisMetricRegistry;
 import org.apache.ratis.server.impl.RaftServerImpl;
-import org.apache.ratis.server.metrics.RatisMetrics;
+import org.apache.ratis.server.metrics.RaftLogMetrics;
 import org.apache.ratis.server.simulation.MiniRaftClusterWithSimulatedRpc;
 import org.apache.ratis.server.storage.RaftStorageTestUtils;
 import org.apache.ratis.statemachine.StateMachine;
@@ -43,8 +57,6 @@ import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import static org.apache.ratis.server.metrics.RatisMetricNames.*;
-
 public class TestRaftLogMetrics extends BaseTest
     implements MiniRaftClusterWithSimulatedRpc.FactoryGet {
   static {
@@ -108,8 +120,8 @@ public class TestRaftLogMetrics extends BaseTest
 
   static void assertFlushCount(RaftServerImpl server) throws Exception {
     final String flushTimeMetric = RaftStorageTestUtils.getLogFlushTimeMetric(server.getId());
-    Timer tm = (Timer) RatisMetrics.getMetricRegistryForLogWorker(server.getId().toString())
-        .get(RAFT_LOG_FLUSH_TIME);
+    RatisMetricRegistry ratisMetricRegistry = new RaftLogMetrics((server.getId().toString())).getRegistry();
+    Timer tm = (Timer) ratisMetricRegistry.get(RAFT_LOG_FLUSH_TIME);
     Assert.assertNotNull(tm);
 
     final MetricsStateMachine stateMachine = MetricsStateMachine.get(server);
@@ -119,7 +131,7 @@ public class TestRaftLogMetrics extends BaseTest
     Assert.assertTrue(tm.getMeanRate() > 0);
 
     // Test jmx
-    ObjectName oname = new ObjectName("ratis_core", "name", flushTimeMetric);
+    ObjectName oname = new ObjectName(RATIS_APPLICATION_NAME_METRICS, "name", flushTimeMetric);
     Assert.assertEquals(expectedFlush,
         ((Long) ManagementFactory.getPlatformMBeanServer().getAttribute(oname, "Count"))
             .intValue());
@@ -127,7 +139,7 @@ public class TestRaftLogMetrics extends BaseTest
 
   static void assertRaftLogWritePathMetrics(RaftServerImpl server) throws Exception {
     final String syncTimeMetric = RaftStorageTestUtils.getRaftLogFullMetric(server.getId(), RAFT_LOG_SYNC_TIME);
-    RatisMetricRegistry ratisMetricRegistry = RatisMetrics.getMetricRegistryForLogWorker(server.getId().toString());
+    RatisMetricRegistry ratisMetricRegistry = new RaftLogMetrics((server.getId().toString())).getRegistry();
 
     //Test sync count
     Timer tm = (Timer) ratisMetricRegistry.get(RAFT_LOG_SYNC_TIME);
@@ -138,7 +150,7 @@ public class TestRaftLogMetrics extends BaseTest
     Assert.assertTrue(tm.getMeanRate() > 0);
 
     // Test jmx. Just testing one metric's JMX is good enough.
-    ObjectName oname = new ObjectName("ratis_core", "name", syncTimeMetric);
+    ObjectName oname = new ObjectName(RATIS_APPLICATION_NAME_METRICS, "name", syncTimeMetric);
     Assert.assertEquals(expectedFlush,
         ((Long) ManagementFactory.getPlatformMBeanServer().getAttribute(oname, "Count"))
             .intValue());
diff --git a/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestLogSegment.java b/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestLogSegment.java
index 032c758..9a11d0f 100644
--- a/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestLogSegment.java
+++ b/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestLogSegment.java
@@ -24,7 +24,6 @@ import org.apache.ratis.server.RaftServerConfigKeys;
 import org.apache.ratis.server.impl.RaftServerConstants.StartupOption;
 import org.apache.ratis.server.impl.ServerProtoUtils;
 import org.apache.ratis.server.metrics.RaftLogMetrics;
-import org.apache.ratis.server.metrics.RatisMetrics;
 import org.apache.ratis.server.protocol.TermIndex;
 import org.apache.ratis.server.storage.RaftStorage;
 import org.apache.ratis.server.storage.RaftStorageDirectory;
@@ -212,7 +211,7 @@ public class TestLogSegment extends BaseTest {
 
   @Test
   public void testAppendEntryMetric() throws Exception {
-    RaftLogMetrics raftLogMetrics = RatisMetrics.createMetricRegistryForLogWorker("test");
+    RaftLogMetrics raftLogMetrics = new RaftLogMetrics("test");
 
     final File openSegmentFile = prepareLog(true, 0, 100, 0, true);
     RaftStorage storage = new RaftStorage(storageDir, StartupOption.REGULAR);
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 8b686fb..7dbbb69 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
@@ -32,6 +32,7 @@ import org.apache.ratis.server.impl.RetryCacheTestUtil;
 import org.apache.ratis.server.impl.RetryCache;
 import org.apache.ratis.server.impl.RaftServerImpl;
 import org.apache.ratis.server.impl.ServerProtoUtils;
+import org.apache.ratis.server.metrics.RaftLogMetrics;
 import org.apache.ratis.server.protocol.TermIndex;
 import org.apache.ratis.proto.RaftProtos.LogEntryProto;
 import org.apache.ratis.server.raftlog.RaftLog;
@@ -63,7 +64,6 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Supplier;
 
-import static org.apache.ratis.server.metrics.RatisMetrics.getMetricRegistryForLogWorker;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.doCallRealMethod;
 import static org.mockito.Mockito.doNothing;
@@ -199,7 +199,7 @@ public class TestSegmentedRaftLog extends BaseTest {
       Assert.assertArrayEquals(entries, entriesFromLog);
       Assert.assertEquals(entries[entries.length - 1], getLastEntry(raftLog));
 
-      RatisMetricRegistry metricRegistryForLogWorker = getMetricRegistryForLogWorker(memberId.getPeerId().toString());
+      RatisMetricRegistry metricRegistryForLogWorker = new RaftLogMetrics((memberId.getPeerId().toString())).getRegistry();
 
       Timer raftLogSegmentLoadLatencyTimer = metricRegistryForLogWorker.timer("segmentLoadLatency");
       Assert.assertTrue(raftLogSegmentLoadLatencyTimer.getMeanRate() > 0);
@@ -408,8 +408,8 @@ public class TestSegmentedRaftLog extends BaseTest {
     int segmentSize = 200;
     long endIndexOfClosedSegment = segmentSize * (endTerm - startTerm - 1) - 1;
     long expectedIndex = segmentSize * (endTerm - startTerm - 2);
+    RatisMetricRegistry metricRegistryForLogWorker = new RaftLogMetrics((memberId.getPeerId().toString())).getRegistry();
     purgeAndVerify(startTerm, endTerm, segmentSize, 1, endIndexOfClosedSegment, expectedIndex);
-    RatisMetricRegistry metricRegistryForLogWorker = getMetricRegistryForLogWorker(memberId.getPeerId().toString());
     Assert.assertTrue(metricRegistryForLogWorker.timer("purgeLog").getCount() > 0);
   }