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 cdc2d85f2b metrics code optimization (#11352)
cdc2d85f2b is described below
commit cdc2d85f2bd1543ad4f41d7a92befbfbf58ee711
Author: wxbty <[email protected]>
AuthorDate: Mon Feb 6 13:36:36 2023 +0800
metrics code optimization (#11352)
---
.../metrics/collector/stat/MetricsStatHandler.java | 8 +-
.../EmptyEvent.java} | 21 ++--
.../MetricsEventMulticaster.java} | 14 +--
.../event/SimpleMetricsEventMulticaster.java | 61 ++++++++++
.../apache/dubbo/metrics/model/MethodMetric.java | 40 +++++-
.../metrics/collector/DefaultMetricsCollector.java | 134 +++++++++------------
.../collector/stat/DefaultMetricsStatHandler.java | 37 +++---
.../collector/stat/MetricsStatComposite.java | 104 +++++-----------
.../metrics/filter/MetricsCollectExecutor.java | 90 ++++----------
.../apache/dubbo/metrics/filter/MetricsFilter.java | 19 ++-
.../collector/AggregateMetricsCollectorTest.java | 35 ++++--
.../collector/DefaultMetricsCollectorTest.java | 36 ++++--
.../metrics/metrics/model/MethodMetricTest.java | 10 +-
13 files changed, 316 insertions(+), 293 deletions(-)
diff --git
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/stat/MetricsStatHandler.java
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/stat/MetricsStatHandler.java
index 690ed2d39d..d2c800ed5a 100644
---
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/stat/MetricsStatHandler.java
+++
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/stat/MetricsStatHandler.java
@@ -17,13 +17,17 @@
package org.apache.dubbo.metrics.collector.stat;
+import org.apache.dubbo.metrics.event.MetricsEvent;
import org.apache.dubbo.metrics.model.MethodMetric;
+import org.apache.dubbo.rpc.Invocation;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
public interface MetricsStatHandler {
Map<MethodMetric, AtomicLong> get();
- void increase(String applicationName, String interfaceName, String
methodName, String group, String version);
- void decrease(String applicationName, String interfaceName, String
methodName, String group, String version);
+
+ MetricsEvent increase(String applicationName, Invocation invocation);
+
+ MetricsEvent decrease(String applicationName, Invocation invocation);
}
diff --git
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/stat/MetricsStatHandler.java
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/EmptyEvent.java
similarity index 62%
copy from
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/stat/MetricsStatHandler.java
copy to
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/EmptyEvent.java
index 690ed2d39d..3298927006 100644
---
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/stat/MetricsStatHandler.java
+++
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/EmptyEvent.java
@@ -15,15 +15,20 @@
* limitations under the License.
*/
-package org.apache.dubbo.metrics.collector.stat;
+package org.apache.dubbo.metrics.event;
-import org.apache.dubbo.metrics.model.MethodMetric;
+/**
+ * EmptyEvent, do nothing.
+ */
+public class EmptyEvent extends MetricsEvent {
+
+ private static final EmptyEvent empty = new EmptyEvent(new Object());
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
+ public EmptyEvent(Object source) {
+ super(source);
+ }
-public interface MetricsStatHandler {
- Map<MethodMetric, AtomicLong> get();
- void increase(String applicationName, String interfaceName, String
methodName, String group, String version);
- void decrease(String applicationName, String interfaceName, String
methodName, String group, String version);
+ public static EmptyEvent instance() {
+ return empty;
+ }
}
diff --git
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/stat/MetricsStatHandler.java
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/MetricsEventMulticaster.java
similarity index 62%
copy from
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/stat/MetricsStatHandler.java
copy to
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/MetricsEventMulticaster.java
index 690ed2d39d..e35549a5c8 100644
---
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/stat/MetricsStatHandler.java
+++
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/MetricsEventMulticaster.java
@@ -15,15 +15,13 @@
* limitations under the License.
*/
-package org.apache.dubbo.metrics.collector.stat;
+package org.apache.dubbo.metrics.event;
-import org.apache.dubbo.metrics.model.MethodMetric;
+import org.apache.dubbo.metrics.listener.MetricsListener;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
+public interface MetricsEventMulticaster {
-public interface MetricsStatHandler {
- Map<MethodMetric, AtomicLong> get();
- void increase(String applicationName, String interfaceName, String
methodName, String group, String version);
- void decrease(String applicationName, String interfaceName, String
methodName, String group, String version);
+ void addListener(MetricsListener listener);
+
+ void publishEvent(MetricsEvent event);
}
diff --git
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/SimpleMetricsEventMulticaster.java
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/SimpleMetricsEventMulticaster.java
new file mode 100644
index 0000000000..60e310bf26
--- /dev/null
+++
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/SimpleMetricsEventMulticaster.java
@@ -0,0 +1,61 @@
+/*
+ * 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.dubbo.metrics.event;
+
+import org.apache.dubbo.metrics.listener.MetricsListener;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public final class SimpleMetricsEventMulticaster implements
MetricsEventMulticaster {
+
+ @SuppressWarnings("java:S3077")
+ private static volatile SimpleMetricsEventMulticaster instance;
+
+ private SimpleMetricsEventMulticaster() {
+ }
+
+ private final List<MetricsListener> listeners =
Collections.synchronizedList(new ArrayList<>());
+
+ public static SimpleMetricsEventMulticaster getInstance() {
+ if (instance == null) {
+ synchronized (SimpleMetricsEventMulticaster.class) {
+ if (instance == null) {
+ instance = new SimpleMetricsEventMulticaster();
+ }
+ }
+ }
+ return instance;
+ }
+
+ @Override
+ public void addListener(MetricsListener listener) {
+ listeners.add(listener);
+ }
+
+ @Override
+ public void publishEvent(MetricsEvent event) {
+ if (event instanceof EmptyEvent) {
+ return;
+ }
+ for (MetricsListener listener : listeners) {
+ listener.onEvent(event);
+ }
+ }
+}
diff --git
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MethodMetric.java
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MethodMetric.java
index 898c18a685..79f49a56e6 100644
---
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MethodMetric.java
+++
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MethodMetric.java
@@ -17,6 +17,9 @@
package org.apache.dubbo.metrics.model;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.RpcInvocation;
+
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
@@ -30,6 +33,7 @@ import static
org.apache.dubbo.common.constants.MetricsConstants.TAG_GROUP_KEY;
import static
org.apache.dubbo.common.constants.MetricsConstants.TAG_VERSION_KEY;
import static org.apache.dubbo.common.utils.NetUtils.getLocalHost;
import static org.apache.dubbo.common.utils.NetUtils.getLocalHostName;
+import static org.apache.dubbo.rpc.support.RpcUtils.isGenericCall;
/**
* Metric class for method.
@@ -45,12 +49,9 @@ public class MethodMetric {
}
- public MethodMetric(String applicationName, String interfaceName, String
methodName, String group, String version) {
+ public MethodMetric(String applicationName, Invocation invocation) {
this.applicationName = applicationName;
- this.interfaceName = interfaceName;
- this.methodName = methodName;
- this.group = group;
- this.version = version;
+ init(invocation);
}
public String getInterfaceName() {
@@ -121,4 +122,33 @@ public class MethodMetric {
", version='" + version + '\'' +
'}';
}
+
+ private void init(Invocation invocation) {
+ String serviceUniqueName = invocation.getTargetServiceUniqueName();
+ String methodName = invocation.getMethodName();
+ if (invocation instanceof RpcInvocation
+ && isGenericCall(((RpcInvocation)
invocation).getParameterTypesDesc(), methodName)
+ && invocation.getArguments() != null
+ && invocation.getArguments().length == 3) {
+ methodName = ((String) invocation.getArguments()[0]).trim();
+ }
+ String group = null;
+ String interfaceAndVersion;
+ String[] arr = serviceUniqueName.split("/");
+ if (arr.length == 2) {
+ group = arr[0];
+ interfaceAndVersion = arr[1];
+ } else {
+ interfaceAndVersion = arr[0];
+ }
+
+ String[] ivArr = interfaceAndVersion.split(":");
+ String interfaceName = ivArr[0];
+ String version = ivArr.length == 2 ? ivArr[1] : null;
+
+ this.interfaceName = interfaceName;
+ this.methodName = methodName;
+ this.group = group;
+ this.version = version;
+ }
}
diff --git
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/DefaultMetricsCollector.java
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/DefaultMetricsCollector.java
index 2ee6c2833d..a14d42d519 100644
---
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/DefaultMetricsCollector.java
+++
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/DefaultMetricsCollector.java
@@ -19,18 +19,21 @@ package org.apache.dubbo.metrics.collector;
import org.apache.dubbo.metrics.collector.stat.MetricsStatComposite;
import org.apache.dubbo.metrics.collector.stat.MetricsStatHandler;
+import org.apache.dubbo.metrics.event.EmptyEvent;
+import org.apache.dubbo.metrics.event.MetricsEvent;
import org.apache.dubbo.metrics.event.RequestEvent;
+import org.apache.dubbo.metrics.event.SimpleMetricsEventMulticaster;
import org.apache.dubbo.metrics.listener.MetricsListener;
import org.apache.dubbo.metrics.model.MetricsKey;
import org.apache.dubbo.metrics.model.sample.GaugeMetricSample;
import org.apache.dubbo.metrics.model.sample.MetricSample;
+import org.apache.dubbo.rpc.Invocation;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
-import java.util.function.Consumer;
import java.util.function.Function;
import static org.apache.dubbo.metrics.model.MetricsCategory.REQUESTS;
@@ -43,11 +46,12 @@ import static
org.apache.dubbo.metrics.model.MetricsCategory.RT;
public class DefaultMetricsCollector implements MetricsCollector {
private AtomicBoolean collectEnabled = new AtomicBoolean(false);
- private final List<MetricsListener> listeners = new ArrayList<>();
private final MetricsStatComposite stats;
+ private final SimpleMetricsEventMulticaster eventMulticaster;
public DefaultMetricsCollector() {
- this.stats = new MetricsStatComposite( this);
+ this.stats = new MetricsStatComposite(this);
+ this.eventMulticaster = SimpleMetricsEventMulticaster.getInstance();
}
public void setCollectEnabled(Boolean collectEnabled) {
@@ -58,80 +62,52 @@ public class DefaultMetricsCollector implements
MetricsCollector {
return collectEnabled.get();
}
- public void addListener(MetricsListener listener) {
- listeners.add(listener);
+ public void increaseTotalRequests(String applicationName, Invocation
invocation) {
+ increaseAndPublishEvent(applicationName, RequestEvent.Type.TOTAL,
invocation);
}
- public List<MetricsListener> getListener() {
- return this.listeners;
+ public void increaseSucceedRequests(String applicationName, Invocation
invocation) {
+ increaseAndPublishEvent(applicationName, RequestEvent.Type.SUCCEED,
invocation);
}
- public void increaseTotalRequests(String applicationName, String
interfaceName, String methodName,
- String group, String version) {
- doExecute(RequestEvent.Type.TOTAL,statHandler-> {
- statHandler.increase(applicationName, interfaceName, methodName,
group, version);
- });
+ public void increaseUnknownFailedRequests(String applicationName,
Invocation invocation) {
+ increaseAndPublishEvent(applicationName,
RequestEvent.Type.UNKNOWN_FAILED, invocation);
}
- public void increaseSucceedRequests(String applicationName, String
interfaceName, String methodName,
- String group, String version) {
- doExecute(RequestEvent.Type.SUCCEED,statHandler->{
- statHandler.increase(applicationName, interfaceName, methodName,
group, version);
- });
+ public void businessFailedRequests(String applicationName, Invocation
invocation) {
+ increaseAndPublishEvent(applicationName,
RequestEvent.Type.BUSINESS_FAILED, invocation);
}
- public void increaseUnknownFailedRequests(String applicationName, String
interfaceName,
- String methodName,
- String group,
- String version) {
- doExecute(RequestEvent.Type.UNKNOWN_FAILED, statHandler->{
- statHandler.increase(applicationName, interfaceName, methodName,
group, version);
- });
+ public void timeoutRequests(String applicationName, Invocation invocation)
{
+
increaseAndPublishEvent(applicationName,RequestEvent.Type.REQUEST_TIMEOUT,
invocation);
}
- public void businessFailedRequests(String applicationName, String
interfaceName, String methodName,
- String group, String version) {
- doExecute(RequestEvent.Type.BUSINESS_FAILED,statHandler->{
- statHandler.increase(applicationName, interfaceName, methodName,
group, version);
- });
+ public void limitRequests(String applicationName, Invocation invocation) {
+
increaseAndPublishEvent(applicationName,RequestEvent.Type.REQUEST_LIMIT,
invocation);
}
- public void timeoutRequests(String applicationName, String interfaceName,
String methodName, String group,
- String version) {
- doExecute(RequestEvent.Type.REQUEST_TIMEOUT,statHandler->{
- statHandler.increase(applicationName, interfaceName, methodName,
group, version);
- });
+ public void increaseProcessingRequests(String applicationName, Invocation
invocation) {
+ increaseAndPublishEvent(applicationName,RequestEvent.Type.PROCESSING,
invocation);
}
- public void limitRequests(String applicationName, String interfaceName,
String methodName, String group, String version) {
- doExecute(RequestEvent.Type.REQUEST_LIMIT,statHandler->{
- statHandler.increase(applicationName, interfaceName, methodName,
group, version);
- });
+ public void decreaseProcessingRequests(String applicationName, Invocation
invocation) {
+ decreaseAndPublishEvent(applicationName,RequestEvent.Type.PROCESSING,
invocation);
}
- public void increaseProcessingRequests(String applicationName, String
interfaceName, String methodName,
- String group, String version) {
- doExecute(RequestEvent.Type.PROCESSING,statHandler-> {
- statHandler.increase(applicationName, interfaceName, methodName,
group, version);
- });
+ public void totalFailedRequests(String applicationName, Invocation
invocation) {
+
increaseAndPublishEvent(applicationName,RequestEvent.Type.TOTAL_FAILED,
invocation);
}
- public void decreaseProcessingRequests(String applicationName, String
interfaceName, String methodName,
- String group, String version) {
- doExecute(RequestEvent.Type.PROCESSING,statHandler-> {
- statHandler.decrease(applicationName, interfaceName, methodName,
group, version);
- });
+ private void increaseAndPublishEvent(String applicationName,
RequestEvent.Type total, Invocation invocation) {
+ this.eventMulticaster.publishEvent(doExecute(total, statHandler ->
statHandler.increase(applicationName,invocation)));
}
- public void totalFailedRequests(String applicationName, String
interfaceName, String methodName, String group,
- String version) {
- doExecute(RequestEvent.Type.TOTAL_FAILED,statHandler-> {
- statHandler.increase(applicationName, interfaceName, methodName,
group, version);
- });
+ private void decreaseAndPublishEvent(String applicationName,
RequestEvent.Type total, Invocation invocation) {
+ this.eventMulticaster.publishEvent(doExecute(total, statHandler ->
statHandler.decrease(applicationName,invocation)));
}
- public void addRT(String applicationName, String interfaceName, String
methodName, String group, String version, Long responseTime) {
- stats.addRT(applicationName, interfaceName, methodName, group,
version, responseTime);
+ public void addRT(String applicationName,Invocation invocation, Long
responseTime) {
+
this.eventMulticaster.publishEvent(stats.addRtAndRetrieveEvent(applicationName,invocation,
responseTime));
}
@Override
@@ -144,29 +120,29 @@ public class DefaultMetricsCollector implements
MetricsCollector {
}
private void collectRequests(List<MetricSample> list) {
- doExecute(RequestEvent.Type.TOTAL,
MetricsStatHandler::get).filter(e->!e.isEmpty())
- .ifPresent(map-> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUESTS, k.getTags(), REQUESTS,
v::get))));
+ doCollect(RequestEvent.Type.TOTAL, MetricsStatHandler::get).filter(e
-> !e.isEmpty())
+ .ifPresent(map -> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUESTS, k.getTags(), REQUESTS,
v::get))));
- doExecute(RequestEvent.Type.SUCCEED,
MetricsStatHandler::get).filter(e->!e.isEmpty())
- .ifPresent(map-> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUESTS_SUCCEED, k.getTags(),
REQUESTS, v::get))));
+ doCollect(RequestEvent.Type.SUCCEED, MetricsStatHandler::get).filter(e
-> !e.isEmpty())
+ .ifPresent(map -> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUESTS_SUCCEED, k.getTags(),
REQUESTS, v::get))));
- doExecute(RequestEvent.Type.UNKNOWN_FAILED,
MetricsStatHandler::get).filter(e->!e.isEmpty())
- .ifPresent(map-> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUESTS_FAILED, k.getTags(),
REQUESTS, v::get))));
+ doCollect(RequestEvent.Type.UNKNOWN_FAILED,
MetricsStatHandler::get).filter(e -> !e.isEmpty())
+ .ifPresent(map -> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUESTS_FAILED, k.getTags(),
REQUESTS, v::get))));
- doExecute(RequestEvent.Type.PROCESSING,
MetricsStatHandler::get).filter(e->!e.isEmpty())
- .ifPresent(map-> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUESTS_PROCESSING, k.getTags(),
REQUESTS, v::get))));
+ doCollect(RequestEvent.Type.PROCESSING,
MetricsStatHandler::get).filter(e -> !e.isEmpty())
+ .ifPresent(map -> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUESTS_PROCESSING, k.getTags(),
REQUESTS, v::get))));
- doExecute(RequestEvent.Type.BUSINESS_FAILED,
MetricsStatHandler::get).filter(e->!e.isEmpty())
- .ifPresent(map-> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUEST_BUSINESS_FAILED,
k.getTags(), REQUESTS, v::get))));
+ doCollect(RequestEvent.Type.BUSINESS_FAILED,
MetricsStatHandler::get).filter(e -> !e.isEmpty())
+ .ifPresent(map -> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUEST_BUSINESS_FAILED,
k.getTags(), REQUESTS, v::get))));
- doExecute(RequestEvent.Type.REQUEST_TIMEOUT,
MetricsStatHandler::get).filter(e->!e.isEmpty())
- .ifPresent(map-> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUESTS_TIMEOUT, k.getTags(),
REQUESTS, v::get))));
+ doCollect(RequestEvent.Type.REQUEST_TIMEOUT,
MetricsStatHandler::get).filter(e -> !e.isEmpty())
+ .ifPresent(map -> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUESTS_TIMEOUT, k.getTags(),
REQUESTS, v::get))));
- doExecute(RequestEvent.Type.REQUEST_LIMIT,
MetricsStatHandler::get).filter(e->!e.isEmpty())
- .ifPresent(map-> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUESTS_LIMIT, k.getTags(),
REQUESTS, v::get))));
+ doCollect(RequestEvent.Type.REQUEST_LIMIT,
MetricsStatHandler::get).filter(e -> !e.isEmpty())
+ .ifPresent(map -> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUESTS_LIMIT, k.getTags(),
REQUESTS, v::get))));
- doExecute(RequestEvent.Type.TOTAL_FAILED,
MetricsStatHandler::get).filter(e->!e.isEmpty())
- .ifPresent(map-> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUESTS_TOTAL_FAILED,
k.getTags(), REQUESTS, v::get))));
+ doCollect(RequestEvent.Type.TOTAL_FAILED,
MetricsStatHandler::get).filter(e -> !e.isEmpty())
+ .ifPresent(map -> map.forEach((k, v) -> list.add(new
GaugeMetricSample(MetricsKey.PROVIDER_METRIC_REQUESTS_TOTAL_FAILED,
k.getTags(), REQUESTS, v::get))));
}
@@ -184,19 +160,27 @@ public class DefaultMetricsCollector implements
MetricsCollector {
list.add(new GaugeMetricSample(MetricsKey.PROVIDER_METRIC_RT_AVG,
k.getTags(), RT, avg::get));
});
}
- private <T> Optional<T> doExecute(RequestEvent.Type requestType,
Function<MetricsStatHandler,T> statExecutor) {
+
+ private <
+ T> Optional<T> doCollect(RequestEvent.Type requestType,
Function<MetricsStatHandler, T> statExecutor) {
if (isCollectEnabled()) {
MetricsStatHandler handler = stats.getHandler(requestType);
- T result = statExecutor.apply(handler);
+ T result = statExecutor.apply(handler);
return Optional.ofNullable(result);
}
return Optional.empty();
}
- private void doExecute(RequestEvent.Type requestType,
Consumer<MetricsStatHandler> statExecutor) {
+ private MetricsEvent doExecute(RequestEvent.Type
+ requestType,
Function<MetricsStatHandler, MetricsEvent> statExecutor) {
if (isCollectEnabled()) {
MetricsStatHandler handler = stats.getHandler(requestType);
- statExecutor.accept(handler);
+ return statExecutor.apply(handler);
}
+ return EmptyEvent.instance();
+ }
+
+ public void addListener(MetricsListener listener) {
+ this.eventMulticaster.addListener(listener);
}
}
diff --git
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/stat/DefaultMetricsStatHandler.java
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/stat/DefaultMetricsStatHandler.java
index 7ca5ebd5ff..44ad17fade 100644
---
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/stat/DefaultMetricsStatHandler.java
+++
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/stat/DefaultMetricsStatHandler.java
@@ -21,7 +21,10 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.BiConsumer;
+import org.apache.dubbo.metrics.event.EmptyEvent;
+import org.apache.dubbo.metrics.event.MetricsEvent;
import org.apache.dubbo.metrics.model.MethodMetric;
+import org.apache.dubbo.rpc.Invocation;
public class DefaultMetricsStatHandler implements MetricsStatHandler {
@@ -32,34 +35,34 @@ public class DefaultMetricsStatHandler implements
MetricsStatHandler {
}
@Override
- public void increase(String applicationName, String interfaceName, String
methodName, String group, String version) {
- this.doIncrExecute(applicationName,
interfaceName,methodName,group,version);
+ public MetricsEvent increase(String applicationName, Invocation
invocation) {
+ return this.doIncrExecute(applicationName, invocation);
}
- public void decrease(String applicationName, String interfaceName, String
methodName, String group, String version){
- this.doDecrExecute(applicationName,
interfaceName,methodName,group,version);
+ public MetricsEvent decrease(String applicationName, Invocation
invocation) {
+ return this.doDecrExecute(applicationName,invocation);
}
- protected void doExecute(String applicationName, String interfaceName,
String methodName, String version,
- BiConsumer<MethodMetric,Map<MethodMetric,
AtomicLong>> execute, String group){
- MethodMetric metric = new MethodMetric(applicationName, interfaceName,
methodName, group, version);
- execute.accept(metric,counts);
+ protected MetricsEvent doExecute(String applicationName, Invocation
invocation, BiConsumer<MethodMetric, Map<MethodMetric, AtomicLong>> execute) {
+ MethodMetric metric = new MethodMetric(applicationName, invocation);
+ execute.accept(metric, counts);
- this.doNotify(metric);
+ return this.retrieveMetricsEvent(metric);
}
- protected void doIncrExecute(String applicationName, String interfaceName,
String methodName, String group, String version){
- this.doExecute(applicationName, interfaceName,methodName, version,
(metric, counts)->{
+ protected MetricsEvent doIncrExecute(String applicationName, Invocation
invocation) {
+ return this.doExecute(applicationName, invocation, (metric, counts) ->
{
AtomicLong count = counts.computeIfAbsent(metric, k -> new
AtomicLong(0L));
count.incrementAndGet();
- }, group);
+ });
}
- protected void doDecrExecute(String applicationName, String interfaceName,
String methodName, String group, String version){
- this.doExecute(applicationName, interfaceName,methodName, version,
(metric, counts)->{
+
+ protected MetricsEvent doDecrExecute(String applicationName, Invocation
invocation) {
+ return this.doExecute(applicationName, invocation, (metric, counts) ->
{
AtomicLong count = counts.computeIfAbsent(metric, k -> new
AtomicLong(0L));
count.decrementAndGet();
- }, group);
+ });
}
@Override
@@ -67,5 +70,7 @@ public class DefaultMetricsStatHandler implements
MetricsStatHandler {
return counts;
}
- public void doNotify(MethodMetric metric){}
+ public MetricsEvent retrieveMetricsEvent(MethodMetric metric) {
+ return EmptyEvent.instance();
+ }
}
diff --git
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/stat/MetricsStatComposite.java
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/stat/MetricsStatComposite.java
index 996d43e074..cff37bb878 100644
---
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/stat/MetricsStatComposite.java
+++
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/collector/stat/MetricsStatComposite.java
@@ -19,13 +19,13 @@ package org.apache.dubbo.metrics.collector.stat;
import org.apache.dubbo.common.utils.ConcurrentHashMapUtils;
import org.apache.dubbo.metrics.collector.DefaultMetricsCollector;
+import org.apache.dubbo.metrics.event.EmptyEvent;
import org.apache.dubbo.metrics.event.MetricsEvent;
import org.apache.dubbo.metrics.event.RTEvent;
import org.apache.dubbo.metrics.event.RequestEvent;
-import org.apache.dubbo.metrics.listener.MetricsListener;
import org.apache.dubbo.metrics.model.MethodMetric;
+import org.apache.dubbo.rpc.Invocation;
-import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@@ -41,11 +41,9 @@ public class MetricsStatComposite {
private final ConcurrentMap<MethodMetric, AtomicLong> avgRT = new
ConcurrentHashMap<>();
private final ConcurrentMap<MethodMetric, AtomicLong> totalRT = new
ConcurrentHashMap<>();
private final ConcurrentMap<MethodMetric, AtomicLong> rtCount = new
ConcurrentHashMap<>();
- private final List<MetricsListener> listeners;
private DefaultMetricsCollector collector;
public MetricsStatComposite(DefaultMetricsCollector collector) {
- this.listeners = collector.getListener();
this.collector = collector;
this.init();
}
@@ -78,87 +76,49 @@ public class MetricsStatComposite {
return this.rtCount;
}
- public void addRT(String applicationName, String interfaceName, String
methodName, String group, String version, Long responseTime) {
- if (collector.isCollectEnabled()) {
- MethodMetric metric = new MethodMetric(applicationName,
interfaceName, methodName, group, version);
+ public MetricsEvent addRtAndRetrieveEvent(String applicationName,
Invocation invocation, Long responseTime) {
+ if (!collector.isCollectEnabled()) {
+ return EmptyEvent.instance();
+ }
+ MethodMetric metric = new MethodMetric(applicationName, invocation);
- AtomicLong last = ConcurrentHashMapUtils.computeIfAbsent(lastRT,
metric, k -> new AtomicLong());
- last.set(responseTime);
+ AtomicLong last = ConcurrentHashMapUtils.computeIfAbsent(lastRT,
metric, k -> new AtomicLong());
+ last.set(responseTime);
- LongAccumulator min =
ConcurrentHashMapUtils.computeIfAbsent(minRT, metric, k -> new
LongAccumulator(Long::min, Long.MAX_VALUE));
- min.accumulate(responseTime);
+ LongAccumulator min = ConcurrentHashMapUtils.computeIfAbsent(minRT,
metric, k -> new LongAccumulator(Long::min, Long.MAX_VALUE));
+ min.accumulate(responseTime);
- LongAccumulator max =
ConcurrentHashMapUtils.computeIfAbsent(maxRT, metric, k -> new
LongAccumulator(Long::max, Long.MIN_VALUE));
- max.accumulate(responseTime);
+ LongAccumulator max = ConcurrentHashMapUtils.computeIfAbsent(maxRT,
metric, k -> new LongAccumulator(Long::max, Long.MIN_VALUE));
+ max.accumulate(responseTime);
- AtomicLong total = ConcurrentHashMapUtils.computeIfAbsent(totalRT,
metric, k -> new AtomicLong());
- total.addAndGet(responseTime);
+ AtomicLong total = ConcurrentHashMapUtils.computeIfAbsent(totalRT,
metric, k -> new AtomicLong());
+ total.addAndGet(responseTime);
- AtomicLong count = ConcurrentHashMapUtils.computeIfAbsent(rtCount,
metric, k -> new AtomicLong());
- count.incrementAndGet();
+ AtomicLong count = ConcurrentHashMapUtils.computeIfAbsent(rtCount,
metric, k -> new AtomicLong());
+ count.incrementAndGet();
- ConcurrentHashMapUtils.computeIfAbsent(avgRT, metric, k -> new
AtomicLong());
+ ConcurrentHashMapUtils.computeIfAbsent(avgRT, metric, k -> new
AtomicLong());
- publishEvent(new RTEvent(metric, responseTime));
- }
+ return new RTEvent(metric, responseTime);
}
private void init() {
- stats.put(RequestEvent.Type.TOTAL, new DefaultMetricsStatHandler() {
- @Override
- public void doNotify(MethodMetric metric) {
- publishEvent(new RequestEvent(metric,
RequestEvent.Type.TOTAL));
- }
- });
-
- stats.put(RequestEvent.Type.SUCCEED, new DefaultMetricsStatHandler() {
- @Override
- public void doNotify(MethodMetric metric) {
- publishEvent(new RequestEvent(metric,
RequestEvent.Type.SUCCEED));
- }
- });
-
- stats.put(RequestEvent.Type.UNKNOWN_FAILED, new
DefaultMetricsStatHandler() {
- @Override
- public void doNotify(MethodMetric metric) {
- publishEvent(new RequestEvent(metric,
RequestEvent.Type.UNKNOWN_FAILED));
- }
- });
-
- stats.put(RequestEvent.Type.BUSINESS_FAILED, new
DefaultMetricsStatHandler() {
- @Override
- public void doNotify(MethodMetric metric) {
- publishEvent(new RequestEvent(metric,
RequestEvent.Type.BUSINESS_FAILED));
- }
- });
-
+ stats.put(RequestEvent.Type.TOTAL,
buildMetricsStatHandler(RequestEvent.Type.TOTAL));
+ stats.put(RequestEvent.Type.SUCCEED,
buildMetricsStatHandler(RequestEvent.Type.SUCCEED));
+ stats.put(RequestEvent.Type.UNKNOWN_FAILED,
buildMetricsStatHandler(RequestEvent.Type.UNKNOWN_FAILED));
+ stats.put(RequestEvent.Type.BUSINESS_FAILED,
buildMetricsStatHandler(RequestEvent.Type.BUSINESS_FAILED));
stats.put(RequestEvent.Type.PROCESSING, new
DefaultMetricsStatHandler());
+ stats.put(RequestEvent.Type.REQUEST_LIMIT,
buildMetricsStatHandler(RequestEvent.Type.REQUEST_LIMIT));
+ stats.put(RequestEvent.Type.REQUEST_TIMEOUT,
buildMetricsStatHandler(RequestEvent.Type.REQUEST_TIMEOUT));
+ stats.put(RequestEvent.Type.TOTAL_FAILED,
buildMetricsStatHandler(RequestEvent.Type.TOTAL_FAILED));
+ }
- stats.put(RequestEvent.Type.REQUEST_LIMIT, new
DefaultMetricsStatHandler() {
- @Override
- public void doNotify(MethodMetric metric) {
- publishEvent(new RequestEvent(metric,
RequestEvent.Type.REQUEST_LIMIT));
- }
- });
-
- stats.put(RequestEvent.Type.REQUEST_TIMEOUT, new
DefaultMetricsStatHandler() {
- @Override
- public void doNotify(MethodMetric metric) {
- publishEvent(new RequestEvent(metric,
RequestEvent.Type.REQUEST_TIMEOUT));
- }
- });
-
- stats.put(RequestEvent.Type.TOTAL_FAILED, new
DefaultMetricsStatHandler() {
+ private DefaultMetricsStatHandler
buildMetricsStatHandler(RequestEvent.Type type) {
+ return new DefaultMetricsStatHandler() {
@Override
- public void doNotify(MethodMetric metric) {
- publishEvent(new RequestEvent(metric,
RequestEvent.Type.TOTAL_FAILED));
+ public MetricsEvent retrieveMetricsEvent(MethodMetric metric) {
+ return new RequestEvent(metric, type);
}
- });
- }
-
- private void publishEvent(MetricsEvent event) {
- for (MetricsListener listener : listeners) {
- listener.onEvent(event);
- }
+ };
}
}
diff --git
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/filter/MetricsCollectExecutor.java
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/filter/MetricsCollectExecutor.java
index 4b3c1b9243..4e378b49e9 100644
---
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/filter/MetricsCollectExecutor.java
+++
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/filter/MetricsCollectExecutor.java
@@ -17,117 +17,71 @@
package org.apache.dubbo.metrics.filter;
-import java.util.function.Supplier;
import org.apache.dubbo.metrics.collector.DefaultMetricsCollector;
import org.apache.dubbo.rpc.Invocation;
import org.apache.dubbo.rpc.Result;
import org.apache.dubbo.rpc.RpcException;
-import org.apache.dubbo.rpc.RpcInvocation;
+
+import java.util.function.Supplier;
import static
org.apache.dubbo.common.constants.MetricsConstants.METRIC_FILTER_START_TIME;
-import static org.apache.dubbo.rpc.support.RpcUtils.isGenericCall;
public class MetricsCollectExecutor {
- private final DefaultMetricsCollector collector;
- private final Invocation invocation;
- private final String applicationName;
-
- private String interfaceName;
- private String methodName;
- private String group;
- private String version;
-
-
- public MetricsCollectExecutor(String applicationName,
DefaultMetricsCollector collector, Invocation invocation) {
- init(invocation);
- this.collector = collector;
- this.invocation = invocation;
- this.applicationName = applicationName;
- }
-
- public void beforeExecute() {
- collector.increaseTotalRequests(applicationName, interfaceName,
methodName, group, version);
- collector.increaseProcessingRequests(applicationName, interfaceName,
methodName, group, version);
+ public static void beforeExecute(String applicationName,
DefaultMetricsCollector collector, Invocation invocation) {
+ collector.increaseTotalRequests(applicationName, invocation);
+ collector.increaseProcessingRequests(applicationName, invocation);
invocation.put(METRIC_FILTER_START_TIME, System.currentTimeMillis());
}
- public void postExecute(Result result) {
+ public static void postExecute(String applicationName,
DefaultMetricsCollector collector, Invocation invocation, Result result) {
if (result.hasException()) {
- this.throwExecute(result.getException());
+ throwExecute(applicationName, collector, invocation,
result.getException());
return;
}
- collector.increaseSucceedRequests(applicationName, interfaceName,
methodName, group, version);
- endExecute();
+ collector.increaseSucceedRequests(applicationName, invocation);
+ endExecute(applicationName, collector, invocation);
}
- public void throwExecute(Throwable throwable){
+ public static void throwExecute(String applicationName,
DefaultMetricsCollector collector, Invocation invocation, Throwable throwable) {
if (throwable instanceof RpcException) {
- RpcException rpcException = (RpcException)throwable;
+ RpcException rpcException = (RpcException) throwable;
switch (rpcException.getCode()) {
case RpcException.TIMEOUT_EXCEPTION:
- collector.timeoutRequests(applicationName, interfaceName,
methodName, group, version);
+ collector.timeoutRequests(applicationName, invocation);
break;
case RpcException.LIMIT_EXCEEDED_EXCEPTION:
- collector.limitRequests(applicationName, interfaceName,
methodName, group, version);
+ collector.limitRequests(applicationName, invocation);
break;
case RpcException.BIZ_EXCEPTION:
- collector.businessFailedRequests(applicationName,
interfaceName, methodName, group, version);
+ collector.businessFailedRequests(applicationName,
invocation);
break;
default:
- collector.increaseUnknownFailedRequests(applicationName,
interfaceName, methodName, group, version);
+ collector.increaseUnknownFailedRequests(applicationName,
invocation);
}
}
- collector.totalFailedRequests(applicationName, interfaceName,
methodName, group, version);
+ collector.totalFailedRequests(applicationName, invocation);
- endExecute(()-> throwable instanceof RpcException && ((RpcException)
throwable).isBiz());
+ endExecute(applicationName, collector, invocation, () -> throwable
instanceof RpcException && ((RpcException) throwable).isBiz());
}
- private void endExecute(){
- this.endExecute(() -> true);
+ private static void endExecute(String applicationName,
DefaultMetricsCollector collector, Invocation invocation) {
+ endExecute(applicationName, collector, invocation, () -> true);
}
- private void endExecute(Supplier<Boolean> rtStat){
+ private static void endExecute(String applicationName,
DefaultMetricsCollector collector, Invocation invocation, Supplier<Boolean>
rtStat) {
if (rtStat.get()) {
Long endTime = System.currentTimeMillis();
Long beginTime = (Long) invocation.get(METRIC_FILTER_START_TIME);
Long rt = endTime - beginTime;
- collector.addRT(applicationName, interfaceName, methodName, group,
version, rt);
+ collector.addRT(applicationName, invocation, rt);
}
- collector.decreaseProcessingRequests(applicationName, interfaceName,
methodName, group, version);
+ collector.decreaseProcessingRequests(applicationName, invocation);
}
- private void init(Invocation invocation) {
- String serviceUniqueName = invocation.getTargetServiceUniqueName();
- String methodName = invocation.getMethodName();
- if (invocation instanceof RpcInvocation
- && isGenericCall(((RpcInvocation)
invocation).getParameterTypesDesc(), methodName)
- && invocation.getArguments() != null
- && invocation.getArguments().length == 3) {
- methodName = ((String) invocation.getArguments()[0]).trim();
- }
- String group = null;
- String interfaceAndVersion;
- String[] arr = serviceUniqueName.split("/");
- if (arr.length == 2) {
- group = arr[0];
- interfaceAndVersion = arr[1];
- } else {
- interfaceAndVersion = arr[0];
- }
-
- String[] ivArr = interfaceAndVersion.split(":");
- String interfaceName = ivArr[0];
- String version = ivArr.length == 2 ? ivArr[1] : null;
-
- this.interfaceName = interfaceName;
- this.methodName = methodName;
- this.group = group;
- this.version = version;
- }
}
diff --git
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/filter/MetricsFilter.java
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/filter/MetricsFilter.java
index 25f506d3b7..852e318be0 100644
---
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/filter/MetricsFilter.java
+++
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/filter/MetricsFilter.java
@@ -27,8 +27,6 @@ import org.apache.dubbo.rpc.RpcException;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.ScopeModelAware;
-import java.util.function.Consumer;
-
import static org.apache.dubbo.common.constants.CommonConstants.PROVIDER;
@Activate(group = PROVIDER, order = -1)
@@ -50,28 +48,25 @@ public class MetricsFilter implements Filter,
BaseFilter.Listener, ScopeModelAwa
if (collector == null || !collector.isCollectEnabled()) {
return invoker.invoke(invocation);
}
- collect(invocation, MetricsCollectExecutor::beforeExecute);
+
MetricsCollectExecutor.beforeExecute(applicationModel.getApplicationName(),
collector, invocation);
return invoker.invoke(invocation);
}
@Override
public void onResponse(Result result, Invoker<?> invoker, Invocation
invocation) {
- collect(invocation, collector->collector.postExecute(result));
+ if (collector == null || !collector.isCollectEnabled()) {
+ return;
+ }
+
MetricsCollectExecutor.postExecute(applicationModel.getApplicationName(),
collector, invocation, result);
}
@Override
public void onError(Throwable t, Invoker<?> invoker, Invocation
invocation) {
- collect(invocation, collector-> collector.throwExecute(t));
- }
-
- private void collect(Invocation invocation,
Consumer<MetricsCollectExecutor> execute) {
if (collector == null || !collector.isCollectEnabled()) {
return;
}
-
- MetricsCollectExecutor collectorExecutor = new
MetricsCollectExecutor(applicationModel.getApplicationName(),
- collector, invocation);
- execute.accept(collectorExecutor);
+
MetricsCollectExecutor.throwExecute(applicationModel.getApplicationName(),
collector, invocation, t);
}
+
}
diff --git
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/AggregateMetricsCollectorTest.java
b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/AggregateMetricsCollectorTest.java
index 6b1670a823..9c863db1f7 100644
---
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/AggregateMetricsCollectorTest.java
+++
b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/AggregateMetricsCollectorTest.java
@@ -17,16 +17,13 @@
package org.apache.dubbo.metrics.collector;
-import org.apache.dubbo.metrics.model.MetricsKey;
-import org.apache.dubbo.metrics.model.sample.GaugeMetricSample;
-import org.apache.dubbo.metrics.model.sample.MetricSample;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.config.MetricsConfig;
import org.apache.dubbo.config.nested.AggregationConfig;
+import org.apache.dubbo.metrics.model.MetricsKey;
+import org.apache.dubbo.metrics.model.sample.GaugeMetricSample;
+import org.apache.dubbo.metrics.model.sample.MetricSample;
+import org.apache.dubbo.rpc.RpcInvocation;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.FrameworkModel;
import org.junit.jupiter.api.AfterEach;
@@ -34,6 +31,12 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
import static org.apache.dubbo.common.constants.MetricsConstants.TAG_GROUP_KEY;
import static
org.apache.dubbo.common.constants.MetricsConstants.TAG_INTERFACE_KEY;
import static
org.apache.dubbo.common.constants.MetricsConstants.TAG_METHOD_KEY;
@@ -48,6 +51,7 @@ class AggregateMetricsCollectorTest {
private String methodName;
private String group;
private String version;
+ private RpcInvocation invocation;
@BeforeEach
public void setup() {
@@ -72,6 +76,11 @@ class AggregateMetricsCollectorTest {
methodName = "mockMethod";
group = "mockGroup";
version = "1.0.0";
+ invocation = new RpcInvocation(methodName, interfaceName,
"serviceKey", null, null);
+ invocation.setTargetServiceUniqueName(group + "/" + interfaceName +
":" + version);
+ invocation.setAttachment(GROUP_KEY, group);
+ invocation.setAttachment(VERSION_KEY, version);
+
}
@AfterEach
@@ -81,12 +90,12 @@ class AggregateMetricsCollectorTest {
@Test
void testRequestsMetrics() {
- AggregateMetricsCollector collector = new
AggregateMetricsCollector(applicationModel);
String applicationName = applicationModel.getApplicationName();
- defaultCollector.increaseTotalRequests(applicationName, interfaceName,
methodName, group, version);
- defaultCollector.increaseSucceedRequests(applicationName,
interfaceName, methodName, group, version);
- defaultCollector.increaseUnknownFailedRequests(applicationName,
interfaceName, methodName, group, version);
- defaultCollector.businessFailedRequests(applicationName,
interfaceName,methodName,group,version);
+ AggregateMetricsCollector collector = new
AggregateMetricsCollector(applicationModel);
+ defaultCollector.increaseTotalRequests(applicationName,invocation);
+ defaultCollector.increaseSucceedRequests(applicationName,invocation);
+
defaultCollector.increaseUnknownFailedRequests(applicationName,invocation);
+ defaultCollector.businessFailedRequests(applicationName,invocation);
List<MetricSample> samples = collector.collect();
for (MetricSample sample : samples) {
@@ -115,7 +124,7 @@ class AggregateMetricsCollectorTest {
@Test
void testRTMetrics() {
AggregateMetricsCollector collector = new
AggregateMetricsCollector(applicationModel);
- defaultCollector.addRT(applicationModel.getApplicationName(),
interfaceName, methodName, group, version, 10L);
+
defaultCollector.addRT(applicationModel.getApplicationName(),invocation, 10L);
List<MetricSample> samples = collector.collect();
for (MetricSample sample : samples) {
diff --git
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/metrics/collector/DefaultMetricsCollectorTest.java
b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/metrics/collector/DefaultMetricsCollectorTest.java
index 51aa1fa85f..bc9346e33d 100644
---
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/metrics/collector/DefaultMetricsCollectorTest.java
+++
b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/metrics/collector/DefaultMetricsCollectorTest.java
@@ -17,10 +17,6 @@
package org.apache.dubbo.metrics.metrics.collector;
-import java.util.List;
-import java.util.Map;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
import org.apache.dubbo.config.ApplicationConfig;
import org.apache.dubbo.metrics.collector.DefaultMetricsCollector;
import org.apache.dubbo.metrics.event.MetricsEvent;
@@ -30,6 +26,7 @@ import org.apache.dubbo.metrics.listener.MetricsListener;
import org.apache.dubbo.metrics.model.MetricsKey;
import org.apache.dubbo.metrics.model.sample.GaugeMetricSample;
import org.apache.dubbo.metrics.model.sample.MetricSample;
+import org.apache.dubbo.rpc.RpcInvocation;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.FrameworkModel;
import org.junit.jupiter.api.AfterEach;
@@ -37,6 +34,13 @@ import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
import static org.apache.dubbo.common.constants.MetricsConstants.TAG_GROUP_KEY;
import static
org.apache.dubbo.common.constants.MetricsConstants.TAG_INTERFACE_KEY;
import static
org.apache.dubbo.common.constants.MetricsConstants.TAG_METHOD_KEY;
@@ -50,6 +54,7 @@ class DefaultMetricsCollectorTest {
private String methodName;
private String group;
private String version;
+ private RpcInvocation invocation;
@BeforeEach
public void setup() {
@@ -64,6 +69,11 @@ class DefaultMetricsCollectorTest {
methodName = "mockMethod";
group = "mockGroup";
version = "1.0.0";
+
+ invocation = new RpcInvocation(methodName, interfaceName,
"serviceKey", null, null);
+ invocation.setTargetServiceUniqueName(group + "/" + interfaceName +
":" + version);
+ invocation.setAttachment(GROUP_KEY, group);
+ invocation.setAttachment(VERSION_KEY, version);
}
@AfterEach
@@ -76,10 +86,10 @@ class DefaultMetricsCollectorTest {
DefaultMetricsCollector collector = new DefaultMetricsCollector();
collector.setCollectEnabled(true);
String applicationName = applicationModel.getApplicationName();
- collector.increaseTotalRequests(applicationName, interfaceName,
methodName, group, version);
- collector.increaseProcessingRequests(applicationName, interfaceName,
methodName, group, version);
- collector.increaseSucceedRequests(applicationName, interfaceName,
methodName, group, version);
- collector.increaseUnknownFailedRequests(applicationName,
interfaceName, methodName, group, version);
+ collector.increaseTotalRequests(applicationName, invocation);
+ collector.increaseProcessingRequests(applicationName, invocation);
+ collector.increaseSucceedRequests(applicationName, invocation);
+ collector.increaseUnknownFailedRequests(applicationName, invocation);
List<MetricSample> samples = collector.collect();
for (MetricSample sample : samples) {
@@ -95,7 +105,7 @@ class DefaultMetricsCollectorTest {
Assertions.assertEquals(supplier.get().longValue(), 1);
}
- collector.decreaseProcessingRequests(applicationName, interfaceName,
methodName, group, version);
+ collector.decreaseProcessingRequests(applicationName, invocation);
samples = collector.collect();
Map<String, Long> sampleMap =
samples.stream().collect(Collectors.toMap(MetricSample::getName, k -> {
Number number = ((GaugeMetricSample) k).getSupplier().get();
@@ -110,8 +120,8 @@ class DefaultMetricsCollectorTest {
DefaultMetricsCollector collector = new DefaultMetricsCollector();
collector.setCollectEnabled(true);
String applicationName = applicationModel.getApplicationName();
- collector.addRT(applicationName, interfaceName, methodName, group,
version, 10L);
- collector.addRT(applicationName, interfaceName, methodName, group,
version, 0L);
+ collector.addRT(applicationName, invocation, 10L);
+ collector.addRT(applicationName, invocation, 0L);
List<MetricSample> samples = collector.collect();
for (MetricSample sample : samples) {
@@ -144,12 +154,12 @@ class DefaultMetricsCollectorTest {
collector.addListener(mockListener);
String applicationName = applicationModel.getApplicationName();
- collector.increaseTotalRequests(applicationName, interfaceName,
methodName, group, version);
+ collector.increaseTotalRequests(applicationName, invocation);
Assertions.assertNotNull(mockListener.getCurEvent());
Assertions.assertTrue(mockListener.getCurEvent() instanceof
RequestEvent);
Assertions.assertEquals(((RequestEvent)
mockListener.getCurEvent()).getType(), RequestEvent.Type.TOTAL);
- collector.addRT(applicationName, interfaceName, methodName, group,
version, 5L);
+ collector.addRT(applicationName, invocation, 5L);
Assertions.assertTrue(mockListener.getCurEvent() instanceof RTEvent);
Assertions.assertEquals(((RTEvent)
mockListener.getCurEvent()).getRt(), 5L);
}
diff --git
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/metrics/model/MethodMetricTest.java
b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/metrics/model/MethodMetricTest.java
index cbc563b26b..c554c09d9b 100644
---
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/metrics/model/MethodMetricTest.java
+++
b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/metrics/model/MethodMetricTest.java
@@ -18,12 +18,15 @@
package org.apache.dubbo.metrics.metrics.model;
import org.apache.dubbo.metrics.model.MethodMetric;
+import org.apache.dubbo.rpc.RpcInvocation;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import java.util.Map;
+import static org.apache.dubbo.common.constants.CommonConstants.GROUP_KEY;
+import static org.apache.dubbo.common.constants.CommonConstants.VERSION_KEY;
import static
org.apache.dubbo.common.constants.MetricsConstants.TAG_APPLICATION_NAME;
import static org.apache.dubbo.common.constants.MetricsConstants.TAG_GROUP_KEY;
import static org.apache.dubbo.common.constants.MetricsConstants.TAG_HOSTNAME;
@@ -41,6 +44,7 @@ class MethodMetricTest {
private static String methodName;
private static String group;
private static String version;
+ private static RpcInvocation invocation;
@BeforeAll
public static void setup() {
@@ -48,11 +52,15 @@ class MethodMetricTest {
methodName = "mockMethod";
group = "mockGroup";
version = "1.0.0";
+ invocation = new RpcInvocation(methodName, interfaceName,
"serviceKey", null, null);
+ invocation.setTargetServiceUniqueName(group + "/" + interfaceName +
":" + version);
+ invocation.setAttachment(GROUP_KEY, group);
+ invocation.setAttachment(VERSION_KEY, version);
}
@Test
void test() {
- MethodMetric metric = new MethodMetric(applicationName, interfaceName,
methodName, group, version);
+ MethodMetric metric = new MethodMetric(applicationName, invocation);
Assertions.assertEquals(metric.getInterfaceName(), interfaceName);
Assertions.assertEquals(metric.getMethodName(), methodName);
Assertions.assertEquals(metric.getGroup(), group);