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 e780b3d5c1 Provides the public part of metrics data collection and 
export (#11522)
e780b3d5c1 is described below

commit e780b3d5c1cfcd290f4ffd2ca3533f19f6b6a36e
Author: wxbty <[email protected]>
AuthorDate: Thu Feb 16 14:56:19 2023 +0800

    Provides the public part of metrics data collection and export (#11522)
    
    * init
    
    * add licence
    
    * update common func
    
    * fix conflict
    
    * add 2 new metaData
    
    * fix testcase
    
    * add param ignore
    
    * revert some format
    
    * fix refrence && remove listener spi
    
    * opt collector spi
    
    * opt collector spi
    
    * opt collector spi
    
    * fix sipi
    
    * fix reflact-json
    
    * fix reflact-json
    
    * move module
    
    * revert default collector
    
    * add licence
    
    * move default collector
    
    * fix testcase
    
    * add comment
    
    * fix frame
    
    ---------
    
    Co-authored-by: x-shadow-man <[email protected]>
    Co-authored-by: wangxiaobin <[email protected]>
---
 .../common/beans/factory/ScopeBeanFactory.java     |  9 +++
 .../dubbo/common/beans/ScopeBeanFactoryTest.java   | 20 ++++-
 .../config/deploy/DefaultApplicationDeployer.java  |  2 +-
 dubbo-distribution/dubbo-all/pom.xml               |  6 ++
 ...ector.java => ApplicationMetricsCollector.java} | 24 +++---
 .../dubbo/metrics/collector/MetricsCollector.java  | 14 +++-
 .../metrics/collector/stat/MetricsStatHandler.java |  2 +-
 .../event/GlobalMetricsEventMulticaster.java       | 42 ++++++++++
 .../metrics/event/MetricsEventMulticaster.java     |  6 +-
 .../event/SimpleMetricsEventMulticaster.java       | 59 ++++++++++----
 ...tricsEventMulticaster.java => TimeCounter.java} | 11 +--
 ...tricsListener.java => MetricsLifeListener.java} | 11 +--
 .../dubbo/metrics/listener/MetricsListener.java    |  9 ++-
 .../dubbo/metrics/model/ApplicationMetric.java     | 26 +++----
 .../dubbo/metrics/model/MetricsCategory.java       |  1 +
 .../org/apache/dubbo/metrics/model/MetricsKey.java | 12 +++
 .../dubbo/metrics/model/MetricsKeyWrapper.java     | 61 +++++++++++++++
 .../model/{MetricsCategory.java => TimePair.java}  | 29 ++++---
 .../MetricsExport.java}                            | 21 ++---
 .../event/SimpleMetricsEventMulticasterTest.java   | 90 ++++++++++++++++++++++
 .../metrics/MetricsScopeModelInitializer.java      | 46 +++++++++++
 .../metrics/collector/DefaultMetricsCollector.java | 15 ++--
 .../metrics/report/AbstractMetricsReporter.java    | 10 +--
 .../metrics/service/DefaultMetricsService.java     |  8 +-
 ...rg.apache.dubbo.rpc.model.ScopeModelInitializer |  1 +
 .../collector/AggregateMetricsCollectorTest.java   | 10 +--
 .../META-INF/native-image/reflect-config.json      | 10 +++
 27 files changed, 448 insertions(+), 107 deletions(-)

diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/beans/factory/ScopeBeanFactory.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/beans/factory/ScopeBeanFactory.java
index e549016703..ff655443d5 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/beans/factory/ScopeBeanFactory.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/beans/factory/ScopeBeanFactory.java
@@ -186,6 +186,15 @@ public class ScopeBeanFactory {
         return ConcurrentHashMapUtils.computeIfAbsent(beanNameIdCounterMap, 
beanClass, key -> new AtomicInteger()).incrementAndGet();
     }
 
+    @SuppressWarnings("unchecked")
+    public <T> List<T> getBeansOfType(Class<T> type) {
+        List<T> currentBeans = (List<T>) 
registeredBeanInfos.stream().filter(beanInfo -> 
type.isInstance(beanInfo.instance)).map(beanInfo -> 
beanInfo.instance).collect(Collectors.toList());
+        if (parent != null) {
+            currentBeans.addAll(parent.getBeansOfType(type));
+        }
+        return currentBeans;
+    }
+
     public <T> T getBean(Class<T> type) {
         return this.getBean(null, type);
     }
diff --git 
a/dubbo-common/src/test/java/org/apache/dubbo/common/beans/ScopeBeanFactoryTest.java
 
