You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2023/03/02 12:22:52 UTC

[dubbo] branch 3.2 updated: Rt metrics bugfix (#11694)

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

albumenj pushed a commit to branch 3.2
in repository https://gitbox.apache.org/repos/asf/dubbo.git


The following commit(s) were added to refs/heads/3.2 by this push:
     new 3902dc7b36 Rt metrics bugfix (#11694)
3902dc7b36 is described below

commit 3902dc7b363ff047b57b528fe383db956d99e5c7
Author: Mengyang Tang <me...@163.com>
AuthorDate: Thu Mar 2 20:22:44 2023 +0800

    Rt metrics bugfix (#11694)
---
 .../collector/sample/MethodMetricsSampler.java     | 16 ++++++----
 .../collector/sample/MetricsCountSampler.java      |  5 ++--
 .../sample/SimpleMetricsCountSampler.java          | 35 +++++++++++-----------
 .../dubbo/metrics/sampler/CountSamplerTest.java    | 17 ++++++-----
 4 files changed, 41 insertions(+), 32 deletions(-)

diff --git a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/sample/MethodMetricsSampler.java b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/sample/MethodMetricsSampler.java
index 186a691f90..b5a9af0157 100644
--- a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/sample/MethodMetricsSampler.java
+++ b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/sample/MethodMetricsSampler.java
@@ -31,6 +31,7 @@ import org.apache.dubbo.rpc.Invocation;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.ToDoubleFunction;
 
 import static org.apache.dubbo.metrics.model.MetricsCategory.REQUESTS;
@@ -64,7 +65,12 @@ public class MethodMetricsSampler extends SimpleMetricsCountSampler<Invocation,
 
         collect(metricSamples);
         metricSamples.addAll(
-            this.collectRT((key, metric, count) -> getGaugeMetricSample(key, metric, RT, count, Number::longValue)));
+            this.collectRT(new MetricSampleFactory<MethodMetric, GaugeMetricSample<?>>() {
+                @Override
+                public <T> GaugeMetricSample<?> newInstance(MetricsKey key, MethodMetric metric, T value, ToDoubleFunction<T> apply) {
+                    return getGaugeMetricSample(key, metric, RT, value, apply);
+                }
+            }));
 
         return metricSamples;
     }
@@ -84,11 +90,11 @@ public class MethodMetricsSampler extends SimpleMetricsCountSampler<Invocation,
     }
 
 
-    private GaugeMetricSample<Number> getGaugeMetricSample(MetricsKey metricsKey,
+    private <T> GaugeMetricSample<T> getGaugeMetricSample(MetricsKey metricsKey,
                                                            MethodMetric methodMetric,
                                                            MetricsCategory metricsCategory,
-                                                           Number value,
-                                                           ToDoubleFunction<Number> apply) {
+                                                           T value,
+                                                           ToDoubleFunction<T> apply) {
         return new GaugeMetricSample<>(
             metricsKey.getNameByType(methodMetric.getSide()),
             metricsKey.getDescription(),
@@ -101,6 +107,6 @@ public class MethodMetricsSampler extends SimpleMetricsCountSampler<Invocation,
     private <T extends Metric> void count(List<MetricSample> list, MetricsEvent.Type eventType, MetricsKey metricsKey) {
         getCount(eventType).filter(e -> !e.isEmpty())
             .ifPresent(map -> map.forEach((k, v) ->
-                list.add(getGaugeMetricSample(metricsKey, k, REQUESTS, v, value -> v.get()))));
+                list.add(getGaugeMetricSample(metricsKey, k, REQUESTS, v, AtomicLong::get))));
     }
 }
diff --git a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/sample/MetricsCountSampler.java b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/sample/MetricsCountSampler.java
index 3fbd3da676..353a04fe99 100644
--- a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/sample/MetricsCountSampler.java
+++ b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/sample/MetricsCountSampler.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.ToDoubleFunction;
 
 public interface MetricsCountSampler<S, K, M extends Metric> extends MetricsSampler {
 
@@ -44,9 +45,9 @@ public interface MetricsCountSampler<S, K, M extends Metric> extends MetricsSamp
 
     <R extends MetricSample> List<R> collectRT(MetricSampleFactory<M, R> factory);
 
-    <R extends MetricSample> List<R> collectRT(MetricSampleFactory<M, R> factory,K metricName);
+    <R extends MetricSample> List<R> collectRT(MetricSampleFactory<M, R> factory, K metricName);
 
     interface MetricSampleFactory<M, R extends MetricSample> {
-        R newInstance(MetricsKey key, M metric, Long count);
+        <T> R newInstance(MetricsKey key, M metric, T value, ToDoubleFunction<T> apply);
     }
 }
