You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ratis.apache.org by ru...@apache.org on 2020/12/22 23:37:21 UTC

[incubator-ratis] branch master updated: RATIS-1257. Refactor RaftServerMetrics. (#370)

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

runzhiwang 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 0a1b63d  RATIS-1257. Refactor RaftServerMetrics. (#370)
0a1b63d is described below

commit 0a1b63d5b5f18e23e4ad52a361e1811730ba8207
Author: Tsz-Wo Nicholas Sze <sz...@apache.org>
AuthorDate: Wed Dec 23 07:37:13 2020 +0800

    RATIS-1257. Refactor RaftServerMetrics. (#370)
---
 .../ratis/server/metrics/RaftServerMetrics.java    | 25 +++++++++++++++++
 .../apache/ratis/server/impl/LeaderStateImpl.java  |  4 +--
 .../apache/ratis/server/impl/PendingRequests.java  |  8 +++---
 .../apache/ratis/server/impl/RaftServerImpl.java   | 10 +++----
 ...rverMetrics.java => RaftServerMetricsImpl.java} | 14 +++++-----
 .../java/org/apache/ratis/LogAppenderTests.java    |  7 ++---
 .../test/java/org/apache/ratis/RaftBasicTests.java |  8 +++---
 .../server/impl/TestRatisServerMetricsBase.java    |  7 ++---
 .../ratis/server/impl/TestRetryCacheMetrics.java   |  6 ++---
 .../ratis/statemachine/RaftSnapshotBaseTest.java   |  5 ++--
 .../ratis/TestRaftServerSlownessDetection.java     |  4 ++-
 .../apache/ratis/grpc/TestRaftServerWithGrpc.java  | 31 ++++++++++++----------
 12 files changed, 81 insertions(+), 48 deletions(-)

diff --git a/ratis-server-api/src/main/java/org/apache/ratis/server/metrics/RaftServerMetrics.java b/ratis-server-api/src/main/java/org/apache/ratis/server/metrics/RaftServerMetrics.java
new file mode 100644
index 0000000..8d21e57
--- /dev/null
+++ b/ratis-server-api/src/main/java/org/apache/ratis/server/metrics/RaftServerMetrics.java
@@ -0,0 +1,25 @@
+/*
+ * 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;
+
+/** Metrics for a raft Server. */
+public interface RaftServerMetrics {
+  /** A snapshot just has been installed. */
+  void onSnapshotInstalled();
+}
\ No newline at end of file
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java
index 5db9158..8b6d391 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java
@@ -38,7 +38,7 @@ import org.apache.ratis.server.leader.FollowerInfo;
 import org.apache.ratis.server.leader.LeaderState;
 import org.apache.ratis.server.leader.LogAppender;
 import org.apache.ratis.server.metrics.LogAppenderMetrics;
-import org.apache.ratis.server.metrics.RaftServerMetrics;
+import org.apache.ratis.server.metrics.RaftServerMetricsImpl;
 import org.apache.ratis.server.protocol.TermIndex;
 import org.apache.ratis.server.raftlog.LogEntryHeader;
 import org.apache.ratis.server.raftlog.LogProtoUtils;
@@ -246,7 +246,7 @@ class LeaderStateImpl implements LeaderState {
 
   private final int stagingCatchupGap;
   private final long placeHolderIndex;
-  private final RaftServerMetrics raftServerMetrics;
+  private final RaftServerMetricsImpl raftServerMetrics;
   private final LogAppenderMetrics logAppenderMetrics;
 
   LeaderStateImpl(RaftServerImpl server) {
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/impl/PendingRequests.java b/ratis-server/src/main/java/org/apache/ratis/server/impl/PendingRequests.java
index 9437a2f..cda61df 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/impl/PendingRequests.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/impl/PendingRequests.java
@@ -27,7 +27,7 @@ import org.apache.ratis.protocol.exceptions.RaftException;
 import org.apache.ratis.protocol.RaftGroupMemberId;
 import org.apache.ratis.protocol.SetConfigurationRequest;
 import org.apache.ratis.server.RaftServerConfigKeys;
-import org.apache.ratis.server.metrics.RaftServerMetrics;
+import org.apache.ratis.server.metrics.RaftServerMetricsImpl;
 import org.apache.ratis.statemachine.TransactionContext;
 import org.apache.ratis.util.JavaUtils;
 import org.apache.ratis.util.Preconditions;
@@ -76,14 +76,14 @@ class PendingRequests {
   private static class RequestMap {
     private final Object name;
     private final ConcurrentMap<Long, PendingRequest> map = new ConcurrentHashMap<>();
-    private final RaftServerMetrics raftServerMetrics;
+    private final RaftServerMetricsImpl raftServerMetrics;
 
     /** Permits to put new requests, always synchronized. */
     private final Map<Permit, Permit> permits = new HashMap<>();
     /** Track and limit the number of requests and the total message size. */
     private final RequestLimits resource;
 
-    RequestMap(Object name, int elementLimit, SizeInBytes byteLimit, RaftServerMetrics raftServerMetrics) {
+    RequestMap(Object name, int elementLimit, SizeInBytes byteLimit, RaftServerMetricsImpl raftServerMetrics) {
       this.name = name;
       this.resource = new RequestLimits(elementLimit, byteLimit);
       this.raftServerMetrics = raftServerMetrics;
@@ -179,7 +179,7 @@ class PendingRequests {
   private final String name;
   private final RequestMap pendingRequests;
 
-  PendingRequests(RaftGroupMemberId id, RaftProperties properties, RaftServerMetrics raftServerMetrics) {
+  PendingRequests(RaftGroupMemberId id, RaftProperties properties, RaftServerMetricsImpl raftServerMetrics) {
     this.name = id + "-" + JavaUtils.getClassSimpleName(getClass());
     this.pendingRequests = new RequestMap(id,
         RaftServerConfigKeys.Write.elementLimit(properties),
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 0bc5601..e13e432 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
@@ -44,7 +44,7 @@ import org.apache.ratis.server.impl.RetryCacheImpl.CacheEntry;
 import org.apache.ratis.server.leader.LeaderState;
 import org.apache.ratis.server.leader.LogAppender;
 import org.apache.ratis.server.metrics.LeaderElectionMetrics;
-import org.apache.ratis.server.metrics.RaftServerMetrics;
+import org.apache.ratis.server.metrics.RaftServerMetricsImpl;
 import org.apache.ratis.server.protocol.RaftServerAsynchronousProtocol;
 import org.apache.ratis.server.protocol.RaftServerProtocol;
 import org.apache.ratis.server.protocol.TermIndex;
@@ -158,7 +158,7 @@ class RaftServerImpl implements RaftServer.Division,
 
   private final RaftServerJmxAdapter jmxAdapter;
   private final LeaderElectionMetrics leaderElectionMetrics;
-  private final RaftServerMetrics raftServerMetrics;
+  private final RaftServerMetricsImpl raftServerMetrics;
 
   private final AtomicReference<TermIndex> inProgressInstallSnapshotRequest;
 
@@ -192,7 +192,7 @@ class RaftServerImpl implements RaftServer.Division,
     this.jmxAdapter = new RaftServerJmxAdapter();
     this.leaderElectionMetrics = LeaderElectionMetrics.getLeaderElectionMetrics(
         getMemberId(), state::getLastLeaderElapsedTimeMs);
-    this.raftServerMetrics = RaftServerMetrics.computeIfAbsentRaftServerMetrics(
+    this.raftServerMetrics = RaftServerMetricsImpl.computeIfAbsentRaftServerMetrics(
         getMemberId(), () -> commitInfoCache::get, retryCache::getStatistics);
 
     this.startComplete = new AtomicBoolean(false);
@@ -424,7 +424,7 @@ class RaftServerImpl implements RaftServer.Division,
       try {
         leaderElectionMetrics.unregister();
         raftServerMetrics.unregister();
-        RaftServerMetrics.removeRaftServerMetrics(getMemberId());
+        RaftServerMetricsImpl.removeRaftServerMetrics(getMemberId());
       } catch (Exception ignored) {
         LOG.warn("{}: Failed to unregister metric", getMemberId(), ignored);
       }
@@ -1603,7 +1603,7 @@ class RaftServerImpl implements RaftServer.Division,
   }
 
   @Override
-  public RaftServerMetrics getRaftServerMetrics() {
+  public RaftServerMetricsImpl getRaftServerMetrics() {
     return raftServerMetrics;
   }
 
diff --git a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftServerMetrics.java b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftServerMetricsImpl.java
similarity index 95%
rename from ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftServerMetrics.java
rename to ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftServerMetricsImpl.java
index 8470467..28f2950 100644
--- a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftServerMetrics.java
+++ b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftServerMetricsImpl.java
@@ -45,7 +45,7 @@ import org.apache.ratis.util.Preconditions;
 /**
  * Metric Registry for Raft Group Server. One instance per leader/follower.
  */
-public final class RaftServerMetrics extends RatisMetrics {
+public final class RaftServerMetricsImpl extends RatisMetrics implements RaftServerMetrics {
 
   public static final String RATIS_SERVER_METRICS = "server";
   public static final String RATIS_SERVER_METRICS_DESC = "Metrics for Raft server";
@@ -84,7 +84,7 @@ public final class RaftServerMetrics extends RatisMetrics {
   private final Supplier<Function<RaftPeerId, CommitInfoProto>> commitInfoCache;
 
   /** id -> metric */
-  private static final Map<RaftGroupMemberId, RaftServerMetrics> METRICS = new ConcurrentHashMap<>();
+  private static final Map<RaftGroupMemberId, RaftServerMetricsImpl> METRICS = new ConcurrentHashMap<>();
   /** id -> key */
   private static final Map<RaftPeerId, String> PEER_COMMIT_INDEX_GAUGE_KEYS = new ConcurrentHashMap<>();
 
@@ -93,18 +93,18 @@ public final class RaftServerMetrics extends RatisMetrics {
         key -> String.format(LEADER_METRIC_PEER_COMMIT_INDEX, key));
   }
 
-  public static RaftServerMetrics computeIfAbsentRaftServerMetrics(RaftGroupMemberId serverId,
+  public static RaftServerMetricsImpl computeIfAbsentRaftServerMetrics(RaftGroupMemberId serverId,
       Supplier<Function<RaftPeerId, CommitInfoProto>> commitInfoCache,
       Supplier<RetryCache.Statistics> retryCacheStatistics) {
     return METRICS.computeIfAbsent(serverId,
-        key -> new RaftServerMetrics(serverId, commitInfoCache, retryCacheStatistics));
+        key -> new RaftServerMetricsImpl(serverId, commitInfoCache, retryCacheStatistics));
   }
 
   public static void removeRaftServerMetrics(RaftGroupMemberId serverId) {
     METRICS.remove(serverId);
   }
 
-  public RaftServerMetrics(RaftGroupMemberId serverId,
+  public RaftServerMetricsImpl(RaftGroupMemberId serverId,
       Supplier<Function<RaftPeerId, CommitInfoProto>> commitInfoCache,
       Supplier<RetryCache.Statistics> retryCacheStatistics) {
     this.registry = getMetricRegistryForRaftServer(serverId.toString());
@@ -159,7 +159,7 @@ public final class RaftServerMetrics extends RatisMetrics {
   @VisibleForTesting
   public static Gauge getPeerCommitIndexGauge(RaftGroupMemberId serverId, RaftPeerId peerId) {
 
-    final RaftServerMetrics serverMetrics = METRICS.get(serverId);
+    final RaftServerMetricsImpl serverMetrics = METRICS.get(serverId);
     if (serverMetrics == null) {
       return null;
     }
@@ -271,7 +271,7 @@ public final class RaftServerMetrics extends RatisMetrics {
     }
   }
 
-  /** A snapshot just has been installed. */
+  @Override
   public void onSnapshotInstalled() {
     registry.counter(RATIS_SERVER_INSTALL_SNAPSHOT_COUNT).inc();
   }
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 cae668c..0a0fdbe 100644
--- a/ratis-server/src/test/java/org/apache/ratis/LogAppenderTests.java
+++ b/ratis-server/src/test/java/org/apache/ratis/LogAppenderTests.java
@@ -32,7 +32,7 @@ import org.apache.ratis.server.RaftServer;
 import org.apache.ratis.server.RaftServerConfigKeys;
 import org.apache.ratis.server.leader.LogAppender;
 import org.apache.ratis.server.impl.MiniRaftCluster;
-import org.apache.ratis.server.metrics.RaftServerMetrics;
+import org.apache.ratis.server.metrics.RaftServerMetricsImpl;
 import org.apache.ratis.server.raftlog.LogProtoUtils;
 import org.apache.ratis.server.raftlog.RaftLog;
 import org.apache.ratis.statemachine.SimpleStateMachine4Testing;
@@ -141,7 +141,8 @@ public abstract class LogAppenderTests<CLUSTER extends MiniRaftCluster>
       throw e;
     }
 
-    final RatisMetricRegistry ratisMetricRegistry = leaderServer.getRaftServerMetrics().getRegistry();
+    final RatisMetricRegistry ratisMetricRegistry
+        = ((RaftServerMetricsImpl)leaderServer.getRaftServerMetrics()).getRegistry();
 
     // Get all last_heartbeat_elapsed_time metric gauges. Should be equal to number of followers.
     SortedMap<String, Gauge> heartbeatElapsedTimeGauges = ratisMetricRegistry.getGauges((s, metric) ->
@@ -157,7 +158,7 @@ public abstract class LogAppenderTests<CLUSTER extends MiniRaftCluster>
       // Metric in nanos > 0.
       assertTrue((long)metric.getValue() > 0);
       // Try to get Heartbeat metrics for follower.
-      final RaftServerMetrics followerMetrics = followerServer.getRaftServerMetrics();
+      final RaftServerMetricsImpl followerMetrics = (RaftServerMetricsImpl) followerServer.getRaftServerMetrics();
       // Metric should not exist. It only exists in leader.
       assertTrue(followerMetrics.getRegistry().getGauges((s, m) -> s.contains("lastHeartbeatElapsedTime")).isEmpty());
       for (boolean heartbeat : new boolean[] { true, false }) {
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 2fe6291..7fdd4b9 100644
--- a/ratis-server/src/test/java/org/apache/ratis/RaftBasicTests.java
+++ b/ratis-server/src/test/java/org/apache/ratis/RaftBasicTests.java
@@ -34,9 +34,9 @@ import org.apache.ratis.server.RaftServer;
 import org.apache.ratis.server.RaftServerConfigKeys;
 import org.apache.ratis.server.impl.BlockRequestHandlingInjection;
 import org.apache.ratis.server.impl.MiniRaftCluster;
-import org.apache.ratis.server.metrics.RaftServerMetrics;
 import org.apache.ratis.server.impl.RaftServerTestUtil;
 import org.apache.ratis.server.impl.RetryCacheTestUtil;
+import org.apache.ratis.server.metrics.RaftServerMetricsImpl;
 import org.apache.ratis.server.raftlog.RaftLog;
 import org.apache.ratis.util.ExitUtils;
 import org.apache.ratis.util.JavaUtils;
@@ -489,14 +489,14 @@ public abstract class RaftBasicTests<CLUSTER extends MiniRaftCluster>
     final List<RaftServer.Division> followers = cluster.getFollowers();
     final RaftGroupMemberId leader = cluster.getLeader().getMemberId();
 
-    Gauge leaderCommitGauge = RaftServerMetrics.getPeerCommitIndexGauge(leader, leader.getPeerId());
+    Gauge leaderCommitGauge = RaftServerMetricsImpl.getPeerCommitIndexGauge(leader, leader.getPeerId());
 
     for (RaftServer.Division f : followers) {
       final RaftGroupMemberId follower = f.getMemberId();
-      Gauge followerCommitGauge = RaftServerMetrics.getPeerCommitIndexGauge(leader, follower.getPeerId());
+      Gauge followerCommitGauge = RaftServerMetricsImpl.getPeerCommitIndexGauge(leader, follower.getPeerId());
       Assert.assertTrue((Long)leaderCommitGauge.getValue() >=
           (Long)followerCommitGauge.getValue());
-      Gauge followerMetric = RaftServerMetrics.getPeerCommitIndexGauge(follower, follower.getPeerId());
+      Gauge followerMetric = RaftServerMetricsImpl.getPeerCommitIndexGauge(follower, follower.getPeerId());
       System.out.println(followerCommitGauge.getValue());
       System.out.println(followerMetric.getValue());
       Assert.assertTrue((Long)followerCommitGauge.getValue()  <= (Long)followerMetric.getValue());
diff --git a/ratis-server/src/test/java/org/apache/ratis/server/impl/TestRatisServerMetricsBase.java b/ratis-server/src/test/java/org/apache/ratis/server/impl/TestRatisServerMetricsBase.java
index 9cdad69..21ea752 100644
--- a/ratis-server/src/test/java/org/apache/ratis/server/impl/TestRatisServerMetricsBase.java
+++ b/ratis-server/src/test/java/org/apache/ratis/server/impl/TestRatisServerMetricsBase.java
@@ -17,7 +17,7 @@
  */
 package org.apache.ratis.server.impl;
 
-import static org.apache.ratis.server.metrics.RaftServerMetrics.RATIS_SERVER_FAILED_CLIENT_STALE_READ_COUNT;
+import static org.apache.ratis.server.metrics.RaftServerMetricsImpl.RATIS_SERVER_FAILED_CLIENT_STALE_READ_COUNT;
 import static org.junit.Assert.assertEquals;
 
 import java.io.IOException;
@@ -32,6 +32,7 @@ import org.apache.ratis.protocol.Message;
 import org.apache.ratis.protocol.RaftClientReply;
 import org.apache.ratis.protocol.RaftClientRequest;
 import org.apache.ratis.server.RaftServer;
+import org.apache.ratis.server.metrics.RaftServerMetricsImpl;
 import org.apache.ratis.util.Log4jUtils;
 import org.junit.Assert;
 import org.junit.Test;
@@ -61,7 +62,7 @@ public abstract class TestRatisServerMetricsBase<CLUSTER extends MiniRaftCluster
         0, Message.EMPTY, RaftClientRequest.staleReadRequestType(Long.MAX_VALUE), null);
     final CompletableFuture<RaftClientReply> f = leaderImpl.getRaftServer().submitClientRequestAsync(r);
     Assert.assertTrue(!f.get().isSuccess());
-    assertEquals(1L, leaderImpl.getRaftServerMetrics().getRegistry()
-        .counter(RATIS_SERVER_FAILED_CLIENT_STALE_READ_COUNT).getCount());
+    assertEquals(1L, ((RaftServerMetricsImpl)leaderImpl.getRaftServerMetrics())
+        .getCounter(RATIS_SERVER_FAILED_CLIENT_STALE_READ_COUNT).getCount());
   }
 }
diff --git a/ratis-server/src/test/java/org/apache/ratis/server/impl/TestRetryCacheMetrics.java b/ratis-server/src/test/java/org/apache/ratis/server/impl/TestRetryCacheMetrics.java
index a6d06f6..3703238 100644
--- a/ratis-server/src/test/java/org/apache/ratis/server/impl/TestRetryCacheMetrics.java
+++ b/ratis-server/src/test/java/org/apache/ratis/server/impl/TestRetryCacheMetrics.java
@@ -18,7 +18,7 @@
 
 package org.apache.ratis.server.impl;
 
-import static org.apache.ratis.server.metrics.RaftServerMetrics.*;
+import static org.apache.ratis.server.metrics.RaftServerMetricsImpl.*;
 import static org.junit.Assert.assertEquals;
 
 import com.codahale.metrics.Gauge;
@@ -29,7 +29,7 @@ import org.apache.ratis.protocol.RaftGroupId;
 import org.apache.ratis.protocol.RaftGroupMemberId;
 import org.apache.ratis.protocol.RaftPeerId;
 import org.apache.ratis.server.RaftServerConfigKeys;
-import org.apache.ratis.server.metrics.RaftServerMetrics;
+import org.apache.ratis.server.metrics.RaftServerMetricsImpl;
 import org.junit.After;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -51,7 +51,7 @@ public class TestRetryCacheMetrics {
           .valueOf(raftPeerId, raftGroupId);
       retryCache = new RetryCacheImpl(RaftServerConfigKeys.RetryCache.EXPIRY_TIME_DEFAULT, null);
 
-      final RaftServerMetrics raftServerMetrics = RaftServerMetrics.computeIfAbsentRaftServerMetrics(
+      final RaftServerMetricsImpl raftServerMetrics = RaftServerMetricsImpl.computeIfAbsentRaftServerMetrics(
           raftGroupMemberId, () -> null, retryCache::getStatistics);
       ratisMetricRegistry = raftServerMetrics.getRegistry();
     }
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 4d5cf67..714ff68 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
@@ -20,7 +20,7 @@ package org.apache.ratis.statemachine;
 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.RaftServerMetrics.RATIS_SERVER_INSTALL_SNAPSHOT_COUNT;
+import static org.apache.ratis.server.metrics.RaftServerMetricsImpl.RATIS_SERVER_INSTALL_SNAPSHOT_COUNT;
 import static org.apache.ratis.metrics.RatisMetrics.RATIS_APPLICATION_NAME_METRICS;
 
 import org.apache.log4j.Level;
@@ -38,6 +38,7 @@ import org.apache.ratis.protocol.RaftPeerId;
 import org.apache.ratis.server.RaftServer;
 import org.apache.ratis.server.RaftServerConfigKeys;
 import org.apache.ratis.server.impl.RaftServerTestUtil;
+import org.apache.ratis.server.metrics.RaftServerMetricsImpl;
 import org.apache.ratis.server.raftlog.RaftLog;
 import org.apache.ratis.server.raftlog.segmented.LogSegmentPath;
 import org.apache.ratis.proto.RaftProtos.LogEntryProto;
@@ -258,7 +259,7 @@ public abstract class RaftSnapshotBaseTest extends BaseTest {
   }
 
   protected void verifyInstallSnapshotMetric(RaftServer.Division leader) {
-    final Counter installSnapshotCounter = leader.getRaftServerMetrics()
+    final Counter installSnapshotCounter = ((RaftServerMetricsImpl)leader.getRaftServerMetrics())
         .getCounter(RATIS_SERVER_INSTALL_SNAPSHOT_COUNT);
     Assert.assertNotNull(installSnapshotCounter);
     Assert.assertTrue(installSnapshotCounter.getCount() >= 1);
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 745470f..fded493 100644
--- a/ratis-test/src/test/java/org/apache/ratis/TestRaftServerSlownessDetection.java
+++ b/ratis-test/src/test/java/org/apache/ratis/TestRaftServerSlownessDetection.java
@@ -25,6 +25,7 @@ import org.apache.ratis.server.RaftServer;
 import org.apache.ratis.server.RaftServerConfigKeys;
 import org.apache.ratis.server.impl.MiniRaftCluster;
 import org.apache.ratis.server.impl.RaftServerTestUtil;
+import org.apache.ratis.server.metrics.RaftServerMetricsImpl;
 import org.apache.ratis.server.simulation.MiniRaftClusterWithSimulatedRpc;
 import org.apache.ratis.proto.RaftProtos;
 import org.apache.ratis.statemachine.SimpleStateMachine4Testing;
@@ -90,7 +91,8 @@ public class TestRaftServerSlownessDetection extends BaseTest {
         .slownessTimeout(cluster.getProperties()).toIntExact(TimeUnit.MILLISECONDS);
     RaftServer.Division failedFollower = cluster.getFollowers().get(0);
 
-    final RatisMetricRegistry ratisMetricRegistry = leaderServer.getRaftServerMetrics().getRegistry();
+    final RatisMetricRegistry ratisMetricRegistry
+        = ((RaftServerMetricsImpl)leaderServer.getRaftServerMetrics()).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 bf57765..836d096 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,14 +17,14 @@
  */
 package org.apache.ratis.grpc;
 
-import static org.apache.ratis.server.metrics.RaftServerMetrics.RAFT_CLIENT_READ_REQUEST;
-import static org.apache.ratis.server.metrics.RaftServerMetrics.RAFT_CLIENT_STALE_READ_REQUEST;
-import static org.apache.ratis.server.metrics.RaftServerMetrics.RAFT_CLIENT_WATCH_REQUEST;
-import static org.apache.ratis.server.metrics.RaftServerMetrics.RAFT_CLIENT_WRITE_REQUEST;
-import static org.apache.ratis.server.metrics.RaftServerMetrics.REQUEST_QUEUE_LIMIT_HIT_COUNTER;
-import static org.apache.ratis.server.metrics.RaftServerMetrics.REQUEST_BYTE_SIZE;
-import static org.apache.ratis.server.metrics.RaftServerMetrics.REQUEST_BYTE_SIZE_LIMIT_HIT_COUNTER;
-import static org.apache.ratis.server.metrics.RaftServerMetrics.RESOURCE_LIMIT_HIT_COUNTER;
+import static org.apache.ratis.server.metrics.RaftServerMetricsImpl.RAFT_CLIENT_READ_REQUEST;
+import static org.apache.ratis.server.metrics.RaftServerMetricsImpl.RAFT_CLIENT_STALE_READ_REQUEST;
+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 static org.apache.ratis.server.metrics.RaftServerMetricsImpl.REQUEST_QUEUE_LIMIT_HIT_COUNTER;
+import static org.apache.ratis.server.metrics.RaftServerMetricsImpl.REQUEST_BYTE_SIZE;
+import static org.apache.ratis.server.metrics.RaftServerMetricsImpl.REQUEST_BYTE_SIZE_LIMIT_HIT_COUNTER;
+import static org.apache.ratis.server.metrics.RaftServerMetricsImpl.RESOURCE_LIMIT_HIT_COUNTER;
 
 import com.codahale.metrics.Gauge;
 import org.apache.commons.lang3.RandomStringUtils;
@@ -51,8 +51,8 @@ import org.apache.ratis.retry.RetryPolicies;
 import org.apache.ratis.server.RaftServer;
 import org.apache.ratis.server.RaftServerConfigKeys;
 import org.apache.ratis.server.RaftServerRpc;
-import org.apache.ratis.server.metrics.RaftServerMetrics;
 import org.apache.ratis.server.impl.RaftServerTestUtil;
+import org.apache.ratis.server.metrics.RaftServerMetricsImpl;
 import org.apache.ratis.statemachine.SimpleStateMachine4Testing;
 import org.apache.ratis.statemachine.StateMachine;
 import org.apache.ratis.util.Log4jUtils;
@@ -228,7 +228,7 @@ public class TestRaftServerWithGrpc extends BaseTest implements MiniRaftClusterW
       client.async().send(new SimpleMessage(message));
 
 
-      final SortedMap<String, Gauge> gaugeMap = cluster.getLeader().getRaftServerMetrics()
+      final SortedMap<String, Gauge> gaugeMap = getRaftServerMetrics(cluster.getLeader())
           .getRegistry().getGauges((s, metric) -> s.contains(REQUEST_BYTE_SIZE));
 
       RaftTestUtil.waitFor(() -> (int) gaugeMap.get(gaugeMap.firstKey()).getValue() == message.length(),
@@ -241,7 +241,7 @@ public class TestRaftServerWithGrpc extends BaseTest implements MiniRaftClusterW
       }
 
       // Because we have passed 11 requests, and the element queue size is 10.
-      RaftTestUtil.waitFor(() -> cluster.getLeader().getRaftServerMetrics()
+      RaftTestUtil.waitFor(() -> getRaftServerMetrics(cluster.getLeader())
           .getCounter(REQUEST_QUEUE_LIMIT_HIT_COUNTER).getCount() == 1, 300, 5000);
 
       stateMachine.unblockFlushStateMachineData();
@@ -253,10 +253,10 @@ public class TestRaftServerWithGrpc extends BaseTest implements MiniRaftClusterW
       client.async().send(new SimpleMessage(RandomStringUtils.random(120, true, false)));
       clients.add(client);
 
-      RaftTestUtil.waitFor(() -> cluster.getLeader().getRaftServerMetrics()
+      RaftTestUtil.waitFor(() -> getRaftServerMetrics(cluster.getLeader())
               .getCounter(REQUEST_BYTE_SIZE_LIMIT_HIT_COUNTER).getCount() == 1, 300, 5000);
 
-      Assert.assertEquals(2, cluster.getLeader().getRaftServerMetrics()
+      Assert.assertEquals(2, getRaftServerMetrics(cluster.getLeader())
               .getCounter(RESOURCE_LIMIT_HIT_COUNTER).getCount());
     } finally {
       for (RaftClient client : clients) {
@@ -265,11 +265,14 @@ public class TestRaftServerWithGrpc extends BaseTest implements MiniRaftClusterW
     }
   }
 
+  static RaftServerMetricsImpl getRaftServerMetrics(RaftServer.Division division) {
+    return (RaftServerMetricsImpl) division.getRaftServerMetrics();
+  }
 
   void testRaftClientRequestMetrics(MiniRaftClusterWithGrpc cluster) throws IOException,
       ExecutionException, InterruptedException {
     final RaftServer.Division leader = RaftTestUtil.waitForLeader(cluster);
-    RaftServerMetrics raftServerMetrics = leader.getRaftServerMetrics();
+    final RaftServerMetricsImpl raftServerMetrics = getRaftServerMetrics(leader);
 
     try (final RaftClient client = cluster.createClient()) {
       final CompletableFuture<RaftClientReply> f1 = client.async().send(new SimpleMessage("testing"));