b/dubbo-common/src/test/java/org/apache/dubbo/common/beans/ScopeBeanFactoryTest.java
index a15bd80bcf..0e51c9e609 100644
--- 
a/dubbo-common/src/test/java/org/apache/dubbo/common/beans/ScopeBeanFactoryTest.java
+++ 
b/dubbo-common/src/test/java/org/apache/dubbo/common/beans/ScopeBeanFactoryTest.java
@@ -25,6 +25,8 @@ import org.apache.dubbo.rpc.model.FrameworkModel;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.util.List;
+
 class ScopeBeanFactoryTest {
 
     @Test
@@ -46,6 +48,17 @@ class ScopeBeanFactoryTest {
         Object objectBean = 
applicationModel.getBeanFactory().getBean(Object.class);
         Assertions.assertNull(objectBean);
 
+        // child bean factory can obtain bean from parent bean factory by 
classType
+        frameworkModel.getBeanFactory().registerBean(new TestBean());
+        applicationModel.getBeanFactory().registerBean(new TestBean());
+        List<TestBean> testBeans = 
applicationModel.getBeanFactory().getBeansOfType(TestBean.class);
+        Assertions.assertEquals(testBeans.size(), 2);
+
+        // father can't get son's
+        List<TestBean> testBeans_1 = 
frameworkModel.getBeanFactory().getBeansOfType(TestBean.class);
+        Assertions.assertEquals(testBeans_1.size(), 1);
+
+
         Assertions.assertFalse(beanWithApplicationModel.isDestroyed());
         Assertions.assertFalse(beanWithFrameworkModel.isDestroyed());
 
@@ -54,4 +67,9 @@ class ScopeBeanFactoryTest {
         Assertions.assertTrue(beanWithApplicationModel.isDestroyed());
         Assertions.assertTrue(beanWithFrameworkModel.isDestroyed());
     }
-}
\ No newline at end of file
+
+
+    static class TestBean {
+
+    }
+}
diff --git 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java
 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java