diff --git a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/sample/SimpleMetricsCountSampler.java b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/sample/SimpleMetricsCountSampler.java
index 7580cee6c3..6fd84204e0 100644
--- a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/sample/SimpleMetricsCountSampler.java
+++ b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/sample/SimpleMetricsCountSampler.java
@@ -50,9 +50,9 @@ public abstract class SimpleMetricsCountSampler<S, K, M extends Metric>
     private final ConcurrentMap<M, LongAccumulator> minRT = new ConcurrentHashMap<>();
     private final ConcurrentMap<M, LongAccumulator> maxRT = new ConcurrentHashMap<>();
 
-    private final ConcurrentMap<K, ConcurrentMap<M,AtomicLongArray>> rtGroupSample = new ConcurrentHashMap<>();
-    private final ConcurrentMap<K, ConcurrentMap<M,LongAccumulator>> groupMinRT   = new ConcurrentHashMap<>();
-    private final ConcurrentMap<K, ConcurrentMap<M,LongAccumulator>> groupMaxRT  = new ConcurrentHashMap<>();
+    private final ConcurrentMap<K, ConcurrentMap<M, AtomicLongArray>> rtGroupSample = new ConcurrentHashMap<>();
+    private final ConcurrentMap<K, ConcurrentMap<M, LongAccumulator>> groupMinRT = new ConcurrentHashMap<>();
+    private final ConcurrentMap<K, ConcurrentMap<M, LongAccumulator>> groupMaxRT = new ConcurrentHashMap<>();
 
     @Override
     public void inc(S source, K metricName) {
@@ -85,6 +85,7 @@ public abstract class SimpleMetricsCountSampler<S, K, M extends Metric>
             return true;
         });
     }
+
     @Override
     public void addRT(S source, Long rt) {
         MetricsCountSampleConfigurer<S, K, M> sampleConfigure = new MetricsCountSampleConfigurer<>();
@@ -121,7 +122,7 @@ public abstract class SimpleMetricsCountSampler<S, K, M extends Metric>
 
     @Override
     public void addRT(S source, K metricName, Long rt) {
-        MetricsCountSampleConfigurer<S,K,M> sampleConfigure = new MetricsCountSampleConfigurer<>();
+        MetricsCountSampleConfigurer<S, K, M> sampleConfigure = new MetricsCountSampleConfigurer<>();
         sampleConfigure.setSource(source);
         sampleConfigure.setMetricsName(metricName);
 
@@ -135,7 +136,7 @@ public abstract class SimpleMetricsCountSampler<S, K, M extends Metric>
             ConcurrentHashMap<M, AtomicLongArray> calculator = new ConcurrentHashMap<>();
             calculator.put(metric, new AtomicLongArray(4));
 
-            rtGroupSample.put(metricName,calculator);
+            rtGroupSample.put(metricName, calculator);
 
             nameToCalculator = rtGroupSample.get(metricName);
         }
@@ -174,32 +175,30 @@ public abstract class SimpleMetricsCountSampler<S, K, M extends Metric>
         return collect(factory, rtSample, this.minRT, this.maxRT);
     }
 
