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 629bee3987 feat: add brave to core (#12814)
629bee3987 is described below

commit 629bee39873295669a482fbfabcf9b31d25526da
Author: conghuhu <[email protected]>
AuthorDate: Mon Aug 14 15:42:40 2023 +0800

    feat: add brave to core (#12814)
---
 dubbo-metrics/dubbo-tracing/pom.xml                |   7 +
 .../tracing/exporter/TraceExporterFactory.java     |  66 ---------
 .../{OTlpExporter.java => OTlpSpanExporter.java}   |  24 +--
 ...ZipkinExporter.java => ZipkinSpanExporter.java} |  35 ++---
 .../tracing/exporter/zipkin/ZipkinSpanHandler.java |  53 +++++++
 .../tracer/brave/BravePropagatorProvider.java      |  10 +-
 .../dubbo/tracing/tracer/brave/BraveProvider.java  | 161 ++++++++++++++++++++-
 .../tracing/tracer/otel/OpenTelemetryProvider.java | 109 ++++++++------
 .../ObservationConstants.java}                     |  20 +--
 .../tracing/utils/ObservationSupportUtil.java      |   4 +
 .../PropagationType.java}                          |  27 +++-
 .../otlp/OTlpSpanExporterTest.java}                |  30 ++--
 .../zipkin/ZipkinSpanExporterTest.java}            |  31 ++--
 .../zipkin/ZipkinSpanHandlerTest.java}             |  29 ++--
 .../BravePropagatorProviderTest.java}              |  19 ++-
 .../tracing/tracer/brave/BraveProviderTest.java    |  86 +++++++++++
 .../tracer/otel/OTelPropagatorProviderTest.java    |   1 +
 .../tracer/otel/OpenTelemetryProviderTest.java     |  32 ++++
 .../dubbo/tracing/utils/PropagationTypeTest.java}  |  24 +--
 19 files changed, 524 insertions(+), 244 deletions(-)

diff --git a/dubbo-metrics/dubbo-tracing/pom.xml 
b/dubbo-metrics/dubbo-tracing/pom.xml
index e50dae23bd..f6e26215d9 100644
--- a/dubbo-metrics/dubbo-tracing/pom.xml
+++ b/dubbo-metrics/dubbo-tracing/pom.xml
@@ -107,5 +107,12 @@
             <artifactId>zipkin-reporter-brave</artifactId>
             <optional>true</optional>
         </dependency>
