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

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


The following commit(s) were added to refs/heads/3.3 by this push:
     new 95207b9079 fix: fix missing metrics filter & recover #12453 (#12577)
95207b9079 is described below

commit 95207b90794387278b3c98c886e421a695647baa
Author: conghuhu <[email protected]>
AuthorDate: Wed Jun 28 20:36:38 2023 +0800

    fix: fix missing metrics filter & recover #12453 (#12577)
    
    * recover "refactor: migrate tracing core from boot-start to dubbo deployer 
(#12453)"
    
    This reverts commit ea35f7ed5c1d6d2a6ede821f1481eb5088254d28.
    
    * fix: fix missing metrics filter
    
    ---------
    
    Co-authored-by: songxiaosheng <[email protected]>
    Co-authored-by: Albumen Kevin <[email protected]>
---
 .artifacts                                         |   1 +
 dubbo-cluster/pom.xml                              |   5 -
 ...g.apache.dubbo.rpc.cluster.filter.ClusterFilter |   1 -
 .../filter/AbstractObservationFilterTest.java      |  84 --------
 .../common/constants/LoggerCodeConstants.java      |   2 +
 .../apache/dubbo/config/nested/BaggageConfig.java  |  25 +++
 .../apache/dubbo/config/nested/ExporterConfig.java |  37 +++-
 .../dubbo/config/nested/PropagationConfig.java     |   7 +
 .../apache/dubbo/config/nested/SamplingConfig.java |   7 +
 dubbo-config/dubbo-config-api/pom.xml              |   6 +
 .../config/deploy/DefaultApplicationDeployer.java  | 117 +++++++-----
 .../deploy/DefaultApplicationDeployerTest.java     |   6 +-
 dubbo-dependencies-bom/pom.xml                     |  17 +-
 dubbo-distribution/dubbo-all/pom.xml               |  10 +
 dubbo-distribution/dubbo-bom/pom.xml               |   7 +
 dubbo-distribution/dubbo-core-spi/pom.xml          |   1 +
 dubbo-metrics/dubbo-metrics-api/pom.xml            |   5 -
 .../org/apache/dubbo/metrics/aggregate/Pane.java   |   0
 .../dubbo/metrics/aggregate/SlidingWindow.java     |   0
 .../MetricsSupportUtil.java}                       |  33 ++--
 .../aggregate/TimeWindowAggregatorTest.java        |   3 +-
 dubbo-metrics/dubbo-metrics-default/pom.xml        |   5 -
 .../dubbo/internal/org.apache.dubbo.rpc.Filter     |   3 +-
 .../dubbo-tracing}/pom.xml                         |  90 +++++----
 .../AbstractDefaultDubboObservationConvention.java |  16 +-
 .../DefaultDubboClientObservationConvention.java   |   7 +-
 .../DefaultDubboServerObservationConvention.java   |   4 +-
 .../tracing}/DubboClientObservationConvention.java |   4 +-
 .../tracing}/DubboObservationDocumentation.java    |   2 +-
 .../dubbo/tracing/DubboObservationRegistry.java    |  90 +++++++++
 .../tracing}/DubboServerObservationConvention.java |   4 +-
 .../dubbo/tracing/context}/DubboClientContext.java |   9 +-
 .../dubbo/tracing/context}/DubboServerContext.java |   5 +-
 .../dubbo/tracing/exporter/TraceExporter.java      |  26 +--
 .../tracing/exporter/TraceExporterFactory.java     |  66 +++++++
 .../dubbo/tracing/exporter/otlp/OTlpExporter.java  |  66 +++++++
 .../tracing/exporter/zipkin/ZipkinExporter.java    |  60 ++++++
 .../tracing/filter}/ObservationReceiverFilter.java |  19 +-
 .../tracing/filter}/ObservationSenderFilter.java   |  23 ++-
 .../dubbo/tracing/tracer/PropagatorProvider.java   |  20 +-
 .../tracing/tracer/PropagatorProviderFactory.java  |  31 ++-
 .../dubbo/tracing/tracer/TracerProvider.java       |  19 +-
 .../tracing/tracer/TracerProviderFactory.java      |  25 ++-
 .../tracer/brave/BravePropagatorProvider.java      |  20 +-
 .../dubbo/tracing/tracer/brave/BraveProvider.java  |  27 ++-
 .../tracer/otel/OTelPropagatorProvider.java}       |  26 ++-
 .../tracing/tracer/otel/OpenTelemetryProvider.java | 212 +++++++++++++++++++++
 .../tracing/utils/ObservationSupportUtil.java      |  49 +++++
 .../dubbo/internal/org.apache.dubbo.rpc.Filter     |   1 +
 ...g.apache.dubbo.rpc.cluster.filter.ClusterFilter |   1 +
 ...efaultDubboClientObservationConventionTest.java |   5 +-
 ...efaultDubboServerObservationConventionTest.java |   6 +-
 .../org/apache/dubbo/tracing}/MockInvocation.java  |   6 +-
 .../filter}/AbstractObservationFilterTest.java     |   5 +-
 .../filter}/ObservationReceiverFilterTest.java     |  12 +-
 .../filter/ObservationSenderFilterTest.java        |   7 +-
 .../tracer/PropagatorProviderFactoryTest.java      |  18 +-
 .../tracer/otel/OTelPropagatorProviderTest.java    |  23 ++-
 .../tracer/otel/OpenTelemetryProviderTest.java     |  53 ++++++
 .../tracing}/utils/ObservationConventionUtils.java |   2 +-
 .../tracing/utils/ObservationSupportUtilTest.java  |  49 +++++
 dubbo-metrics/pom.xml                              |   1 +
 .../observability/autoconfigure/pom.xml            |   6 +
 .../DubboObservationAutoConfiguration.java         |  19 +-
 .../brave/BraveAutoConfiguration.java              |  18 +-
 .../otel/OpenTelemetryAutoConfiguration.java       |  17 +-
 dubbo-test/dubbo-dependencies-all/pom.xml          |   6 +-
 67 files changed, 1140 insertions(+), 417 deletions(-)

diff --git a/.artifacts b/.artifacts
index 70701e2ce3..6532ad99c3 100644
--- a/.artifacts
+++ b/.artifacts
@@ -115,4 +115,5 @@ dubbo-nacos-spring-boot-starter
 dubbo-zookeeper-spring-boot-starter
 dubbo-zookeeper-curator5-spring-boot-starter
 dubbo-spring-security
+dubbo-tracing
 dubbo-xds
diff --git a/dubbo-cluster/pom.xml b/dubbo-cluster/pom.xml
index 130b7e3f7e..08b83b8cca 100644
--- a/dubbo-cluster/pom.xml
+++ b/dubbo-cluster/pom.xml
@@ -86,10 +86,5 @@
             <version>${project.parent.version}</version>
             <optional>true</optional>
         </dependency>
-        <dependency>
-            <groupId>io.micrometer</groupId>
-            <artifactId>micrometer-tracing-integration-test</artifactId>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 </project>
diff --git 
a/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter
 
b/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter
index cd0a2f44e8..28a9e73853 100644
--- 
a/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter
+++ 
b/dubbo-cluster/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter
@@ -1,5 +1,4 @@
 
consumercontext=org.apache.dubbo.rpc.cluster.filter.support.ConsumerContextFilter
 
consumer-classloader=org.apache.dubbo.rpc.cluster.filter.support.ConsumerClassLoaderFilter
 router-snapshot=org.apache.dubbo.rpc.cluster.router.RouterSnapshotFilter
-observationsender=org.apache.dubbo.rpc.cluster.filter.support.ObservationSenderFilter
 
metricsClusterFilter=org.apache.dubbo.rpc.cluster.filter.support.MetricsClusterFilter
\ No newline at end of file
diff --git 
a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/AbstractObservationFilterTest.java
 