-    public  <R extends MetricSample> List<R> collectRT(MetricSampleFactory<M, R> factory,K metricName){
-        return collect(factory, rtGroupSample.get(metricName), groupMinRT.get(metricName),
-            groupMaxRT.get(metricName));
+    @Override
+    public <R extends MetricSample> List<R> collectRT(MetricSampleFactory<M, R> factory, K metricName) {
+        return collect(factory, rtGroupSample.get(metricName), groupMinRT.get(metricName), groupMaxRT.get(metricName));
     }
 
     private <R extends MetricSample> List<R> collect(MetricSampleFactory<M, R> factory,
-                                                  ConcurrentMap<M, AtomicLongArray> rtSample,
-                                                  ConcurrentMap<M, LongAccumulator> min,
-                                                  ConcurrentMap<M, LongAccumulator> max){
+                                                     ConcurrentMap<M, AtomicLongArray> rtSample,
+                                                     ConcurrentMap<M, LongAccumulator> min,
+                                                     ConcurrentMap<M, LongAccumulator> max) {
         final List<R> result = new ArrayList<>();
         rtSample.forEach((k, v) -> {
             // lastRT
-            result.add(factory.newInstance(MetricsKey.METRIC_RT_LAST, k, v.get(0)));
+            result.add(factory.newInstance(MetricsKey.METRIC_RT_LAST, k, v, value -> value.get(0)));
             // totalRT
-            long totalRT = v.get(1);
-            long rtCount = v.get(2);
-            result.add(factory.newInstance(MetricsKey.METRIC_RT_SUM, k, totalRT));
+            result.add(factory.newInstance(MetricsKey.METRIC_RT_SUM, k, v, value -> value.get(1)));
             // avgRT
-            result.add(factory.newInstance(MetricsKey.METRIC_RT_AVG, k, Math.floorDiv(totalRT, rtCount)));
+            result.add(factory.newInstance(MetricsKey.METRIC_RT_AVG, k, v, value -> Math.floorDiv(value.get(1), value.get(2))));
         });
 
         min.forEach((k, v) ->
-            result.add(factory.newInstance(MetricsKey.METRIC_RT_MIN, k, v.get())));
+            result.add(factory.newInstance(MetricsKey.METRIC_RT_MIN, k, v, LongAccumulator::get)));
 
         max.forEach((k, v) ->
-            result.add(factory.newInstance(MetricsKey.METRIC_RT_MAX, k, v.get())));
+            result.add(factory.newInstance(MetricsKey.METRIC_RT_MAX, k, v, LongAccumulator::get)));
 
         return result;
     }
diff --git a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/sampler/CountSamplerTest.java b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/sampler/CountSamplerTest.java
index b1d701c903..d592176515 100644
--- a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/sampler/CountSamplerTest.java
+++ b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/sampler/CountSamplerTest.java
@@ -18,10 +18,9 @@
 package org.apache.dubbo.metrics.sampler;
 
 import org.apache.dubbo.metrics.collector.sample.MetricsCountSampleConfigurer;
+import org.apache.dubbo.metrics.collector.sample.MetricsCountSampler;
 import org.apache.dubbo.metrics.collector.sample.SimpleMetricsCountSampler;
-import org.apache.dubbo.metrics.model.MethodMetric;
 import org.apache.dubbo.metrics.model.Metric;
-import org.apache.dubbo.metrics.model.MetricsCategory;
 import org.apache.dubbo.metrics.model.MetricsKey;
 import org.apache.dubbo.metrics.model.sample.GaugeMetricSample;
 import org.apache.dubbo.metrics.model.sample.MetricSample;
@@ -35,7 +34,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
-import java.util.function.Supplier;
+import java.util.function.ToDoubleFunction;
 import java.util.stream.Collectors;
 
 import static org.apache.dubbo.metrics.model.MetricsCategory.RT;
@@ -117,14 +116,18 @@ public class CountSamplerTest {
     @NotNull
     @SuppressWarnings("rawtypes")
     private Map<String, GaugeMetricSample> getCollect(RTType rtType) {
-        List<GaugeMetricSample> metricSamples = sampler.collectRT((key, metric, count) ->
-            new GaugeMetricSample<>(key.formatName("consumer"), metric.getTags(), RT, count, __ -> count), rtType);
+        List<GaugeMetricSample<?>> metricSamples = sampler.collectRT(
+            new MetricsCountSampler.MetricSampleFactory<RequestMethodMetrics, GaugeMetricSample<?>>() {
+                @Override
+                public <T> GaugeMetricSample<?> newInstance(MetricsKey key, RequestMethodMetrics metric, T value, ToDoubleFunction<T> apply) {
+                    return new GaugeMetricSample<>(key.formatName("consumer"), metric.getTags(), RT, value, apply);
+                }
+            }, rtType);
 
         return metricSamples.stream()
             .collect(Collectors.toMap(MetricSample::getName, v -> v));
     }
 
-
     public class RequestMetricsCountSampler extends SimpleMetricsCountSampler<String, RTType, RequestMethodMetrics> {
 
         @Override
@@ -152,7 +155,7 @@ public class CountSamplerTest {
         }
     }
 
-    static enum RTType {
+    enum RTType {
         METHOD_REQUEST,
         APPLICATION
     }