+
+        <!-- sender -->
+        <dependency>
+            <groupId>io.zipkin.reporter2</groupId>
+            <artifactId>zipkin-sender-urlconnection</artifactId>
+            <optional>true</optional>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
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
deleted file mode 100644
index 7327cf038e..0000000000
--- 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporterFactory.java
+++ /dev/null
@@ -1,66 +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.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/OTlpSpanExporter.java
similarity index 77%
rename from 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/otlp/OTlpExporter.java
rename to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/otlp/OTlpSpanExporter.java
index 72da78a795..2f2a4acd9f 100644
--- 
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/OTlpSpanExporter.java
@@ -18,9 +18,7 @@ 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;
@@ -28,18 +26,12 @@ 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;
-    }
+/**
+ * OTlp span exporter for OTel.
+ */
+public class OTlpSpanExporter {
 
-    @Override
-    public SpanExporter getSpanExporter() {
+    public static SpanExporter getSpanExporter(ApplicationModel 
applicationModel, ExporterConfig.OtlpConfig otlpConfig) {
         OtlpGrpcSpanExporter externalOTlpGrpcSpanExporter = 
applicationModel.getBeanFactory().getBean(OtlpGrpcSpanExporter.class);
         if (externalOTlpGrpcSpanExporter != null) {
             return externalOTlpGrpcSpanExporter;
@@ -57,10 +49,4 @@ public class OTlpExporter implements TraceExporter {
         }
         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/ZipkinSpanExporter.java
similarity index 54%
rename from 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinExporter.java
rename to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinSpanExporter.java
index c0c00c6fa8..e8a7a9f3d1 100644
--- 
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/ZipkinSpanExporter.java
@@ -18,43 +18,26 @@ 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;
-    }
+/**
+ * Zipkin span exporter for OTel.
+ */
+public class ZipkinSpanExporter {
 
-    @Override
-    public SpanExporter getSpanExporter() {
-        BytesEncoder<Span> encoder = getSpanBytesEncoder();
-        return ZipkinSpanExporter.builder()
-                .setEncoder(encoder)
+    public static io.opentelemetry.sdk.trace.export.SpanExporter 
getSpanExporter(ApplicationModel applicationModel, ExporterConfig.ZipkinConfig 
zipkinConfig) {
+        return io.opentelemetry.exporter.zipkin.ZipkinSpanExporter.builder()
+                .setEncoder(getSpanBytesEncoder(applicationModel))
                 .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);
+    private static BytesEncoder<Span> getSpanBytesEncoder(ApplicationModel 
applicationModel) {
+        BytesEncoder<zipkin2.Span> encoder = 
applicationModel.getBeanFactory().getBean(BytesEncoder.class);
         return encoder == null ? SpanBytesEncoder.JSON_V2 : encoder;
     }
 }
diff --git 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinSpanHandler.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinSpanHandler.java
new file mode 100644
index 0000000000..f56173a8ad
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinSpanHandler.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.exporter.zipkin;
+
+import org.apache.dubbo.config.nested.ExporterConfig;
+import org.apache.dubbo.rpc.model.ApplicationModel;
+
+import brave.handler.SpanHandler;
+import zipkin2.Span;
+import zipkin2.codec.BytesEncoder;
+import zipkin2.codec.SpanBytesEncoder;
+import zipkin2.reporter.AsyncReporter;
+import zipkin2.reporter.urlconnection.URLConnectionSender;
+
+/**
+ * Zipkin span handler for Brave.
+ */
+public class ZipkinSpanHandler {
+
+    public static SpanHandler getSpanHandler(ApplicationModel 
applicationModel, ExporterConfig.ZipkinConfig zipkinConfig) {
+        URLConnectionSender sender = 
applicationModel.getBeanFactory().getBean(URLConnectionSender.class);
+        if (sender == null) {
+            URLConnectionSender.Builder builder = 
URLConnectionSender.newBuilder();
+            builder.connectTimeout((int) 
zipkinConfig.getConnectTimeout().toMillis());
+            builder.readTimeout((int) 
zipkinConfig.getReadTimeout().toMillis());
+            builder.endpoint(zipkinConfig.getEndpoint());
+
+            sender = builder.build();
+        }
+
+        AsyncReporter<Span> spanReporter = 
AsyncReporter.builder(sender).build(getSpanBytesEncoder(applicationModel));
+        return 
zipkin2.reporter.brave.ZipkinSpanHandler.newBuilder(spanReporter).build();
+    }
+
+    private static BytesEncoder<zipkin2.Span> 
getSpanBytesEncoder(ApplicationModel applicationModel) {
+        BytesEncoder<zipkin2.Span> encoder = 
applicationModel.getBeanFactory().getBean(BytesEncoder.class);
+        return encoder == null ? SpanBytesEncoder.JSON_V2 : encoder;
+    }
+}
diff --git 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java
index 8560a5b149..56e23d3670 100644
--- 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java
@@ -18,14 +18,20 @@ package org.apache.dubbo.tracing.tracer.brave;
 
 import org.apache.dubbo.tracing.tracer.PropagatorProvider;
 
+import io.micrometer.tracing.brave.bridge.BravePropagator;
 import io.micrometer.tracing.propagation.Propagator;
 
 
 public class BravePropagatorProvider implements PropagatorProvider {
 
+    private static Propagator propagator;
+
     @Override
     public Propagator getPropagator() {
-        // TODO impl
-        return null;
+        return propagator;
+    }
+
+    protected static void createMicrometerPropagator(brave.Tracing tracing) {
+        propagator = new BravePropagator(tracing);
     }
 }
diff --git 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BraveProvider.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BraveProvider.java
index 9ab8172b02..9f178f400b 100644
--- 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BraveProvider.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BraveProvider.java
@@ -16,15 +16,40 @@
  */
 package org.apache.dubbo.tracing.tracer.brave;
 
+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.ApplicationConfig;
 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.exporter.zipkin.ZipkinSpanHandler;
 import org.apache.dubbo.tracing.tracer.TracerProvider;
+import org.apache.dubbo.tracing.utils.PropagationType;
 
+import io.micrometer.tracing.CurrentTraceContext;
 import io.micrometer.tracing.Tracer;
+import io.micrometer.tracing.brave.bridge.BraveBaggageManager;
+import io.micrometer.tracing.brave.bridge.BraveCurrentTraceContext;
+import io.micrometer.tracing.brave.bridge.BraveTracer;
+import io.micrometer.tracing.brave.bridge.W3CPropagation;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+import static 
org.apache.dubbo.tracing.utils.ObservationConstants.DEFAULT_APPLICATION_NAME;
+import static 
org.apache.dubbo.tracing.utils.ObservationSupportUtil.isSupportBraveURLSender;
 
 
 public class BraveProvider implements TracerProvider {
 
+    private final static ErrorTypeAwareLogger LOGGER = 
LoggerFactory.getErrorTypeAwareLogger(BraveProvider.class);
+
+    private static final BraveBaggageManager BRAVE_BAGGAGE_MANAGER = new 
BraveBaggageManager();
+
     private final ApplicationModel applicationModel;
     private final TracingConfig tracingConfig;
 
@@ -35,7 +60,139 @@ public class BraveProvider implements TracerProvider {
 
     @Override
     public Tracer getTracer() {
-        // TODO impl
-        return null;
+        // [Brave component] SpanHandler is a component that gets called when 
a span is finished.
+        List<brave.handler.SpanHandler> spanHandlerList = getSpanHandlers();
+
+        String applicationName = 
applicationModel.getApplicationConfigManager().getApplication()
+                .map(ApplicationConfig::getName)
+                .orElse(DEFAULT_APPLICATION_NAME);
+
+        // [Brave component] CurrentTraceContext is a Brave component that 
allows you to
+        // retrieve the current TraceContext.
+        brave.propagation.ThreadLocalCurrentTraceContext 
braveCurrentTraceContext = 
brave.propagation.ThreadLocalCurrentTraceContext.newBuilder()
+                .addScopeDecorator(correlationScopeDecorator()) // Brave's 
automatic MDC setup
+                .build();
+
+        // [Micrometer Tracing component] A Micrometer Tracing wrapper for 
Brave's CurrentTraceContext
+        CurrentTraceContext bridgeContext = new 
BraveCurrentTraceContext(braveCurrentTraceContext);
+
+
+        // [Brave component] Tracing is the root component that allows to 
configure the
+        // tracer, handlers, context propagation etc.
+        brave.Tracing.Builder builder = brave.Tracing.newBuilder()
+                .currentTraceContext(braveCurrentTraceContext)
+                .supportsJoin(false)
+                .traceId128Bit(true)
+                .localServiceName(applicationName)
+                // For Baggage to work you need to provide a list of fields to 
propagate
+                
.propagationFactory(PropagatorFactory.getPropagationFactory(tracingConfig))
+                .sampler(getSampler());
+        spanHandlerList.forEach(builder::addSpanHandler);
+
+        brave.Tracing tracing = builder.build();
+
+        BravePropagatorProvider.createMicrometerPropagator(tracing);
+
+        // [Brave component] Tracer is a component that handles the life-cycle 
of a span
+        brave.Tracer braveTracer = tracing.tracer();
+
+        // [Micrometer Tracing component] A Micrometer Tracing wrapper for 
Brave's Tracer
+        return new BraveTracer(braveTracer, bridgeContext, 
BRAVE_BAGGAGE_MANAGER);
+    }
+
+    private List<brave.handler.SpanHandler> getSpanHandlers() {
+        ExporterConfig exporterConfig = tracingConfig.getTracingExporter();
+        List<brave.handler.SpanHandler> res = new ArrayList<>();
+        if (!isSupportBraveURLSender()) {
+            return res;
+        }
+        ExporterConfig.ZipkinConfig zipkinConfig = 
exporterConfig.getZipkinConfig();
+        if (zipkinConfig != null && 
StringUtils.isNotEmpty(zipkinConfig.getEndpoint())) {
+            LOGGER.info("Create zipkin span handler.");
+            res.add(ZipkinSpanHandler.getSpanHandler(applicationModel, 
zipkinConfig));
+        }
+        return res;
+    }
+
+    private brave.sampler.Sampler getSampler() {
+        return 
brave.sampler.Sampler.create(tracingConfig.getSampling().getProbability());
+    }
+
+    private Optional<brave.baggage.CorrelationScopeCustomizer> 
correlationFieldsCorrelationScopeCustomizer() {
+        BaggageConfig.Correlation correlation = 
tracingConfig.getBaggage().getCorrelation();
+        boolean enabled = correlation.isEnabled();
+        if (!enabled) {
+            return Optional.empty();
+        }
+        return Optional.of((builder) -> {
+            List<String> correlationFields = correlation.getFields();
+            for (String field : correlationFields) {
+                
builder.add(brave.baggage.CorrelationScopeConfig.SingleCorrelationField.newBuilder(brave.baggage.BaggageField.create(field))
+                        .flushOnUpdate().build());
+            }
+        });
+    }
+
+    private brave.propagation.CurrentTraceContext.ScopeDecorator 
correlationScopeDecorator() {
+        brave.baggage.CorrelationScopeDecorator.Builder builder = 
brave.context.slf4j.MDCScopeDecorator.newBuilder();
+        correlationFieldsCorrelationScopeCustomizer().ifPresent((customizer) 
-> customizer.customize(builder));
+        return builder.build();
+    }
+
+    static class PropagatorFactory {
+
+        public static brave.propagation.Propagation.Factory 
getPropagationFactory(TracingConfig tracingConfig) {
+            BaggageConfig baggageConfig = tracingConfig.getBaggage();
+            if (baggageConfig == null || !baggageConfig.getEnabled()) {
+                return getPropagationFactoryWithoutBaggage(tracingConfig);
+            }
+            return getPropagationFactoryWithBaggage(tracingConfig);
+        }
+
+        private static brave.propagation.Propagation.Factory 
getPropagationFactoryWithoutBaggage(TracingConfig tracingConfig) {
+            PropagationType propagationType = 
PropagationType.forValue(tracingConfig.getPropagation().getType());
+            if (PropagationType.W3C == propagationType) {
+                return new io.micrometer.tracing.brave.bridge.W3CPropagation();
+            } else {
+                // Brave default propagation is B3
+                return 
brave.propagation.B3Propagation.newFactoryBuilder().injectFormat(brave.propagation.B3Propagation.Format.SINGLE_NO_PARENT).build();
+            }
+        }
+
+        private static brave.propagation.Propagation.Factory 
getPropagationFactoryWithBaggage(TracingConfig tracingConfig) {
+            PropagationType propagationType = 
PropagationType.forValue(tracingConfig.getPropagation().getType());
+            brave.propagation.Propagation.Factory delegate;
+            if (PropagationType.W3C == propagationType) {
+                delegate = new W3CPropagation(BRAVE_BAGGAGE_MANAGER, 
Collections.emptyList());
+            } else {
+                // Brave default propagation is B3
+                delegate = 
brave.propagation.B3Propagation.newFactoryBuilder().injectFormat(brave.propagation.B3Propagation.Format.SINGLE_NO_PARENT).build();
+            }
+            return getBaggageFactoryBuilder(delegate, tracingConfig).build();
+        }
+
+        private static brave.baggage.BaggagePropagation.FactoryBuilder 
getBaggageFactoryBuilder(brave.propagation.Propagation.Factory delegate, 
TracingConfig tracingConfig) {
+            brave.baggage.BaggagePropagation.FactoryBuilder builder = 
brave.baggage.BaggagePropagation.newFactoryBuilder(delegate);
+
+            
getBaggagePropagationCustomizers(tracingConfig).forEach((customizer) -> 
customizer.customize(builder));
+            return builder;
+        }
+
+        private static List<brave.baggage.BaggagePropagationCustomizer> 
getBaggagePropagationCustomizers(TracingConfig tracingConfig) {
+            List<brave.baggage.BaggagePropagationCustomizer> res = new 
ArrayList<>();
+            if (tracingConfig.getBaggage().getCorrelation().isEnabled()) {
+                
res.add(remoteFieldsBaggagePropagationCustomizer(tracingConfig));
+            }
+            return res;
+        }
+
+        private static brave.baggage.BaggagePropagationCustomizer 
remoteFieldsBaggagePropagationCustomizer(TracingConfig tracingConfig) {
+            return (builder) -> {
+                List<String> remoteFields = 
tracingConfig.getBaggage().getRemoteFields();
+                for (String fieldName : remoteFields) {
+                    
builder.add(brave.baggage.BaggagePropagationConfig.SingleBaggageField.remote(brave.baggage.BaggageField.create(fieldName)));
+                }
+            };
+        }
     }
 }
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
index 36b3c3f191..bf00771b99 100644
--- 
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
@@ -18,13 +18,19 @@ package org.apache.dubbo.tracing.tracer.otel;
 
 import org.apache.dubbo.common.Version;
 import org.apache.dubbo.common.lang.Nullable;
+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.ApplicationConfig;
 import org.apache.dubbo.config.TracingConfig;
 import org.apache.dubbo.config.nested.BaggageConfig;
+import org.apache.dubbo.config.nested.ExporterConfig;
 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.exporter.otlp.OTlpSpanExporter;
+import org.apache.dubbo.tracing.exporter.zipkin.ZipkinSpanExporter;
 import org.apache.dubbo.tracing.tracer.TracerProvider;
+import org.apache.dubbo.tracing.utils.PropagationType;
 
 import io.micrometer.tracing.Tracer;
 import io.micrometer.tracing.otel.bridge.CompositeSpanExporter;
@@ -36,28 +42,17 @@ 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;
 
+import static 
org.apache.dubbo.tracing.utils.ObservationConstants.DEFAULT_APPLICATION_NAME;
+
 public class OpenTelemetryProvider implements TracerProvider {
 
-    private static final String DEFAULT_APPLICATION_NAME = "dubbo-application";
+    private final static ErrorTypeAwareLogger LOGGER = 
LoggerFactory.getErrorTypeAwareLogger(OpenTelemetryProvider.class);
+
     private final ApplicationModel applicationModel;
     private final TracingConfig tracingConfig;
 
@@ -72,7 +67,7 @@ public class OpenTelemetryProvider implements TracerProvider {
     @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());
+        List<io.opentelemetry.sdk.trace.export.SpanExporter> spanExporters = 
getSpanExporters();
 
         String applicationName = 
applicationModel.getApplicationConfigManager().getApplication()
                 .map(ApplicationConfig::getName)
@@ -84,18 +79,18 @@ public class OpenTelemetryProvider implements 
TracerProvider {
         this.otelCurrentTraceContext = createCurrentTraceContext();
 
         // [OTel component] SdkTracerProvider is an SDK implementation for 
TracerProvider
-        SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder()
+        io.opentelemetry.sdk.trace.SdkTracerProvider sdkTracerProvider = 
io.opentelemetry.sdk.trace.SdkTracerProvider.builder()
                 .setSampler(getSampler())
-                
.setResource(Resource.create(Attributes.of(ResourceAttributes.SERVICE_NAME, 
applicationName)))
-                .addSpanProcessor(BatchSpanProcessor
+                
.setResource(io.opentelemetry.sdk.resources.Resource.create(io.opentelemetry.api.common.Attributes.of(io.opentelemetry.semconv.resource.attributes.ResourceAttributes.SERVICE_NAME,
 applicationName)))
+                
.addSpanProcessor(io.opentelemetry.sdk.trace.export.BatchSpanProcessor
                         .builder(new CompositeSpanExporter(spanExporters, 
null, null, null))
                         .build())
                 .build();
 
-        ContextPropagators otelContextPropagators = 
createOtelContextPropagators();
+        io.opentelemetry.context.propagation.ContextPropagators 
otelContextPropagators = createOtelContextPropagators();
 
         // [OTel component] The SDK implementation of OpenTelemetry
-        OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder()
+        io.opentelemetry.sdk.OpenTelemetrySdk openTelemetrySdk = 
io.opentelemetry.sdk.OpenTelemetrySdk.builder()
                 .setTracerProvider(sdkTracerProvider)
                 .setPropagators(otelContextPropagators)
                 .build();
@@ -113,14 +108,31 @@ public class OpenTelemetryProvider implements 
TracerProvider {
                         Collections.emptyList()));
     }
 
+    private List<io.opentelemetry.sdk.trace.export.SpanExporter> 
getSpanExporters() {
+        ExporterConfig exporterConfig = tracingConfig.getTracingExporter();
+        ExporterConfig.ZipkinConfig zipkinConfig = 
exporterConfig.getZipkinConfig();
+        ExporterConfig.OtlpConfig otlpConfig = exporterConfig.getOtlpConfig();
+        List<io.opentelemetry.sdk.trace.export.SpanExporter> res = new 
ArrayList<>();
+        if (zipkinConfig != null && 
StringUtils.isNotEmpty(zipkinConfig.getEndpoint())) {
+            LOGGER.info("Create zipkin span exporter.");
+            res.add(ZipkinSpanExporter.getSpanExporter(applicationModel, 
zipkinConfig));
+        }
+        if (otlpConfig != null && 
StringUtils.isNotEmpty(otlpConfig.getEndpoint())) {
+            LOGGER.info("Create OTlp span exporter.");
+            res.add(OTlpSpanExporter.getSpanExporter(applicationModel, 
otlpConfig));
+        }
+
+        return res;
+    }
+
     /**
      * sampler with probability
      *
      * @return sampler
      */
-    private Sampler getSampler() {
-        Sampler rootSampler = 
Sampler.traceIdRatioBased(tracingConfig.getSampling().getProbability());
-        return Sampler.parentBased(rootSampler);
+    private io.opentelemetry.sdk.trace.samplers.Sampler getSampler() {
+        io.opentelemetry.sdk.trace.samplers.Sampler rootSampler = 
io.opentelemetry.sdk.trace.samplers.Sampler.traceIdRatioBased(tracingConfig.getSampling().getProbability());
+        return 
io.opentelemetry.sdk.trace.samplers.Sampler.parentBased(rootSampler);
     }
 
     private List<EventListener> getEventListeners() {
@@ -141,13 +153,13 @@ public class OpenTelemetryProvider implements 
TracerProvider {
     }
 
     private OtelCurrentTraceContext createCurrentTraceContext() {
-        ContextStorage.addWrapper(new 
EventPublishingContextWrapper(publisher));
+        io.opentelemetry.context.ContextStorage.addWrapper(new 
EventPublishingContextWrapper(publisher));
         return new OtelCurrentTraceContext();
     }
 
-    private ContextPropagators createOtelContextPropagators() {
-        return ContextPropagators.create(
-                TextMapPropagator.composite(
+    private io.opentelemetry.context.propagation.ContextPropagators 
createOtelContextPropagators() {
+        return io.opentelemetry.context.propagation.ContextPropagators.create(
+                
io.opentelemetry.context.propagation.TextMapPropagator.composite(
                         
PropagatorFactory.getPropagator(tracingConfig.getPropagation(),
                                 tracingConfig.getBaggage(),
                                 otelCurrentTraceContext
@@ -172,41 +184,44 @@ public class OpenTelemetryProvider implements 
TracerProvider {
 
     static class PropagatorFactory {
 
-        public static TextMapPropagator getPropagator(PropagationConfig 
propagationConfig,
-                                                      @Nullable BaggageConfig 
baggageConfig,
-                                                      @Nullable 
OtelCurrentTraceContext currentTraceContext) {
+        public static io.opentelemetry.context.propagation.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) {
+        private static io.opentelemetry.context.propagation.TextMapPropagator 
getPropagatorWithoutBaggage(PropagationConfig propagationConfig) {
             String type = propagationConfig.getType();
-            if ("B3".equals(type)) {
-                return B3Propagator.injectingSingleHeader();
-            } else if ("W3C".equals(type)) {
-                return W3CTraceContextPropagator.getInstance();
+            PropagationType propagationType = PropagationType.forValue(type);
+
+            if (PropagationType.B3 == propagationType) {
+                return 
io.opentelemetry.extension.trace.propagation.B3Propagator.injectingSingleHeader();
+            } else if (PropagationType.W3C == propagationType) {
+                return 
io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator.getInstance();
             }
-            return TextMapPropagator.noop();
+            return 
io.opentelemetry.context.propagation.TextMapPropagator.noop();
         }
 
-        private static TextMapPropagator 
getPropagatorWithBaggage(PropagationConfig propagationConfig,
-                                                                  
BaggageConfig baggageConfig,
-                                                                  
OtelCurrentTraceContext currentTraceContext) {
+        private static io.opentelemetry.context.propagation.TextMapPropagator 
getPropagatorWithBaggage(PropagationConfig propagationConfig,
+                                                                               
                        BaggageConfig baggageConfig,
+                                                                               
                        OtelCurrentTraceContext currentTraceContext) {
             String type = propagationConfig.getType();
-            if ("B3".equals(type)) {
+            PropagationType propagationType = PropagationType.forValue(type);
+            if (PropagationType.B3 == propagationType) {
                 List<String> remoteFields = baggageConfig.getRemoteFields();
-                return 
TextMapPropagator.composite(B3Propagator.injectingSingleHeader(),
+                return 
io.opentelemetry.context.propagation.TextMapPropagator.composite(io.opentelemetry.extension.trace.propagation.B3Propagator.injectingSingleHeader(),
                         new BaggageTextMapPropagator(remoteFields,
                                 new OtelBaggageManager(currentTraceContext, 
remoteFields, Collections.emptyList())));
-            } else if ("W3C".equals(type)) {
+            } else if (PropagationType.W3C == propagationType) {
                 List<String> remoteFields = baggageConfig.getRemoteFields();
-                return 
TextMapPropagator.composite(W3CTraceContextPropagator.getInstance(),
-                        W3CBaggagePropagator.getInstance(), new 
BaggageTextMapPropagator(remoteFields,
+                return 
io.opentelemetry.context.propagation.TextMapPropagator.composite(io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator.getInstance(),
+                        
io.opentelemetry.api.baggage.propagation.W3CBaggagePropagator.getInstance(), 
new BaggageTextMapPropagator(remoteFields,
                                 new OtelBaggageManager(currentTraceContext, 
remoteFields, Collections.emptyList())));
             }
-            return TextMapPropagator.noop();
+            return 
io.opentelemetry.context.propagation.TextMapPropagator.noop();
         }
     }
 }
diff --git 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporter.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/utils/ObservationConstants.java
similarity index 70%
rename from 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporter.java
rename to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/utils/ObservationConstants.java
index 9b8f12ee4b..819e6ac44b 100644
--- 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/exporter/TraceExporter.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/utils/ObservationConstants.java
@@ -14,24 +14,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.tracing.exporter;
 
-import brave.handler.SpanHandler;
-import io.opentelemetry.sdk.trace.export.SpanExporter;
+package org.apache.dubbo.tracing.utils;
 
-public interface TraceExporter {
+public class ObservationConstants {
 
-    /**
-     * for otel
-     *
-     * @return
-     */
-    SpanExporter getSpanExporter();
-
-    /**
-     * for brave
-     *
-     * @return
-     */
-    SpanHandler getSpanHandler();
+    public static final String DEFAULT_APPLICATION_NAME = "dubbo-application";
 }
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
index 4cf8e05edf..72a77556eb 100644
--- 
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
@@ -43,6 +43,10 @@ public class ObservationSupportUtil {
                 && isClassPresent("brave.Tracing");
     }
 
+    public static boolean isSupportBraveURLSender() {
+        return 
isClassPresent("zipkin2.reporter.urlconnection.URLConnectionSender");
+    }
+
     private static boolean isClassPresent(String className) {
         return ClassUtils.isPresent(className, 
ObservationSupportUtil.class.getClassLoader());
     }
diff --git 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java
 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/utils/PropagationType.java
similarity index 61%
copy from 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java
copy to 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/utils/PropagationType.java
index 8560a5b149..8ed5c56135 100644
--- 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/utils/PropagationType.java
@@ -14,18 +14,31 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.tracing.tracer.brave;
 
-import org.apache.dubbo.tracing.tracer.PropagatorProvider;
+package org.apache.dubbo.tracing.utils;
 
-import io.micrometer.tracing.propagation.Propagator;
+public enum PropagationType {
 
+    W3C("W3C"),
+    B3("B3");
 
-public class BravePropagatorProvider implements PropagatorProvider {
+    private final String value;
 
-    @Override
-    public Propagator getPropagator() {
-        // TODO impl
+    PropagationType(String type) {
+        this.value = type;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public static PropagationType forValue(String value) {
+        PropagationType[] values = values();
+        for (PropagationType type : values) {
+            if (type.getValue().equals(value)) {
+                return type;
+            }
+        }
         return null;
     }
 }
diff --git 
a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/exporter/otlp/OTlpSpanExporterTest.java
similarity index 51%
copy from 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
copy to 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/exporter/otlp/OTlpSpanExporterTest.java
index 83f2cd2df0..a57933ea2e 100644
--- 
a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/exporter/otlp/OTlpSpanExporterTest.java
@@ -14,26 +14,30 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.tracing.tracer.otel;
+package org.apache.dubbo.tracing.exporter.otlp;
 
-import org.apache.dubbo.common.utils.Assert;
+import org.apache.dubbo.config.nested.ExporterConfig;
+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 io.opentelemetry.sdk.trace.export.SpanExporter;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.time.Duration;
+
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
-class OTelPropagatorProviderTest {
+class OTlpSpanExporterTest {
 
     @Test
-    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.");
+    void getSpanExporter() {
+        ExporterConfig.OtlpConfig otlpConfig = 
mock(ExporterConfig.OtlpConfig.class);
+        
when(otlpConfig.getEndpoint()).thenReturn("http://localhost:9411/api/v2/spans";);
+        when(otlpConfig.getTimeout()).thenReturn(Duration.ofSeconds(5));
+        when(otlpConfig.getCompressionMethod()).thenReturn("gzip");
+
+        SpanExporter spanExporter = 
OTlpSpanExporter.getSpanExporter(ApplicationModel.defaultModel(), otlpConfig);
+        Assertions.assertNotNull(spanExporter);
     }
 }
\ No newline at end of file
diff --git 
a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinSpanExporterTest.java
similarity index 50%
copy from 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
copy to 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinSpanExporterTest.java
index 83f2cd2df0..c6bd0922e0 100644
--- 
a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinSpanExporterTest.java
@@ -14,26 +14,31 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.tracing.tracer.otel;
+package org.apache.dubbo.tracing.exporter.zipkin;
 
-import org.apache.dubbo.common.utils.Assert;
+import org.apache.dubbo.config.nested.ExporterConfig;
+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 io.opentelemetry.sdk.trace.export.SpanExporter;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.time.Duration;
+
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 
-class OTelPropagatorProviderTest {
+class ZipkinSpanExporterTest {
 
     @Test
-    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.");
+    void getSpanExporter() {
+        ExporterConfig.ZipkinConfig zipkinConfig = 
mock(ExporterConfig.ZipkinConfig.class);
+        
when(zipkinConfig.getEndpoint()).thenReturn("http://localhost:9411/api/v2/spans";);
+        
when(zipkinConfig.getConnectTimeout()).thenReturn(Duration.ofSeconds(5));
+        when(zipkinConfig.getReadTimeout()).thenReturn(Duration.ofSeconds(5));
+
+        SpanExporter spanExporter = 
ZipkinSpanExporter.getSpanExporter(ApplicationModel.defaultModel(), 
zipkinConfig);
+        Assertions.assertNotNull(spanExporter);
     }
 }
\ No newline at end of file
diff --git 
a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinSpanHandlerTest.java
similarity index 53%
copy from 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
copy to 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinSpanHandlerTest.java
index 83f2cd2df0..b30b2a8f04 100644
--- 
a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/exporter/zipkin/ZipkinSpanHandlerTest.java
@@ -14,26 +14,29 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.tracing.tracer.otel;
+package org.apache.dubbo.tracing.exporter.zipkin;
 
-import org.apache.dubbo.common.utils.Assert;
+import org.apache.dubbo.config.nested.ExporterConfig;
+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 brave.handler.SpanHandler;
+import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
 
+import java.time.Duration;
+
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
-class OTelPropagatorProviderTest {
+class ZipkinSpanHandlerTest {
 
     @Test
-    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.");
+    void getSpanHandler() {
+        ExporterConfig.ZipkinConfig zipkinConfig = 
mock(ExporterConfig.ZipkinConfig.class);
+        
when(zipkinConfig.getEndpoint()).thenReturn("http://localhost:9411/api/v2/spans";);
+        
when(zipkinConfig.getConnectTimeout()).thenReturn(Duration.ofSeconds(5));
+
+        SpanHandler spanHandler = 
ZipkinSpanHandler.getSpanHandler(ApplicationModel.defaultModel(), zipkinConfig);
+        Assertions.assertNotNull(spanHandler);
     }
 }
\ No newline at end of file
diff --git 
a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProviderTest.java
similarity index 63%
copy from 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
copy to 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProviderTest.java
index 83f2cd2df0..b9c6c32489 100644
--- 
a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProviderTest.java
@@ -14,26 +14,25 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.tracing.tracer.otel;
+package org.apache.dubbo.tracing.tracer.brave;
 
 import org.apache.dubbo.common.utils.Assert;
 
+import brave.Tracing;
 import io.micrometer.tracing.propagation.Propagator;
-import io.opentelemetry.api.trace.Tracer;
-import io.opentelemetry.context.propagation.ContextPropagators;
 import org.junit.jupiter.api.Test;
 
 import static org.mockito.Mockito.mock;
 
-class OTelPropagatorProviderTest {
+class BravePropagatorProviderTest {
 
     @Test
-    void testOTelPropagatorProvider() {
-        ContextPropagators contextPropagators = mock(ContextPropagators.class);
-        Tracer tracer = mock(Tracer.class);
-        OTelPropagatorProvider.createMicrometerPropagator(contextPropagators, 
tracer);
-        OTelPropagatorProvider oTelPropagatorProvider = new 
OTelPropagatorProvider();
-        Propagator propagator = oTelPropagatorProvider.getPropagator();
+    void testBravePropagatorProvider() {
+        Tracing tracing = mock(Tracing.class);
+        BravePropagatorProvider.createMicrometerPropagator(tracing);
+
+        BravePropagatorProvider bravePropagatorProvider = new 
BravePropagatorProvider();
+        Propagator propagator = bravePropagatorProvider.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/brave/BraveProviderTest.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/brave/BraveProviderTest.java
new file mode 100644
index 0000000000..a622a3c6a1
--- /dev/null
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/brave/BraveProviderTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.brave;
+
+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.config.nested.PropagationConfig;
+import org.apache.dubbo.rpc.model.ApplicationModel;
+import org.apache.dubbo.tracing.utils.PropagationType;
+
+import brave.propagation.Propagation;
+import io.micrometer.tracing.Tracer;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+class BraveProviderTest {
+
+    @Test
+    void testGetTracer() {
+        TracingConfig tracingConfig = new TracingConfig();
+        tracingConfig.setEnabled(true);
+        ExporterConfig exporterConfig = new ExporterConfig();
+        exporterConfig.setZipkinConfig(new ExporterConfig.ZipkinConfig(""));
+        tracingConfig.setTracingExporter(exporterConfig);
+
+        BraveProvider braveProvider = new 
BraveProvider(ApplicationModel.defaultModel(), tracingConfig);
+        Tracer tracer = braveProvider.getTracer();
+        Assert.notNull(tracer, "Tracer should not be null.");
+        assertEquals(io.micrometer.tracing.brave.bridge.BraveTracer.class, 
tracer.getClass());
+    }
+
+    @Test
+    void testGetPropagator() {
+        TracingConfig tracingConfig = mock(TracingConfig.class);
+        PropagationConfig propagationConfig = mock(PropagationConfig.class);
+        when(tracingConfig.getPropagation()).thenReturn(propagationConfig);
+        BaggageConfig baggageConfig = mock(BaggageConfig.class);
+        when(tracingConfig.getBaggage()).thenReturn(baggageConfig);
+
+        // no baggage
+        when(baggageConfig.getEnabled()).thenReturn(Boolean.FALSE);
+
+        
when(propagationConfig.getType()).thenReturn(PropagationType.W3C.getValue());
+        Propagation.Factory w3cPropagationFactoryWithoutBaggage = 
BraveProvider.PropagatorFactory.getPropagationFactory(tracingConfig);
+        assertEquals(io.micrometer.tracing.brave.bridge.W3CPropagation.class, 
w3cPropagationFactoryWithoutBaggage.getClass());
+
+        
when(propagationConfig.getType()).thenReturn(PropagationType.B3.getValue());
+        Propagation.Factory b3PropagationFactoryWithoutBaggage = 
BraveProvider.PropagatorFactory.getPropagationFactory(tracingConfig);
+        Assert.notNull(b3PropagationFactoryWithoutBaggage, 
"b3PropagationFactoryWithoutBaggage should not be null.");
+
+        // with baggage
+        when(baggageConfig.getEnabled()).thenReturn(Boolean.TRUE);
+        BaggageConfig.Correlation correlation = 
mock(BaggageConfig.Correlation.class);
+        when(correlation.isEnabled()).thenReturn(Boolean.TRUE);
+        when(baggageConfig.getCorrelation()).thenReturn(correlation);
+        List<String> remoteFields = new ArrayList<>();
+        for (int i = 0; i < 10; i++) {
+            remoteFields.add("test-hd-" + i);
+        }
+        when(baggageConfig.getRemoteFields()).thenReturn(remoteFields);
+        Propagation.Factory propagationFactoryWithBaggage = 
BraveProvider.PropagatorFactory.getPropagationFactory(tracingConfig);
+        Assert.notNull(propagationFactoryWithBaggage, 
"propagationFactoryWithBaggage should not be null.");
+    }
+}
\ No newline at end of file
diff --git 
a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
index 83f2cd2df0..24b1e3f11d 100644
--- 
a/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/tracer/otel/OTelPropagatorProviderTest.java
@@ -23,6 +23,7 @@ import io.opentelemetry.api.trace.Tracer;
 import io.opentelemetry.context.propagation.ContextPropagators;
 import org.junit.jupiter.api.Test;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.mock;
 
 class OTelPropagatorProviderTest {
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
index 0374912c3a..b48c624cd8 100644
--- 
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
@@ -20,15 +20,23 @@ 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.config.nested.PropagationConfig;
 import org.apache.dubbo.rpc.model.ApplicationModel;
 import org.apache.dubbo.tracing.tracer.TracerProvider;
 import org.apache.dubbo.tracing.tracer.TracerProviderFactory;
+import org.apache.dubbo.tracing.utils.PropagationType;
 
 import io.micrometer.tracing.Tracer;
+import io.micrometer.tracing.otel.bridge.OtelCurrentTraceContext;
 import io.micrometer.tracing.otel.bridge.OtelTracer;
+import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
+import io.opentelemetry.context.propagation.TextMapPropagator;
+import io.opentelemetry.extension.trace.propagation.B3Propagator;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 class OpenTelemetryProviderTest {
 
@@ -50,4 +58,28 @@ class OpenTelemetryProviderTest {
         Tracer tracer2 = tracerProvider2.getTracer();
         assertEquals(OtelTracer.class, tracer2.getClass());
     }
+
+    @Test
+    void testGetPropagator() {
+        PropagationConfig propagationConfig = mock(PropagationConfig.class);
+        BaggageConfig baggageConfig = mock(BaggageConfig.class);
+        OtelCurrentTraceContext otelCurrentTraceContext = 
mock(OtelCurrentTraceContext.class);
+
+        when(baggageConfig.getEnabled()).thenReturn(Boolean.FALSE);
+
+        
when(propagationConfig.getType()).thenReturn(PropagationType.B3.getValue());
+        TextMapPropagator b3PropagatorWithoutBaggage = 
OpenTelemetryProvider.PropagatorFactory.getPropagator(propagationConfig, 
baggageConfig, otelCurrentTraceContext);
+        assertEquals(B3Propagator.class, 
b3PropagatorWithoutBaggage.getClass());
+
+        
when(propagationConfig.getType()).thenReturn(PropagationType.W3C.getValue());
+        TextMapPropagator w3cPropagatorWithoutBaggage = 
OpenTelemetryProvider.PropagatorFactory.getPropagator(propagationConfig, 
baggageConfig, otelCurrentTraceContext);
+        assertEquals(W3CTraceContextPropagator.class, 
w3cPropagatorWithoutBaggage.getClass());
+
+
+        when(baggageConfig.getEnabled()).thenReturn(Boolean.TRUE);
+        TextMapPropagator propagatorWithBaggage = 
OpenTelemetryProvider.PropagatorFactory.getPropagator(propagationConfig, 
baggageConfig, otelCurrentTraceContext);
+        Assert.notNull(propagatorWithBaggage, "PropagatorWithBaggage should 
not be null");
+    }
+
+
 }
\ No newline at end of file
diff --git 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java
 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/utils/PropagationTypeTest.java
similarity index 55%
copy from 
dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java
copy to 
dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/utils/PropagationTypeTest.java
index 8560a5b149..857c7a84f3 100644
--- 
a/dubbo-metrics/dubbo-tracing/src/main/java/org/apache/dubbo/tracing/tracer/brave/BravePropagatorProvider.java
+++ 
b/dubbo-metrics/dubbo-tracing/src/test/java/org/apache/dubbo/tracing/utils/PropagationTypeTest.java
@@ -14,18 +14,24 @@
  * 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.tracing.utils;
 
-import org.apache.dubbo.tracing.tracer.PropagatorProvider;
+import org.junit.jupiter.api.Test;
 
-import io.micrometer.tracing.propagation.Propagator;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
+class PropagationTypeTest {
 
-public class BravePropagatorProvider implements PropagatorProvider {
+    @Test
+    void forValue() {
+        PropagationType propagationType1 = PropagationType.forValue("W3C");
+        assertEquals(PropagationType.W3C, propagationType1);
 
-    @Override
-    public Propagator getPropagator() {
-        // TODO impl
-        return null;
+        PropagationType propagationType2 = PropagationType.forValue("B3");
+        assertEquals(PropagationType.B3, propagationType2);
+
+        PropagationType propagationType3 = PropagationType.forValue("B33");
+        assertNull(propagationType3);
     }
-}
+}
\ No newline at end of file

Reply via email to