From cea5493705cf6b53868bc74d9f99506db9d3d3ee Mon Sep 17 00:00:00 2001 From: Tsz-Wo Nicholas Sze Date: Fri, 26 Aug 2022 09:54:07 -0700 Subject: [PATCH] Revert "RATIS-1689. Remove the use of the thirdparty Gauge. (#724)" This reverts commit 0c647c60b353d4b33d1c79ce127bbbb9802b206b. --- .../ratis/grpc/metrics/GrpcServerMetrics.java | 12 +++- .../grpc/server/TestGrpcServerMetrics.java | 23 +++++--- .../ratis/metrics/MetricRegistryInfo.java | 5 +- .../ratis/metrics/MetricsReporting.java | 8 +-- .../ratis/metrics/RatisMetricRegistry.java | 19 +++---- .../metrics/impl/RatisMetricRegistryImpl.java | 35 +++--------- .../server/impl/StateMachineMetrics.java | 6 +- .../server/metrics/RaftLogMetricsBase.java | 2 +- .../server/metrics/RaftServerMetricsImpl.java | 30 ++++++++-- .../metrics/SegmentedRaftLogMetrics.java | 23 +++++--- .../segmented/SegmentedRaftLogWorker.java | 5 +- .../org/apache/ratis/LogAppenderTests.java | 9 ++- .../java/org/apache/ratis/RaftBasicTests.java | 16 ++++-- .../server/impl/LeaderElectionTests.java | 6 +- .../server/impl/TestLogAppenderMetrics.java | 6 +- .../server/impl/TestRetryCacheMetrics.java | 6 +- .../metrics/ServerMetricsTestUtils.java | 55 ------------------- .../metrics/TestLeaderElectionMetrics.java | 6 +- .../TestRaftServerSlownessDetection.java | 7 ++- .../ratis/grpc/TestRaftServerWithGrpc.java | 8 +++ .../segmented/TestSegmentedRaftLogCache.java | 6 +- 21 files changed, 137 insertions(+), 156 deletions(-) delete mode 100644 ratis-server/src/test/java/org/apache/ratis/server/metrics/ServerMetricsTestUtils.java diff --git a/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/GrpcServerMetrics.java b/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/GrpcServerMetrics.java index dcc2d309f4..0bc400d6bc 100644 --- a/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/GrpcServerMetrics.java +++ b/ratis-grpc/src/main/java/org/apache/ratis/grpc/metrics/GrpcServerMetrics.java @@ -17,14 +17,14 @@ */ package org.apache.ratis.grpc.metrics; +import org.apache.ratis.thirdparty.com.codahale.metrics.Gauge; import org.apache.ratis.metrics.MetricRegistryInfo; import org.apache.ratis.metrics.RatisMetricRegistry; import org.apache.ratis.metrics.RatisMetrics; +import org.apache.ratis.thirdparty.com.google.common.annotations.VisibleForTesting; import org.apache.ratis.thirdparty.com.codahale.metrics.Timer; -import java.util.function.Supplier; - public class GrpcServerMetrics extends RatisMetrics { private static final String RATIS_GRPC_METRICS_APP_NAME = "ratis_grpc"; private static final String RATIS_GRPC_METRICS_COMP_NAME = "log_appender"; @@ -89,7 +89,8 @@ public void onRequestTimeout(String follower, boolean isHeartbeat) { follower)).inc(); } - public void addPendingRequestsCount(String follower, Supplier pendinglogQueueSize) { + public void addPendingRequestsCount(String follower, + Gauge pendinglogQueueSize) { registry.gauge(String.format(RATIS_GRPC_METRICS_LOG_APPENDER_PENDING_COUNT, follower), () -> pendinglogQueueSize); } @@ -100,4 +101,9 @@ public void onInstallSnapshot() { public static String getHeartbeatSuffix(boolean heartbeat) { return heartbeat ? "_heartbeat" : ""; } + + @VisibleForTesting + public RatisMetricRegistry getRegistry() { + return registry; + } } diff --git a/ratis-grpc/src/test/java/org/apache/ratis/grpc/server/TestGrpcServerMetrics.java b/ratis-grpc/src/test/java/org/apache/ratis/grpc/server/TestGrpcServerMetrics.java index 7cd10bc5d5..252a0dc2e0 100644 --- a/ratis-grpc/src/test/java/org/apache/ratis/grpc/server/TestGrpcServerMetrics.java +++ b/ratis-grpc/src/test/java/org/apache/ratis/grpc/server/TestGrpcServerMetrics.java @@ -27,16 +27,16 @@ import static org.apache.ratis.grpc.metrics.GrpcServerMetrics.RATIS_GRPC_METRICS_REQUEST_RETRY_COUNT; import static org.mockito.Mockito.when; +import java.util.SortedMap; import java.util.function.Consumer; -import org.apache.ratis.server.metrics.ServerMetricsTestUtils; +import org.apache.ratis.thirdparty.com.codahale.metrics.Gauge; import org.apache.ratis.grpc.metrics.GrpcServerMetrics; import org.apache.ratis.metrics.RatisMetricRegistry; import org.apache.ratis.proto.RaftProtos; import org.apache.ratis.protocol.RaftGroupId; import org.apache.ratis.protocol.RaftGroupMemberId; import org.apache.ratis.protocol.RaftPeerId; -import org.apache.ratis.thirdparty.com.codahale.metrics.Gauge; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; @@ -109,12 +109,21 @@ public void testGrpcLogPendingRequestCount() { GrpcLogAppender.RequestMap pendingRequest = Mockito.mock(GrpcLogAppender.RequestMap.class); when(pendingRequest.logRequestsSize()).thenReturn(0); grpcServerMetrics.addPendingRequestsCount(raftPeerId.toString(), - pendingRequest::logRequestsSize); - final String name = String.format(RATIS_GRPC_METRICS_LOG_APPENDER_PENDING_COUNT, raftPeerId); - final Gauge gauge = ServerMetricsTestUtils.getGaugeWithName(name, grpcServerMetrics::getRegistry); - Assert.assertEquals(0, gauge.getValue()); + () -> pendingRequest.logRequestsSize()); + Assert.assertEquals(0, getGuageWithName( + String.format(RATIS_GRPC_METRICS_LOG_APPENDER_PENDING_COUNT, + raftPeerId.toString())).getValue()); when(pendingRequest.logRequestsSize()).thenReturn(10); - Assert.assertEquals(10, gauge.getValue()); + Assert.assertEquals(10, getGuageWithName( + String.format(RATIS_GRPC_METRICS_LOG_APPENDER_PENDING_COUNT, + raftPeerId.toString())).getValue()); + } + + private Gauge getGuageWithName(String gaugeName) { + SortedMap gaugeMap = + grpcServerMetrics.getRegistry().getGauges((s, metric) -> + s.contains(gaugeName)); + return gaugeMap.get(gaugeMap.firstKey()); } @Test diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistryInfo.java b/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistryInfo.java index 70efac6272..5563b96d11 100644 --- a/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistryInfo.java +++ b/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricRegistryInfo.java @@ -1,4 +1,4 @@ -/* +/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -18,10 +18,11 @@ package org.apache.ratis.metrics; -import org.apache.ratis.thirdparty.com.codahale.metrics.MetricRegistry; import java.util.Objects; +import org.apache.ratis.thirdparty.com.codahale.metrics.*; + /** * * This class holds the name and description and JMX related context names for such group of diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricsReporting.java b/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricsReporting.java index efaa1a45d8..df51420f07 100644 --- a/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricsReporting.java +++ b/ratis-metrics/src/main/java/org/apache/ratis/metrics/MetricsReporting.java @@ -17,15 +17,15 @@ */ package org.apache.ratis.metrics; -import org.apache.ratis.thirdparty.com.codahale.metrics.ConsoleReporter; +import java.util.concurrent.TimeUnit; +import java.util.function.Consumer; + +import org.apache.ratis.thirdparty.com.codahale.metrics.*; import org.apache.ratis.thirdparty.com.codahale.metrics.jmx.JmxReporter; import org.apache.ratis.util.TimeDuration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; - public final class MetricsReporting { public static final Logger LOG = LoggerFactory.getLogger(MetricsReporting.class); diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/RatisMetricRegistry.java b/ratis-metrics/src/main/java/org/apache/ratis/metrics/RatisMetricRegistry.java index 1745413be0..388f9f4e03 100644 --- a/ratis-metrics/src/main/java/org/apache/ratis/metrics/RatisMetricRegistry.java +++ b/ratis-metrics/src/main/java/org/apache/ratis/metrics/RatisMetricRegistry.java @@ -1,4 +1,4 @@ -/* +/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -17,19 +17,12 @@ */ package org.apache.ratis.metrics; -import org.apache.ratis.thirdparty.com.codahale.metrics.ConsoleReporter; -import org.apache.ratis.thirdparty.com.codahale.metrics.Counter; -import org.apache.ratis.thirdparty.com.codahale.metrics.Histogram; -import org.apache.ratis.thirdparty.com.codahale.metrics.Meter; -import org.apache.ratis.thirdparty.com.codahale.metrics.Metric; -import org.apache.ratis.thirdparty.com.codahale.metrics.MetricRegistry; -import org.apache.ratis.thirdparty.com.codahale.metrics.MetricSet; -import org.apache.ratis.thirdparty.com.codahale.metrics.Timer; +import java.util.SortedMap; + +import org.apache.ratis.thirdparty.com.codahale.metrics.*; import org.apache.ratis.thirdparty.com.codahale.metrics.jmx.JmxReporter; import org.apache.ratis.thirdparty.com.google.common.annotations.VisibleForTesting; -import java.util.function.Supplier; - public interface RatisMetricRegistry { Timer timer(String name); @@ -37,10 +30,12 @@ public interface RatisMetricRegistry { boolean remove(String name); - Supplier gauge(String name, Supplier> gaugeSupplier); + Gauge gauge(String name, MetricRegistry.MetricSupplier supplier); Timer timer(String name, MetricRegistry.MetricSupplier supplier); + SortedMap getGauges(MetricFilter filter); + Counter counter(String name, MetricRegistry.MetricSupplier supplier); Histogram histogram(String name); diff --git a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/RatisMetricRegistryImpl.java b/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/RatisMetricRegistryImpl.java index fe023eb294..1b33efb8d6 100644 --- a/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/RatisMetricRegistryImpl.java +++ b/ratis-metrics/src/main/java/org/apache/ratis/metrics/impl/RatisMetricRegistryImpl.java @@ -1,4 +1,4 @@ -/* +/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information @@ -17,30 +17,20 @@ */ package org.apache.ratis.metrics.impl; +import java.util.Map; +import java.util.SortedMap; + +import org.apache.ratis.thirdparty.com.codahale.metrics.*; import org.apache.ratis.metrics.MetricRegistryInfo; import org.apache.ratis.metrics.RatisMetricRegistry; -import org.apache.ratis.thirdparty.com.codahale.metrics.ConsoleReporter; -import org.apache.ratis.thirdparty.com.codahale.metrics.Counter; -import org.apache.ratis.thirdparty.com.codahale.metrics.Gauge; -import org.apache.ratis.thirdparty.com.codahale.metrics.Histogram; -import org.apache.ratis.thirdparty.com.codahale.metrics.Meter; -import org.apache.ratis.thirdparty.com.codahale.metrics.Metric; -import org.apache.ratis.thirdparty.com.codahale.metrics.MetricFilter; -import org.apache.ratis.thirdparty.com.codahale.metrics.MetricRegistry; -import org.apache.ratis.thirdparty.com.codahale.metrics.MetricSet; -import org.apache.ratis.thirdparty.com.codahale.metrics.Timer; import org.apache.ratis.thirdparty.com.codahale.metrics.jmx.JmxReporter; import org.apache.ratis.thirdparty.com.google.common.annotations.VisibleForTesting; -import java.util.Map; -import java.util.SortedMap; -import java.util.function.Supplier; - /** * Custom implementation of {@link MetricRegistry}. */ public class RatisMetricRegistryImpl implements RatisMetricRegistry { - private final MetricRegistry metricRegistry = new MetricRegistry(); + private MetricRegistry metricRegistry = new MetricRegistry(); private final MetricRegistryInfo info; @@ -67,22 +57,15 @@ public boolean remove(String name) { return metricRegistry.remove(getMetricName(name)); } - static Gauge toGauge(Supplier supplier) { - return supplier::get; - } - - @Override - public Supplier gauge(String name, Supplier> gaugeSupplier) { - final MetricRegistry.MetricSupplier> s = () -> toGauge(gaugeSupplier.get()); - final Gauge g = metricRegistry.gauge(getMetricName(name), s); - return g::getValue; + @Override public Gauge gauge(String name, MetricRegistry.MetricSupplier supplier) { + return metricRegistry.gauge(getMetricName(name), supplier); } @Override public Timer timer(String name, MetricRegistry.MetricSupplier supplier) { return metricRegistry.timer(getMetricName(name), supplier); } - public SortedMap getGauges(MetricFilter filter) { + @Override public SortedMap getGauges(MetricFilter filter) { return metricRegistry.getGauges(filter); } 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 596cdaf5ac..3466f3f67b 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 @@ -56,8 +56,10 @@ public static StateMachineMetrics getStateMachineMetrics( private StateMachineMetrics(String serverId, LongSupplier getApplied, LongSupplier getApplyCompleted) { registry = getMetricRegistryForStateMachine(serverId); - registry.gauge(STATEMACHINE_APPLIED_INDEX_GAUGE, () -> getApplied::getAsLong); - registry.gauge(STATEMACHINE_APPLY_COMPLETED_GAUGE, () -> getApplyCompleted::getAsLong); + registry.gauge(STATEMACHINE_APPLIED_INDEX_GAUGE, + () -> () -> getApplied.getAsLong()); + registry.gauge(STATEMACHINE_APPLY_COMPLETED_GAUGE, + () -> () -> getApplyCompleted.getAsLong()); } private RatisMetricRegistry getMetricRegistryForStateMachine(String serverId) { diff --git a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftLogMetricsBase.java b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftLogMetricsBase.java index c21ae08a6d..fc40082fb3 100644 --- a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftLogMetricsBase.java +++ b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftLogMetricsBase.java @@ -18,12 +18,12 @@ package org.apache.ratis.server.metrics; +import org.apache.ratis.thirdparty.com.codahale.metrics.*; import org.apache.ratis.metrics.MetricRegistryInfo; import org.apache.ratis.metrics.RatisMetricRegistry; import org.apache.ratis.metrics.RatisMetrics; import org.apache.ratis.protocol.RaftGroupMemberId; import org.apache.ratis.server.raftlog.LogEntryHeader; -import org.apache.ratis.thirdparty.com.codahale.metrics.Timer; public class RaftLogMetricsBase extends RatisMetrics implements RaftLogMetrics { public static final String RATIS_LOG_WORKER_METRICS_DESC = "Metrics for Log Worker"; diff --git a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftServerMetricsImpl.java b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftServerMetricsImpl.java index 35e35c1cd0..210bf7d1eb 100644 --- a/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftServerMetricsImpl.java +++ b/ratis-server/src/main/java/org/apache/ratis/server/metrics/RaftServerMetricsImpl.java @@ -22,10 +22,12 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.HashMap; import java.util.Map; +import java.util.SortedMap; import java.util.function.Function; import java.util.function.Supplier; import org.apache.ratis.thirdparty.com.codahale.metrics.Counter; +import org.apache.ratis.thirdparty.com.codahale.metrics.Gauge; import org.apache.ratis.thirdparty.com.codahale.metrics.Timer; import org.apache.ratis.metrics.MetricRegistryInfo; @@ -38,6 +40,7 @@ import org.apache.ratis.metrics.RatisMetrics; import org.apache.ratis.server.RetryCache; import org.apache.ratis.thirdparty.com.google.common.annotations.VisibleForTesting; +import org.apache.ratis.util.Preconditions; /** * Metric Registry for Raft Group Server. One instance per leader/follower. @@ -85,7 +88,7 @@ public final class RaftServerMetricsImpl extends RatisMetrics implements RaftSer /** id -> key */ private static final Map PEER_COMMIT_INDEX_GAUGE_KEYS = new ConcurrentHashMap<>(); - static String getPeerCommitIndexGaugeKey(RaftPeerId serverId) { + private static String getPeerCommitIndexGaugeKey(RaftPeerId serverId) { return PEER_COMMIT_INDEX_GAUGE_KEYS.computeIfAbsent(serverId, key -> String.format(LEADER_METRIC_PEER_COMMIT_INDEX, key)); } @@ -149,9 +152,26 @@ public void addPeerCommitIndexGauge(RaftPeerId peerId) { .orElse(0L)); } + /** + * Get the commit index gauge for the given peer of the server + * @return Metric Gauge holding the value of commit index of the peer + */ @VisibleForTesting - static RaftServerMetricsImpl getImpl(RaftGroupMemberId serverId) { - return METRICS.get(serverId); + public static Gauge getPeerCommitIndexGauge(RaftGroupMemberId serverId, RaftPeerId peerId) { + + final RaftServerMetricsImpl serverMetrics = METRICS.get(serverId); + if (serverMetrics == null) { + return null; + } + + final String followerCommitIndexKey = getPeerCommitIndexGaugeKey(peerId); + + SortedMap map = + serverMetrics.registry.getGauges((s, metric) -> + s.contains(followerCommitIndexKey)); + + Preconditions.assertTrue(map.size() <= 1); + return map.get(map.firstKey()); } /** @@ -193,7 +213,7 @@ public void onRequestQueueLimitHit() { registry.counter(REQUEST_QUEUE_LIMIT_HIT_COUNTER).inc(); } - public void addNumPendingRequestsGauge(Supplier queueSize) { + public void addNumPendingRequestsGauge(Gauge queueSize) { registry.gauge(REQUEST_QUEUE_SIZE, () -> queueSize); } @@ -201,7 +221,7 @@ public boolean removeNumPendingRequestsGauge() { return registry.remove(REQUEST_QUEUE_SIZE); } - public void addNumPendingRequestsMegaByteSize(Supplier megabyteSize) { + public void addNumPendingRequestsMegaByteSize(Gauge megabyteSize) { registry.gauge(REQUEST_MEGA_BYTE_SIZE, () -> megabyteSize); } diff --git a/ratis-server/src/main/java/org/apache/ratis/server/metrics/SegmentedRaftLogMetrics.java b/ratis-server/src/main/java/org/apache/ratis/server/metrics/SegmentedRaftLogMetrics.java index 69526cbc6c..80ad0df580 100644 --- a/ratis-server/src/main/java/org/apache/ratis/server/metrics/SegmentedRaftLogMetrics.java +++ b/ratis-server/src/main/java/org/apache/ratis/server/metrics/SegmentedRaftLogMetrics.java @@ -18,13 +18,12 @@ package org.apache.ratis.server.metrics; +import org.apache.ratis.thirdparty.com.codahale.metrics.*; import org.apache.ratis.protocol.RaftGroupMemberId; import org.apache.ratis.server.raftlog.segmented.SegmentedRaftLogCache; -import org.apache.ratis.thirdparty.com.codahale.metrics.Timer; import org.apache.ratis.util.DataQueue; import java.util.Queue; -import java.util.function.Supplier; public class SegmentedRaftLogMetrics extends RaftLogMetricsBase { ////////////////////////////// @@ -83,27 +82,33 @@ public SegmentedRaftLogMetrics(RaftGroupMemberId serverId) { super(serverId); } - public void addDataQueueSizeGauge(DataQueue queue) { + public void addDataQueueSizeGauge(DataQueue queue) { registry.gauge(RAFT_LOG_DATA_QUEUE_SIZE, () -> queue::getNumElements); } public void addClosedSegmentsNum(SegmentedRaftLogCache cache) { - registry.gauge(RAFT_LOG_CACHE_CLOSED_SEGMENTS_NUM, () -> cache::getCachedSegmentNum); + registry.gauge(RAFT_LOG_CACHE_CLOSED_SEGMENTS_NUM, () -> () -> { + return cache.getCachedSegmentNum(); + }); } public void addClosedSegmentsSizeInBytes(SegmentedRaftLogCache cache) { - registry.gauge(RAFT_LOG_CACHE_CLOSED_SEGMENTS_SIZE_IN_BYTES, () -> cache::getClosedSegmentsSizeInBytes); + registry.gauge(RAFT_LOG_CACHE_CLOSED_SEGMENTS_SIZE_IN_BYTES, () -> () -> { + return cache.getClosedSegmentsSizeInBytes(); + }); } public void addOpenSegmentSizeInBytes(SegmentedRaftLogCache cache) { - registry.gauge(RAFT_LOG_CACHE_OPEN_SEGMENT_SIZE_IN_BYTES, () -> cache::getOpenSegmentSizeInBytes); + registry.gauge(RAFT_LOG_CACHE_OPEN_SEGMENT_SIZE_IN_BYTES, () -> () -> { + return cache.getOpenSegmentSizeInBytes(); + }); } - public void addLogWorkerQueueSizeGauge(Queue queue) { - registry.gauge(RAFT_LOG_WORKER_QUEUE_SIZE, () -> queue::size); + public void addLogWorkerQueueSizeGauge(Queue queue) { + registry.gauge(RAFT_LOG_WORKER_QUEUE_SIZE, () -> () -> queue.size()); } - public void addFlushBatchSizeGauge(Supplier> supplier) { + public void addFlushBatchSizeGauge(MetricRegistry.MetricSupplier supplier) { registry.gauge(RAFT_LOG_SYNC_BATCH_SIZE, supplier); } diff --git a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogWorker.java b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogWorker.java index 8053f44b72..599772f126 100644 --- a/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogWorker.java +++ b/ratis-server/src/main/java/org/apache/ratis/server/raftlog/segmented/SegmentedRaftLogWorker.java @@ -18,6 +18,7 @@ package org.apache.ratis.server.raftlog.segmented; import org.apache.ratis.thirdparty.com.codahale.metrics.Timer; +import org.apache.ratis.thirdparty.com.codahale.metrics.Gauge; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.ratis.conf.RaftProperties; import org.apache.ratis.proto.RaftProtos.StateMachineLogEntryProto; @@ -173,7 +174,7 @@ synchronized void updateIndex(long i) { private final long segmentMaxSize; private final long preallocatedSize; private final RaftServer.Division server; - private volatile int flushBatchSize; + private int flushBatchSize; private final boolean asyncFlush; private final boolean unsafeFlush; @@ -211,7 +212,7 @@ synchronized void updateIndex(long i) { // Server Id can be null in unit tests metricRegistry.addDataQueueSizeGauge(queue); metricRegistry.addLogWorkerQueueSizeGauge(writeTasks.q); - metricRegistry.addFlushBatchSizeGauge(() -> () -> flushBatchSize); + metricRegistry.addFlushBatchSizeGauge(() -> (Gauge) () -> flushBatchSize); this.logFlushTimer = metricRegistry.getFlushTimer(); this.raftLogSyncTimer = metricRegistry.getRaftLogSyncTimer(); this.raftLogQueueingTimer = metricRegistry.getRaftLogQueueTimer(); 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 c9ef9b06b7..b187dabaef 100644 --- a/ratis-server/src/test/java/org/apache/ratis/LogAppenderTests.java +++ b/ratis-server/src/test/java/org/apache/ratis/LogAppenderTests.java @@ -24,7 +24,7 @@ import org.apache.ratis.RaftTestUtil.SimpleMessage; import org.apache.ratis.client.RaftClient; import org.apache.ratis.conf.RaftProperties; -import org.apache.ratis.metrics.impl.RatisMetricRegistryImpl; +import org.apache.ratis.metrics.RatisMetricRegistry; import org.apache.ratis.proto.RaftProtos.LogEntryProto; import org.apache.ratis.proto.RaftProtos.LogEntryProto.LogEntryBodyCase; import org.apache.ratis.protocol.RaftPeerId; @@ -141,8 +141,8 @@ public void testFollowerHeartbeatMetric() throws IOException, InterruptedExcepti throw e; } - final RatisMetricRegistryImpl ratisMetricRegistry = (RatisMetricRegistryImpl) - ((RaftServerMetricsImpl)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 heartbeatElapsedTimeGauges = ratisMetricRegistry.getGauges((s, metric) -> @@ -160,8 +160,7 @@ public void testFollowerHeartbeatMetric() throws IOException, InterruptedExcepti // Try to get Heartbeat metrics for follower. final RaftServerMetricsImpl followerMetrics = (RaftServerMetricsImpl) followerServer.getRaftServerMetrics(); // Metric should not exist. It only exists in leader. - final RatisMetricRegistryImpl followerMetricRegistry = (RatisMetricRegistryImpl)followerMetrics.getRegistry(); - assertTrue(followerMetricRegistry.getGauges((s, m) -> s.contains("lastHeartbeatElapsedTime")).isEmpty()); + assertTrue(followerMetrics.getRegistry().getGauges((s, m) -> s.contains("lastHeartbeatElapsedTime")).isEmpty()); for (boolean heartbeat : new boolean[] { true, false }) { assertTrue(followerMetrics.getFollowerAppendEntryTimer(heartbeat).getMeanRate() > 0.0d); assertTrue(followerMetrics.getFollowerAppendEntryTimer(heartbeat).getCount() > 0L); 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 1413d6b910..5f09c86d25 100644 --- a/ratis-server/src/test/java/org/apache/ratis/RaftBasicTests.java +++ b/ratis-server/src/test/java/org/apache/ratis/RaftBasicTests.java @@ -17,7 +17,6 @@ */ package org.apache.ratis; -import org.apache.ratis.server.metrics.ServerMetricsTestUtils; import org.apache.ratis.thirdparty.com.codahale.metrics.Gauge; import org.apache.log4j.Level; import org.apache.ratis.RaftTestUtil.SimpleMessage; @@ -37,6 +36,7 @@ import org.apache.ratis.server.impl.MiniRaftCluster; 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; @@ -51,6 +51,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.SortedMap; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.CompletableFuture; @@ -488,14 +489,14 @@ private static void checkFollowerCommitLagsLeader(MiniRaftCluster cluster) { final List followers = cluster.getFollowers(); final RaftGroupMemberId leader = cluster.getLeader().getMemberId(); - Gauge leaderCommitGauge = ServerMetricsTestUtils.getPeerCommitIndexGauge(leader, leader.getPeerId()); + Gauge leaderCommitGauge = RaftServerMetricsImpl.getPeerCommitIndexGauge(leader, leader.getPeerId()); for (RaftServer.Division f : followers) { final RaftGroupMemberId follower = f.getMemberId(); - Gauge followerCommitGauge = ServerMetricsTestUtils.getPeerCommitIndexGauge(leader, follower.getPeerId()); + Gauge followerCommitGauge = RaftServerMetricsImpl.getPeerCommitIndexGauge(leader, follower.getPeerId()); Assert.assertTrue((Long)leaderCommitGauge.getValue() >= (Long)followerCommitGauge.getValue()); - Gauge followerMetric = ServerMetricsTestUtils.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()); @@ -510,7 +511,12 @@ private static Gauge getStatemachineGaugeWithName(RaftServer.Division server, St Optional metricRegistry = MetricRegistries.global().get(info); Assert.assertTrue(metricRegistry.isPresent()); + RatisMetricRegistry ratisStateMachineMetricRegistry = metricRegistry.get(); - return ServerMetricsTestUtils.getGaugeWithName(gaugeName, metricRegistry::get); + SortedMap gaugeMap = + ratisStateMachineMetricRegistry.getGauges((s, metric) -> + s.contains(gaugeName)); + + return gaugeMap.get(gaugeMap.firstKey()); } } 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 8929fb8625..6b5d04b244 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 @@ -22,7 +22,7 @@ import org.apache.ratis.RaftTestUtil; import org.apache.ratis.client.RaftClient; import org.apache.ratis.conf.RaftProperties; -import org.apache.ratis.metrics.impl.RatisMetricRegistryImpl; +import org.apache.ratis.metrics.RatisMetricRegistry; import org.apache.ratis.proto.RaftProtos; import org.apache.ratis.protocol.RaftClientReply; import org.apache.ratis.protocol.RaftGroupId; @@ -407,8 +407,8 @@ public void testLeaderElectionMetrics() throws IOException, InterruptedException cluster.start(); final RaftServer.Division leaderServer = waitForLeader(cluster); - final RatisMetricRegistryImpl ratisMetricRegistry = (RatisMetricRegistryImpl) - LeaderElectionMetrics.getMetricRegistryForLeaderElection(leaderServer.getMemberId()); + final RatisMetricRegistry ratisMetricRegistry = LeaderElectionMetrics.getMetricRegistryForLeaderElection( + leaderServer.getMemberId()); // Verify each metric individually. long numLeaderElections = ratisMetricRegistry.counter(LEADER_ELECTION_COUNT_METRIC).getCount(); 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 5c78db42f6..07870f981f 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 @@ -21,7 +21,7 @@ import static org.apache.ratis.server.metrics.LogAppenderMetrics.FOLLOWER_NEXT_INDEX; import static org.apache.ratis.server.metrics.LogAppenderMetrics.FOLLOWER_RPC_RESP_TIME; -import org.apache.ratis.metrics.impl.RatisMetricRegistryImpl; +import org.apache.ratis.metrics.RatisMetricRegistry; import org.apache.ratis.protocol.RaftGroupId; import org.apache.ratis.protocol.RaftGroupMemberId; import org.apache.ratis.protocol.RaftPeerId; @@ -35,7 +35,7 @@ public class TestLogAppenderMetrics { - private RatisMetricRegistryImpl ratisMetricRegistry; + private RatisMetricRegistry ratisMetricRegistry; private RaftPeerId raftPeerId; private MyFollowerInfo followerInfo; @@ -46,7 +46,7 @@ public void setup() { RaftGroupMemberId raftGroupMemberId = RaftGroupMemberId.valueOf(raftPeerId, raftGroupId); followerInfo = new MyFollowerInfo(100L); LogAppenderMetrics logAppenderMetrics = new LogAppenderMetrics(raftGroupMemberId); - ratisMetricRegistry = (RatisMetricRegistryImpl) logAppenderMetrics.getRegistry(); + ratisMetricRegistry = logAppenderMetrics.getRegistry(); logAppenderMetrics.addFollowerGauges(raftPeerId, followerInfo::getNextIndex, followerInfo::getMatchIndex, followerInfo::getLastRpcTime); } 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 e5222d21b1..93d466b521 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 @@ -21,8 +21,8 @@ import static org.apache.ratis.server.metrics.RaftServerMetricsImpl.*; import static org.junit.Assert.assertEquals; -import org.apache.ratis.metrics.impl.RatisMetricRegistryImpl; import org.apache.ratis.thirdparty.com.codahale.metrics.Gauge; +import org.apache.ratis.metrics.RatisMetricRegistry; import org.apache.ratis.protocol.ClientInvocationId; import org.apache.ratis.protocol.ClientId; import org.apache.ratis.protocol.RaftGroupId; @@ -40,7 +40,7 @@ * Test for metrics of retry cache. */ public class TestRetryCacheMetrics { - private static RatisMetricRegistryImpl ratisMetricRegistry; + private static RatisMetricRegistry ratisMetricRegistry; private static RetryCacheImpl retryCache; @BeforeClass @@ -53,7 +53,7 @@ public static void setUp() { final RaftServerMetricsImpl raftServerMetrics = RaftServerMetricsImpl.computeIfAbsentRaftServerMetrics( raftGroupMemberId, () -> null, retryCache::getStatistics); - ratisMetricRegistry = (RatisMetricRegistryImpl) raftServerMetrics.getRegistry(); + ratisMetricRegistry = raftServerMetrics.getRegistry(); } @After diff --git a/ratis-server/src/test/java/org/apache/ratis/server/metrics/ServerMetricsTestUtils.java b/ratis-server/src/test/java/org/apache/ratis/server/metrics/ServerMetricsTestUtils.java deleted file mode 100644 index 40ba31e162..0000000000 --- a/ratis-server/src/test/java/org/apache/ratis/server/metrics/ServerMetricsTestUtils.java +++ /dev/null @@ -1,55 +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; - -import org.apache.ratis.metrics.RatisMetricRegistry; -import org.apache.ratis.metrics.impl.RatisMetricRegistryImpl; -import org.apache.ratis.protocol.RaftGroupMemberId; -import org.apache.ratis.protocol.RaftPeerId; -import org.apache.ratis.thirdparty.com.codahale.metrics.Gauge; -import org.apache.ratis.util.Preconditions; - -import java.util.SortedMap; -import java.util.function.Supplier; - -public interface ServerMetricsTestUtils { - static Gauge getGaugeWithName(String gaugeName, Supplier metrics) { - final SortedMap gaugeMap = ((RatisMetricRegistryImpl)metrics.get()).getGauges( - (s, metric) -> s.contains(gaugeName)); - return gaugeMap.get(gaugeMap.firstKey()); - } - - /** - * Get the commit index gauge for the given peer of the server - * @return Metric Gauge holding the value of commit index of the peer - */ - static Gauge getPeerCommitIndexGauge(RaftGroupMemberId serverId, RaftPeerId peerId) { - final RaftServerMetricsImpl serverMetrics = RaftServerMetricsImpl.getImpl(serverId); - if (serverMetrics == null) { - return null; - } - - final String followerCommitIndexKey = RaftServerMetricsImpl.getPeerCommitIndexGaugeKey(peerId); - - final SortedMap map = ((RatisMetricRegistryImpl)serverMetrics.getRegistry()) - .getGauges((s, metric) -> s.contains(followerCommitIndexKey)); - - Preconditions.assertTrue(map.size() <= 1); - return map.get(map.firstKey()); - } -} \ No newline at end of file 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 a39612c57e..392b4e45a5 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 @@ -23,9 +23,9 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import org.apache.ratis.metrics.impl.RatisMetricRegistryImpl; import org.apache.ratis.thirdparty.com.codahale.metrics.Gauge; import org.apache.ratis.BaseTest; +import org.apache.ratis.metrics.RatisMetricRegistry; import org.apache.ratis.protocol.RaftGroupId; import org.apache.ratis.protocol.RaftGroupMemberId; import org.apache.ratis.protocol.RaftPeerId; @@ -40,7 +40,7 @@ public class TestLeaderElectionMetrics extends BaseTest { private static LeaderElectionMetrics leaderElectionMetrics; - private static RatisMetricRegistryImpl ratisMetricRegistry; + private static RatisMetricRegistry ratisMetricRegistry; @BeforeClass public static void setUp() { @@ -48,7 +48,7 @@ public static void setUp() { RaftPeerId raftPeerId = RaftPeerId.valueOf("TestId"); RaftGroupMemberId raftGroupMemberId = RaftGroupMemberId.valueOf(raftPeerId, raftGroupId); leaderElectionMetrics = LeaderElectionMetrics.getLeaderElectionMetrics(raftGroupMemberId, () -> 1000L); - ratisMetricRegistry = (RatisMetricRegistryImpl) leaderElectionMetrics.getRegistry(); + ratisMetricRegistry = leaderElectionMetrics.getRegistry(); } @Test 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 db2a8df469..9b850e2756 100644 --- a/ratis-test/src/test/java/org/apache/ratis/TestRaftServerSlownessDetection.java +++ b/ratis-test/src/test/java/org/apache/ratis/TestRaftServerSlownessDetection.java @@ -19,11 +19,12 @@ import org.apache.log4j.Level; import org.apache.ratis.conf.RaftProperties; -import org.apache.ratis.metrics.impl.RatisMetricRegistryImpl; +import org.apache.ratis.metrics.RatisMetricRegistry; import org.apache.ratis.protocol.RaftPeerId; 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; @@ -90,8 +91,8 @@ public void testSlownessDetection() throws Exception { .slownessTimeout(cluster.getProperties()).toIntExact(TimeUnit.MILLISECONDS); RaftServer.Division failedFollower = cluster.getFollowers().get(0); - final RatisMetricRegistryImpl ratisMetricRegistry - = (RatisMetricRegistryImpl) ((RaftServerMetricsImpl)leaderServer.getRaftServerMetrics()).getRegistry(); + final RatisMetricRegistry ratisMetricRegistry + = ((RaftServerMetricsImpl)leaderServer.getRaftServerMetrics()).getRegistry(); SortedMap 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 71cc783815..bcf70f1698 100644 --- a/ratis-test/src/test/java/org/apache/ratis/grpc/TestRaftServerWithGrpc.java +++ b/ratis-test/src/test/java/org/apache/ratis/grpc/TestRaftServerWithGrpc.java @@ -22,9 +22,11 @@ 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_MEGA_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 org.apache.ratis.thirdparty.com.codahale.metrics.Gauge; import org.apache.log4j.Level; import org.apache.ratis.BaseTest; import org.apache.ratis.protocol.RaftGroup; @@ -247,6 +249,12 @@ void testRequestMetrics(MiniRaftClusterWithGrpc cluster) throws Exception { clients.add(client); client.async().send(new SimpleMessage("2nd Message")); + + final SortedMap gaugeMap = getRaftServerMetrics(cluster.getLeader()) + .getRegistry().getGauges((s, metric) -> s.contains( + REQUEST_MEGA_BYTE_SIZE)); + + for (int i = 0; i < 10; i++) { client = cluster.createClient(cluster.getLeader().getId(), RetryPolicies.noRetry()); clients.add(client); diff --git a/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLogCache.java b/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLogCache.java index 4f135628c1..976e9d6e42 100644 --- a/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLogCache.java +++ b/ratis-test/src/test/java/org/apache/ratis/server/raftlog/segmented/TestSegmentedRaftLogCache.java @@ -25,7 +25,7 @@ import org.apache.ratis.RaftTestUtil.SimpleOperation; import org.apache.ratis.conf.RaftProperties; -import org.apache.ratis.metrics.impl.RatisMetricRegistryImpl; +import org.apache.ratis.metrics.RatisMetricRegistry; import org.apache.ratis.server.impl.RaftServerTestUtil; import org.apache.ratis.server.metrics.SegmentedRaftLogMetrics; import org.apache.ratis.server.protocol.TermIndex; @@ -44,12 +44,12 @@ public class TestSegmentedRaftLogCache { private SegmentedRaftLogCache cache; private SegmentedRaftLogMetrics raftLogMetrics; - private RatisMetricRegistryImpl ratisMetricRegistry; + private RatisMetricRegistry ratisMetricRegistry; @Before public void setup() { raftLogMetrics = new SegmentedRaftLogMetrics(RaftServerTestUtil.TEST_MEMBER_ID); - ratisMetricRegistry = (RatisMetricRegistryImpl) raftLogMetrics.getRegistry(); + ratisMetricRegistry = raftLogMetrics.getRegistry(); cache = new SegmentedRaftLogCache(null, null, prop, raftLogMetrics); }