index f4f64b1167..e5853a9f4c 100644
--- 
a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java
+++ 
b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployer.java
@@ -359,7 +359,7 @@ public class DefaultApplicationDeployer extends 
AbstractDeployer<ApplicationMode
 
     private void initMetricsReporter() {
         DefaultMetricsCollector collector =
-            
applicationModel.getFrameworkModel().getBeanFactory().getOrRegisterBean(DefaultMetricsCollector.class);
+            
applicationModel.getFrameworkModel().getBeanFactory().getBean(DefaultMetricsCollector.class);
         MetricsConfig metricsConfig = configManager.getMetrics().orElse(null);
         // TODO compatible with old usage of metrics, remove protocol check 
after new metrics is ready for use.
         if (metricsConfig != null && 
PROTOCOL_PROMETHEUS.equals(metricsConfig.getProtocol())) {
diff --git a/dubbo-distribution/dubbo-all/pom.xml 
b/dubbo-distribution/dubbo-all/pom.xml
index a728b8a8a8..b9bb45e01a 100644
--- a/dubbo-distribution/dubbo-all/pom.xml
+++ b/dubbo-distribution/dubbo-all/pom.xml
@@ -1212,6 +1212,12 @@
                                         
META-INF/dubbo/internal/org.apache.dubbo.rpc.executor.IsolationExecutorSupportFactory
                                     </resource>
                                 </transformer>
+                                <transformer
+                                    
implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
+                                    <resource>
+                                        
META-INF/dubbo/internal/org.apache.dubbo.metrics.collector.MetricsCollector
+                                    </resource>
+                                </transformer>
                             </transformers>
                             <filters>
                                 <filter>
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/MetricsCollector.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/ApplicationMetricsCollector.java
similarity index 70%
copy from 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/MetricsCollector.java
copy to 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/ApplicationMetricsCollector.java
index 59d923020a..b437561a7b 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/MetricsCollector.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/ApplicationMetricsCollector.java
@@ -17,20 +17,18 @@
 
 package org.apache.dubbo.metrics.collector;
 
-import org.apache.dubbo.metrics.model.sample.MetricSample;
-
-import java.util.List;
-
 /**
- * Metrics Collector.
- * An interface of collector to collect framework internal metrics.
+ * Application-level collector.
+ * registration center, configuration center and other scenarios
+ *
+ * @Params <T>  metrics type
  */
-public interface MetricsCollector {
+public interface ApplicationMetricsCollector<T> extends MetricsCollector {
 
-    /**
-     * Collect metrics as {@link MetricSample}
-     *
-     * @return List of MetricSample
-     */
-    List<MetricSample> collect();
+    void increment(String applicationName, T type);
+
+    void decrease(String applicationName, T type);
+
+    void addRT(String applicationName, Long responseTime);
 }
+
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/MetricsCollector.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/MetricsCollector.java
index 59d923020a..d722f77547 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/MetricsCollector.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/MetricsCollector.java
@@ -17,6 +17,9 @@
 
 package org.apache.dubbo.metrics.collector;
 
+import org.apache.dubbo.common.extension.SPI;
+import org.apache.dubbo.metrics.event.MetricsEvent;
+import org.apache.dubbo.metrics.listener.MetricsListener;
 import org.apache.dubbo.metrics.model.sample.MetricSample;
 
 import java.util.List;
@@ -25,12 +28,21 @@ import java.util.List;
  * Metrics Collector.
  * An interface of collector to collect framework internal metrics.
  */
-public interface MetricsCollector {
+@SPI
+public interface MetricsCollector extends MetricsListener {
 
+    default boolean isCollectEnabled() {
+        return false;
+    }
     /**
      * Collect metrics as {@link MetricSample}
      *
      * @return List of MetricSample
      */
     List<MetricSample> collect();
+
+    @Override
+    default void onEvent(MetricsEvent event) {
+
+    }
 }
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 d9b2e0d25a..95567945d4 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
@@ -31,6 +31,6 @@ public interface MetricsStatHandler {
 
     MetricsEvent decrease(String applicationName, Invocation invocation);
 
-    MetricsEvent addApplication(String applicationName, String version);
+    MetricsEvent addApplication(String applicationName);
 
 }
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/GlobalMetricsEventMulticaster.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/GlobalMetricsEventMulticaster.java
new file mode 100644
index 0000000000..b5d4effdfe
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/GlobalMetricsEventMulticaster.java
@@ -0,0 +1,42 @@
+/*
+ * 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.common.beans.factory.ScopeBeanFactory;
+import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.metrics.collector.MetricsCollector;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+
+import java.util.List;
+
+public class GlobalMetricsEventMulticaster extends 
SimpleMetricsEventMulticaster {
+
+    public GlobalMetricsEventMulticaster(FrameworkModel frameworkModel) {
+        ScopeBeanFactory beanFactory = frameworkModel.getBeanFactory();
+        ExtensionLoader<MetricsCollector> extensionLoader = 
frameworkModel.getExtensionLoader(MetricsCollector.class);
+        if (extensionLoader != null) {
+            List<MetricsCollector> customizeCollectors = extensionLoader
+                .getActivateExtensions();
+            for (MetricsCollector customizeCollector : customizeCollectors) {
+                beanFactory.registerBean(customizeCollector);
+            }
+            customizeCollectors.forEach(this::addListener);
+        }
+    }
+
+}
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/MetricsEventMulticaster.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/MetricsEventMulticaster.java
index e35549a5c8..166301f0c6 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/MetricsEventMulticaster.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/MetricsEventMulticaster.java
@@ -21,7 +21,11 @@ import org.apache.dubbo.metrics.listener.MetricsListener;
 
 public interface MetricsEventMulticaster {
 
-    void addListener(MetricsListener listener);
+    void addListener(MetricsListener<?> listener);
 
     void publishEvent(MetricsEvent event);
+
+    void publishFinishEvent(MetricsEvent event);
+
+    void publishErrorEvent(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
index 60e310bf26..6f5df6660b 100644
--- 
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
@@ -17,45 +17,72 @@
 
 package org.apache.dubbo.metrics.event;
 
+import org.apache.dubbo.metrics.listener.MetricsLifeListener;
 import org.apache.dubbo.metrics.listener.MetricsListener;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Consumer;
 
-public final class SimpleMetricsEventMulticaster implements 
MetricsEventMulticaster {
+/**
+ *  A simple event publisher that defines lifecycle events and supports rt 
events
+ */
+public class SimpleMetricsEventMulticaster implements MetricsEventMulticaster {
+    private final List<MetricsListener<?>> listeners = 
Collections.synchronizedList(new ArrayList<>());
 
-    @SuppressWarnings("java:S3077")
-    private static volatile SimpleMetricsEventMulticaster instance;
+    private boolean available = false;
 
-    private SimpleMetricsEventMulticaster() {
+    public void setAvailable() {
+        this.available = true;
     }
 
-    private final List<MetricsListener> listeners = 
Collections.synchronizedList(new ArrayList<>());
+    public boolean isAvailable() {
+        return available;
+    }
 
-    public static SimpleMetricsEventMulticaster getInstance() {
-        if (instance == null) {
-            synchronized (SimpleMetricsEventMulticaster.class) {
-                if (instance == null) {
-                    instance = new SimpleMetricsEventMulticaster();
-                }
+    @Override
+    public void addListener(MetricsListener<?> listener) {
+        listeners.add(listener);
+    }
+
+    @Override
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    public void publishEvent(MetricsEvent event) {
+        if (event instanceof EmptyEvent) {
+            return;
+        }
+        for (MetricsListener listener : listeners) {
+            if (listener.isSupport(event)) {
+                listener.onEvent(event);
             }
         }
-        return instance;
     }
 
     @Override
-    public void addListener(MetricsListener listener) {
-        listeners.add(listener);
+    @SuppressWarnings({"unchecked"})
+    public void publishFinishEvent(MetricsEvent event) {
+        publishTimeEvent(event, metricsLifeListener -> 
metricsLifeListener.onEventFinish(event));
     }
 
     @Override
-    public void publishEvent(MetricsEvent event) {
+    @SuppressWarnings({"unchecked"})
+    public void publishErrorEvent(MetricsEvent event) {
+        publishTimeEvent(event, metricsLifeListener -> 
metricsLifeListener.onEventError(event));
+    }
+
+    @SuppressWarnings({"rawtypes", "unchecked"})
+    private void publishTimeEvent(MetricsEvent event, 
Consumer<MetricsLifeListener> consumer) {
         if (event instanceof EmptyEvent) {
             return;
         }
+        if (event instanceof TimeCounter) {
+            ((TimeCounter) event).getTimePair().end();
+        }
         for (MetricsListener listener : listeners) {
-            listener.onEvent(event);
+            if (listener instanceof MetricsLifeListener && 
listener.isSupport(event)) {
+                consumer.accept(((MetricsLifeListener) listener));
+            }
         }
     }
 }
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/MetricsEventMulticaster.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/TimeCounter.java
similarity index 79%
copy from 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/MetricsEventMulticaster.java
copy to 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/TimeCounter.java
index e35549a5c8..780684cf1e 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/MetricsEventMulticaster.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/event/TimeCounter.java
@@ -17,11 +17,12 @@
 
 package org.apache.dubbo.metrics.event;
 
-import org.apache.dubbo.metrics.listener.MetricsListener;
+import org.apache.dubbo.metrics.model.TimePair;
 
-public interface MetricsEventMulticaster {
-
-    void addListener(MetricsListener listener);
+/**
+ *  Mark certain types of events, allow automatic recording of start and end 
times, and provide time pairs
+ */
+public interface TimeCounter {
 
-    void publishEvent(MetricsEvent event);
+    TimePair getTimePair();
 }
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/listener/MetricsListener.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/listener/MetricsLifeListener.java
similarity index 85%
copy from 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/listener/MetricsListener.java
copy to 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/listener/MetricsLifeListener.java
index 696a038f80..80098f67bf 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/listener/MetricsListener.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/listener/MetricsLifeListener.java
@@ -22,12 +22,9 @@ import org.apache.dubbo.metrics.event.MetricsEvent;
 /**
  * Metrics Listener.
  */
-public interface MetricsListener {
+public interface MetricsLifeListener<E extends MetricsEvent> extends 
MetricsListener<E> {
 
-    /**
-     * notify event.
-     *
-     * @param event BaseMetricsEvent
-     */
-    void onEvent(MetricsEvent event);
+    void onEventFinish(E event);
+
+    void onEventError(E event);
 }
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/listener/MetricsListener.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/listener/MetricsListener.java
index 696a038f80..058f583e94 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/listener/MetricsListener.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/listener/MetricsListener.java
@@ -22,12 +22,17 @@ import org.apache.dubbo.metrics.event.MetricsEvent;
 /**
  * Metrics Listener.
  */
-public interface MetricsListener {
+public interface MetricsListener<E extends MetricsEvent> {
+
+    default boolean isSupport(MetricsEvent event) {
+        return true;
+    }
 
     /**
      * notify event.
      *
      * @param event BaseMetricsEvent
      */
-    void onEvent(MetricsEvent event);
+    void onEvent(E event);
+
 }
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/ApplicationMetric.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/ApplicationMetric.java
index 773dfea5ac..ff23c7d8b0 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/ApplicationMetric.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/ApplicationMetric.java
@@ -17,48 +17,44 @@
 
 package org.apache.dubbo.metrics.model;
 
+import org.apache.dubbo.common.Version;
+
 import java.util.HashMap;
 import java.util.Map;
 
-import static org.apache.dubbo.common.constants.MetricsConstants.TAG_HOSTNAME;
-import static 
org.apache.dubbo.common.constants.MetricsConstants.TAG_APPLICATION_VERSION_KEY;
 import static 
org.apache.dubbo.common.constants.MetricsConstants.TAG_APPLICATION_NAME;
+import static 
org.apache.dubbo.common.constants.MetricsConstants.TAG_APPLICATION_VERSION_KEY;
+import static org.apache.dubbo.common.constants.MetricsConstants.TAG_HOSTNAME;
 import static org.apache.dubbo.common.constants.MetricsConstants.TAG_IP;
 import static org.apache.dubbo.common.utils.NetUtils.getLocalHost;
 import static org.apache.dubbo.common.utils.NetUtils.getLocalHostName;
 
 public class ApplicationMetric implements Metric {
-    private String applicationName;
-    private String version;
+    private final String applicationName;
+    private static final String version = Version.getVersion();
 
-    public ApplicationMetric(String applicationName, String version) {
+    public ApplicationMetric(String applicationName) {
         this.applicationName = applicationName;
-        this.version = version;
     }
 
     public String getApplicationName() {
         return applicationName;
     }
 
-    public void setApplicationName(String applicationName) {
-        this.applicationName = applicationName;
-    }
-
     public String getData() {
         return version;
     }
 
-    public void setData(String version) {
-        this.version = version;
-    }
-
     @Override
     public Map<String, String> getTags() {
+        return getTagsByName(this.getApplicationName());
+    }
+
+    public static Map<String, String> getTagsByName(String applicationName) {
         Map<String, String> tags = new HashMap<>();
         tags.put(TAG_IP, getLocalHost());
         tags.put(TAG_HOSTNAME, getLocalHostName());
         tags.put(TAG_APPLICATION_NAME, applicationName);
-
         tags.put(TAG_APPLICATION_VERSION_KEY, version);
         return tags;
     }
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsCategory.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsCategory.java
index 96de914503..fadd27e7eb 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsCategory.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsCategory.java
@@ -24,6 +24,7 @@ public enum MetricsCategory {
     RT,
     QPS,
     REQUESTS,
+    REGISTRY,
     THREAD_POOL,
     APPLICATION
 }
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsKey.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsKey.java
index 82cf70b0b3..1d19b044c7 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsKey.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsKey.java
@@ -48,6 +48,18 @@ public enum MetricsKey {
     PROVIDER_METRIC_RT_P99("dubbo.provider.rt.seconds.p99", "Response Time 
P99"),
     PROVIDER_METRIC_RT_P95("dubbo.provider.rt.seconds.p95", "Response Time 
P95"),
 
+    GENERIC_METRIC_REQUESTS("dubbo.%s.requests.total", "Total %s Requests"),
+    GENERIC_METRIC_REQUESTS_SUCCEED("dubbo.%s.requests.succeed.total", 
"Succeed %s Requests"),
+    GENERIC_METRIC_REQUESTS_FAILED("dubbo.%s.requests.failed.total", "Failed 
%s Requests"),
+
+    GENERIC_METRIC_RT_LAST("dubbo.%s.rt.seconds.last", "Last Response Time"),
+    GENERIC_METRIC_RT_MIN("dubbo.%s.rt.seconds.min", "Min Response Time"),
+    GENERIC_METRIC_RT_MAX("dubbo.%s.rt.seconds.max", "Max Response Time"),
+    GENERIC_METRIC_RT_SUM("dubbo.%s.rt.seconds.sum", "Sum Response Time"),
+    GENERIC_METRIC_RT_AVG("dubbo.%s.rt.seconds.avg", "Average Response Time"),
+    GENERIC_METRIC_RT_P99("dubbo.%s.rt.seconds.p99", "Response Time P99"),
+    GENERIC_METRIC_RT_P95("dubbo.%s.rt.seconds.p95", "Response Time P95"),
+
     THREAD_POOL_CORE_SIZE("dubbo.thread.pool.core.size","Thread Pool Core 
Size"),
     THREAD_POOL_LARGEST_SIZE("dubbo.thread.pool.largest.size","Thread Pool 
Largest Size"),
     THREAD_POOL_MAX_SIZE("dubbo.thread.pool.max.size","Thread Pool Max Size"),
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsKeyWrapper.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsKeyWrapper.java
new file mode 100644
index 0000000000..0a0afc95e8
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsKeyWrapper.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.model;
+
+/**
+ * Let {@link MetricsKey MetricsKey}  output dynamic, custom string content
+ */
+public class MetricsKeyWrapper {
+
+    private final String type;
+    private final MetricsKey metricsKey;
+
+    public MetricsKeyWrapper(String type, MetricsKey metricsKey) {
+        this.type = type;
+        this.metricsKey = metricsKey;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public MetricsKey getMetricsKey() {
+        return metricsKey;
+    }
+
+    public boolean isKey(MetricsKey metricsKey) {
+        return metricsKey == getMetricsKey();
+    }
+
+    public String targetKey() {
+        try {
+            return String.format(metricsKey.getName(), type);
+        } catch (Exception ignore) {
+            return metricsKey.getName();
+        }
+    }
+
+    public String targetDesc() {
+        try {
+            return String.format(metricsKey.getDescription(), type);
+        } catch (Exception ignore) {
+            return metricsKey.getDescription();
+        }
+    }
+
+}
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsCategory.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/TimePair.java
similarity index 67%
copy from 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsCategory.java
copy to 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/TimePair.java
index 96de914503..3994fe9dd2 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/MetricsCategory.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/model/TimePair.java
@@ -17,13 +17,24 @@
 
 package org.apache.dubbo.metrics.model;
 
-/**
- * Metric category.
- */
-public enum MetricsCategory {
-    RT,
-    QPS,
-    REQUESTS,
-    THREAD_POOL,
-    APPLICATION
+public class TimePair {
+
+    private final long begin;
+    private long end;
+
+    public TimePair(long currentTimeMillis) {
+        this.begin = currentTimeMillis;
+    }
+
+    public static TimePair start() {
+        return new TimePair(System.currentTimeMillis());
+    }
+
+    public void end() {
+        this.end = System.currentTimeMillis();
+    }
+
+    public long calc() {
+        return end - begin;
+    }
 }
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/MetricsCollector.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/report/MetricsExport.java
similarity index 66%
copy from 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/MetricsCollector.java
copy to 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/report/MetricsExport.java
index 59d923020a..1c230545a6 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/collector/MetricsCollector.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/report/MetricsExport.java
@@ -15,22 +15,25 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.metrics.collector;
+package org.apache.dubbo.metrics.report;
 
-import org.apache.dubbo.metrics.model.sample.MetricSample;
+import org.apache.dubbo.metrics.model.sample.GaugeMetricSample;
 
 import java.util.List;
 
 /**
- * Metrics Collector.
- * An interface of collector to collect framework internal metrics.
+ * Metrics data export.
+ * Export data in a unified format for external collection(e.g. Prometheus).
  */
-public interface MetricsCollector {
+public interface MetricsExport {
 
     /**
-     * Collect metrics as {@link MetricSample}
-     *
-     * @return List of MetricSample
+     * Cumulative statistics.
      */
-    List<MetricSample> collect();
+    List<GaugeMetricSample> exportNumMetrics();
+
+    /**
+     * Response time statistics at different latitudes
+     */
+    List<GaugeMetricSample> exportRtMetrics();
 }
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/event/SimpleMetricsEventMulticasterTest.java
 
b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/event/SimpleMetricsEventMulticasterTest.java
new file mode 100644
index 0000000000..de5314d803
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/event/SimpleMetricsEventMulticasterTest.java
@@ -0,0 +1,90 @@
+/*
+ * 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.MetricsLifeListener;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+public class SimpleMetricsEventMulticasterTest {
+
+    private SimpleMetricsEventMulticaster eventMulticaster;
+    private Object[] obj;
+    MetricsEvent requestEvent;
+
+    @BeforeEach
+    public void setup() {
+        eventMulticaster = new SimpleMetricsEventMulticaster();
+        obj = new Object[]{new Object()};
+        eventMulticaster.addListener(event -> obj[0] = new Object());
+        requestEvent = new RequestEvent(obj[0], MetricsEvent.Type.TOTAL);
+
+    }
+
+
+    @Test
+    void testPublishEvent() {
+
+        // emptyEvent do nothing
+        MetricsEvent emptyEvent = new EmptyEvent(obj[0]);
+        eventMulticaster.publishEvent(emptyEvent);
+        Assertions.assertSame(emptyEvent.getSource(), obj[0]);
+
+        // not empty Event change obj[]
+        MetricsEvent requestEvent = new RequestEvent(obj[0], 
MetricsEvent.Type.TOTAL);
+        eventMulticaster.publishEvent(requestEvent);
+        Assertions.assertNotSame(requestEvent.getSource(), obj[0]);
+
+    }
+
+    @Test
+    void testPublishFinishEvent() {
+
+        //do nothing with no MetricsLifeListener
+        eventMulticaster.publishFinishEvent(requestEvent);
+        Assertions.assertSame(requestEvent.getSource(), obj[0]);
+
+        //do onEventFinish with MetricsLifeListener
+        eventMulticaster.addListener((new MetricsLifeListener<MetricsEvent>() {
+
+            @Override
+            public void onEvent(MetricsEvent event) {
+
+            }
+
+            @Override
+            public void onEventFinish(MetricsEvent event) {
+                obj[0] = new Object();
+            }
+
+            @Override
+            public void onEventError(MetricsEvent event) {
+
+            }
+        }));
+        eventMulticaster.publishFinishEvent(requestEvent);
+        Assertions.assertNotSame(requestEvent.getSource(), obj[0]);
+
+    }
+
+    @Test
+    void testPublishErrorEvent() {
+
+    }
+}
diff --git 
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/MetricsScopeModelInitializer.java
 
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/MetricsScopeModelInitializer.java
new file mode 100644
index 0000000000..6f786b2c67
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/MetricsScopeModelInitializer.java
@@ -0,0 +1,46 @@
+/*
+ * 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.beans.factory.ScopeBeanFactory;
+import org.apache.dubbo.metrics.collector.DefaultMetricsCollector;
+import org.apache.dubbo.metrics.event.GlobalMetricsEventMulticaster;
+import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.rpc.model.FrameworkModel;
+import org.apache.dubbo.rpc.model.ModuleModel;
+import org.apache.dubbo.rpc.model.ScopeModelInitializer;
+
+public class MetricsScopeModelInitializer implements ScopeModelInitializer {
+
+    @Override
+    public void initializeFrameworkModel(FrameworkModel frameworkModel) {
+
+    }
+
+    @Override
+    public void initializeApplicationModel(ApplicationModel applicationModel) {
+        ScopeBeanFactory beanFactory = 
applicationModel.getFrameworkModel().getBeanFactory();
+        beanFactory.registerBean(DefaultMetricsCollector.class);
+        beanFactory.registerBean(GlobalMetricsEventMulticaster.class);
+    }
+
+    @Override
+    public void initializeModuleModel(ModuleModel moduleModel) {
+
+    }
+}
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 32049c6aa4..b91ae3a1de 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
@@ -17,7 +17,6 @@
 
 package org.apache.dubbo.metrics.collector;
 
-import org.apache.dubbo.common.Version;
 import org.apache.dubbo.metrics.collector.sample.MethodMetricsSampler;
 import org.apache.dubbo.metrics.collector.sample.MetricsCountSampleConfigurer;
 import org.apache.dubbo.metrics.collector.sample.MetricsSampler;
@@ -33,7 +32,6 @@ import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.atomic.AtomicBoolean;
 
 import static org.apache.dubbo.metrics.model.MetricsCategory.APPLICATION;
 import static 
org.apache.dubbo.metrics.model.MetricsKey.APPLICATION_METRIC_INFO;
@@ -43,7 +41,7 @@ import static 
org.apache.dubbo.metrics.model.MetricsKey.APPLICATION_METRIC_INFO;
  */
 public class DefaultMetricsCollector implements MetricsCollector {
 
-    private final AtomicBoolean collectEnabled = new AtomicBoolean(false);
+    private boolean collectEnabled = false;
     private final SimpleMetricsEventMulticaster eventMulticaster;
     private final MethodMetricsSampler methodSampler = new 
MethodMetricsSampler(this);
     private final ThreadPoolMetricsSampler threadPoolSampler = new 
ThreadPoolMetricsSampler(this);
@@ -52,7 +50,7 @@ public class DefaultMetricsCollector implements 
MetricsCollector {
     private final List<MetricsSampler> samplers = new ArrayList<>();
 
     public DefaultMetricsCollector() {
-        this.eventMulticaster = SimpleMetricsEventMulticaster.getInstance();
+        this.eventMulticaster = new SimpleMetricsEventMulticaster();
         samplers.add(methodSampler);
         samplers.add(applicationSampler);
         samplers.add(threadPoolSampler);
@@ -75,11 +73,11 @@ public class DefaultMetricsCollector implements 
MetricsCollector {
     }
 
     public void setCollectEnabled(Boolean collectEnabled) {
-        this.collectEnabled.compareAndSet(isCollectEnabled(), collectEnabled);
+        this.collectEnabled = collectEnabled;
     }
 
-    public Boolean isCollectEnabled() {
-        return collectEnabled.get();
+    public boolean isCollectEnabled() {
+        return collectEnabled;
     }
 
     public MethodMetricsSampler getMethodSampler() {
@@ -119,8 +117,7 @@ public class DefaultMetricsCollector implements 
MetricsCollector {
         @Override
         protected void countConfigure(
             MetricsCountSampleConfigurer<String, MetricsEvent.Type, 
ApplicationMetric> sampleConfigure) {
-            sampleConfigure.configureMetrics(configure -> new 
ApplicationMetric(sampleConfigure.getSource(),
-                Version.getVersion()));
+            sampleConfigure.configureMetrics(configure -> new 
ApplicationMetric(sampleConfigure.getSource()));
         }
     };
 }
diff --git 
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/report/AbstractMetricsReporter.java
 
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/report/AbstractMetricsReporter.java
index 38ac41f162..f62b8b0c0d 100644
--- 
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/report/AbstractMetricsReporter.java
+++ 
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/report/AbstractMetricsReporter.java
@@ -29,13 +29,13 @@ import 
io.micrometer.core.instrument.binder.system.ProcessorMetrics;
 import io.micrometer.core.instrument.binder.system.UptimeMetrics;
 import io.micrometer.core.instrument.composite.CompositeMeterRegistry;
 import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.beans.factory.ScopeBeanFactory;
 import org.apache.dubbo.common.constants.MetricsConstants;
 import org.apache.dubbo.common.lang.ShutdownHookCallbacks;
 import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
 import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.metrics.DubboMetrics;
 import org.apache.dubbo.metrics.collector.AggregateMetricsCollector;
-import org.apache.dubbo.metrics.collector.DefaultMetricsCollector;
 import org.apache.dubbo.metrics.collector.MetricsCollector;
 import org.apache.dubbo.metrics.model.sample.GaugeMetricSample;
 import org.apache.dubbo.metrics.model.sample.MetricSample;
@@ -120,10 +120,10 @@ public abstract class AbstractMetricsReporter implements 
MetricsReporter {
     }
 
     private void initCollectors() {
-        
applicationModel.getBeanFactory().getOrRegisterBean(AggregateMetricsCollector.class);
-
-        
collectors.add(applicationModel.getBeanFactory().getBean(DefaultMetricsCollector.class));
-        
collectors.add(applicationModel.getBeanFactory().getBean(AggregateMetricsCollector.class));
+        ScopeBeanFactory beanFactory = applicationModel.getBeanFactory();
+        beanFactory.getOrRegisterBean(AggregateMetricsCollector.class);
+        List<MetricsCollector> otherCollectors = 
beanFactory.getBeansOfType(MetricsCollector.class);
+        collectors.addAll(otherCollectors);
     }
 
     public void refreshData() {
diff --git 
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/service/DefaultMetricsService.java
 
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/service/DefaultMetricsService.java
index eb9b661505..3aedcfc5f3 100644
--- 
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/service/DefaultMetricsService.java
+++ 
b/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/service/DefaultMetricsService.java
@@ -17,8 +17,6 @@
 
 package org.apache.dubbo.metrics.service;
 
-import org.apache.dubbo.metrics.collector.AggregateMetricsCollector;
-import org.apache.dubbo.metrics.collector.DefaultMetricsCollector;
 import org.apache.dubbo.metrics.collector.MetricsCollector;
 import org.apache.dubbo.metrics.model.MetricsCategory;
 import org.apache.dubbo.metrics.model.sample.GaugeMetricSample;
@@ -37,12 +35,8 @@ public class DefaultMetricsService implements MetricsService 
{
 
     protected final List<MetricsCollector> collectors = new ArrayList<>();
 
-    private final ApplicationModel applicationModel;
-
     public DefaultMetricsService(ApplicationModel applicationModel) {
-        this.applicationModel = applicationModel;
-        
collectors.add(applicationModel.getBeanFactory().getBean(DefaultMetricsCollector.class));
-        
collectors.add(applicationModel.getBeanFactory().getBean(AggregateMetricsCollector.class));
+        
collectors.addAll(applicationModel.getBeanFactory().getBeansOfType(MetricsCollector.class));
     }
 
     @Override
diff --git 
a/dubbo-metrics/dubbo-metrics-default/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.model.ScopeModelInitializer
 
b/dubbo-metrics/dubbo-metrics-default/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.model.ScopeModelInitializer
new file mode 100644
index 0000000000..822fee760c
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-metrics-default/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.model.ScopeModelInitializer
@@ -0,0 +1 @@
+dubbo-metrics-init=org.apache.dubbo.metrics.MetricsScopeModelInitializer
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 6359223805..6baaa3af4e 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
@@ -71,7 +71,7 @@ class AggregateMetricsCollectorTest {
         aggregationConfig.setTimeWindowSeconds(120);
         metricsConfig.setAggregation(aggregationConfig);
         
applicationModel.getApplicationConfigManager().setMetrics(metricsConfig);
-        applicationModel.getBeanFactory().registerBean(defaultCollector);
+        defaultCollector = 
applicationModel.getBeanFactory().getBean(DefaultMetricsCollector.class);
 
         interfaceName = "org.apache.dubbo.MockInterface";
         methodName = "mockMethod";
@@ -96,10 +96,10 @@ class AggregateMetricsCollectorTest {
         defaultCollector.setApplicationName(applicationName);
         MethodMetricsSampler methodMetricsCountSampler = 
defaultCollector.getMethodSampler();
 
-        
methodMetricsCountSampler.incOnEvent(invocation,MetricsEvent.Type.TOTAL);
-        
methodMetricsCountSampler.incOnEvent(invocation,MetricsEvent.Type.SUCCEED);
-        
methodMetricsCountSampler.incOnEvent(invocation,MetricsEvent.Type.UNKNOWN_FAILED);
-        
methodMetricsCountSampler.incOnEvent(invocation,MetricsEvent.Type.BUSINESS_FAILED);
+        methodMetricsCountSampler.incOnEvent(invocation, 
MetricsEvent.Type.TOTAL);
+        methodMetricsCountSampler.incOnEvent(invocation, 
MetricsEvent.Type.SUCCEED);
+        methodMetricsCountSampler.incOnEvent(invocation, 
MetricsEvent.Type.UNKNOWN_FAILED);
+        methodMetricsCountSampler.incOnEvent(invocation, 
MetricsEvent.Type.BUSINESS_FAILED);
 
         List<MetricSample> samples = collector.collect();
         for (MetricSample sample : samples) {
diff --git 
a/dubbo-native-plugin/src/main/resources/META-INF/native-image/reflect-config.json
 
b/dubbo-native-plugin/src/main/resources/META-INF/native-image/reflect-config.json
index e298f0f778..8ffe07af6c 100644
--- 
a/dubbo-native-plugin/src/main/resources/META-INF/native-image/reflect-config.json
+++ 
b/dubbo-native-plugin/src/main/resources/META-INF/native-image/reflect-config.json
@@ -2901,5 +2901,15 @@
   {
     "name": "java.util.Collections$UnmodifiableCollection",
     "allPublicMethods": true
+  },
+  {
+    "name": "org.apache.dubbo.metrics.event.GlobalMetricsEventMulticaster",
+    "allPublicMethods": true,
+    "methods": [
+      {
+        "name": "<init>",
+        "parameterTypes": ["org.apache.dubbo.rpc.model.FrameworkModel"]
+      }
+    ]
   }
 ]


Reply via email to