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
}