b/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/AbstractObservationFilterTest.java
deleted file mode 100644
index 567e9cab3b..0000000000
--- 
a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/AbstractObservationFilterTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * 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.rpc.cluster.filter;
-
-import org.apache.dubbo.config.ApplicationConfig;
-import org.apache.dubbo.config.TracingConfig;
-import org.apache.dubbo.rpc.AppResponse;
-import org.apache.dubbo.rpc.BaseFilter;
-import org.apache.dubbo.rpc.Invoker;
-import org.apache.dubbo.rpc.RpcInvocation;
-import org.apache.dubbo.rpc.model.ApplicationModel;
-
-import io.micrometer.tracing.test.SampleTestRunner;
-import org.junit.jupiter.api.AfterEach;
-
-import static org.mockito.BDDMockito.given;
-import static org.mockito.Mockito.mock;
-
-abstract class AbstractObservationFilterTest extends SampleTestRunner {
-
-    ApplicationModel applicationModel;
-    RpcInvocation    invocation;
-
-    BaseFilter filter;
-
-    Invoker<?> invoker = mock(Invoker.class);
-
-    static final String INTERFACE_NAME = "org.apache.dubbo.MockInterface";
-    static final String METHOD_NAME = "mockMethod";
-    static final String GROUP = "mockGroup";
-    static final String VERSION = "1.0.0";
-
-    @AfterEach
-    public void teardown() {
-        if (applicationModel != null) {
-            applicationModel.destroy();
-        }
-    }
-
-    abstract BaseFilter createFilter(ApplicationModel applicationModel);
-
-    void setupConfig() {
-        ApplicationConfig config = new ApplicationConfig();
-        config.setName("MockObservations");
-
-        applicationModel = ApplicationModel.defaultModel();
-        applicationModel.getApplicationConfigManager().setApplication(config);
-
-        invocation = new RpcInvocation(new MockInvocation());
-        invocation.addInvokedInvoker(invoker);
-
-        
applicationModel.getBeanFactory().registerBean(getObservationRegistry());
-        TracingConfig tracingConfig = new TracingConfig();
-        tracingConfig.setEnabled(true);
-        
applicationModel.getApplicationConfigManager().setTracing(tracingConfig);
-
-        filter = createFilter(applicationModel);
-
-        given(invoker.invoke(invocation)).willReturn(new 
AppResponse("success"));
-
-        initParam();
-    }
-
-    private void initParam() {
-        invocation.setTargetServiceUniqueName(GROUP + "/" + INTERFACE_NAME + 
":" + VERSION);
-        invocation.setMethodName(METHOD_NAME);
-        invocation.setParameterTypes(new Class[] {String.class});
-    }
-
-}
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/LoggerCodeConstants.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/LoggerCodeConstants.java
index 568a5d888d..fb66b5a8c9 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/common/constants/LoggerCodeConstants.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/common/constants/LoggerCodeConstants.java
@@ -92,6 +92,8 @@ public interface LoggerCodeConstants {
 
     String VULNERABILITY_WARNING = "0-28";
 
+    String COMMON_NOT_FOUND_TRACER_DEPENDENCY = "0-29";
+
     /**
      * Used in annotation processor to indicate a deprecated method is invoked.
      */
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/BaggageConfig.java 
b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/BaggageConfig.java
index beba9b5ddd..b39f0ece30 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/BaggageConfig.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/BaggageConfig.java
@@ -39,6 +39,19 @@ public class BaggageConfig implements Serializable {
      */
     private List<String> remoteFields = new ArrayList<>();
 
+    public BaggageConfig() {
+    }
+
+    public BaggageConfig(Boolean enabled) {
+        this.enabled = enabled;
+    }
+
+    public BaggageConfig(Boolean enabled, Correlation correlation, 
List<String> remoteFields) {
+        this.enabled = enabled;
+        this.correlation = correlation;
+        this.remoteFields = remoteFields;
+    }
+
     public Boolean getEnabled() {
         return enabled;
     }
@@ -76,6 +89,18 @@ public class BaggageConfig implements Serializable {
          */
         private List<String> fields = new ArrayList<>();
 
+        public Correlation() {
+        }
+
+        public Correlation(boolean enabled) {
+            this.enabled = enabled;
+        }
+
+        public Correlation(boolean enabled, List<String> fields) {
+            this.enabled = enabled;
+            this.fields = fields;
+        }
+
         public boolean isEnabled() {
             return this.enabled;
         }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/ExporterConfig.java 
b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/ExporterConfig.java
index 58de4dcd80..871a5afbab 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/ExporterConfig.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/ExporterConfig.java
@@ -56,15 +56,28 @@ public class ExporterConfig implements Serializable {
         private String endpoint;
 
         /**
-         * Connection timeout for requests to Zipkin.
+         * Connection timeout for requests to Zipkin. (seconds)
          */
         private Duration connectTimeout = Duration.ofSeconds(1);
 
         /**
-         * Read timeout for requests to Zipkin.
+         * Read timeout for requests to Zipkin. (seconds)
          */
         private Duration readTimeout = Duration.ofSeconds(10);
 
+        public ZipkinConfig() {
+        }
+
+        public ZipkinConfig(String endpoint) {
+            this.endpoint = endpoint;
+        }
+
+        public ZipkinConfig(String endpoint, Duration connectTimeout, Duration 
readTimeout) {
+            this.endpoint = endpoint;
+            this.connectTimeout = connectTimeout;
+            this.readTimeout = readTimeout;
+        }
+
         public String getEndpoint() {
             return endpoint;
         }
@@ -98,7 +111,7 @@ public class ExporterConfig implements Serializable {
         private String endpoint;
 
         /**
-         * The maximum time to wait for the collector to process an exported 
batch of spans.
+         * The maximum time to wait for the collector to process an exported 
batch of spans. (seconds)
          */
         private Duration timeout = Duration.ofSeconds(10);
 
@@ -110,6 +123,24 @@ public class ExporterConfig implements Serializable {
 
         private Map<String, String> headers = new HashMap<>();
 
+        public OtlpConfig() {
+        }
+
+        public OtlpConfig(String endpoint) {
+            this.endpoint = endpoint;
+        }
+
+        public OtlpConfig(String endpoint, Duration timeout) {
+            this.endpoint = endpoint;
+            this.timeout = timeout;
+        }
+
+        public OtlpConfig(String endpoint, Duration timeout, String 
compressionMethod) {
+            this.endpoint = endpoint;
+            this.timeout = timeout;
+            this.compressionMethod = compressionMethod;
+        }
+
         public String getEndpoint() {
             return endpoint;
         }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/PropagationConfig.java
 
b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/PropagationConfig.java
index 8e52353323..c574bd0e6d 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/PropagationConfig.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/PropagationConfig.java
@@ -29,6 +29,13 @@ public class PropagationConfig implements Serializable {
      */
     private String type = W3C;
 
+    public PropagationConfig() {
+    }
+
+    public PropagationConfig(String type) {
+        this.type = type;
+    }
+
     public String getType() {
         return type;
     }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java 
b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java
index a605527190..0e98a98b5f 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java
+++ 
b/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java
@@ -25,6 +25,13 @@ public class SamplingConfig implements Serializable {
      */
     private float probability = 0.10f;
 
+    public SamplingConfig() {
+    }
+
+    public SamplingConfig(float probability) {
+        this.probability = probability;
+    }
+
     public float getProbability() {
         return this.probability;
     }
diff --git a/dubbo-config/dubbo-config-api/pom.xml 
b/dubbo-config/dubbo-config-api/pom.xml
index e6d279081c..ea1857fdcd 100644
--- a/dubbo-config/dubbo-config-api/pom.xml
+++ b/dubbo-config/dubbo-config-api/pom.xml
@@ -72,6 +72,12 @@
             <version>${project.parent.version}</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-tracing</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-monitor-api</artifactId>
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 ac012ee3d5..6302ee6eb3 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
@@ -38,7 +38,6 @@ import org.apache.dubbo.common.logger.LoggerFactory;
 import org.apache.dubbo.common.threadpool.manager.ExecutorRepository;
 import org.apache.dubbo.common.threadpool.manager.FrameworkExecutorRepository;
 import org.apache.dubbo.common.utils.ArrayUtils;
-import org.apache.dubbo.common.utils.ClassUtils;
 import org.apache.dubbo.common.utils.CollectionUtils;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.config.ApplicationConfig;
@@ -47,6 +46,7 @@ import org.apache.dubbo.config.DubboShutdownHook;
 import org.apache.dubbo.config.MetadataReportConfig;
 import org.apache.dubbo.config.MetricsConfig;
 import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.TracingConfig;
 import org.apache.dubbo.config.context.ConfigManager;
 import org.apache.dubbo.config.utils.CompositeReferenceCache;
 import org.apache.dubbo.config.utils.ConfigValidationUtils;
@@ -60,6 +60,7 @@ import 
org.apache.dubbo.metrics.report.DefaultMetricsReporterFactory;
 import org.apache.dubbo.metrics.report.MetricsReporter;
 import org.apache.dubbo.metrics.report.MetricsReporterFactory;
 import org.apache.dubbo.metrics.service.MetricsServiceExporter;
+import org.apache.dubbo.metrics.utils.MetricsSupportUtil;
 import org.apache.dubbo.registry.Registry;
 import org.apache.dubbo.registry.RegistryFactory;
 import org.apache.dubbo.registry.client.metadata.ServiceInstanceMetadataUtils;
@@ -70,6 +71,8 @@ import org.apache.dubbo.rpc.model.ModuleServiceRepository;
 import org.apache.dubbo.rpc.model.ProviderModel;
 import org.apache.dubbo.rpc.model.ScopeModel;
 import org.apache.dubbo.rpc.model.ScopeModelUtil;
+import org.apache.dubbo.tracing.DubboObservationRegistry;
+import org.apache.dubbo.tracing.utils.ObservationSupportUtil;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -152,7 +155,7 @@ public class DefaultApplicationDeployer extends 
AbstractDeployer<ApplicationMode
 
         // load spi listener
         Set<ApplicationDeployListener> deployListeners = 
applicationModel.getExtensionLoader(ApplicationDeployListener.class)
-            .getSupportedExtensionInstances();
+                .getSupportedExtensionInstances();
         for (ApplicationDeployListener listener : deployListeners) {
             this.addDeployListener(listener);
         }
@@ -226,6 +229,9 @@ public class DefaultApplicationDeployer extends 
AbstractDeployer<ApplicationMode
 
             initMetricsService();
 
+            // @since 3.2.3
+            initObservationRegistry();
+
             // @since 2.7.8
             startMetadataCenter();
 
@@ -352,17 +358,17 @@ public class DefaultApplicationDeployer extends 
AbstractDeployer<ApplicationMode
         List<RegistryConfig> defaultRegistries = 
configManager.getDefaultRegistries();
         if (defaultRegistries.size() > 0) {
             defaultRegistries
-                .stream()
-                .filter(this::isUsedRegistryAsConfigCenter)
-                .map(this::registryAsConfigCenter)
-                .forEach(configCenter -> {
-                    if 
(configManager.getConfigCenter(configCenter.getId()).isPresent()) {
-                        return;
-                    }
-                    configManager.addConfigCenter(configCenter);
-                    logger.info("use registry as config-center: " + 
configCenter);
+                    .stream()
+                    .filter(this::isUsedRegistryAsConfigCenter)
+                    .map(this::registryAsConfigCenter)
+                    .forEach(configCenter -> {
+                        if 
(configManager.getConfigCenter(configCenter.getId()).isPresent()) {
+                            return;
+                        }
+                        configManager.addConfigCenter(configCenter);
+                        logger.info("use registry as config-center: " + 
configCenter);
 
-                });
+                    });
         }
     }
 
@@ -372,16 +378,16 @@ public class DefaultApplicationDeployer extends 
AbstractDeployer<ApplicationMode
     }
 
     private void initMetricsReporter() {
-        if (!isSupportMetrics()) {
+        if (!MetricsSupportUtil.isSupportMetrics()) {
             return;
         }
         DefaultMetricsCollector collector =
-            
applicationModel.getBeanFactory().getBean(DefaultMetricsCollector.class);
+                
applicationModel.getBeanFactory().getBean(DefaultMetricsCollector.class);
         Optional<MetricsConfig> configOptional = configManager.getMetrics();
         //If no specific metrics type is configured and there is no Prometheus 
dependency in the dependencies.
         MetricsConfig metricsConfig = configOptional.orElse(new 
MetricsConfig(applicationModel));
         if (StringUtils.isBlank(metricsConfig.getProtocol())) {
-            metricsConfig.setProtocol(isSupportPrometheus() ? 
PROTOCOL_PROMETHEUS : PROTOCOL_DEFAULT);
+            metricsConfig.setProtocol(MetricsSupportUtil.isSupportPrometheus() 
? PROTOCOL_PROMETHEUS : PROTOCOL_DEFAULT);
         }
         collector.setCollectEnabled(true);
         collector.collectApplication();
@@ -409,26 +415,35 @@ public class DefaultApplicationDeployer extends 
AbstractDeployer<ApplicationMode
         }
     }
 
-    public boolean isSupportMetrics() {
-        return isClassPresent("io.micrometer.core.instrument.MeterRegistry");
-    }
-
-    public static boolean isSupportPrometheus() {
-        return isClassPresent("io.micrometer.prometheus.PrometheusConfig")
-            && 
isClassPresent("io.prometheus.client.exporter.BasicAuthHttpConnectionFactory")
-            && 
isClassPresent("io.prometheus.client.exporter.HttpConnectionFactory")
-            && isClassPresent("io.prometheus.client.exporter.PushGateway");
-    }
-
+    /**
+     * init ObservationRegistry(Micrometer)
+     */
+    private void initObservationRegistry() {
+        if (!ObservationSupportUtil.isSupportObservation()) {
+            if (logger.isDebugEnabled()) {
+                logger.debug("Not found micrometer-observation or plz check 
the version of micrometer-observation version if already introduced, need > 
1.10.0");
+            }
+            return;
+        }
+        if (!ObservationSupportUtil.isSupportTracing()) {
+            if (logger.isDebugEnabled()) {
+                logger.debug("Not found micrometer-tracing dependency, skip 
init ObservationRegistry.");
+            }
+            return;
+        }
+        Optional<TracingConfig> configOptional = configManager.getTracing();
+        if (!configOptional.isPresent() || !configOptional.get().getEnabled()) 
{
+            return;
+        }
 
-    private static boolean isClassPresent(String className) {
-        return ClassUtils.isPresent(className, 
DefaultApplicationDeployer.class.getClassLoader());
+        DubboObservationRegistry dubboObservationRegistry = new 
DubboObservationRegistry(applicationModel, configOptional.get());
+        dubboObservationRegistry.initObservationRegistry();
     }
 
 
     private boolean isUsedRegistryAsConfigCenter(RegistryConfig 
registryConfig) {
         return isUsedRegistryAsCenter(registryConfig, 
registryConfig::getUseAsConfigCenter, "config",
-            DynamicConfigurationFactory.class);
+                DynamicConfigurationFactory.class);
     }
 
     private ConfigCenterConfig registryAsConfigCenter(RegistryConfig 
registryConfig) {
@@ -470,9 +485,9 @@ public class DefaultApplicationDeployer extends 
AbstractDeployer<ApplicationMode
         }
 
         Collection<MetadataReportConfig> metadataConfigsToOverride = 
originMetadataConfigs
-            .stream()
-            .filter(m -> Objects.isNull(m.getAddress()))
-            .collect(Collectors.toList());
+                .stream()
+                .filter(m -> Objects.isNull(m.getAddress()))
+                .collect(Collectors.toList());
 
         if (metadataConfigsToOverride.size() > 1) {
             return;
@@ -483,12 +498,12 @@ public class DefaultApplicationDeployer extends 
AbstractDeployer<ApplicationMode
         List<RegistryConfig> defaultRegistries = 
configManager.getDefaultRegistries();
         if (!defaultRegistries.isEmpty()) {
             defaultRegistries
-                .stream()
-                .filter(this::isUsedRegistryAsMetadataCenter)
-                .map(registryConfig -> 
registryAsMetadataCenter(registryConfig, metadataConfigToOverride))
-                .forEach(metadataReportConfig -> {
-                    overrideMetadataReportConfig(metadataConfigToOverride, 
metadataReportConfig);
-                });
+                    .stream()
+                    .filter(this::isUsedRegistryAsMetadataCenter)
+                    .map(registryConfig -> 
registryAsMetadataCenter(registryConfig, metadataConfigToOverride))
+                    .forEach(metadataReportConfig -> {
+                        overrideMetadataReportConfig(metadataConfigToOverride, 
metadataReportConfig);
+                    });
         }
     }
 
@@ -517,7 +532,7 @@ public class DefaultApplicationDeployer extends 
AbstractDeployer<ApplicationMode
 
     private boolean isUsedRegistryAsMetadataCenter(RegistryConfig 
registryConfig) {
         return isUsedRegistryAsCenter(registryConfig, 
registryConfig::getUseAsMetadataCenter, "metadata",
-            MetadataReportFactory.class);
+                MetadataReportFactory.class);
     }
 
     /**
@@ -543,13 +558,13 @@ public class DefaultApplicationDeployer extends 
AbstractDeployer<ApplicationMode
             supported = supportsExtension(extensionClass, protocol);
             if (logger.isInfoEnabled()) {
                 logger.info(format("No value is configured in the registry, 
the %s extension[name : %s] %s as the %s center"
-                    , extensionClass.getSimpleName(), protocol, supported ? 
"supports" : "does not support", centerType));
+                        , extensionClass.getSimpleName(), protocol, supported 
? "supports" : "does not support", centerType));
             }
         }
 
         if (logger.isInfoEnabled()) {
             logger.info(format("The registry[%s] will be %s as the %s center", 
registryConfig,
-                supported ? "used" : "not used", centerType));
+                    supported ? "used" : "not used", centerType));
         }
         return supported;
     }
@@ -572,7 +587,7 @@ public class DefaultApplicationDeployer extends 
AbstractDeployer<ApplicationMode
 
     private MetadataReportConfig registryAsMetadataCenter(RegistryConfig 
registryConfig, MetadataReportConfig originMetadataReportConfig) {
         MetadataReportConfig metadataReportConfig = originMetadataReportConfig 
== null ?
-            new MetadataReportConfig(registryConfig.getApplicationModel()) : 
originMetadataReportConfig;
+                new MetadataReportConfig(registryConfig.getApplicationModel()) 
: originMetadataReportConfig;
         if (metadataReportConfig.getId() == null) {
             metadataReportConfig.setId(registryConfig.getId());
         }
@@ -775,13 +790,13 @@ public class DefaultApplicationDeployer extends 
AbstractDeployer<ApplicationMode
 
     private void exportMetricsService() {
         boolean exportMetrics = 
applicationModel.getApplicationConfigManager().getMetrics()
-            .map(MetricsConfig::getExportMetricsService).orElse(true);
+                .map(MetricsConfig::getExportMetricsService).orElse(true);
         if (exportMetrics) {
             try {
                 metricsServiceExporter.export();
             } catch (Exception e) {
                 
logger.error(LoggerCodeConstants.COMMON_METRICS_COLLECTOR_EXCEPTION, "", "",
-                    "exportMetricsService an exception occurred when handle 
starting event", e);
+                        "exportMetricsService an exception occurred when 
handle starting event", e);
             }
         }
     }
@@ -859,10 +874,10 @@ public class DefaultApplicationDeployer extends 
AbstractDeployer<ApplicationMode
 
                     // Add metrics
                     
MetricsEventBus.publish(ConfigCenterEvent.toChangeEvent(applicationModel, 
configCenter.getConfigFile(), configCenter.getGroup(),
-                        configCenter.getProtocol(), 
ConfigChangeType.ADDED.name(), configMap.size()));
+                            configCenter.getProtocol(), 
ConfigChangeType.ADDED.name(), configMap.size()));
                     if (isNotEmpty(appGroup)) {
                         
MetricsEventBus.publish(ConfigCenterEvent.toChangeEvent(applicationModel, 
appConfigFile, appGroup,
-                            configCenter.getProtocol(), 
ConfigChangeType.ADDED.name(), appConfigMap.size()));
+                                configCenter.getProtocol(), 
ConfigChangeType.ADDED.name(), appConfigMap.size()));
                     }
                 } catch (IOException e) {
                     throw new IllegalStateException("Failed to parse 
configurations from Config Center.", e);
@@ -900,10 +915,10 @@ public class DefaultApplicationDeployer extends 
AbstractDeployer<ApplicationMode
         try {
             registered = true;
             
MetricsEventBus.post(RegistryEvent.toRegisterEvent(applicationModel),
-                () -> {
-                    
ServiceInstanceMetadataUtils.registerMetadataAndInstance(applicationModel);
-                    return null;
-                }
+                    () -> {
+                        
ServiceInstanceMetadataUtils.registerMetadataAndInstance(applicationModel);
+                        return null;
+                    }
             );
         } catch (Exception e) {
             logger.error(CONFIG_REGISTER_INSTANCE_ERROR, "configuration server 
disconnected", "", "Register instance error.", e);
@@ -1017,7 +1032,7 @@ public class DefaultApplicationDeployer extends 
AbstractDeployer<ApplicationMode
 
     private void doOffline(ProviderModel.RegisterStatedURL statedURL) {
         RegistryFactory registryFactory =
-            
statedURL.getRegistryUrl().getOrDefaultApplicationModel().getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
+                
statedURL.getRegistryUrl().getOrDefaultApplicationModel().getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
         Registry registry = 
registryFactory.getRegistry(statedURL.getRegistryUrl());
         registry.unregister(statedURL.getProviderUrl());
         statedURL.setRegistered(false);
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
index 434fb55f17..99f94ebe49 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
+++ 
b/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
@@ -18,7 +18,7 @@
 package org.apache.dubbo.config.deploy;
 
 import org.apache.dubbo.common.utils.Assert;
-import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.metrics.utils.MetricsSupportUtil;
 
 import org.junit.jupiter.api.Test;
 
@@ -26,7 +26,7 @@ class DefaultApplicationDeployerTest {
 
     @Test
     void isSupportPrometheus() {
-        boolean supportPrometheus = new 
DefaultApplicationDeployer(ApplicationModel.defaultModel()).isSupportPrometheus();
-        
Assert.assertTrue(supportPrometheus,"DefaultApplicationDeployer.isSupportPrometheus()
 should return true");
+        boolean supportPrometheus = MetricsSupportUtil.isSupportPrometheus();
+        Assert.assertTrue(supportPrometheus, 
"MetricsSupportUtil.isSupportPrometheus() should return true");
     }
 }
diff --git a/dubbo-dependencies-bom/pom.xml b/dubbo-dependencies-bom/pom.xml
index 43c4cc7167..0c0023c471 100644
--- a/dubbo-dependencies-bom/pom.xml
+++ b/dubbo-dependencies-bom/pom.xml
@@ -134,7 +134,8 @@
         <protostuff_version>1.8.0</protostuff_version>
         <envoy_api_version>0.1.35</envoy_api_version>
         <micrometer.version>1.11.1</micrometer.version>
-
+        <opentelemetry.version>1.26.0</opentelemetry.version>
+        <zipkin-reporter.version>2.16.4</zipkin-reporter.version>
         <micrometer-tracing.version>1.1.2</micrometer-tracing.version>
         <t_digest.version>3.3</t_digest.version>
         <prometheus_client.version>0.16.0</prometheus_client.version>
@@ -231,6 +232,20 @@
                 <type>pom</type>
                 <scope>import</scope>
             </dependency>
+            <dependency>
+                <groupId>io.opentelemetry</groupId>
+                <artifactId>opentelemetry-bom</artifactId>
+                <version>${opentelemetry.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+            <dependency>
+                <groupId>io.zipkin.reporter2</groupId>
+                <artifactId>zipkin-reporter-bom</artifactId>
+                <version>${zipkin-reporter.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
             <dependency>
                 <groupId>io.netty</groupId>
                 <artifactId>netty-all</artifactId>
diff --git a/dubbo-distribution/dubbo-all/pom.xml 
b/dubbo-distribution/dubbo-all/pom.xml
index eb53379b6d..d647725897 100644
--- a/dubbo-distribution/dubbo-all/pom.xml
+++ b/dubbo-distribution/dubbo-all/pom.xml
@@ -219,6 +219,15 @@
             <optional>true</optional>
         </dependency>
 
+        <!-- tracing -->
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-tracing</artifactId>
+            <version>${project.version}</version>
+            <scope>compile</scope>
+            <optional>true</optional>
+        </dependency>
+
         <!-- monitor -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>
@@ -530,6 +539,7 @@
                                     
<include>org.apache.dubbo:dubbo-metrics-metadata</include>
                                     
<include>org.apache.dubbo:dubbo-metrics-config-center</include>
                                     
<include>org.apache.dubbo:dubbo-metrics-prometheus</include>
+                                    
<include>org.apache.dubbo:dubbo-tracing</include>
                                     
<include>org.apache.dubbo:dubbo-monitor-api</include>
                                     
<include>org.apache.dubbo:dubbo-monitor-default</include>
                                     
<include>org.apache.dubbo:dubbo-qos</include>
diff --git a/dubbo-distribution/dubbo-bom/pom.xml 
b/dubbo-distribution/dubbo-bom/pom.xml
index 967c6143a3..d7626c9f47 100644
--- a/dubbo-distribution/dubbo-bom/pom.xml
+++ b/dubbo-distribution/dubbo-bom/pom.xml
@@ -262,6 +262,13 @@
                 <version>${project.version}</version>
             </dependency>
 
+            <!-- tracing -->
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-tracing</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+
             <!-- monitor -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
diff --git a/dubbo-distribution/dubbo-core-spi/pom.xml 
b/dubbo-distribution/dubbo-core-spi/pom.xml
index 88939753e9..2a441485f8 100644
--- a/dubbo-distribution/dubbo-core-spi/pom.xml
+++ b/dubbo-distribution/dubbo-core-spi/pom.xml
@@ -134,6 +134,7 @@
                                     
<include>org.apache.dubbo:dubbo-metadata-api</include>
                                     
<include>org.apache.dubbo:dubbo-metrics-api</include>
                                     
<include>org.apache.dubbo:dubbo-metrics-default</include>
+                                    
<include>org.apache.dubbo:dubbo-tracing</include>
                                     
<include>org.apache.dubbo:dubbo-monitor-api</include>
                                     
<include>org.apache.dubbo:dubbo-registry-api</include>
                                     
<include>org.apache.dubbo:dubbo-remoting-api</include>
diff --git a/dubbo-metrics/dubbo-metrics-api/pom.xml 
b/dubbo-metrics/dubbo-metrics-api/pom.xml
index a35c238395..3c31ae389c 100644
--- a/dubbo-metrics/dubbo-metrics-api/pom.xml
+++ b/dubbo-metrics/dubbo-metrics-api/pom.xml
@@ -49,10 +49,5 @@
             <groupId>com.tdunning</groupId>
             <artifactId>t-digest</artifactId>
         </dependency>
-        <dependency>
-            <groupId>io.micrometer</groupId>
-            <artifactId>micrometer-tracing-integration-test</artifactId>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 </project>
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/aggregate/Pane.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/aggregate/Pane.java
old mode 100755
new mode 100644
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/aggregate/SlidingWindow.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/aggregate/SlidingWindow.java
old mode 100755
new mode 100644
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboServerContext.java
 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/utils/MetricsSupportUtil.java
similarity index 51%
copy from 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboServerContext.java
copy to 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/utils/MetricsSupportUtil.java
index bb1d7005d7..e0a02f5f04 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboServerContext.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/utils/MetricsSupportUtil.java
@@ -14,34 +14,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metrics.observation;
 
-import org.apache.dubbo.rpc.Invocation;
-import org.apache.dubbo.rpc.Invoker;
+package org.apache.dubbo.metrics.utils;
 
-import io.micrometer.observation.transport.ReceiverContext;
+import org.apache.dubbo.common.utils.ClassUtils;
 
-/**
- * Consumer context for RPC.
- */
-public class DubboServerContext extends ReceiverContext<Invocation> {
-
-    private final Invoker<?> invoker;
-
-    private final Invocation invocation;
+public class MetricsSupportUtil {
 
-    public DubboServerContext(Invoker<?> invoker, Invocation invocation) {
-        super((stringObjectMap, s) -> 
String.valueOf(stringObjectMap.getAttachment(s)));
-        this.invoker = invoker;
-        this.invocation = invocation;
-        setCarrier(invocation);
+    public static boolean isSupportMetrics() {
+        return isClassPresent("io.micrometer.core.instrument.MeterRegistry");
     }
 
-    public Invoker<?> getInvoker() {
-        return invoker;
+    public static boolean isSupportPrometheus() {
+        return isClassPresent("io.micrometer.prometheus.PrometheusConfig")
+                && 
isClassPresent("io.prometheus.client.exporter.BasicAuthHttpConnectionFactory")
+                && 
isClassPresent("io.prometheus.client.exporter.HttpConnectionFactory")
+                && isClassPresent("io.prometheus.client.exporter.PushGateway");
     }
 
-    public Invocation getInvocation() {
-        return invocation;
+    private static boolean isClassPresent(String className) {
+        return ClassUtils.isPresent(className, 
MetricsSupportUtil.class.getClassLoader());
     }
 }
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/aggregate/TimeWindowAggregatorTest.java
 
b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/aggregate/TimeWindowAggregatorTest.java
index e0db96730f..2a660a5dd4 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/aggregate/TimeWindowAggregatorTest.java
+++ 
b/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/aggregate/TimeWindowAggregatorTest.java
@@ -17,8 +17,9 @@
 
 package org.apache.dubbo.metrics.aggregate;
 
-import org.junit.Test;
+
 import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
 
 import java.util.concurrent.TimeUnit;
 
diff --git a/dubbo-metrics/dubbo-metrics-default/pom.xml 
b/dubbo-metrics/dubbo-metrics-default/pom.xml
index f9130bf7e1..fe00d02c96 100644
--- a/dubbo-metrics/dubbo-metrics-default/pom.xml
+++ b/dubbo-metrics/dubbo-metrics-default/pom.xml
@@ -48,10 +48,5 @@
             <artifactId>micrometer-test</artifactId>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>io.micrometer</groupId>
-            <artifactId>micrometer-tracing-integration-test</artifactId>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 </project>
diff --git 
a/dubbo-metrics/dubbo-metrics-default/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
 
b/dubbo-metrics/dubbo-metrics-default/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
index 5ee6c1d455..c169595307 100644
--- 
a/dubbo-metrics/dubbo-metrics-default/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
+++ 
b/dubbo-metrics/dubbo-metrics-default/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
@@ -1,2 +1 @@
-metrics-beta=org.apache.dubbo.metrics.filter.MetricsFilter
-observationreceiver=org.apache.dubbo.metrics.observation.ObservationReceiverFilter
\ No newline at end of file
+metrics-beta=org.apache.dubbo.metrics.filter.MetricsFilter
\ No newline at end of file
diff --git a/dubbo-cluster/pom.xml b/dubbo-metrics/dubbo-tracing/pom.xml
similarity index 57%
copy from dubbo-cluster/pom.xml
copy to dubbo-metrics/dubbo-tracing/pom.xml
index 130b7e3f7e..e50dae23bd 100644
--- a/dubbo-cluster/pom.xml
+++ b/dubbo-metrics/dubbo-tracing/pom.xml
@@ -14,82 +14,98 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+<project xmlns="http://maven.apache.org/POM/4.0.0";
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/xsd/maven-4.0.0.xsd";>
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>org.apache.dubbo</groupId>
-        <artifactId>dubbo-parent</artifactId>
+        <artifactId>dubbo-metrics</artifactId>
         <version>${revision}</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
-    <artifactId>dubbo-cluster</artifactId>
+
+    <artifactId>dubbo-tracing</artifactId>
     <packaging>jar</packaging>
     <name>${project.artifactId}</name>
-    <description>The cluster module of dubbo project</description>
+    <description>The tracing module of dubbo project</description>
+
     <properties>
+        <maven.compiler.source>11</maven.compiler.source>
+        <maven.compiler.target>11</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <skip_maven_deploy>false</skip_maven_deploy>
     </properties>
+
     <dependencies>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-rpc-api</artifactId>
+            <artifactId>dubbo-common</artifactId>
             <version>${project.parent.version}</version>
         </dependency>
         <dependency>
-            <groupId>org.yaml</groupId>
-            <artifactId>snakeyaml</artifactId>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-cluster</artifactId>
+            <version>${project.parent.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-rpc-injvm</artifactId>
+            <artifactId>dubbo-rpc-api</artifactId>
             <version>${project.parent.version}</version>
-            <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.curator</groupId>
-            <artifactId>curator-framework</artifactId>
-            <scope>test</scope>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metrics-default</artifactId>
+            <version>${project.parent.version}</version>
         </dependency>
+
+        <!-- micrometer -->
         <dependency>
-            <groupId>org.apache.zookeeper</groupId>
-            <artifactId>zookeeper</artifactId>
-            <scope>test</scope>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-core</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-hessian2</artifactId>
-            <version>${project.parent.version}</version>
-            <scope>test</scope>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-tracing</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-fastjson2</artifactId>
-            <version>${project.parent.version}</version>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-test</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-test-check</artifactId>
-            <version>${project.parent.version}</version>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-tracing-integration-test</artifactId>
             <scope>test</scope>
         </dependency>
+
+        <!-- bridge -->
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-metrics-registry</artifactId>
-            <version>${project.parent.version}</version>
-            <scope>compile</scope>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-tracing-bridge-otel</artifactId>
+            <optional>true</optional>
         </dependency>
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-metrics-default</artifactId>
-            <version>${project.parent.version}</version>
+            <groupId>io.micrometer</groupId>
+            <artifactId>micrometer-tracing-bridge-brave</artifactId>
             <optional>true</optional>
         </dependency>
+
+        <!-- exporter -->
         <dependency>
-            <groupId>io.micrometer</groupId>
-            <artifactId>micrometer-tracing-integration-test</artifactId>
-            <scope>test</scope>
+            <groupId>io.opentelemetry</groupId>
+            <artifactId>opentelemetry-exporter-zipkin</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>io.opentelemetry</groupId>
+            <artifactId>opentelemetry-exporter-otlp</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>io.zipkin.reporter2</groupId>
+            <artifactId>zipkin-reporter-brave</artifactId>
+            <optional>true</optional>
         </dependency>
     </dependencies>
-</project>
+</project>
\ No newline at end of file
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/AbstractDefaultDubboObservationConvention.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/AbstractDefaultDubboObservationConvention.java
similarity index 87%
rename from 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/AbstractDefaultDubboObservationConvention.java
rename to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/AbstractDefaultDubboObservationConvention.java
index 410af9d674..a688a4c826 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/AbstractDefaultDubboObservationConvention.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/AbstractDefaultDubboObservationConvention.java
@@ -14,20 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metrics.observation;
+package org.apache.dubbo.tracing;
+
+import io.micrometer.common.KeyValues;
+import io.micrometer.common.docs.KeyName;
+import io.micrometer.common.lang.Nullable;
 
 import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.rpc.Invocation;
 import org.apache.dubbo.rpc.support.RpcUtils;
 
-import io.micrometer.common.KeyValues;
-import io.micrometer.common.docs.KeyName;
-import io.micrometer.common.lang.Nullable;
-
-import static 
org.apache.dubbo.metrics.observation.DubboObservationDocumentation.LowCardinalityKeyNames.RPC_METHOD;
-import static 
org.apache.dubbo.metrics.observation.DubboObservationDocumentation.LowCardinalityKeyNames.RPC_SERVICE;
-import static 
org.apache.dubbo.metrics.observation.DubboObservationDocumentation.LowCardinalityKeyNames.RPC_SYSTEM;
+import static 
org.apache.dubbo.tracing.DubboObservationDocumentation.LowCardinalityKeyNames.RPC_METHOD;
+import static 
org.apache.dubbo.tracing.DubboObservationDocumentation.LowCardinalityKeyNames.RPC_SERVICE;
+import static 
org.apache.dubbo.tracing.DubboObservationDocumentation.LowCardinalityKeyNames.RPC_SYSTEM;
 
 class AbstractDefaultDubboObservationConvention {
     KeyValues getLowCardinalityKeyValues(Invocation invocation) {
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DefaultDubboClientObservationConvention.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DefaultDubboClientObservationConvention.java
similarity index 92%
rename from 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DefaultDubboClientObservationConvention.java
rename to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DefaultDubboClientObservationConvention.java
index 91e88da2a3..481861d1f9 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DefaultDubboClientObservationConvention.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DefaultDubboClientObservationConvention.java
@@ -14,19 +14,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metrics.observation;
+package org.apache.dubbo.tracing;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.RpcContext;
 import org.apache.dubbo.rpc.RpcContextAttachment;
+import org.apache.dubbo.tracing.context.DubboClientContext;
 
 import io.micrometer.common.KeyValues;
 
 import java.util.List;
 
-import static 
org.apache.dubbo.metrics.observation.DubboObservationDocumentation.LowCardinalityKeyNames.NET_PEER_NAME;
-import static 
org.apache.dubbo.metrics.observation.DubboObservationDocumentation.LowCardinalityKeyNames.NET_PEER_PORT;
+import static 
org.apache.dubbo.tracing.DubboObservationDocumentation.LowCardinalityKeyNames.NET_PEER_NAME;
+import static 
org.apache.dubbo.tracing.DubboObservationDocumentation.LowCardinalityKeyNames.NET_PEER_PORT;
 
 /**
  * Default implementation of the {@link DubboClientObservationConvention}.
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DefaultDubboServerObservationConvention.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DefaultDubboServerObservationConvention.java
similarity index 94%
rename from 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DefaultDubboServerObservationConvention.java
rename to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DefaultDubboServerObservationConvention.java
index adcebdbdac..c78be59806 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DefaultDubboServerObservationConvention.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DefaultDubboServerObservationConvention.java
@@ -14,7 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metrics.observation;
+package org.apache.dubbo.tracing;
+
+import org.apache.dubbo.tracing.context.DubboServerContext;
 
 import io.micrometer.common.KeyValues;
 
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboClientObservationConvention.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboClientObservationConvention.java
similarity index 92%
copy from 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboClientObservationConvention.java
copy to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboClientObservationConvention.java
index d33164294d..5bd74dec50 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboClientObservationConvention.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboClientObservationConvention.java
@@ -14,7 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metrics.observation;
+package org.apache.dubbo.tracing;
+
+import org.apache.dubbo.tracing.context.DubboClientContext;
 
 import io.micrometer.observation.Observation;
 import io.micrometer.observation.ObservationConvention;
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboObservationDocumentation.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboObservationDocumentation.java
similarity index 98%
rename from 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboObservationDocumentation.java
rename to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboObservationDocumentation.java
index 855a2e01e1..cd0dfe3d61 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboObservationDocumentation.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboObservationDocumentation.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metrics.observation;
+package org.apache.dubbo.tracing;
 
 import io.micrometer.common.docs.KeyName;
 import io.micrometer.common.lang.NonNullApi;
diff --git 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboObservationRegistry.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboObservationRegistry.java
new file mode 100644
index 0000000000..a8497d998b
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboObservationRegistry.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.tracing;
+
+import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
+import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.JsonUtils;
+import org.apache.dubbo.config.TracingConfig;
+import org.apache.dubbo.metrics.MetricsGlobalRegistry;
+import org.apache.dubbo.metrics.utils.MetricsSupportUtil;
+import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.tracing.tracer.PropagatorProvider;
+import org.apache.dubbo.tracing.tracer.PropagatorProviderFactory;
+import org.apache.dubbo.tracing.tracer.TracerProvider;
+import org.apache.dubbo.tracing.tracer.TracerProviderFactory;
+
+import static 
org.apache.dubbo.common.constants.LoggerCodeConstants.COMMON_NOT_FOUND_TRACER_DEPENDENCY;
+
+public class DubboObservationRegistry {
+
+    private static final ErrorTypeAwareLogger logger = 
LoggerFactory.getErrorTypeAwareLogger(DubboObservationRegistry.class);
+
+    private final ApplicationModel applicationModel;
+
+    private final TracingConfig tracingConfig;
+
+    public DubboObservationRegistry(ApplicationModel applicationModel, 
TracingConfig tracingConfig) {
+        this.applicationModel = applicationModel;
+        this.tracingConfig = tracingConfig;
+    }
+
+    public void initObservationRegistry() {
+        // If get ObservationRegistry.class from external(eg Spring.), use 
external.
+        io.micrometer.observation.ObservationRegistry 
externalObservationRegistry = 
applicationModel.getBeanFactory().getBean(io.micrometer.observation.ObservationRegistry.class);
+        if (externalObservationRegistry != null) {
+            if (logger.isDebugEnabled()) {
+                logger.debug("ObservationRegistry.class from external is 
existed.");
+            }
+            return;
+        }
+
+        if (logger.isDebugEnabled()) {
+            logger.debug("Tracing config is: " + 
JsonUtils.toJson(tracingConfig));
+        }
+
+        TracerProvider tracerProvider = 
TracerProviderFactory.getProvider(applicationModel, tracingConfig);
+        if (tracerProvider == null) {
+            logger.warn(COMMON_NOT_FOUND_TRACER_DEPENDENCY, "", "", "Can not 
found OpenTelemetry/Brave tracer dependencies, skip init ObservationRegistry.");
+            return;
+        }
+        // The real tracer will come from tracer implementation (OTel / Brave)
+        io.micrometer.tracing.Tracer tracer = tracerProvider.getTracer();
+
+        // The real propagator will come from tracer implementation (OTel / 
Brave)
+        PropagatorProvider propagatorProvider = 
PropagatorProviderFactory.getPropagatorProvider();
+        io.micrometer.tracing.propagation.Propagator propagator = 
propagatorProvider != null ? propagatorProvider.getPropagator() : 
io.micrometer.tracing.propagation.Propagator.NOOP;
+
+        io.micrometer.observation.ObservationRegistry registry = 
io.micrometer.observation.ObservationRegistry.create();
+        registry.observationConfig()
+                // set up a first matching handler that creates spans - it 
comes from Micrometer Tracing.
+                // set up spans for sending and receiving data over the wire 
and a default one.
+                .observationHandler(new 
io.micrometer.observation.ObservationHandler.FirstMatchingCompositeObservationHandler(
+                        new 
io.micrometer.tracing.handler.PropagatingSenderTracingObservationHandler<>(tracer,
 propagator),
+                        new 
io.micrometer.tracing.handler.PropagatingReceiverTracingObservationHandler<>(tracer,
 propagator),
+                        new 
io.micrometer.tracing.handler.DefaultTracingObservationHandler(tracer)));
+
+        if (MetricsSupportUtil.isSupportMetrics()) {
+            io.micrometer.core.instrument.MeterRegistry meterRegistry = 
MetricsGlobalRegistry.getCompositeRegistry(applicationModel);
+            registry.observationConfig().observationHandler(new 
io.micrometer.core.instrument.observation.DefaultMeterObservationHandler(meterRegistry));
+        }
+
+        applicationModel.getBeanFactory().registerBean(registry);
+        applicationModel.getBeanFactory().registerBean(tracer);
+        applicationModel.getBeanFactory().registerBean(propagator);
+    }
+}
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboServerObservationConvention.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboServerObservationConvention.java
similarity index 92%
rename from 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboServerObservationConvention.java
rename to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboServerObservationConvention.java
index 678226ee7f..0f7917aded 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboServerObservationConvention.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/DubboServerObservationConvention.java
@@ -14,7 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metrics.observation;
+package org.apache.dubbo.tracing;
+
+import org.apache.dubbo.tracing.context.DubboServerContext;
 
 import io.micrometer.observation.Observation;
 import io.micrometer.observation.ObservationConvention;
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboClientContext.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/context/DubboClientContext.java
similarity index 97%
rename from 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboClientContext.java
rename to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/context/DubboClientContext.java
index 910d6f74c0..f1998bc91a 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboClientContext.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/context/DubboClientContext.java
@@ -14,14 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metrics.observation;
+package org.apache.dubbo.tracing.context;
 
-import org.apache.dubbo.rpc.Invocation;
-import org.apache.dubbo.rpc.Invoker;
+import java.util.Objects;
 
 import io.micrometer.observation.transport.SenderContext;
-
-import java.util.Objects;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
 
 /**
  * Provider context for RPC.
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboServerContext.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/context/DubboServerContext.java
similarity index 97%
rename from 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboServerContext.java
rename to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/context/DubboServerContext.java
index bb1d7005d7..3e5bd13fae 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboServerContext.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/context/DubboServerContext.java
@@ -14,13 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metrics.observation;
+package org.apache.dubbo.tracing.context;
 
+import io.micrometer.observation.transport.ReceiverContext;
 import org.apache.dubbo.rpc.Invocation;
 import org.apache.dubbo.rpc.Invoker;
 
-import io.micrometer.observation.transport.ReceiverContext;
-
 /**
  * Consumer context for RPC.
  */
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporter.java
similarity index 66%
copy from 
dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java
copy to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporter.java
index a605527190..9b8f12ee4b 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporter.java
@@ -14,22 +14,24 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.config.nested;
+package org.apache.dubbo.tracing.exporter;
 
-import java.io.Serializable;
+import brave.handler.SpanHandler;
+import io.opentelemetry.sdk.trace.export.SpanExporter;
 
-public class SamplingConfig implements Serializable {
+public interface TraceExporter {
 
     /**
-     * Probability in the range from 0.0 to 1.0 that a trace will be sampled.
+     * for otel
+     *
+     * @return
      */
-    private float probability = 0.10f;
+    SpanExporter getSpanExporter();
 
-    public float getProbability() {
-        return this.probability;
-    }
-
-    public void setProbability(float probability) {
-        this.probability = probability;
-    }
+    /**
+     * for brave
+     *
+     * @return
+     */
+    SpanHandler getSpanHandler();
 }
diff --git 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporterFactory.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporterFactory.java
new file mode 100644
index 0000000000..7327cf038e
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporterFactory.java
@@ -0,0 +1,66 @@
+/*
+ * 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.tracing.exporter;
+
+import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
+import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.config.nested.ExporterConfig;
+import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.tracing.exporter.otlp.OTlpExporter;
+import org.apache.dubbo.tracing.exporter.zipkin.ZipkinExporter;
+
+import brave.handler.SpanHandler;
+import io.opentelemetry.sdk.trace.export.SpanExporter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class TraceExporterFactory {
+
+    private final static ErrorTypeAwareLogger LOGGER = 
LoggerFactory.getErrorTypeAwareLogger(TraceExporterFactory.class);
+
+    /**
+     * for OTel
+     */
+    public static List<SpanExporter> getSpanExporters(ApplicationModel 
applicationModel, ExporterConfig exporterConfig) {
+        ExporterConfig.ZipkinConfig zipkinConfig = 
exporterConfig.getZipkinConfig();
+        ExporterConfig.OtlpConfig otlpConfig = exporterConfig.getOtlpConfig();
+        List<SpanExporter> res = new ArrayList<>();
+        if (zipkinConfig != null && 
StringUtils.isNotEmpty(zipkinConfig.getEndpoint())) {
+            ZipkinExporter zipkinExporter = new 
ZipkinExporter(applicationModel, zipkinConfig);
+            LOGGER.info("Create zipkin span exporter.");
+            res.add(zipkinExporter.getSpanExporter());
+        }
+        if (otlpConfig != null && 
StringUtils.isNotEmpty(otlpConfig.getEndpoint())) {
+            OTlpExporter otlpExporter = new OTlpExporter(applicationModel, 
otlpConfig);
+            LOGGER.info("Create OTlp span exporter.");
+            res.add(otlpExporter.getSpanExporter());
+        }
+
+        return res;
+    }
+
+    /**
+     * for Brave
+     */
+    public static List<SpanHandler> getSpanHandlers(ApplicationModel 
applicationModel, ExporterConfig exporterConfig) {
+        List<SpanHandler> res = new ArrayList<>();
+        // TODO brave SpanHandler impl
+        return res;
+    }
+}
diff --git 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/otlp/OTlpExporter.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/otlp/OTlpExporter.java
new file mode 100644
index 0000000000..72da78a795
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/otlp/OTlpExporter.java
@@ -0,0 +1,66 @@
+/*
+ * 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.tracing.exporter.otlp;
+
+import org.apache.dubbo.config.nested.ExporterConfig;
+import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.tracing.exporter.TraceExporter;
+
+import brave.handler.SpanHandler;
+import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter;
+import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
+import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder;
+import io.opentelemetry.sdk.trace.export.SpanExporter;
+
+import java.util.Map;
+
+public class OTlpExporter implements TraceExporter {
+
+    private final ApplicationModel applicationModel;
+    private final ExporterConfig.OtlpConfig otlpConfig;
+
+    public OTlpExporter(ApplicationModel applicationModel, 
ExporterConfig.OtlpConfig otlpConfig) {
+        this.applicationModel = applicationModel;
+        this.otlpConfig = otlpConfig;
+    }
+
+    @Override
+    public SpanExporter getSpanExporter() {
+        OtlpGrpcSpanExporter externalOTlpGrpcSpanExporter = 
applicationModel.getBeanFactory().getBean(OtlpGrpcSpanExporter.class);
+        if (externalOTlpGrpcSpanExporter != null) {
+            return externalOTlpGrpcSpanExporter;
+        }
+        OtlpHttpSpanExporter externalOtlpHttpSpanExporter = 
applicationModel.getBeanFactory().getBean(OtlpHttpSpanExporter.class);
+        if (externalOtlpHttpSpanExporter != null) {
+            return externalOtlpHttpSpanExporter;
+        }
+        OtlpGrpcSpanExporterBuilder builder = OtlpGrpcSpanExporter.builder()
+                .setEndpoint(otlpConfig.getEndpoint())
+                .setTimeout(otlpConfig.getTimeout())
+                .setCompression(otlpConfig.getCompressionMethod());
+        for (Map.Entry<String, String> entry : 
otlpConfig.getHeaders().entrySet()) {
+            builder.addHeader(entry.getKey(), entry.getValue());
+        }
+        return builder.build();
+    }
+
+    @Override
+    public SpanHandler getSpanHandler() {
+        // OTlp is only belong to OTel.
+        return null;
+    }
+}
diff --git 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinExporter.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinExporter.java
new file mode 100644
index 0000000000..c0c00c6fa8
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinExporter.java
@@ -0,0 +1,60 @@
+/*
+ * 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.tracing.exporter.zipkin;
+
+import org.apache.dubbo.config.nested.ExporterConfig;
+import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.tracing.exporter.TraceExporter;
+
+import brave.handler.SpanHandler;
+import io.opentelemetry.exporter.zipkin.ZipkinSpanExporter;
+import io.opentelemetry.sdk.trace.export.SpanExporter;
+import zipkin2.Span;
+import zipkin2.codec.BytesEncoder;
+import zipkin2.codec.SpanBytesEncoder;
+
+public class ZipkinExporter implements TraceExporter {
+
+    private final ApplicationModel applicationModel;
+    private final ExporterConfig.ZipkinConfig zipkinConfig;
+
+    public ZipkinExporter(ApplicationModel applicationModel, 
ExporterConfig.ZipkinConfig zipkinConfig) {
+        this.applicationModel = applicationModel;
+        this.zipkinConfig = zipkinConfig;
+    }
+
+    @Override
+    public SpanExporter getSpanExporter() {
+        BytesEncoder<Span> encoder = getSpanBytesEncoder();
+        return ZipkinSpanExporter.builder()
+                .setEncoder(encoder)
+                .setEndpoint(zipkinConfig.getEndpoint())
+                .setReadTimeout(zipkinConfig.getReadTimeout())
+                .build();
+    }
+
+    @Override
+    public SpanHandler getSpanHandler() {
+        // TODO SpanHandler of Brave impl
+        return null;
+    }
+
+    private BytesEncoder<Span> getSpanBytesEncoder() {
+        BytesEncoder<Span> encoder = 
applicationModel.getBeanFactory().getBean(BytesEncoder.class);
+        return encoder == null ? SpanBytesEncoder.JSON_V2 : encoder;
+    }
+}
diff --git 
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/observation/ObservationReceiverFilter.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/filter/ObservationReceiverFilter.java
similarity index 80%
rename from 
dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/observation/ObservationReceiverFilter.java
rename to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/filter/ObservationReceiverFilter.java
index 5a33ced437..25b7008c67 100644
--- 
a/dubbo-metrics/dubbo-metrics-default/src/main/java/org/apache/dubbo/metrics/observation/ObservationReceiverFilter.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/filter/ObservationReceiverFilter.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metrics.observation;
+package org.apache.dubbo.tracing.filter;
 
 import org.apache.dubbo.common.extension.Activate;
 import org.apache.dubbo.rpc.BaseFilter;
@@ -25,6 +25,10 @@ import org.apache.dubbo.rpc.Result;
 import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ScopeModelAware;
+import org.apache.dubbo.tracing.DefaultDubboServerObservationConvention;
+import org.apache.dubbo.tracing.DubboObservationDocumentation;
+import org.apache.dubbo.tracing.DubboServerObservationConvention;
+import org.apache.dubbo.tracing.context.DubboServerContext;
 
 import io.micrometer.observation.Observation;
 import io.micrometer.observation.ObservationRegistry;
@@ -34,7 +38,7 @@ import static 
org.apache.dubbo.common.constants.CommonConstants.PROVIDER;
 /**
  * A {@link Filter} that creates an {@link Observation} around the incoming 
message.
  */
-@Activate(group = PROVIDER, order = -1, onClass = 
"io.micrometer.observation.NoopObservationRegistry")
+@Activate(group = PROVIDER, order = Integer.MIN_VALUE + 50, onClass = 
"io.micrometer.observation.NoopObservationRegistry")
 public class ObservationReceiverFilter implements Filter, BaseFilter.Listener, 
ScopeModelAware {
 
     private ObservationRegistry observationRegistry;
@@ -42,12 +46,8 @@ public class ObservationReceiverFilter implements Filter, 
BaseFilter.Listener, S
     private DubboServerObservationConvention serverObservationConvention;
 
     public ObservationReceiverFilter(ApplicationModel applicationModel) {
-        
applicationModel.getApplicationConfigManager().getTracing().ifPresent(cfg -> {
-            if (Boolean.TRUE.equals(cfg.getEnabled())) {
-                observationRegistry = 
applicationModel.getBeanFactory().getBean(ObservationRegistry.class);
-                serverObservationConvention = 
applicationModel.getBeanFactory().getBean(DubboServerObservationConvention.class);
-            }
-        });
+        observationRegistry = 
applicationModel.getBeanFactory().getBean(ObservationRegistry.class);
+        serverObservationConvention = 
applicationModel.getBeanFactory().getBean(DubboServerObservationConvention.class);
     }
 
     @Override
@@ -70,6 +70,9 @@ public class ObservationReceiverFilter implements Filter, 
BaseFilter.Listener, S
         if (observation == null) {
             return;
         }
+        if (appResponse != null && appResponse.hasException()) {
+            observation.error(appResponse.getException());
+        }
         observation.stop();
     }
 
diff --git 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/filter/support/ObservationSenderFilter.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/filter/ObservationSenderFilter.java
similarity index 78%
rename from 
dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/filter/support/ObservationSenderFilter.java
rename to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/filter/ObservationSenderFilter.java
index 233a5ed35b..bce47b7b9a 100644
--- 
a/dubbo-cluster/src/main/java/org/apache/dubbo/rpc/cluster/filter/support/ObservationSenderFilter.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/filter/ObservationSenderFilter.java
@@ -14,13 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.rpc.cluster.filter.support;
+package org.apache.dubbo.tracing.filter;
 
 import org.apache.dubbo.common.extension.Activate;
-import 
org.apache.dubbo.metrics.observation.DefaultDubboClientObservationConvention;
-import org.apache.dubbo.metrics.observation.DubboClientContext;
-import org.apache.dubbo.metrics.observation.DubboClientObservationConvention;
-import org.apache.dubbo.metrics.observation.DubboObservationDocumentation;
 import org.apache.dubbo.rpc.BaseFilter;
 import org.apache.dubbo.rpc.Filter;
 import org.apache.dubbo.rpc.Invocation;
@@ -30,6 +26,10 @@ import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.rpc.cluster.filter.ClusterFilter;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.rpc.model.ScopeModelAware;
+import org.apache.dubbo.tracing.DefaultDubboClientObservationConvention;
+import org.apache.dubbo.tracing.DubboClientObservationConvention;
+import org.apache.dubbo.tracing.DubboObservationDocumentation;
+import org.apache.dubbo.tracing.context.DubboClientContext;
 
 import io.micrometer.observation.Observation;
 import io.micrometer.observation.ObservationRegistry;
@@ -39,7 +39,7 @@ import static 
org.apache.dubbo.common.constants.CommonConstants.CONSUMER;
 /**
  * A {@link Filter} that creates an {@link Observation} around the outgoing 
message.
  */
-@Activate(group = CONSUMER, order = -1, onClass = 
"io.micrometer.observation.NoopObservationRegistry")
+@Activate(group = CONSUMER, order = Integer.MIN_VALUE + 50, onClass = 
"io.micrometer.observation.NoopObservationRegistry")
 public class ObservationSenderFilter implements ClusterFilter, 
BaseFilter.Listener, ScopeModelAware {
 
     private ObservationRegistry observationRegistry;
@@ -47,12 +47,8 @@ public class ObservationSenderFilter implements 
ClusterFilter, BaseFilter.Listen
     private DubboClientObservationConvention clientObservationConvention;
 
     public ObservationSenderFilter(ApplicationModel applicationModel) {
-        
applicationModel.getApplicationConfigManager().getTracing().ifPresent(cfg -> {
-            if (Boolean.TRUE.equals(cfg.getEnabled())) {
-                observationRegistry = 
applicationModel.getBeanFactory().getBean(ObservationRegistry.class);
-                clientObservationConvention = 
applicationModel.getBeanFactory().getBean(DubboClientObservationConvention.class);
-            }
-        });
+        observationRegistry = 
applicationModel.getBeanFactory().getBean(ObservationRegistry.class);
+        clientObservationConvention = 
applicationModel.getBeanFactory().getBean(DubboClientObservationConvention.class);
     }
 
     @Override
@@ -75,6 +71,9 @@ public class ObservationSenderFilter implements 
ClusterFilter, BaseFilter.Listen
         if (observation == null) {
             return;
         }
+        if (appResponse != null && appResponse.hasException()) {
+            observation.error(appResponse.getException());
+        }
         observation.stop();
     }
 
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/PropagatorProvider.java
similarity index 66%
copy from 
dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java
copy to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/PropagatorProvider.java
index a605527190..dc9b58f4e0 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/PropagatorProvider.java
@@ -14,22 +14,16 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.config.nested;
+package org.apache.dubbo.tracing.tracer;
 
-import java.io.Serializable;
+import io.micrometer.tracing.propagation.Propagator;
 
-public class SamplingConfig implements Serializable {
+public interface PropagatorProvider {
 
     /**
-     * Probability in the range from 0.0 to 1.0 that a trace will be sampled.
+     * The real propagator will come from tracer implementation (OTel / Brave)
+     *
+     * @return Propagator
      */
-    private float probability = 0.10f;
-
-    public float getProbability() {
-        return this.probability;
-    }
-
-    public void setProbability(float probability) {
-        this.probability = probability;
-    }
+    Propagator getPropagator();
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/PropagationConfig.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/PropagatorProviderFactory.java
similarity index 54%
copy from 
dubbo-common/src/main/java/org/apache/dubbo/config/nested/PropagationConfig.java
copy to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/PropagatorProviderFactory.java
index 8e52353323..066cb7ad63 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/PropagationConfig.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/PropagatorProviderFactory.java
@@ -14,27 +14,24 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.config.nested;
+package org.apache.dubbo.tracing.tracer;
 
-import java.io.Serializable;
+import org.apache.dubbo.tracing.tracer.brave.BravePropagatorProvider;
+import org.apache.dubbo.tracing.tracer.otel.OTelPropagatorProvider;
+import org.apache.dubbo.tracing.utils.ObservationSupportUtil;
 
-public class PropagationConfig implements Serializable {
+public class PropagatorProviderFactory {
 
-    public static final String B3 = "B3";
+    public static PropagatorProvider getPropagatorProvider() {
+        // If support OTel firstly, return OTel, then Brave.
+        if (ObservationSupportUtil.isSupportOTelTracer()) {
+            return new OTelPropagatorProvider();
+        }
 
-    public static final String W3C = "W3C";
+        if (ObservationSupportUtil.isSupportBraveTracer()) {
+            return new BravePropagatorProvider();
+        }
 
-    /**
-     * Tracing context propagation type.
-     */
-    private String type = W3C;
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
+        return null;
     }
-
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/TracerProvider.java
similarity index 66%
copy from 
dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java
copy to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/TracerProvider.java
index a605527190..05305ada67 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/TracerProvider.java
@@ -14,22 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.config.nested;
+package org.apache.dubbo.tracing.tracer;
 
-import java.io.Serializable;
+import io.micrometer.tracing.Tracer;
 
-public class SamplingConfig implements Serializable {
+public interface TracerProvider {
 
     /**
-     * Probability in the range from 0.0 to 1.0 that a trace will be sampled.
+     * Tracer of Micrometer. The real tracer will come from tracer 
implementation (OTel / Brave)
+     *
+     * @return Tracer
      */
-    private float probability = 0.10f;
+    Tracer getTracer();
 
-    public float getProbability() {
-        return this.probability;
-    }
-
-    public void setProbability(float probability) {
-        this.probability = probability;
-    }
 }
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/TracerProviderFactory.java
similarity index 52%
copy from 
dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
copy to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/TracerProviderFactory.java
index 434fb55f17..7e325809cb 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/TracerProviderFactory.java
@@ -14,19 +14,26 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.dubbo.tracing.tracer;
 
-package org.apache.dubbo.config.deploy;
-
-import org.apache.dubbo.common.utils.Assert;
+import org.apache.dubbo.config.TracingConfig;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.tracing.tracer.brave.BraveProvider;
+import org.apache.dubbo.tracing.tracer.otel.OpenTelemetryProvider;
+import org.apache.dubbo.tracing.utils.ObservationSupportUtil;
+
+public class TracerProviderFactory {
 
-import org.junit.jupiter.api.Test;
+    public static TracerProvider getProvider(ApplicationModel 
applicationModel, TracingConfig tracingConfig) {
+        // If support OTel firstly, return OTel, then Brave.
+        if (ObservationSupportUtil.isSupportOTelTracer()) {
+            return new OpenTelemetryProvider(applicationModel, tracingConfig);
+        }
 
-class DefaultApplicationDeployerTest {
+        if (ObservationSupportUtil.isSupportBraveTracer()) {
+            return new BraveProvider(applicationModel, tracingConfig);
+        }
 
-    @Test
-    void isSupportPrometheus() {
-        boolean supportPrometheus = new 
DefaultApplicationDeployer(ApplicationModel.defaultModel()).isSupportPrometheus();
-        
Assert.assertTrue(supportPrometheus,"DefaultApplicationDeployer.isSupportPrometheus()
 should return true");
+        return null;
     }
 }
diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java
similarity index 65%
copy from 
dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java
copy to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java
index a605527190..8560a5b149 100644
--- 
a/dubbo-common/src/main/java/org/apache/dubbo/config/nested/SamplingConfig.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java
@@ -14,22 +14,18 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.config.nested;
+package org.apache.dubbo.tracing.tracer.brave;
 
-import java.io.Serializable;
+import org.apache.dubbo.tracing.tracer.PropagatorProvider;
 
-public class SamplingConfig implements Serializable {
+import io.micrometer.tracing.propagation.Propagator;
 
-    /**
-     * Probability in the range from 0.0 to 1.0 that a trace will be sampled.
-     */
-    private float probability = 0.10f;
 
-    public float getProbability() {
-        return this.probability;
-    }
+public class BravePropagatorProvider implements PropagatorProvider {
 
-    public void setProbability(float probability) {
-        this.probability = probability;
+    @Override
+    public Propagator getPropagator() {
+        // TODO impl
+        return null;
     }
 }
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BraveProvider.java
similarity index 58%
copy from 
dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
copy to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BraveProvider.java
index 434fb55f17..9ab8172b02 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BraveProvider.java
@@ -14,19 +14,28 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
+package org.apache.dubbo.tracing.tracer.brave;
 
-package org.apache.dubbo.config.deploy;
-
-import org.apache.dubbo.common.utils.Assert;
+import org.apache.dubbo.config.TracingConfig;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.tracing.tracer.TracerProvider;
+
+import io.micrometer.tracing.Tracer;
+
 
-import org.junit.jupiter.api.Test;
+public class BraveProvider implements TracerProvider {
 
-class DefaultApplicationDeployerTest {
+    private final ApplicationModel applicationModel;
+    private final TracingConfig tracingConfig;
+
+    public BraveProvider(ApplicationModel applicationModel, TracingConfig 
tracingConfig) {
+        this.applicationModel = applicationModel;
+        this.tracingConfig = tracingConfig;
+    }
 
-    @Test
-    void isSupportPrometheus() {
-        boolean supportPrometheus = new 
DefaultApplicationDeployer(ApplicationModel.defaultModel()).isSupportPrometheus();
-        
Assert.assertTrue(supportPrometheus,"DefaultApplicationDeployer.isSupportPrometheus()
 should return true");
+    @Override
+    public Tracer getTracer() {
+        // TODO impl
+        return null;
     }
 }
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboClientObservationConvention.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProvider.java
similarity index 54%
rename from 
dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboClientObservationConvention.java
rename to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProvider.java
index d33164294d..9f537f1e4d 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/main/java/org/apache/dubbo/metrics/observation/DubboClientObservationConvention.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProvider.java
@@ -14,17 +14,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metrics.observation;
+package org.apache.dubbo.tracing.tracer.otel;
 
-import io.micrometer.observation.Observation;
-import io.micrometer.observation.ObservationConvention;
+import org.apache.dubbo.tracing.tracer.PropagatorProvider;
+
+import io.micrometer.tracing.otel.bridge.OtelPropagator;
+import io.micrometer.tracing.propagation.Propagator;
+import io.opentelemetry.api.trace.Tracer;
+import io.opentelemetry.context.propagation.ContextPropagators;
+
+public class OTelPropagatorProvider implements PropagatorProvider {
+
+    private static Propagator propagator;
 
-/**
- * {@link ObservationConvention} for a {@link DubboClientContext}.
- */
-public interface DubboClientObservationConvention extends 
ObservationConvention<DubboClientContext> {
     @Override
-    default boolean supportsContext(Observation.Context context) {
-        return context instanceof DubboClientContext;
+    public Propagator getPropagator() {
+        return propagator;
+    }
+
+    protected static void createMicrometerPropagator(ContextPropagators 
contextPropagators, Tracer tracer) {
+        propagator = new OtelPropagator(contextPropagators, tracer);
     }
 }
diff --git 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/otel/OpenTelemetryProvider.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/otel/OpenTelemetryProvider.java
new file mode 100644
index 0000000000..36b3c3f191
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/otel/OpenTelemetryProvider.java
@@ -0,0 +1,212 @@
+/*
+ * 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.tracing.tracer.otel;
+
+import org.apache.dubbo.common.Version;
+import org.apache.dubbo.common.lang.Nullable;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.TracingConfig;
+import org.apache.dubbo.config.nested.BaggageConfig;
+import org.apache.dubbo.config.nested.PropagationConfig;
+import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.tracing.exporter.TraceExporterFactory;
+import org.apache.dubbo.tracing.tracer.TracerProvider;
+
+import io.micrometer.tracing.Tracer;
+import io.micrometer.tracing.otel.bridge.CompositeSpanExporter;
+import io.micrometer.tracing.otel.bridge.EventListener;
+import io.micrometer.tracing.otel.bridge.EventPublishingContextWrapper;
+import io.micrometer.tracing.otel.bridge.OtelBaggageManager;
+import io.micrometer.tracing.otel.bridge.OtelCurrentTraceContext;
+import io.micrometer.tracing.otel.bridge.OtelTracer;
+import io.micrometer.tracing.otel.bridge.Slf4JBaggageEventListener;
+import io.micrometer.tracing.otel.bridge.Slf4JEventListener;
+import io.micrometer.tracing.otel.propagation.BaggageTextMapPropagator;
+import io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator;
+import io.opentelemetry.api.common.Attributes;
+import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
+import io.opentelemetry.context.ContextStorage;
+import io.opentelemetry.context.propagation.ContextPropagators;
+import io.opentelemetry.context.propagation.TextMapPropagator;
+import io.opentelemetry.extension.trace.propagation.B3Propagator;
+import io.opentelemetry.sdk.OpenTelemetrySdk;
+import io.opentelemetry.sdk.resources.Resource;
+import io.opentelemetry.sdk.trace.SdkTracerProvider;
+import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
+import io.opentelemetry.sdk.trace.export.SpanExporter;
+import io.opentelemetry.sdk.trace.samplers.Sampler;
+import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+public class OpenTelemetryProvider implements TracerProvider {
+
+    private static final String DEFAULT_APPLICATION_NAME = "dubbo-application";
+    private final ApplicationModel applicationModel;
+    private final TracingConfig tracingConfig;
+
+    private OTelEventPublisher publisher;
+    private OtelCurrentTraceContext otelCurrentTraceContext;
+
+    public OpenTelemetryProvider(ApplicationModel applicationModel, 
TracingConfig tracingConfig) {
+        this.applicationModel = applicationModel;
+        this.tracingConfig = tracingConfig;
+    }
+
+    @Override
+    public Tracer getTracer() {
+        // [OTel component] SpanExporter is a component that gets called when 
a span is finished.
+        List<SpanExporter> spanExporters = 
TraceExporterFactory.getSpanExporters(applicationModel, 
tracingConfig.getTracingExporter());
+
+        String applicationName = 
applicationModel.getApplicationConfigManager().getApplication()
+                .map(ApplicationConfig::getName)
+                .orElse(DEFAULT_APPLICATION_NAME);
+
+        this.publisher = new OTelEventPublisher(getEventListeners());
+
+        // [Micrometer Tracing component] A Micrometer Tracing wrapper for OTel
+        this.otelCurrentTraceContext = createCurrentTraceContext();
+
+        // [OTel component] SdkTracerProvider is an SDK implementation for 
TracerProvider
+        SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
+                .setSampler(getSampler())
+                
.setResource(Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, 
applicationName)))
+                .addSpanProcessor(BatchSpanProcessor
+                        .builder(new CompositeSpanExporter(spanExporters, 
null, null, null))
+                        .build())
+                .build();
+
+        ContextPropagators otelContextPropagators = 
createOtelContextPropagators();
+
+        // [OTel component] The SDK implementation of OpenTelemetry
+        OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()
+                .setTracerProvider(sdkTracerProvider)
+                .setPropagators(otelContextPropagators)
+                .build();
+
+        // [OTel component] Tracer is a component that handles the life-cycle 
of a span
+        io.opentelemetry.api.trace.Tracer otelTracer = 
openTelemetrySdk.getTracerProvider()
+                .get("org.apache.dubbo", Version.getVersion());
+
+        
OTelPropagatorProvider.createMicrometerPropagator(otelContextPropagators, 
otelTracer);
+
+        // [Micrometer Tracing component] A Micrometer Tracing wrapper for 
OTel's Tracer.
+        return new OtelTracer(otelTracer, otelCurrentTraceContext, publisher,
+                new OtelBaggageManager(otelCurrentTraceContext,
+                        tracingConfig.getBaggage().getRemoteFields(),
+                        Collections.emptyList()));
+    }
+
+    /**
+     * sampler with probability
+     *
+     * @return sampler
+     */
+    private Sampler getSampler() {
+        Sampler rootSampler = 
Sampler.traceIdRatioBased(tracingConfig.getSampling().getProbability());
+        return Sampler.parentBased(rootSampler);
+    }
+
+    private List<EventListener> getEventListeners() {
+        List<EventListener> listeners = new ArrayList<>();
+
+        // [Micrometer Tracing component] A Micrometer Tracing listener for 
setting up MDC.
+        Slf4JEventListener slf4JEventListener = new Slf4JEventListener();
+        listeners.add(slf4JEventListener);
+
+        if (tracingConfig.getBaggage().getEnabled()) {
+            // [Micrometer Tracing component] A Micrometer Tracing listener 
for setting Baggage in MDC.
+            // Customizable with correlation fields.
+            Slf4JBaggageEventListener slf4JBaggageEventListener = new 
Slf4JBaggageEventListener(tracingConfig.getBaggage().getCorrelation().getFields());
+            listeners.add(slf4JBaggageEventListener);
+        }
+
+        return listeners;
+    }
+
+    private OtelCurrentTraceContext createCurrentTraceContext() {
+        ContextStorage.addWrapper(new 
EventPublishingContextWrapper(publisher));
+        return new OtelCurrentTraceContext();
+    }
+
+    private ContextPropagators createOtelContextPropagators() {
+        return ContextPropagators.create(
+                TextMapPropagator.composite(
+                        
PropagatorFactory.getPropagator(tracingConfig.getPropagation(),
+                                tracingConfig.getBaggage(),
+                                otelCurrentTraceContext
+                        )));
+    }
+
+    static class OTelEventPublisher implements OtelTracer.EventPublisher {
+
+        private final List<EventListener> listeners;
+
+        OTelEventPublisher(List<EventListener> listeners) {
+            this.listeners = listeners;
+        }
+
+        @Override
+        public void publishEvent(Object event) {
+            for (EventListener listener : this.listeners) {
+                listener.onEvent(event);
+            }
+        }
+    }
+
+    static class PropagatorFactory {
+
+        public static TextMapPropagator getPropagator(PropagationConfig 
propagationConfig,
+                                                      @Nullable BaggageConfig 
baggageConfig,
+                                                      @Nullable 
OtelCurrentTraceContext currentTraceContext) {
+            if (baggageConfig == null || !baggageConfig.getEnabled()) {
+                return getPropagatorWithoutBaggage(propagationConfig);
+            }
+            return getPropagatorWithBaggage(propagationConfig, baggageConfig, 
currentTraceContext);
+        }
+
+        private static TextMapPropagator 
getPropagatorWithoutBaggage(PropagationConfig propagationConfig) {
+            String type = propagationConfig.getType();
+            if ("B3".equals(type)) {
+                return B3Propagator.injectingSingleHeader();
+            } else if ("W3C".equals(type)) {
+                return W3CTraceContextPropagator.getInstance();
+            }
+            return TextMapPropagator.noop();
+        }
+
+        private static TextMapPropagator 
getPropagatorWithBaggage(PropagationConfig propagationConfig,
+                                                                  
BaggageConfig baggageConfig,
+                                                                  
OtelCurrentTraceContext currentTraceContext) {
+            String type = propagationConfig.getType();
+            if ("B3".equals(type)) {
+                List<String> remoteFields = baggageConfig.getRemoteFields();
+                return 
TextMapPropagator.composite(B3Propagator.injectingSingleHeader(),
+                        new BaggageTextMapPropagator(remoteFields,
+                                new OtelBaggageManager(currentTraceContext, 
remoteFields, Collections.emptyList())));
+            } else if ("W3C".equals(type)) {
+                List<String> remoteFields = baggageConfig.getRemoteFields();
+                return 
TextMapPropagator.composite(W3CTraceContextPropagator.getInstance(),
+                        W3CBaggagePropagator.getInstance(), new 
BaggageTextMapPropagator(remoteFields,
+                                new OtelBaggageManager(currentTraceContext, 
remoteFields, Collections.emptyList())));
+            }
+            return TextMapPropagator.noop();
+        }
+    }
+}
diff --git 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/utils/ObservationSupportUtil.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/utils/ObservationSupportUtil.java
new file mode 100644
index 0000000000..4cf8e05edf
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/utils/ObservationSupportUtil.java
@@ -0,0 +1,49 @@
+/*
+ * 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.tracing.utils;
+
+import org.apache.dubbo.common.utils.ClassUtils;
+
+public class ObservationSupportUtil {
+
+    public static boolean isSupportObservation() {
+        return isClassPresent("io.micrometer.observation.Observation")
+                && 
isClassPresent("io.micrometer.observation.ObservationRegistry")
+                && 
isClassPresent("io.micrometer.observation.ObservationHandler");
+    }
+
+    public static boolean isSupportTracing() {
+        return isClassPresent("io.micrometer.tracing.Tracer")
+                && 
isClassPresent("io.micrometer.tracing.propagation.Propagator");
+    }
+
+    public static boolean isSupportOTelTracer() {
+        return isClassPresent("io.micrometer.tracing.otel.bridge.OtelTracer")
+                && 
isClassPresent("io.opentelemetry.sdk.trace.SdkTracerProvider")
+                && isClassPresent("io.opentelemetry.api.OpenTelemetry");
+    }
+
+    public static boolean isSupportBraveTracer() {
+        return isClassPresent("io.micrometer.tracing.Tracer")
+                && 
isClassPresent("io.micrometer.tracing.brave.bridge.BraveTracer")
+                && isClassPresent("brave.Tracing");
+    }
+
+    private static boolean isClassPresent(String className) {
+        return ClassUtils.isPresent(className, 
ObservationSupportUtil.class.getClassLoader());
+    }
+}
diff --git 
a/dubbo-metrics/dubbo-tracing/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
 
b/dubbo-metrics/dubbo-tracing/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
new file mode 100644
index 0000000000..a7efac7c5e
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
@@ -0,0 +1 @@
+observationreceiver=org.apache.dubbo.tracing.filter.ObservationReceiverFilter
\ No newline at end of file
diff --git 
a/dubbo-metrics/dubbo-tracing/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter
 
b/dubbo-metrics/dubbo-tracing/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter
new file mode 100644
index 0000000000..f13199c666
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.cluster.filter.ClusterFilter
@@ -0,0 +1 @@
+observationsender=org.apache.dubbo.tracing.filter.ObservationSenderFilter
\ No newline at end of file
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/DefaultDubboClientObservationConventionTest.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/DefaultDubboClientObservationConventionTest.java
similarity index 94%
rename from 
dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/DefaultDubboClientObservationConventionTest.java
rename to 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/DefaultDubboClientObservationConventionTest.java
index ce83f9e886..0f1e641c4a 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/DefaultDubboClientObservationConventionTest.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/DefaultDubboClientObservationConventionTest.java
@@ -14,11 +14,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metrics.observation;
+package org.apache.dubbo.tracing;
 
-import org.apache.dubbo.metrics.observation.utils.ObservationConventionUtils;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.RpcInvocation;
+import org.apache.dubbo.tracing.context.DubboClientContext;
+import org.apache.dubbo.tracing.utils.ObservationConventionUtils;
 
 import io.micrometer.common.KeyValues;
 import org.junit.jupiter.api.Assertions;
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/DefaultDubboServerObservationConventionTest.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/DefaultDubboServerObservationConventionTest.java
similarity index 93%
rename from 
dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/DefaultDubboServerObservationConventionTest.java
rename to 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/DefaultDubboServerObservationConventionTest.java
index 7ca6398c9e..95a755cd98 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/DefaultDubboServerObservationConventionTest.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/DefaultDubboServerObservationConventionTest.java
@@ -14,11 +14,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metrics.observation;
+package org.apache.dubbo.tracing;
 
-import org.apache.dubbo.metrics.observation.utils.ObservationConventionUtils;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.RpcInvocation;
+import org.apache.dubbo.tracing.context.DubboClientContext;
+import org.apache.dubbo.tracing.context.DubboServerContext;
+import org.apache.dubbo.tracing.utils.ObservationConventionUtils;
 
 import io.micrometer.common.KeyValues;
 import org.junit.jupiter.api.Assertions;
diff --git 
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/MockInvocation.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/MockInvocation.java
similarity index 97%
rename from 
dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/MockInvocation.java
rename to 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/MockInvocation.java
index 8cb43471d8..cd9c0335dd 100644
--- 
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/MockInvocation.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/MockInvocation.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metrics.observation;
+package org.apache.dubbo.tracing;
 
 import org.apache.dubbo.rpc.AttachmentsAdapter;
 import org.apache.dubbo.rpc.Invoker;
@@ -68,11 +68,11 @@ public class MockInvocation extends RpcInvocation {
     }
 
     public Class<?>[] getParameterTypes() {
-        return new Class[] {String.class};
+        return new Class[]{String.class};
     }
 
     public Object[] getArguments() {
-        return new Object[] {"aa"};
+        return new Object[]{"aa"};
     }
 
     public Map<String, String> getAttachments() {
diff --git 
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/AbstractObservationFilterTest.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/AbstractObservationFilterTest.java
similarity index 94%
rename from 
dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/AbstractObservationFilterTest.java
rename to 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/AbstractObservationFilterTest.java
index 31715ca94b..046a0f1f95 100644
--- 
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/AbstractObservationFilterTest.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/AbstractObservationFilterTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.metrics.observation;
+package org.apache.dubbo.tracing.filter;
 
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.TracingConfig;
@@ -24,6 +24,7 @@ import org.apache.dubbo.rpc.BaseFilter;
 import org.apache.dubbo.rpc.Invoker;
 import org.apache.dubbo.rpc.RpcInvocation;
 import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.tracing.MockInvocation;
 
 import io.micrometer.tracing.test.SampleTestRunner;
 import org.junit.jupiter.api.AfterEach;
@@ -79,7 +80,7 @@ abstract class AbstractObservationFilterTest extends 
SampleTestRunner {
     private void initParam() {
         invocation.setTargetServiceUniqueName(GROUP + "/" + INTERFACE_NAME + 
":" + VERSION);
         invocation.setMethodName(METHOD_NAME);
-        invocation.setParameterTypes(new Class[] {String.class});
+        invocation.setParameterTypes(new Class[]{String.class});
     }
 
 }
diff --git 
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/ObservationReceiverFilterTest.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/ObservationReceiverFilterTest.java
similarity index 99%
rename from 
dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/ObservationReceiverFilterTest.java
rename to 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/ObservationReceiverFilterTest.java
index 91101e1aa0..4cb0282430 100644
--- 
a/dubbo-metrics/dubbo-metrics-default/src/test/java/org/apache/dubbo/metrics/observation/ObservationReceiverFilterTest.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/ObservationReceiverFilterTest.java
@@ -15,8 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.metrics.observation;
+package org.apache.dubbo.tracing.filter;
 
+import io.micrometer.common.KeyValues;
+import io.micrometer.core.tck.MeterRegistryAssert;
+import io.micrometer.tracing.Span;
+import io.micrometer.tracing.Tracer;
+import io.micrometer.tracing.test.simple.SpansAssert;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.rpc.AppResponse;
 import org.apache.dubbo.rpc.Filter;
@@ -27,11 +32,6 @@ import org.apache.dubbo.rpc.RpcContext;
 import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
-import io.micrometer.common.KeyValues;
-import io.micrometer.core.tck.MeterRegistryAssert;
-import io.micrometer.tracing.Span;
-import io.micrometer.tracing.Tracer;
-import io.micrometer.tracing.test.simple.SpansAssert;
 import org.assertj.core.api.BDDAssertions;
 
 class ObservationReceiverFilterTest extends AbstractObservationFilterTest {
diff --git 
a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/ObservationSenderFilterTest.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/ObservationSenderFilterTest.java
similarity index 92%
rename from 
dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/ObservationSenderFilterTest.java
rename to 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/ObservationSenderFilterTest.java
index 1315686740..071bc0e978 100644
--- 
a/dubbo-cluster/src/test/java/org/apache/dubbo/rpc/cluster/filter/ObservationSenderFilterTest.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/filter/ObservationSenderFilterTest.java
@@ -15,23 +15,22 @@
  * limitations under the License.
  */
 
-package org.apache.dubbo.rpc.cluster.filter;
+package org.apache.dubbo.tracing.filter;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.rpc.RpcContext;
-import org.apache.dubbo.rpc.cluster.filter.support.ObservationSenderFilter;
+import org.apache.dubbo.rpc.cluster.filter.ClusterFilter;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 
 import io.micrometer.common.KeyValues;
 import io.micrometer.core.tck.MeterRegistryAssert;
-import io.micrometer.tracing.test.SampleTestRunner;
 import io.micrometer.tracing.test.simple.SpansAssert;
 import org.assertj.core.api.BDDAssertions;
 
 class ObservationSenderFilterTest extends AbstractObservationFilterTest {
 
     @Override
-    public SampleTestRunner.SampleTestRunnerConsumer yourCode() {
+    public SampleTestRunnerConsumer yourCode() {
         return (buildingBlocks, meterRegistry) -> {
             setupConfig();
             setupAttachments();
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/PropagatorProviderFactoryTest.java
similarity index 63%
copy from 
dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
copy to 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/PropagatorProviderFactoryTest.java
index 434fb55f17..18f1a74e0e 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/PropagatorProviderFactoryTest.java
@@ -14,19 +14,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-package org.apache.dubbo.config.deploy;
+package org.apache.dubbo.tracing.tracer;
 
 import org.apache.dubbo.common.utils.Assert;
-import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.tracing.tracer.otel.OTelPropagatorProvider;
 
 import org.junit.jupiter.api.Test;
 
-class DefaultApplicationDeployerTest {
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class PropagatorProviderFactoryTest {
 
     @Test
-    void isSupportPrometheus() {
-        boolean supportPrometheus = new 
DefaultApplicationDeployer(ApplicationModel.defaultModel()).isSupportPrometheus();
-        
Assert.assertTrue(supportPrometheus,"DefaultApplicationDeployer.isSupportPrometheus()
 should return true");
+    void testPropagatorProviderFactory() {
+        PropagatorProvider propagatorProvider = 
PropagatorProviderFactory.getPropagatorProvider();
+        Assert.notNull(propagatorProvider, "PropagatorProvider should not be 
null");
+        assertEquals(OTelPropagatorProvider.class, 
propagatorProvider.getClass());
     }
-}
+}
\ No newline at end of file
diff --git 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
similarity index 54%
copy from 
dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
copy to 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
index 434fb55f17..83f2cd2df0 100644
--- 
a/dubbo-config/dubbo-config-api/src/test/java/org/apache/dubbo/config/deploy/DefaultApplicationDeployerTest.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
@@ -14,19 +14,26 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-package org.apache.dubbo.config.deploy;
+package org.apache.dubbo.tracing.tracer.otel;
 
 import org.apache.dubbo.common.utils.Assert;
-import org.apache.dubbo.rpc.model.ApplicationModel;
 
+import io.micrometer.tracing.propagation.Propagator;
+import io.opentelemetry.api.trace.Tracer;
+import io.opentelemetry.context.propagation.ContextPropagators;
 import org.junit.jupiter.api.Test;
 
-class DefaultApplicationDeployerTest {
+import static org.mockito.Mockito.mock;
+
+class OTelPropagatorProviderTest {
 
     @Test
-    void isSupportPrometheus() {
-        boolean supportPrometheus = new 
DefaultApplicationDeployer(ApplicationModel.defaultModel()).isSupportPrometheus();
-        
Assert.assertTrue(supportPrometheus,"DefaultApplicationDeployer.isSupportPrometheus()
 should return true");
+    void testOTelPropagatorProvider() {
+        ContextPropagators contextPropagators = mock(ContextPropagators.class);
+        Tracer tracer = mock(Tracer.class);
+        OTelPropagatorProvider.createMicrometerPropagator(contextPropagators, 
tracer);
+        OTelPropagatorProvider oTelPropagatorProvider = new 
OTelPropagatorProvider();
+        Propagator propagator = oTelPropagatorProvider.getPropagator();
+        Assert.notNull(propagator, "Propagator don't be null.");
     }
-}
+}
\ No newline at end of file
diff --git 
a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OpenTelemetryProviderTest.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OpenTelemetryProviderTest.java
new file mode 100644
index 0000000000..0374912c3a
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OpenTelemetryProviderTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.tracing.tracer.otel;
+
+import org.apache.dubbo.common.utils.Assert;
+import org.apache.dubbo.config.TracingConfig;
+import org.apache.dubbo.config.nested.BaggageConfig;
+import org.apache.dubbo.config.nested.ExporterConfig;
+import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.tracing.tracer.TracerProvider;
+import org.apache.dubbo.tracing.tracer.TracerProviderFactory;
+
+import io.micrometer.tracing.Tracer;
+import io.micrometer.tracing.otel.bridge.OtelTracer;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class OpenTelemetryProviderTest {
+
+    @Test
+    void testGetTracer() {
+        TracingConfig tracingConfig = new TracingConfig();
+        tracingConfig.setEnabled(true);
+        ExporterConfig exporterConfig = new ExporterConfig();
+        exporterConfig.setZipkinConfig(new ExporterConfig.ZipkinConfig(""));
+        tracingConfig.setTracingExporter(exporterConfig);
+        TracerProvider tracerProvider1 = 
TracerProviderFactory.getProvider(ApplicationModel.defaultModel(), 
tracingConfig);
+        Assert.notNull(tracerProvider1, "TracerProvider should not be null.");
+        Tracer tracer1 = tracerProvider1.getTracer();
+        assertEquals(OtelTracer.class, tracer1.getClass());
+
+        tracingConfig.setBaggage(new BaggageConfig(false));
+        TracerProvider tracerProvider2 = 
TracerProviderFactory.getProvider(ApplicationModel.defaultModel(), 
tracingConfig);
+        Assert.notNull(tracerProvider2, "TracerProvider should not be null.");
+        Tracer tracer2 = tracerProvider2.getTracer();
+        assertEquals(OtelTracer.class, tracer2.getClass());
+    }
+}
\ No newline at end of file
diff --git 
a/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/utils/ObservationConventionUtils.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/utils/ObservationConventionUtils.java
similarity index 97%
rename from 
dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/utils/ObservationConventionUtils.java
rename to 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/utils/ObservationConventionUtils.java
index e6de96f069..f0b75c8c2c 100644
--- 
a/dubbo-metrics/dubbo-metrics-api/src/test/java/org/apache/dubbo/metrics/observation/utils/ObservationConventionUtils.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/utils/ObservationConventionUtils.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metrics.observation.utils;
+package org.apache.dubbo.tracing.utils;
 
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.rpc.Invoker;
diff --git 
a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/utils/ObservationSupportUtilTest.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/utils/ObservationSupportUtilTest.java
new file mode 100644
index 0000000000..3903053ca8
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/utils/ObservationSupportUtilTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.tracing.utils;
+
+import org.apache.dubbo.common.utils.Assert;
+
+import org.junit.jupiter.api.Test;
+
+public class ObservationSupportUtilTest {
+
+    @Test
+    void testIsSupportObservation() {
+        boolean supportObservation = 
ObservationSupportUtil.isSupportObservation();
+        Assert.assertTrue(supportObservation, 
"ObservationSupportUtil.isSupportObservation() should return true");
+    }
+
+    @Test
+    void testIsSupportTracing() {
+        boolean supportTracing = ObservationSupportUtil.isSupportTracing();
+        Assert.assertTrue(supportTracing, 
"ObservationSupportUtil.isSupportTracing() should return true");
+    }
+
+    @Test
+    void testIsSupportOTelTracer() {
+        boolean supportOTelTracer = 
ObservationSupportUtil.isSupportOTelTracer();
+        Assert.assertTrue(supportOTelTracer, 
"ObservationSupportUtil.isSupportOTelTracer() should return true");
+    }
+
+    @Test
+    void testIsSupportBraveTracer() {
+        boolean supportBraveTracer = 
ObservationSupportUtil.isSupportBraveTracer();
+        Assert.assertTrue(supportBraveTracer, 
"ObservationSupportUtil.isSupportOTelTracer() should return true");
+    }
+}
diff --git a/dubbo-metrics/pom.xml b/dubbo-metrics/pom.xml
index 04abd6e077..c10defb8d6 100644
--- a/dubbo-metrics/pom.xml
+++ b/dubbo-metrics/pom.xml
@@ -24,6 +24,7 @@
         <module>dubbo-metrics-metadata</module>
         <module>dubbo-metrics-prometheus</module>
         <module>dubbo-metrics-config-center</module>
+        <module>dubbo-tracing</module>
     </modules>
     <parent>
         <groupId>org.apache.dubbo</groupId>
diff --git 
a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/pom.xml
 
b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/pom.xml
index b9e1369556..e8d997bda9 100644
--- 
a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/pom.xml
+++ 
b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/pom.xml
@@ -137,6 +137,12 @@
             <version>${project.version}</version>
             <optional>true</optional>
         </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-config-spring</artifactId>
+            <version>${project.version}</version>
+            <optional>true</optional>
+        </dependency>
 
         <!-- prometheus client -->
         <dependency>
diff --git 
a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboObservationAutoConfiguration.java
 
b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboObservationAutoConfiguration.java
index 37f552fadf..10ffaa9be1 100644
--- 
a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboObservationAutoConfiguration.java
+++ 
b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/DubboObservationAutoConfiguration.java
@@ -18,6 +18,7 @@ package 
org.apache.dubbo.spring.boot.observability.autoconfigure;
 
 import org.apache.dubbo.common.logger.ErrorTypeAwareLogger;
 import org.apache.dubbo.common.logger.LoggerFactory;
+import org.apache.dubbo.config.spring.context.event.DubboConfigInitEvent;
 import org.apache.dubbo.qos.protocol.QosProtocolWrapper;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import 
org.apache.dubbo.spring.boot.observability.autoconfigure.annotation.ConditionalOnDubboTracingEnable;
@@ -28,14 +29,15 @@ import org.springframework.beans.factory.BeanFactory;
 import org.springframework.beans.factory.BeanFactoryAware;
 import org.springframework.beans.factory.NoSuchBeanDefinitionException;
 import org.springframework.beans.factory.ObjectProvider;
-import org.springframework.beans.factory.SmartInitializingSingleton;
 import org.springframework.boot.autoconfigure.AutoConfiguration;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
 import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import 
org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
+import org.springframework.context.ApplicationListener;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
 
 import java.util.Arrays;
 
@@ -46,7 +48,7 @@ import java.util.Arrays;
 @AutoConfiguration(after = DubboMicrometerTracingAutoConfiguration.class, 
afterName = 
"org.springframework.boot.actuate.autoconfigure.observation.ObservationAutoConfiguration")
 @ConditionalOnDubboTracingEnable
 @ConditionalOnClass(name = {"io.micrometer.observation.Observation", 
"io.micrometer.tracing.Tracer"})
-public class DubboObservationAutoConfiguration implements BeanFactoryAware, 
SmartInitializingSingleton {
+public class DubboObservationAutoConfiguration implements BeanFactoryAware, 
ApplicationListener<DubboConfigInitEvent>, Ordered {
     private final ErrorTypeAwareLogger logger = 
LoggerFactory.getErrorTypeAwareLogger(QosProtocolWrapper.class);
 
 
@@ -79,16 +81,21 @@ public class DubboObservationAutoConfiguration implements 
BeanFactoryAware, Smar
     }
 
     @Override
-    public void afterSingletonsInstantiated() {
+    public void onApplicationEvent(DubboConfigInitEvent event) {
         try {
             
applicationModel.getBeanFactory().registerBean(beanFactory.getBean(io.micrometer.observation.ObservationRegistry.class));
-            io.micrometer.tracing.Tracer bean = 
beanFactory.getBean(io.micrometer.tracing.Tracer.class);
-            applicationModel.getBeanFactory().registerBean(bean);
+            
applicationModel.getBeanFactory().registerBean(beanFactory.getBean(io.micrometer.tracing.Tracer.class));
+            
applicationModel.getBeanFactory().registerBean(beanFactory.getBean(io.micrometer.tracing.propagation.Propagator.class));
         } catch (NoSuchBeanDefinitionException e) {
-            logger.info("Please use a version of micrometer higher than 1.10.0 
:{}" + e.getMessage());
+            logger.info("Please use a version of micrometer higher than 
1.10.0: " + e.getMessage());
         }
     }
 
+    @Override
+    public int getOrder() {
+        return HIGHEST_PRECEDENCE;
+    }
+
     @Configuration(proxyBeanMethods = false)
     @ConditionalOnClass(MeterRegistry.class)
     @ConditionalOnMissingClass("io.micrometer.tracing.Tracer")
diff --git 
a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/brave/BraveAutoConfiguration.java
 
b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/brave/BraveAutoConfiguration.java
index 24be95c4ec..8894b890cb 100644
--- 
a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/brave/BraveAutoConfiguration.java
+++ 
b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/brave/BraveAutoConfiguration.java
@@ -16,8 +16,7 @@
  */
 package org.apache.dubbo.spring.boot.observability.autoconfigure.brave;
 
-import org.apache.dubbo.config.ApplicationConfig;
-import org.apache.dubbo.rpc.model.ModuleModel;
+import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.spring.boot.autoconfigure.DubboConfigurationProperties;
 import 
org.apache.dubbo.spring.boot.observability.autoconfigure.DubboMicrometerTracingAutoConfiguration;
 import 
org.apache.dubbo.spring.boot.observability.autoconfigure.ObservabilityUtils;
@@ -53,12 +52,12 @@ public class BraveAutoConfiguration {
     /**
      * Default value for application name if {@code spring.application.name} 
is not set.
      */
-    private static final String DEFAULT_APPLICATION_NAME = "application";
+    private static final String DEFAULT_APPLICATION_NAME = "dubbo-application";
 
-    private final ModuleModel moduleModel;
+    private final DubboConfigurationProperties dubboConfigProperties;
 
-    public BraveAutoConfiguration(ModuleModel moduleModel) {
-        this.moduleModel = moduleModel;
+    public BraveAutoConfiguration(DubboConfigurationProperties 
dubboConfigProperties) {
+        this.dubboConfigProperties = dubboConfigProperties;
     }
 
     @Bean
@@ -76,9 +75,10 @@ public class BraveAutoConfiguration {
     public brave.Tracing braveTracing(List<brave.handler.SpanHandler> 
spanHandlers,
                                       List<brave.TracingCustomizer> 
tracingCustomizers, brave.propagation.CurrentTraceContext currentTraceContext,
                                       brave.propagation.Propagation.Factory 
propagationFactory, brave.sampler.Sampler sampler) {
-        String applicationName = 
moduleModel.getApplicationModel().getApplicationConfigManager().getApplication()
-                .map(ApplicationConfig::getName)
-                .orElse(DEFAULT_APPLICATION_NAME);
+        String applicationName = 
dubboConfigProperties.getApplication().getName();
+        if (StringUtils.isEmpty(applicationName)) {
+            applicationName = DEFAULT_APPLICATION_NAME;
+        }
         brave.Tracing.Builder builder = 
brave.Tracing.newBuilder().currentTraceContext(currentTraceContext).traceId128Bit(true)
                 
.supportsJoin(false).propagationFactory(propagationFactory).sampler(sampler)
                 .localServiceName(applicationName);
diff --git 
a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/otel/OpenTelemetryAutoConfiguration.java
 
b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/otel/OpenTelemetryAutoConfiguration.java
index 85babb77f8..6b4e38f7c9 100644
--- 
a/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/otel/OpenTelemetryAutoConfiguration.java
+++ 
b/dubbo-spring-boot/dubbo-spring-boot-starters/observability/autoconfigure/src/main/java/org/apache/dubbo/spring/boot/observability/autoconfigure/otel/OpenTelemetryAutoConfiguration.java
@@ -18,8 +18,7 @@ package 
org.apache.dubbo.spring.boot.observability.autoconfigure.otel;
 
 
 import org.apache.dubbo.common.Version;
-import org.apache.dubbo.config.ApplicationConfig;
-import org.apache.dubbo.rpc.model.ModuleModel;
+import org.apache.dubbo.common.utils.StringUtils;
 import org.apache.dubbo.spring.boot.autoconfigure.DubboConfigurationProperties;
 import 
org.apache.dubbo.spring.boot.observability.autoconfigure.DubboMicrometerTracingAutoConfiguration;
 import 
org.apache.dubbo.spring.boot.observability.autoconfigure.ObservabilityUtils;
@@ -52,15 +51,12 @@ public class OpenTelemetryAutoConfiguration {
     /**
      * Default value for application name if {@code spring.application.name} 
is not set.
      */
-    private static final String DEFAULT_APPLICATION_NAME = "application";
+    private static final String DEFAULT_APPLICATION_NAME = "dubbo-application";
 
     private final DubboConfigurationProperties dubboConfigProperties;
 
-    private final ModuleModel moduleModel;
-
-    OpenTelemetryAutoConfiguration(DubboConfigurationProperties 
dubboConfigProperties, ModuleModel moduleModel) {
+    OpenTelemetryAutoConfiguration(DubboConfigurationProperties 
dubboConfigProperties) {
         this.dubboConfigProperties = dubboConfigProperties;
-        this.moduleModel = moduleModel;
     }
 
     @Bean
@@ -74,9 +70,10 @@ public class OpenTelemetryAutoConfiguration {
     @ConditionalOnMissingBean
     io.opentelemetry.sdk.trace.SdkTracerProvider 
otelSdkTracerProvider(ObjectProvider<io.opentelemetry.sdk.trace.SpanProcessor> 
spanProcessors,
                                                                        
io.opentelemetry.sdk.trace.samplers.Sampler sampler) {
-        String applicationName = 
moduleModel.getApplicationModel().getApplicationConfigManager().getApplication()
-                .map(ApplicationConfig::getName)
-                .orElse(DEFAULT_APPLICATION_NAME);
+        String applicationName = 
dubboConfigProperties.getApplication().getName();
+        if (StringUtils.isEmpty(applicationName)) {
+            applicationName = DEFAULT_APPLICATION_NAME;
+        }
         io.opentelemetry.sdk.trace.SdkTracerProviderBuilder builder = 
io.opentelemetry.sdk.trace.SdkTracerProvider.builder().setSampler(sampler)
                 
.setResource(io.opentelemetry.sdk.resources.Resource.create(io.opentelemetry.api.common.Attributes.of(io.opentelemetry.semconv.resource.attributes.ResourceAttributes.SERVICE_NAME,
 applicationName)));
         spanProcessors.orderedStream().forEach(builder::addSpanProcessor);
diff --git a/dubbo-test/dubbo-dependencies-all/pom.xml 
b/dubbo-test/dubbo-dependencies-all/pom.xml
index 3fbd8d38a1..3708d2c508 100644
--- a/dubbo-test/dubbo-dependencies-all/pom.xml
+++ b/dubbo-test/dubbo-dependencies-all/pom.xml
@@ -198,6 +198,11 @@
             <artifactId>dubbo-metrics-prometheus</artifactId>
             <version>${project.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-tracing</artifactId>
+            <version>${project.version}</version>
+        </dependency>
 
         <!-- monitor -->
         <dependency>
@@ -210,7 +215,6 @@
             <artifactId>dubbo-monitor-default</artifactId>
             <version>${project.version}</version>
         </dependency>
-
         <!-- native -->
         <dependency>
             <groupId>org.apache.dubbo</groupId>


Reply via email to