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

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


The following commit(s) were added to refs/heads/3.1 by this push:
     new b860358b94 Fixed metrics collection getting wrong method name when 
generalize called (#11012)
b860358b94 is described below

commit b860358b944846883c22349d522912603eb58765
Author: twz007 <[email protected]>
AuthorDate: Mon Nov 28 09:27:51 2022 +0800

    Fixed metrics collection getting wrong method name when generalize called 
(#11012)
    
    * Fixes #11001, fixed metrics collection getting wrong method name when 
generalize called
    
    * avoid array out of bounds
---
 .../metrics/filter/MetricsCollectExecutor.java     |  8 +++++++
 .../dubbo/metrics/filter/MetricsFilterTest.java    | 26 ++++++++++++++++++++++
 2 files changed, 34 insertions(+)

diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/filter/MetricsCollectExecutor.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/filter/MetricsCollectExecutor.java
index 0ae3fdf73f..d510d488a6 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/filter/MetricsCollectExecutor.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/filter/MetricsCollectExecutor.java
@@ -18,6 +18,7 @@
 package org.apache.dubbo.metrics.filter;
 
 import static 
org.apache.dubbo.common.constants.MetricsConstants.METRIC_FILTER_START_TIME;
+import static org.apache.dubbo.rpc.support.RpcUtils.isGenericCall;
 
 import java.util.function.Supplier;
 
@@ -25,6 +26,7 @@ import 
org.apache.dubbo.common.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;
 
 public class MetricsCollectExecutor {
 
@@ -88,6 +90,12 @@ public class MetricsCollectExecutor {
     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("/");
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/filter/MetricsFilterTest.java
 
b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/filter/MetricsFilterTest.java
index 34a828061a..f572693187 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/filter/MetricsFilterTest.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/filter/MetricsFilterTest.java
@@ -38,6 +38,7 @@ import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import static org.apache.dubbo.common.constants.CommonConstants.*;
 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;
@@ -234,6 +235,31 @@ class MetricsFilterTest {
         Assertions.assertNull(tags.get(TAG_VERSION_KEY));
     }
 
+    @Test
+    void testGenericCall() {
+        collector.setCollectEnabled(true);
+        given(invoker.invoke(invocation)).willReturn(new 
AppResponse("success"));
+        invocation.setTargetServiceUniqueName(INTERFACE_NAME);
+        invocation.setMethodName(METHOD_NAME);
+        invocation.setParameterTypes(new Class[]{String.class});
+
+        Result result = filter.invoke(invoker, invocation);
+
+        invocation.setMethodName($INVOKE);
+        invocation.setParameterTypesDesc(GENERIC_PARAMETER_DESC);
+        invocation.setArguments(new Object[]{METHOD_NAME, new 
String[]{"java.lang.String"}, new Object[]{"mock"}});
+
+        filter.onResponse(result, invoker, invocation);
+
+        Map<String, MetricSample> metricsMap = getMetricsMap();
+
+        MetricSample sample = metricsMap.get("requests.processing");
+        Map<String, String> tags = sample.getTags();
+
+        Assertions.assertEquals(tags.get(TAG_INTERFACE_KEY), INTERFACE_NAME);
+        Assertions.assertEquals(tags.get(TAG_METHOD_KEY), METHOD_NAME);
+    }
+
     private void initParam() {
         invocation.setTargetServiceUniqueName(GROUP + "/" + INTERFACE_NAME + 
":" + VERSION);
         invocation.setMethodName(METHOD_NAME);

Reply via email to