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

songxiaosheng 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 d2391d2abd Metrics default val set 0 (#12379)
d2391d2abd is described below

commit d2391d2abde386dbf6387d02667ed8f2cb23939c
Author: wxbty <38374721+wx...@users.noreply.github.com>
AuthorDate: Wed May 24 13:48:43 2023 +0800

    Metrics default val set 0 (#12379)
    
    * add comment
    
    * use dubbo nullable
    
    * fill default 0
    
    * add licence
    
    * fix ci
    
    * fix ci
    
    * fix ci
    
    * add comment
    
    * fix ci
    
    * fix ci
    
    * modify warn
    
    ---------
    
    Co-authored-by: x-shadow-man <1494445...@qq.com>
    Co-authored-by: songxiaosheng <songxiaosh...@elastic.link>
---
 .../dubbo/metrics/data/MethodStatComposite.java    | 16 ++++--
 .../dubbo/metrics/data/ServiceStatComposite.java   |  3 ++
 .../apache/dubbo/metrics/model/MetricsSupport.java | 27 ++++++++--
 .../dubbo/metrics/model/key/CategoryOverall.java   |  3 +-
 .../apache/dubbo/metrics/model/key/MetricsCat.java | 13 ++++-
 .../apache/dubbo/metrics/model/key/MetricsKey.java |  6 ---
 .../dubbo/metrics/model/key/MetricsKeyWrapper.java | 15 ++++++
 .../apache/dubbo/metrics/MetricsSupportTest.java   | 59 ++++++++++++++++++++++
 .../org/apache/dubbo/metrics/DefaultConstants.java |  6 ++-
 .../dubbo/metrics/event/DefaultSubDispatcher.java  | 12 +----
 .../metrics/collector/DefaultCollectorTest.java    |  7 +--
 .../dubbo/metrics/filter/MetricsFilterTest.java    | 22 ++++----
 .../metadata/event/MetadataSubDispatcher.java      |  7 +++
 .../metadata/MetadataMetricsCollectorTest.java     |  4 +-
 .../registry/event/RegistrySubDispatcher.java      |  7 +++
 .../collector/RegistryMetricsCollectorTest.java    | 22 ++++----
 16 files changed, 177 insertions(+), 52 deletions(-)

diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/MethodStatComposite.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/MethodStatComposite.java
index 7b029e8f95..a4c6bba709 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/MethodStatComposite.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/MethodStatComposite.java
@@ -17,9 +17,13 @@
 
 package org.apache.dubbo.metrics.data;
 
+import org.apache.dubbo.common.logger.Logger;
+import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.utils.CollectionUtils;
+import org.apache.dubbo.metrics.exception.MetricsNeverHappenException;
 import org.apache.dubbo.metrics.model.MethodMetric;
 import org.apache.dubbo.metrics.model.MetricsCategory;
+import org.apache.dubbo.metrics.model.MetricsSupport;
 import org.apache.dubbo.metrics.model.key.MetricsKeyWrapper;
 import org.apache.dubbo.metrics.model.sample.CounterMetricSample;
 import org.apache.dubbo.metrics.model.sample.GaugeMetricSample;
@@ -41,9 +45,12 @@ import java.util.concurrent.atomic.AtomicLong;
  */
 public class MethodStatComposite extends AbstractMetricsExport {
 
+    private static final Logger logger = 
LoggerFactory.getLogger(MethodStatComposite.class);
+
     public MethodStatComposite(ApplicationModel applicationModel) {
         super(applicationModel);
     }
+
     private final Map<MetricsKeyWrapper, Map<MethodMetric, AtomicLong>> 
methodNumStats = new ConcurrentHashMap<>();
 
     public void initWrapper(List<MetricsKeyWrapper> metricsKeyWrappers) {
@@ -58,6 +65,7 @@ public class MethodStatComposite extends 
AbstractMetricsExport {
             return;
         }
         methodNumStats.get(wrapper).computeIfAbsent(new 
MethodMetric(getApplicationModel(), invocation), k -> new 
AtomicLong(0L)).getAndAdd(size);
+        MetricsSupport.fillZero(methodNumStats);
     }
 
     public List<MetricSample> export(MetricsCategory category) {
@@ -65,11 +73,13 @@ public class MethodStatComposite extends 
AbstractMetricsExport {
         for (MetricsKeyWrapper wrapper : methodNumStats.keySet()) {
             Map<MethodMetric, AtomicLong> stringAtomicLongMap = 
methodNumStats.get(wrapper);
             for (MethodMetric methodMetric : stringAtomicLongMap.keySet()) {
-                if (methodMetric.getSampleType() == MetricSample.Type.GAUGE) {
+                if (wrapper.getSampleType() == MetricSample.Type.COUNTER) {
                     list.add(new CounterMetricSample<>(wrapper,
-                            methodMetric.getTags(), category, 
stringAtomicLongMap.get(methodMetric)));
-                } else {
+                        methodMetric.getTags(), category, 
stringAtomicLongMap.get(methodMetric)));
+                } else if (wrapper.getSampleType() == MetricSample.Type.GAUGE) 
{
                     list.add(new GaugeMetricSample<>(wrapper, 
methodMetric.getTags(), category, stringAtomicLongMap, value -> 
value.get(methodMetric).get()));
+                } else {
+                    throw new MetricsNeverHappenException("Unsupported 
metricSample type: " + wrapper.getSampleType());
                 }
 
             }
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/ServiceStatComposite.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/ServiceStatComposite.java
index ef63566636..797270300c 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/ServiceStatComposite.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/data/ServiceStatComposite.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.metrics.data;
 
 import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.metrics.model.MetricsCategory;
+import org.apache.dubbo.metrics.model.MetricsSupport;
 import org.apache.dubbo.metrics.model.ServiceKeyMetric;
 import org.apache.dubbo.metrics.model.key.MetricsKeyWrapper;
 import org.apache.dubbo.metrics.model.sample.GaugeMetricSample;
@@ -57,6 +58,7 @@ public class ServiceStatComposite extends 
AbstractMetricsExport {
             return;
         }
         serviceWrapperNumStats.get(wrapper).computeIfAbsent(new 
ServiceKeyMetric(getApplicationModel(), serviceKey), k -> new 
AtomicLong(0L)).getAndAdd(size);
+        MetricsSupport.fillZero(serviceWrapperNumStats);
     }
 
     public void setServiceKey(MetricsKeyWrapper wrapper, String serviceKey, 
int num) {
@@ -64,6 +66,7 @@ public class ServiceStatComposite extends 
AbstractMetricsExport {
             return;
         }
         serviceWrapperNumStats.get(wrapper).computeIfAbsent(new 
ServiceKeyMetric(getApplicationModel(), serviceKey), k -> new 
AtomicLong(0L)).set(num);
+        MetricsSupport.fillZero(serviceWrapperNumStats);
     }
 
     public List<MetricSample> export(MetricsCategory category) {
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsSupport.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsSupport.java
index dde1c958b4..a8f26efd13 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsSupport.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsSupport.java
@@ -18,6 +18,7 @@
 package org.apache.dubbo.metrics.model;
 
 import org.apache.dubbo.common.Version;
+import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.metrics.collector.MethodMetricsCollector;
 import org.apache.dubbo.metrics.collector.ServiceMetricsCollector;
 import org.apache.dubbo.metrics.event.MetricsEvent;
@@ -35,6 +36,9 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.stream.Collectors;
 
 import static 
org.apache.dubbo.common.constants.CommonConstants.GROUP_CHAR_SEPARATOR;
 import static org.apache.dubbo.common.constants.CommonConstants.PATH_SEPARATOR;
@@ -158,9 +162,9 @@ public class MetricsSupport {
     public static String getMethodName(Invocation invocation) {
         String methodName = invocation.getMethodName();
         if (invocation instanceof RpcInvocation
-                && isGenericCall(((RpcInvocation) 
invocation).getParameterTypesDesc(), methodName)
-                && invocation.getArguments() != null
-                && invocation.getArguments().length == 3) {
+            && isGenericCall(((RpcInvocation) 
invocation).getParameterTypesDesc(), methodName)
+            && invocation.getArguments() != null
+            && invocation.getArguments().length == 3) {
             methodName = ((String) invocation.getArguments()[0]).trim();
         }
         return methodName;
@@ -224,4 +228,21 @@ public class MetricsSupport {
         collector.increment(event.getAttachmentValue(INVOCATION), new 
MetricsKeyWrapper(metricsKey, placeType), SELF_INCREMENT_SIZE);
         collector.addRt(event.getAttachmentValue(INVOCATION), 
placeType.getType(), event.getTimePair().calc());
     }
+
+    /**
+     *  Generate a complete indicator item for an interface/method
+     */
+    public static <T> void fillZero(Map<MetricsKeyWrapper, Map<T, AtomicLong>> 
data) {
+        if (CollectionUtils.isEmptyMap(data)) {
+            return;
+        }
+        Set<T> allKeyMetrics = data.values().stream().flatMap(map -> 
map.keySet().stream()).collect(Collectors.toSet());
+        data.forEach((keyWrapper, mapVal) ->
+        {
+            for (T key : allKeyMetrics) {
+                mapVal.computeIfAbsent(key, k -> new AtomicLong(0));
+            }
+        });
+
+    }
 }
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/CategoryOverall.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/CategoryOverall.java
index c13973d17a..6afec48106 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/CategoryOverall.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/CategoryOverall.java
@@ -17,7 +17,8 @@
 
 package org.apache.dubbo.metrics.model.key;
 
-import io.micrometer.common.lang.Nullable;
+
+import org.apache.dubbo.common.lang.Nullable;
 
 /**
  *  The overall event set, including the event processing functions in three 
stages
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsCat.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsCat.java
index 88b19cd2f8..cf1c813419 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsCat.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsCat.java
@@ -23,18 +23,27 @@ import 
org.apache.dubbo.metrics.listener.AbstractMetricsKeyListener;
 import java.util.function.BiFunction;
 import java.util.function.Function;
 
+/**
+ * The behavior wrapper class of MetricsKey,
+ * which saves the complete content of the key {@link MetricsPlaceValue},
+ * the corresponding collector {@link CombMetricsCollector},
+ * and the event listener (generate function) at the key level {@link 
AbstractMetricsKeyListener}
+ */
 public class MetricsCat {
 
     private MetricsPlaceValue placeType;
     private final Function<CombMetricsCollector, AbstractMetricsKeyListener> 
eventFunc;
 
+    /**
+     * @param metricsKey The key corresponding to the listening event, not 
necessarily the export key(export key may be dynamic)
+     * @param biFunc Binary function, corresponding to MetricsKey with less 
content, corresponding to post event
+     */
     public MetricsCat(MetricsKey metricsKey, BiFunction<MetricsKey, 
CombMetricsCollector, AbstractMetricsKeyListener> biFunc) {
         this.eventFunc = collector -> biFunc.apply(metricsKey, collector);
     }
 
     /**
-     * @param metricsKey The key that the current category listens to,not 
necessarily the export key(export key may be dynamic)
-     * @param tpFunc     Build the func that outputs the MetricsListener by 
listen metricsKey
+     * @param tpFunc   Ternary function, corresponding to finish and error 
events, because an additional record rt is required, and the type type of 
metricsKey is required
      */
     public MetricsCat(MetricsKey metricsKey, TpFunction<MetricsKey, 
MetricsPlaceValue, CombMetricsCollector, AbstractMetricsKeyListener> tpFunc) {
         this.eventFunc = collector -> tpFunc.apply(metricsKey, placeType, 
collector);
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsKey.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsKey.java
index 9470f6b31b..09cb988118 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsKey.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsKey.java
@@ -134,12 +134,6 @@ public enum MetricsKey {
         return String.format(name, type);
     }
 
-
-    public final MetricsKey formatName(String type) {
-        this.name = String.format(name, type);
-        return this;
-    }
-
     public final String getDescription() {
         return this.description;
     }
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsKeyWrapper.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsKeyWrapper.java
index 95d7a31d69..21bb7648e9 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsKeyWrapper.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/key/MetricsKeyWrapper.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.metrics.model.key;
 
 import io.micrometer.common.lang.Nullable;
 import org.apache.dubbo.metrics.model.MetricsSupport;
+import org.apache.dubbo.metrics.model.sample.MetricSample;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import java.util.Map;
@@ -39,6 +40,11 @@ public class MetricsKeyWrapper {
      */
     private final MetricsPlaceValue placeType;
 
+    /**
+     * Exported sample type
+     */
+    private MetricSample.Type sampleType = MetricSample.Type.COUNTER;
+
     /**
      * When the MetricsPlaceType is null, it is equivalent to a single 
MetricsKey.
      * Use the decorator mode to share a container with MetricsKey
@@ -48,6 +54,15 @@ public class MetricsKeyWrapper {
         this.placeType = placeType;
     }
 
+    public MetricsKeyWrapper setSampleType(MetricSample.Type sampleType) {
+        this.sampleType = sampleType;
+        return this;
+    }
+
+    public MetricSample.Type getSampleType() {
+        return sampleType;
+    }
+
     public MetricsPlaceValue getPlaceType() {
         return placeType;
     }
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/MetricsSupportTest.java
 
b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/MetricsSupportTest.java
new file mode 100644
index 0000000000..7bc12d6a49
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/MetricsSupportTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.metrics.model.MetricsSupport;
+import org.apache.dubbo.metrics.model.ServiceKeyMetric;
+import org.apache.dubbo.metrics.model.key.MetricsKeyWrapper;
+import org.apache.dubbo.metrics.model.key.MetricsLevel;
+import org.apache.dubbo.metrics.model.key.MetricsPlaceValue;
+import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
+
+import static org.apache.dubbo.metrics.model.key.MetricsKey.METRIC_REQUESTS;
+
+public class MetricsSupportTest {
+
+    @Test
+    void testFillZero() {
+        ApplicationModel applicationModel = 
FrameworkModel.defaultModel().newApplication();
+        ApplicationConfig config = new ApplicationConfig();
+        config.setName("MockMetrics");
+        applicationModel.getApplicationConfigManager().setApplication(config);
+
+        Map<MetricsKeyWrapper, Map<ServiceKeyMetric, AtomicLong>> data = new 
HashMap<>();
+        MetricsKeyWrapper key1 = new MetricsKeyWrapper(METRIC_REQUESTS, 
MetricsPlaceValue.of(CommonConstants.PROVIDER, MetricsLevel.METHOD));
+        MetricsKeyWrapper key2 = new MetricsKeyWrapper(METRIC_REQUESTS, 
MetricsPlaceValue.of(CommonConstants.CONSUMER, MetricsLevel.METHOD));
+        ServiceKeyMetric sm1 = new ServiceKeyMetric(applicationModel, "a.b.c");
+        ServiceKeyMetric sm2 = new ServiceKeyMetric(applicationModel, "a.b.d");
+        data.computeIfAbsent(key1, k -> new HashMap<>()).put(sm1, new 
AtomicLong(1));
+        data.computeIfAbsent(key1, k -> new HashMap<>()).put(sm2, new 
AtomicLong(1));
+        data.put(key2, new HashMap<>());
+        Assertions.assertEquals(2, data.values().stream().mapToLong(map -> 
map.values().size()).sum());
+        MetricsSupport.fillZero(data);
+        Assertions.assertEquals(4, data.values().stream().mapToLong(map -> 
map.values().size()).sum());
+    }
+}
diff --git 
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/DefaultConstants.java
 
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/DefaultConstants.java
index c4e6f9485c..4bb9245e58 100644
--- 
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/DefaultConstants.java
+++ 
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/DefaultConstants.java
@@ -21,6 +21,7 @@ import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.metrics.model.key.MetricsKeyWrapper;
 import org.apache.dubbo.metrics.model.key.MetricsLevel;
 import org.apache.dubbo.metrics.model.key.MetricsPlaceValue;
+import org.apache.dubbo.metrics.model.sample.MetricSample;
 
 import java.util.Arrays;
 import java.util.List;
@@ -46,8 +47,9 @@ public interface DefaultConstants {
     List<MetricsKeyWrapper> METHOD_LEVEL_KEYS = Arrays.asList(
         new MetricsKeyWrapper(METRIC_REQUESTS, 
MetricsPlaceValue.of(CommonConstants.PROVIDER, MetricsLevel.METHOD)),
         new MetricsKeyWrapper(METRIC_REQUESTS, 
MetricsPlaceValue.of(CommonConstants.CONSUMER, MetricsLevel.METHOD)),
-        new MetricsKeyWrapper(METRIC_REQUESTS_PROCESSING, 
MetricsPlaceValue.of(CommonConstants.PROVIDER, MetricsLevel.METHOD)),
-        new MetricsKeyWrapper(METRIC_REQUESTS_PROCESSING, 
MetricsPlaceValue.of(CommonConstants.CONSUMER, MetricsLevel.METHOD)),
+        // METRIC_REQUESTS_PROCESSING use GAUGE
+        new MetricsKeyWrapper(METRIC_REQUESTS_PROCESSING, 
MetricsPlaceValue.of(CommonConstants.PROVIDER, 
MetricsLevel.METHOD)).setSampleType(MetricSample.Type.GAUGE),
+        new MetricsKeyWrapper(METRIC_REQUESTS_PROCESSING, 
MetricsPlaceValue.of(CommonConstants.CONSUMER, 
MetricsLevel.METHOD)).setSampleType(MetricSample.Type.GAUGE),
         new MetricsKeyWrapper(METRIC_REQUESTS_SUCCEED, 
MetricsPlaceValue.of(CommonConstants.PROVIDER, MetricsLevel.METHOD)),
         new MetricsKeyWrapper(METRIC_REQUESTS_SUCCEED, 
MetricsPlaceValue.of(CommonConstants.CONSUMER, MetricsLevel.METHOD)),
         new MetricsKeyWrapper(METRIC_REQUEST_BUSINESS_FAILED, 
MetricsPlaceValue.of(CommonConstants.PROVIDER, MetricsLevel.METHOD)),
diff --git 
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/DefaultSubDispatcher.java
 
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/DefaultSubDispatcher.java
index 99c78e6c1d..5bcbc20469 100644
--- 
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/DefaultSubDispatcher.java
+++ 
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/event/DefaultSubDispatcher.java
@@ -29,12 +29,8 @@ import org.apache.dubbo.metrics.model.key.MetricsCat;
 import org.apache.dubbo.metrics.model.key.MetricsKey;
 import org.apache.dubbo.metrics.model.key.MetricsLevel;
 import org.apache.dubbo.metrics.model.key.MetricsPlaceValue;
-import org.apache.dubbo.metrics.model.sample.MetricSample;
-import org.apache.dubbo.rpc.Invocation;
 
 import static org.apache.dubbo.metrics.DefaultConstants.METRIC_THROWABLE;
-import static org.apache.dubbo.metrics.MetricsConstants.INVOCATION;
-import static 
org.apache.dubbo.metrics.MetricsConstants.INVOCATION_METRICS_COUNTER;
 import static 
org.apache.dubbo.metrics.model.key.MetricsKey.METRIC_REQUESTS_SERVICE_UNAVAILABLE_FAILED;
 
 @SuppressWarnings({"unchecked", "rawtypes"})
@@ -71,17 +67,13 @@ public final class DefaultSubDispatcher extends 
SimpleMetricsEventMulticaster {
                         {
                             MetricsPlaceValue dynamicPlaceType = 
MetricsPlaceValue.of(event.getAttachmentValue(MetricsConstants.INVOCATION_SIDE),
 MetricsLevel.METHOD);
                             MetricsSupport.increment(key, dynamicPlaceType, 
(MethodMetricsCollector) collector, event);
-
-                            // METRIC_REQUESTS_PROCESSING use GAUGE
-                            Invocation invocation = 
event.getAttachmentValue(INVOCATION);
-                            invocation.put(INVOCATION_METRICS_COUNTER, 
MetricSample.Type.GAUGE);
                             
MetricsSupport.increment(MetricsKey.METRIC_REQUESTS_PROCESSING, 
dynamicPlaceType, (MethodMetricsCollector) collector, event);
                         })),
                 new MetricsCat(MetricsKey.METRIC_REQUESTS_SUCCEED, (key, 
placeType, collector) -> AbstractMetricsKeyListener.onFinish(key,
                         event ->
                         {
                             MetricsPlaceValue dynamicPlaceType = 
MetricsPlaceValue.of(event.getAttachmentValue(MetricsConstants.INVOCATION_SIDE),
 MetricsLevel.METHOD);
-                            
MetricsSupport.dec(MetricsKey.METRIC_REQUESTS_PROCESSING, dynamicPlaceType, 
(MethodMetricsCollector) collector, event);
+                            
MetricsSupport.dec(MetricsKey.METRIC_REQUESTS_PROCESSING, dynamicPlaceType, 
collector, event);
 
                             Object throwableObj = 
event.getAttachmentValue(METRIC_THROWABLE);
                             MetricsKey targetKey;
@@ -99,7 +91,7 @@ public final class DefaultSubDispatcher extends 
SimpleMetricsEventMulticaster {
                             // Dynamic metricsKey && dynamicPlaceType
                             MetricsPlaceValue dynamicPlaceType = 
MetricsPlaceValue.of(event.getAttachmentValue(MetricsConstants.INVOCATION_SIDE),
 MetricsLevel.METHOD);
                             
MetricsSupport.increment(MetricsKey.METRIC_REQUESTS_TOTAL_FAILED, 
dynamicPlaceType, (MethodMetricsCollector) collector, event);
-                            
MetricsSupport.dec(MetricsKey.METRIC_REQUESTS_PROCESSING, dynamicPlaceType, 
(MethodMetricsCollector) collector, event);
+                            
MetricsSupport.dec(MetricsKey.METRIC_REQUESTS_PROCESSING, dynamicPlaceType, 
collector, event);
                             MetricsSupport.incrAndAddRt(targetKey, 
dynamicPlaceType, (MethodMetricsCollector) collector, event);
                         }
                 )));
diff --git 
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/DefaultCollectorTest.java
 
b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/DefaultCollectorTest.java
index 9beb258115..ab17adeae3 100644
--- 
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/DefaultCollectorTest.java
+++ 
b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/collector/DefaultCollectorTest.java
@@ -20,6 +20,7 @@ package org.apache.dubbo.metrics.collector;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.metrics.DefaultConstants;
 import org.apache.dubbo.metrics.TestMetricsInvoker;
 import org.apache.dubbo.metrics.event.MetricsDispatcher;
 import org.apache.dubbo.metrics.event.RequestBeforeEvent;
@@ -148,8 +149,8 @@ class DefaultCollectorTest {
 
         // push finish rt +1
         List<MetricSample> metricSamples = collector.collect();
-        //num(total+success+processing) + rt(5) = 8
-        Assertions.assertEquals(8, metricSamples.size());
+        //all METHOD_LEVEL_KEYS + rt(5) = 27
+        Assertions.assertEquals(DefaultConstants.METHOD_LEVEL_KEYS.size() + 5, 
metricSamples.size());
         List<String> metricsNames = 
metricSamples.stream().map(MetricSample::getName).collect(Collectors.toList());
         // No error will contain total+success+processing
         String REQUESTS = new MetricsKeyWrapper(METRIC_REQUESTS, 
MetricsPlaceValue.of(side, MetricsLevel.SERVICE)).targetKey();
@@ -191,7 +192,7 @@ class DefaultCollectorTest {
         metricSamples = collector.collect();
 
         // num(total+success+error+total_error+processing) + rt(5) = 5
-        Assertions.assertEquals(10, metricSamples.size());
+        Assertions.assertEquals(DefaultConstants.METHOD_LEVEL_KEYS.size() + 5, 
metricSamples.size());
 
         String TIMEOUT = new MetricsKeyWrapper(METRIC_REQUESTS_TIMEOUT, 
MetricsPlaceValue.of(side, MetricsLevel.SERVICE)).targetKey();
         String TOTAL_FAILED = new 
MetricsKeyWrapper(METRIC_REQUESTS_TOTAL_FAILED, MetricsPlaceValue.of(side, 
MetricsLevel.SERVICE)).targetKey();
diff --git 
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/filter/MetricsFilterTest.java
 
b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/filter/MetricsFilterTest.java
index 887b785555..488986afeb 100644
--- 
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/filter/MetricsFilterTest.java
+++ 
b/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/filter/MetricsFilterTest.java
@@ -25,6 +25,9 @@ import 
org.apache.dubbo.metrics.collector.DefaultMetricsCollector;
 import org.apache.dubbo.metrics.event.MetricsEventBus;
 import org.apache.dubbo.metrics.event.RequestEvent;
 import org.apache.dubbo.metrics.model.key.MetricsKey;
+import org.apache.dubbo.metrics.model.key.MetricsKeyWrapper;
+import org.apache.dubbo.metrics.model.key.MetricsLevel;
+import org.apache.dubbo.metrics.model.key.MetricsPlaceValue;
 import org.apache.dubbo.metrics.model.sample.CounterMetricSample;
 import org.apache.dubbo.metrics.model.sample.MetricSample;
 import org.apache.dubbo.rpc.AppResponse;
@@ -125,7 +128,7 @@ class MetricsFilterTest {
 
         Map<String, MetricSample> metricsMap = getMetricsMap();
         
Assertions.assertTrue(metricsMap.containsKey(MetricsKey.METRIC_REQUESTS_FAILED.getNameByType(side)));
-        
Assertions.assertFalse(metricsMap.containsKey(MetricsKey.METRIC_REQUESTS_SUCCEED.getNameByType(side)));
+        
Assertions.assertTrue(metricsMap.containsKey(MetricsKey.METRIC_REQUESTS_SUCCEED.getNameByType(side)));
 
         MetricSample sample = 
metricsMap.get(MetricsKey.METRIC_REQUESTS_FAILED.getNameByType(side));
         Map<String, String> tags = sample.getTags();
@@ -152,7 +155,7 @@ class MetricsFilterTest {
 
         Map<String, MetricSample> metricsMap = getMetricsMap();
         
Assertions.assertTrue(metricsMap.containsKey(MetricsKey.METRIC_REQUEST_BUSINESS_FAILED.getNameByType(side)));
-        
Assertions.assertFalse(metricsMap.containsKey(MetricsKey.METRIC_REQUESTS_SUCCEED.getNameByType(side)));
+        
Assertions.assertTrue(metricsMap.containsKey(MetricsKey.METRIC_REQUESTS_SUCCEED.getNameByType(side)));
 
         MetricSample sample = 
metricsMap.get(MetricsKey.METRIC_REQUEST_BUSINESS_FAILED.getNameByType(side));
 
@@ -229,7 +232,7 @@ class MetricsFilterTest {
         filter.onResponse(result, invoker, invocation);
 
         Map<String, MetricSample> metricsMap = getMetricsMap();
-        
Assertions.assertFalse(metricsMap.containsKey(MetricsKey.METRIC_REQUEST_BUSINESS_FAILED.getNameByType(side)));
+        
Assertions.assertTrue(metricsMap.containsKey(MetricsKey.METRIC_REQUEST_BUSINESS_FAILED.getNameByType(side)));
         
Assertions.assertTrue(metricsMap.containsKey(MetricsKey.METRIC_REQUESTS_SUCCEED.getNameByType(side)));
 
         MetricSample sample = 
metricsMap.get(MetricsKey.METRIC_REQUESTS_SUCCEED.getNameByType(side));
@@ -266,12 +269,13 @@ class MetricsFilterTest {
 
     @Test
     public void testErrors() {
-        testFilterError(RpcException.SERIALIZATION_EXCEPTION, 
MetricsKey.METRIC_REQUESTS_CODEC_FAILED.formatName(side));
-        testFilterError(RpcException.NETWORK_EXCEPTION, 
MetricsKey.METRIC_REQUESTS_NETWORK_FAILED.formatName(side));
+        testFilterError(RpcException.SERIALIZATION_EXCEPTION, 
MetricsKey.METRIC_REQUESTS_CODEC_FAILED);
+        testFilterError(RpcException.NETWORK_EXCEPTION, 
MetricsKey.METRIC_REQUESTS_NETWORK_FAILED);
     }
 
 
     private void testFilterError(int errorCode, MetricsKey metricsKey) {
+        String targetKey = new MetricsKeyWrapper(metricsKey, 
MetricsPlaceValue.of(side, MetricsLevel.METHOD)).targetKey();
         setup();
         collector.setCollectEnabled(true);
         given(invoker.invoke(invocation)).willThrow(new 
RpcException(errorCode));
@@ -288,14 +292,14 @@ class MetricsFilterTest {
             }
         }
         Map<String, MetricSample> metricsMap = getMetricsMap();
-        Assertions.assertTrue(metricsMap.containsKey(metricsKey.getName()));
+        Assertions.assertTrue(metricsMap.containsKey(targetKey));
 
-        MetricSample sample = metricsMap.get(metricsKey.getName());
+        MetricSample sample = metricsMap.get(targetKey);
 
-        Assertions.assertSame(((CounterMetricSample) 
sample).getValue().longValue(), count);
+        Assertions.assertSame(((CounterMetricSample<?>) 
sample).getValue().longValue(), count);
 
 
-        Assertions.assertTrue(metricsMap.containsKey(metricsKey.getName()));
+        Assertions.assertTrue(metricsMap.containsKey(targetKey));
         Map<String, String> tags = sample.getTags();
 
         Assertions.assertEquals(tags.get(TAG_INTERFACE_KEY), INTERFACE_NAME);
diff --git 
a/dubbo-metrics/dubbo-metrics-metadata/src/main/java/org/apache/dubbo/metrics/metadata/event/MetadataSubDispatcher.java
 
b/dubbo-metrics/dubbo-metrics-metadata/src/main/java/org/apache/dubbo/metrics/metadata/event/MetadataSubDispatcher.java
index f78f1965e1..ebbe20f8a8 100644
--- 
a/dubbo-metrics/dubbo-metrics-metadata/src/main/java/org/apache/dubbo/metrics/metadata/event/MetadataSubDispatcher.java
+++ 
b/dubbo-metrics/dubbo-metrics-metadata/src/main/java/org/apache/dubbo/metrics/metadata/event/MetadataSubDispatcher.java
@@ -50,6 +50,9 @@ public final class MetadataSubDispatcher extends 
SimpleMetricsEventMulticaster {
 
     }
 
+    /**
+     * A closer aggregation of MetricsCat, a summary collection of certain 
types of events
+     */
     interface CategorySet {
         CategoryOverall APPLICATION_PUSH = new CategoryOverall(OP_TYPE_PUSH, 
MCat.APPLICATION_PUSH_POST, MCat.APPLICATION_PUSH_FINISH, 
MCat.APPLICATION_PUSH_ERROR);
         CategoryOverall APPLICATION_SUBSCRIBE = new 
CategoryOverall(OP_TYPE_SUBSCRIBE, MCat.APPLICATION_SUBSCRIBE_POST, 
MCat.APPLICATION_SUBSCRIBE_FINISH, MCat.APPLICATION_SUBSCRIBE_ERROR);
@@ -58,6 +61,10 @@ public final class MetadataSubDispatcher extends 
SimpleMetricsEventMulticaster {
         List<CategoryOverall> ALL = Arrays.asList(APPLICATION_PUSH, 
APPLICATION_SUBSCRIBE, SERVICE_SUBSCRIBE);
     }
 
+    /**
+     *  {@link MetricsCat} MetricsCat collection, for better classification 
processing
+     *  Except for a few custom functions, most of them can build standard 
event listening functions through the static methods of 
MetricsApplicationListener
+     */
     interface MCat {
         // MetricsPushListener
         MetricsCat APPLICATION_PUSH_POST = new 
MetricsCat(MetricsKey.METADATA_PUSH_METRIC_NUM, 
MetricsApplicationListener::onPostEventBuild);
diff --git 
a/dubbo-metrics/dubbo-metrics-metadata/src/test/java/org/apache/dubbo/metrics/metadata/MetadataMetricsCollectorTest.java
 
b/dubbo-metrics/dubbo-metrics-metadata/src/test/java/org/apache/dubbo/metrics/metadata/MetadataMetricsCollectorTest.java
index 3f3d54bb23..23d93254a9 100644
--- 
a/dubbo-metrics/dubbo-metrics-metadata/src/test/java/org/apache/dubbo/metrics/metadata/MetadataMetricsCollectorTest.java
+++ 
b/dubbo-metrics/dubbo-metrics-metadata/src/test/java/org/apache/dubbo/metrics/metadata/MetadataMetricsCollectorTest.java
@@ -211,7 +211,7 @@ class MetadataMetricsCollectorTest {
                 List<MetricSample> metricSamples = collector.collect();
 
                 // App(6) + service success(1)
-                
Assertions.assertEquals(MetadataMetricsConstants.APP_LEVEL_KEYS.size() + 1, 
metricSamples.size());
+                
Assertions.assertEquals(MetadataMetricsConstants.APP_LEVEL_KEYS.size() + 
MetadataMetricsConstants.SERVICE_LEVEL_KEYS.size(), metricSamples.size());
                 
Assertions.assertTrue(metricSamples.stream().allMatch(metricSample -> 
metricSample instanceof GaugeMetricSample));
                 
Assertions.assertTrue(metricSamples.stream().anyMatch(metricSample -> 
((GaugeMetricSample) metricSample).applyAsDouble() == 1));
                 return null;
@@ -221,7 +221,7 @@ class MetadataMetricsCollectorTest {
         // push finish rt +1
         List<MetricSample> metricSamples = collector.collect();
         // App(6) + service total/success(2) + rt(5) = 7
-        Assertions.assertEquals(MetadataMetricsConstants.APP_LEVEL_KEYS.size() 
+ 2 + 5, metricSamples.size());
+        Assertions.assertEquals(MetadataMetricsConstants.APP_LEVEL_KEYS.size() 
+ MetadataMetricsConstants.SERVICE_LEVEL_KEYS.size() + 5, metricSamples.size());
 
         long c1 = metadataEvent.getTimePair().calc();
         metadataEvent = 
MetadataEvent.toServiceSubscribeEvent(applicationModel, serviceKey);
diff --git 
a/dubbo-metrics/dubbo-metrics-registry/src/main/java/org/apache/dubbo/metrics/registry/event/RegistrySubDispatcher.java
 
b/dubbo-metrics/dubbo-metrics-registry/src/main/java/org/apache/dubbo/metrics/registry/event/RegistrySubDispatcher.java
index 8481a19984..f0d8c74f41 100644
--- 
a/dubbo-metrics/dubbo-metrics-registry/src/main/java/org/apache/dubbo/metrics/registry/event/RegistrySubDispatcher.java
+++ 
b/dubbo-metrics/dubbo-metrics-registry/src/main/java/org/apache/dubbo/metrics/registry/event/RegistrySubDispatcher.java
@@ -58,6 +58,9 @@ public final class RegistrySubDispatcher extends 
SimpleMetricsEventMulticaster {
         });
     }
 
+    /**
+     * A closer aggregation of MetricsCat, a summary collection of certain 
types of events
+     */
     interface CategorySet {
         CategoryOverall APPLICATION_REGISTER = new 
CategoryOverall(OP_TYPE_REGISTER, MCat.APPLICATION_REGISTER_POST, 
MCat.APPLICATION_REGISTER_FINISH, MCat.APPLICATION_REGISTER_ERROR);
         CategoryOverall APPLICATION_SUBSCRIBE = new 
CategoryOverall(OP_TYPE_SUBSCRIBE, MCat.APPLICATION_SUBSCRIBE_POST, 
MCat.APPLICATION_SUBSCRIBE_FINISH, MCat.APPLICATION_SUBSCRIBE_ERROR);
@@ -70,6 +73,10 @@ public final class RegistrySubDispatcher extends 
SimpleMetricsEventMulticaster {
     }
 
 
+    /**
+     *  {@link MetricsCat} MetricsCat collection, for better classification 
processing
+     *  Except for a few custom functions, most of them can build standard 
event listening functions through the static methods of 
MetricsApplicationListener
+     */
     interface MCat {
         // MetricsRegisterListener
         MetricsCat APPLICATION_REGISTER_POST = new 
MetricsCat(MetricsKey.REGISTER_METRIC_REQUESTS, 
MetricsApplicationListener::onPostEventBuild);
diff --git 
a/dubbo-metrics/dubbo-metrics-registry/src/test/java/org/apache/dubbo/metrics/registry/metrics/collector/RegistryMetricsCollectorTest.java
 
b/dubbo-metrics/dubbo-metrics-registry/src/test/java/org/apache/dubbo/metrics/registry/metrics/collector/RegistryMetricsCollectorTest.java
index 3dc6dad7d3..9b9de75e60 100644
--- 
a/dubbo-metrics/dubbo-metrics-registry/src/test/java/org/apache/dubbo/metrics/registry/metrics/collector/RegistryMetricsCollectorTest.java
+++ 
b/dubbo-metrics/dubbo-metrics-registry/src/test/java/org/apache/dubbo/metrics/registry/metrics/collector/RegistryMetricsCollectorTest.java
@@ -140,9 +140,9 @@ class RegistryMetricsCollectorTest {
                 List<MetricSample> metricSamples = collector.collect();
 
                 // push success +1
-                
Assertions.assertEquals(RegistryMetricsConstants.APP_LEVEL_KEYS.size() + 1, 
metricSamples.size());
+                
Assertions.assertEquals(RegistryMetricsConstants.APP_LEVEL_KEYS.size() + 
RegistryMetricsConstants.SERVICE_LEVEL_KEYS.size(), metricSamples.size());
                 // Service num only 1 and contains tag of interface
-                Assertions.assertEquals(1, 
metricSamples.stream().filter(metricSample -> 
serviceName.equals(metricSample.getTags().get("interface"))).count());
+                
Assertions.assertEquals(RegistryMetricsConstants.SERVICE_LEVEL_KEYS.size(), 
metricSamples.stream().filter(metricSample -> 
serviceName.equals(metricSample.getTags().get("interface"))).count());
                 return null;
             }
         );
@@ -150,7 +150,7 @@ class RegistryMetricsCollectorTest {
         // push finish rt +1
         List<MetricSample> metricSamples = collector.collect();
         // App(7) + rt(5) + service(total/success) = 14
-        Assertions.assertEquals(RegistryMetricsConstants.APP_LEVEL_KEYS.size() 
+ 5 + 2, metricSamples.size());
+        Assertions.assertEquals(RegistryMetricsConstants.APP_LEVEL_KEYS.size() 
+ 5 + RegistryMetricsConstants.SERVICE_LEVEL_KEYS.size(), metricSamples.size());
 
         long c1 = registryEvent.getTimePair().calc();
         registryEvent = RegistryEvent.toRsEvent(applicationModel, serviceName, 
2);
@@ -171,7 +171,7 @@ class RegistryMetricsCollectorTest {
         metricSamples = collector.collect();
 
         // App(7) + rt(5) + service(total/success/failed) = 15
-        Assertions.assertEquals(RegistryMetricsConstants.APP_LEVEL_KEYS.size() 
+ 5 + 3, metricSamples.size());
+        Assertions.assertEquals(RegistryMetricsConstants.APP_LEVEL_KEYS.size() 
+ 5 + RegistryMetricsConstants.SERVICE_LEVEL_KEYS.size(), metricSamples.size());
 
         // calc rt
         for (MetricSample sample : metricSamples) {
@@ -201,10 +201,10 @@ class RegistryMetricsCollectorTest {
                 List<MetricSample> metricSamples = collector.collect();
                 
Assertions.assertTrue(metricSamples.stream().allMatch(metricSample -> 
metricSample instanceof GaugeMetricSample));
                 
Assertions.assertTrue(metricSamples.stream().anyMatch(metricSample -> 
((GaugeMetricSample) metricSample).applyAsDouble() == 1));
-                // App(7) + (service success +1)
-                
Assertions.assertEquals(RegistryMetricsConstants.APP_LEVEL_KEYS.size() + 1, 
metricSamples.size());
+                // App(default=7) + (service success +1)
+                
Assertions.assertEquals(RegistryMetricsConstants.APP_LEVEL_KEYS.size() + 
RegistryMetricsConstants.SERVICE_LEVEL_KEYS.size(), metricSamples.size());
                 // Service num only 1 and contains tag of interface
-                Assertions.assertEquals(1, 
metricSamples.stream().filter(metricSample -> 
serviceName.equals(metricSample.getTags().get("interface"))).count());
+                
Assertions.assertEquals(RegistryMetricsConstants.SERVICE_LEVEL_KEYS.size(), 
metricSamples.stream().filter(metricSample -> 
serviceName.equals(metricSample.getTags().get("interface"))).count());
                 return null;
             }
         );
@@ -212,7 +212,7 @@ class RegistryMetricsCollectorTest {
         // push finish rt +1
         List<MetricSample> metricSamples = collector.collect();
         // App(7) + rt(5) + service(total/success) = 14
-        Assertions.assertEquals(RegistryMetricsConstants.APP_LEVEL_KEYS.size() 
+ 5 + 2, metricSamples.size());
+        Assertions.assertEquals(RegistryMetricsConstants.APP_LEVEL_KEYS.size() 
+ 5 + RegistryMetricsConstants.SERVICE_LEVEL_KEYS.size(), metricSamples.size());
 
         long c1 = subscribeEvent.getTimePair().calc();
         subscribeEvent = RegistryEvent.toSsEvent(applicationModel, 
serviceName);
@@ -233,7 +233,7 @@ class RegistryMetricsCollectorTest {
         metricSamples = collector.collect();
 
         // App(7) + rt(5) + service(total/success/failed) = 15
-        Assertions.assertEquals(RegistryMetricsConstants.APP_LEVEL_KEYS.size() 
+ 5 + 3, metricSamples.size());
+        Assertions.assertEquals(RegistryMetricsConstants.APP_LEVEL_KEYS.size() 
+ 5 + RegistryMetricsConstants.SERVICE_LEVEL_KEYS.size(), metricSamples.size());
 
         // calc rt
         for (MetricSample sample : metricSamples) {
@@ -254,6 +254,7 @@ class RegistryMetricsCollectorTest {
 
     @Test
     public void testNotify() {
+        Map<String, Integer> lastNumMap = new HashMap<>();
         MetricsEventBus.post(RegistryEvent.toNotifyEvent(applicationModel),
             () -> {
                 try {
@@ -261,7 +262,6 @@ class RegistryMetricsCollectorTest {
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
-                Map<String, Integer> lastNumMap = new HashMap<>();
                 // 1 different services
                 lastNumMap.put("demo.service1", 3);
                 lastNumMap.put("demo.service2", 4);
@@ -271,7 +271,7 @@ class RegistryMetricsCollectorTest {
         );
         List<MetricSample> metricSamples = collector.collect();
         // App(7) + num(service*3) + rt(5) = 9
-        Assertions.assertEquals(RegistryMetricsConstants.APP_LEVEL_KEYS.size() 
+ 3 + 5, metricSamples.size());
+        
Assertions.assertEquals((RegistryMetricsConstants.APP_LEVEL_KEYS.size() + 3 + 
5)*3, metricSamples.size());
 
     }
 }


Reply via email to