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"]
+ }
+ ]
}
]