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

mikexue pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/eventmesh.git


The following commit(s) were added to refs/heads/master by this push:
     new 1e8c5dba3 [ISSUE #3944]Var of type SpanProcessor no need to be defined 
as global variables in ZipkinTraceService, PinpointTraceService (#3945)
1e8c5dba3 is described below

commit 1e8c5dba327d73ceb044f26ccbd02bdee5b0d06d
Author: pandaapo <[email protected]>
AuthorDate: Wed May 31 11:29:19 2023 +0800

    [ISSUE #3944]Var of type SpanProcessor no need to be defined as global 
variables in ZipkinTraceService, PinpointTraceService (#3945)
    
    * Add an base class for EventMeshTraceService's implementations.;
    
    * Fix CI error.
    
    * Fix CI error.
    
    * Fix checkstyle error.
    
    * Fix checkstyle error.
    
    * Fix test case bug.
---
 .../eventmesh/common/config/ConfigService.java     |  14 +-
 .../eventmesh/common/utils/ReflectUtils.java       |  45 +++++++
 .../eventmesh/trace/api/AbstractTraceService.java  | 149 +++++++++++++++++++++
 .../trace/api/common/EventMeshTraceConstants.java  |   3 +
 .../eventmesh/trace/jaeger/JaegerTraceService.java | 117 +---------------
 .../trace/jaeger/common/JaegerConstants.java       |  23 ----
 .../trace/jaeger/JaegerTraceServiceTest.java       |  22 ++-
 .../jaeger/config/JaegerConfigurationTest.java     |  15 ++-
 .../trace/pinpoint/PinpointTraceService.java       | 135 +------------------
 .../trace/pinpoint/common/PinpointConstants.java   |   2 -
 .../pinpoint/exporter/PinpointSpanExporter.java    |   4 +-
 .../trace/pinpoint/PinpointTraceServiceTest.java   |  14 +-
 .../eventmesh/trace/zipkin/ZipkinTraceService.java | 111 +--------------
 .../trace/zipkin/common/ZipkinConstants.java       |   3 -
 .../trace/zipkin/ZipkinTraceServiceTest.java       |  14 +-
 15 files changed, 273 insertions(+), 398 deletions(-)

diff --git 
a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigService.java
 
b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigService.java
index 4b938b16c..1f1fc398b 100644
--- 
a/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigService.java
+++ 
b/eventmesh-common/src/main/java/org/apache/eventmesh/common/config/ConfigService.java
@@ -17,6 +17,8 @@
 
 package org.apache.eventmesh.common.config;
 
+import static org.apache.eventmesh.common.utils.ReflectUtils.lookUpField;
+
 import org.apache.commons.lang3.StringUtils;
 
 import java.io.File;
@@ -27,7 +29,6 @@ import java.net.URL;
 import java.util.Objects;
 import java.util.Properties;
 
-
 import org.assertj.core.util.Strings;
 
 import lombok.Getter;
@@ -155,7 +156,15 @@ public class ConfigService {
         configInfo.setMonitor(config.monitor());
         configInfo.setReloadMethodName(config.reloadMethodName());
 
-        Field field = clazz.getDeclaredField(configInfo.getField());
+        Field field = null;
+        try {
+            field = clazz.getDeclaredField(configInfo.getField());
+        } catch (NoSuchFieldException e) {
+            field = lookUpField(clazz, configInfo.getField());
+            if (field == null) {
+                throw e;
+            }
+        }
         configInfo.setClazz(field.getType());
 
         Config configType = field.getType().getAnnotation(Config.class);
@@ -180,4 +189,5 @@ public class ConfigService {
             configMonitorService.monitor(configInfo);
         }
     }
+
 }
diff --git 
a/eventmesh-common/src/main/java/org/apache/eventmesh/common/utils/ReflectUtils.java
 
b/eventmesh-common/src/main/java/org/apache/eventmesh/common/utils/ReflectUtils.java
new file mode 100644
index 000000000..f3572b5b6
--- /dev/null
+++ 
b/eventmesh-common/src/main/java/org/apache/eventmesh/common/utils/ReflectUtils.java
@@ -0,0 +1,45 @@
+/*
+ * 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.eventmesh.common.utils;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+
+public class ReflectUtils {
+
+    /**
+     * Look up fields inherited from the parent class.
+     *
+     * @param clazz
+     * @param fieldName
+     * @return
+     */
+    public static Field lookUpField(Class<?> clazz, String fieldName) {
+        Class<?> superClass = clazz.getSuperclass();
+        while (superClass != null) {
+            Field[] superFields = superClass.getDeclaredFields();
+            for (Field superField : superFields) {
+                if (!Modifier.isPrivate(superField.getModifiers()) && 
superField.getName().equals(fieldName)) {
+                    return superField;
+                }
+            }
+            superClass = superClass.getSuperclass();
+        }
+        return null;
+    }
+}
diff --git 
a/eventmesh-trace-plugin/eventmesh-trace-api/src/main/java/org/apache/eventmesh/trace/api/AbstractTraceService.java
 
b/eventmesh-trace-plugin/eventmesh-trace-api/src/main/java/org/apache/eventmesh/trace/api/AbstractTraceService.java
new file mode 100644
index 000000000..89928a578
--- /dev/null
+++ 
b/eventmesh-trace-plugin/eventmesh-trace-api/src/main/java/org/apache/eventmesh/trace/api/AbstractTraceService.java
@@ -0,0 +1,149 @@
+/*
+ * 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.eventmesh.trace.api;
+
+import org.apache.eventmesh.trace.api.common.EventMeshTraceConstants;
+import org.apache.eventmesh.trace.api.config.ExporterConfiguration;
+import org.apache.eventmesh.trace.api.exception.TraceException;
+
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import io.opentelemetry.api.OpenTelemetry;
+import io.opentelemetry.api.trace.Span;
+import io.opentelemetry.api.trace.SpanKind;
+import io.opentelemetry.api.trace.Tracer;
+import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
+import io.opentelemetry.context.Context;
+import io.opentelemetry.context.propagation.ContextPropagators;
+import io.opentelemetry.context.propagation.TextMapGetter;
+import io.opentelemetry.context.propagation.TextMapPropagator;
+import io.opentelemetry.sdk.OpenTelemetrySdk;
+import io.opentelemetry.sdk.resources.Resource;
+import io.opentelemetry.sdk.trace.SdkTracerProvider;
+import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
+import io.opentelemetry.sdk.trace.SpanProcessor;
+
+import lombok.Data;
+
+/**
+ * The abstract base class for EventMeshTraceService's implementations
+ */
+@Data
+public abstract class AbstractTraceService implements EventMeshTraceService {
+
+    protected transient SdkTracerProvider sdkTracerProvider;
+
+    protected transient Tracer tracer;
+
+    protected transient TextMapPropagator textMapPropagator;
+
+    /**
+     * Unified configuration class corresponding to exporter.properties
+     */
+    protected transient ExporterConfiguration exporterConfiguration;
+
+    protected transient Thread shutdownHook;
+
+    @Override
+    public Context extractFrom(final Context context, final Map<String, 
Object> carrier) throws TraceException {
+        textMapPropagator.extract(context, carrier, new 
TextMapGetter<Map<String, Object>>() {
+            @Override
+            public Iterable<String> keys(@Nonnull final Map<String, Object> 
carrier) {
+                return carrier.keySet();
+            }
+
+            @Nullable
+            @Override
+            public String get(final @Nonnull Map<String, Object> carrier, 
final String key) {
+                return 
Optional.ofNullable(carrier.get(key)).map(Objects::toString).orElse(null);
+            }
+        });
+        return context;
+    }
+
+    @Override
+    public void inject(Context context, Map<String, Object> map) {
+        textMapPropagator.inject(context, map, (carrier, key, value) -> 
map.put(key, value));
+    }
+
+    @Override
+    public Span createSpan(final String spanName,
+                           final SpanKind spanKind,
+                           final long startTimestamp,
+                           final TimeUnit timeUnit,
+                           final Context context,
+                           final boolean isSpanFinishInOtherThread) throws 
TraceException {
+        return tracer.spanBuilder(spanName)
+                .setParent(context)
+                .setSpanKind(spanKind)
+                .setStartTimestamp(startTimestamp, timeUnit)
+                .startSpan();
+    }
+
+    @Override
+    public Span createSpan(String spanName, SpanKind spanKind, Context context,
+                           boolean isSpanFinishInOtherThread) throws 
TraceException {
+        return tracer.spanBuilder(spanName)
+                .setParent(context)
+                .setSpanKind(spanKind)
+                .setStartTimestamp(System.currentTimeMillis(), 
TimeUnit.MILLISECONDS)
+                .startSpan();
+    }
+
+    @Override
+    public void shutdown() throws TraceException {
+        try {
+            if (sdkTracerProvider != null) {
+                sdkTracerProvider.close();
+            }
+        } catch (Exception e) {
+            throw new TraceException("trace close error", e);
+        }
+    }
+
+    /**
+     * Init the common fields
+     * @param spanProcessor
+     * @param serviceNameResource
+     */
+    protected void initVars(SpanProcessor spanProcessor, Resource 
serviceNameResource) {
+        SdkTracerProviderBuilder builder = SdkTracerProvider.builder()
+                .addSpanProcessor(spanProcessor);
+        if (serviceNameResource != null) {
+            
builder.setResource(Resource.getDefault().merge(serviceNameResource));
+        }
+        sdkTracerProvider = builder.build();
+
+        final OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
+                
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
+                .setTracerProvider(sdkTracerProvider)
+                .build();
+
+        tracer = openTelemetry.getTracer(EventMeshTraceConstants.SERVICE_NAME);
+        textMapPropagator = 
openTelemetry.getPropagators().getTextMapPropagator();
+        shutdownHook = new Thread(sdkTracerProvider::close);
+        shutdownHook.setDaemon(true);
+        Runtime.getRuntime().addShutdownHook(shutdownHook);
+    }
+}
diff --git 
a/eventmesh-trace-plugin/eventmesh-trace-api/src/main/java/org/apache/eventmesh/trace/api/common/EventMeshTraceConstants.java
 
b/eventmesh-trace-plugin/eventmesh-trace-api/src/main/java/org/apache/eventmesh/trace/api/common/EventMeshTraceConstants.java
index 41c1f3419..992af000d 100644
--- 
a/eventmesh-trace-plugin/eventmesh-trace-api/src/main/java/org/apache/eventmesh/trace/api/common/EventMeshTraceConstants.java
+++ 
b/eventmesh-trace-plugin/eventmesh-trace-api/src/main/java/org/apache/eventmesh/trace/api/common/EventMeshTraceConstants.java
@@ -29,4 +29,7 @@ public class EventMeshTraceConstants {
     public static final String TRACE_DOWNSTREAM_EVENTMESH_CLIENT_SPAN = 
"downstream-eventmesh-client-span";
 
     public static final String TRACE_EVENTMESH_SDK_SERVER_SPAN = 
"eventmesh-sdk-server-span";
+
+    // Name of the service(using the instrumentationName)
+    public static final String SERVICE_NAME = "eventmesh_trace";
 }
diff --git 
a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/JaegerTraceService.java
 
b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/JaegerTraceService.java
index 20b3fb0b7..0f48aed52 100644
--- 
a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/JaegerTraceService.java
+++ 
b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/JaegerTraceService.java
@@ -20,34 +20,17 @@ package org.apache.eventmesh.trace.jaeger;
 import static io.opentelemetry.api.common.AttributeKey.stringKey;
 
 import org.apache.eventmesh.common.config.Config;
-import org.apache.eventmesh.trace.api.EventMeshTraceService;
-import org.apache.eventmesh.trace.api.config.ExporterConfiguration;
+import org.apache.eventmesh.trace.api.AbstractTraceService;
+import org.apache.eventmesh.trace.api.common.EventMeshTraceConstants;
 import org.apache.eventmesh.trace.api.exception.TraceException;
-import org.apache.eventmesh.trace.jaeger.common.JaegerConstants;
 import org.apache.eventmesh.trace.jaeger.config.JaegerConfiguration;
 
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 
-import io.opentelemetry.api.OpenTelemetry;
 import io.opentelemetry.api.common.Attributes;
-import io.opentelemetry.api.trace.Span;
-import io.opentelemetry.api.trace.SpanKind;
-import io.opentelemetry.api.trace.Tracer;
-import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
-import io.opentelemetry.context.Context;
-import io.opentelemetry.context.propagation.ContextPropagators;
-import io.opentelemetry.context.propagation.TextMapGetter;
-import io.opentelemetry.context.propagation.TextMapPropagator;
 import io.opentelemetry.exporter.jaeger.JaegerGrpcSpanExporter;
-import io.opentelemetry.sdk.OpenTelemetrySdk;
 import io.opentelemetry.sdk.resources.Resource;
-import io.opentelemetry.sdk.trace.SdkTracerProvider;
 import io.opentelemetry.sdk.trace.SpanProcessor;
 import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
 
@@ -56,26 +39,13 @@ import lombok.Data;
 @Config(field = "jaegerConfiguration")
 @Config(field = "exporterConfiguration")
 @Data
-public class JaegerTraceService implements EventMeshTraceService {
-
-    private transient SdkTracerProvider sdkTracerProvider;
-
-    private transient Tracer tracer;
-
-    private transient TextMapPropagator textMapPropagator;
+public class JaegerTraceService extends AbstractTraceService {
 
     /**
      * Unified configuration class corresponding to jaeger.properties
      */
     private transient JaegerConfiguration jaegerConfiguration;
 
-    /**
-     * Unified configuration class corresponding to exporter.properties
-     */
-    private transient ExporterConfiguration exporterConfiguration;
-
-    private transient Thread shutdownHook;
-
     @Override
     public void init() throws TraceException {
         // jaeger's config
@@ -99,90 +69,15 @@ public class JaegerTraceService implements 
EventMeshTraceService {
             .setMaxQueueSize(eventMeshTraceMaxQueueSize)
             .build();
 
+        //set the trace service's name
         final Resource serviceNameResource =
-            Resource.create(Attributes.of(stringKey("service.name"), 
JaegerConstants.SERVICE_NAME));
-
-        sdkTracerProvider = SdkTracerProvider.builder()
-            .addSpanProcessor(spanProcessor)
-            .setResource(Resource.getDefault().merge(serviceNameResource))
-            .build();
-
-        final OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
-            
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
-            .setTracerProvider(sdkTracerProvider)
-            .build();
-
-        tracer = openTelemetry.getTracer(JaegerConstants.SERVICE_NAME);
-        textMapPropagator = 
openTelemetry.getPropagators().getTextMapPropagator();
-
-        shutdownHook = new Thread(sdkTracerProvider::close);
-        shutdownHook.setDaemon(true);
-        Runtime.getRuntime().addShutdownHook(shutdownHook);
-    }
+            Resource.create(Attributes.of(stringKey("service.name"), 
EventMeshTraceConstants.SERVICE_NAME));
 
-    @Override
-    public Context extractFrom(final Context context, final Map<String, 
Object> carrier) throws TraceException {
-        textMapPropagator.extract(context, carrier, new 
TextMapGetter<Map<String, Object>>() {
-            @Override
-            public Iterable<String> keys(@Nonnull final Map<String, Object> 
carrier) {
-                return carrier.keySet();
-            }
-
-            @Nullable
-            @Override
-            public String get(final @Nonnull Map<String, Object> carrier, 
final String key) {
-                return 
Optional.ofNullable(carrier.get(key)).map(Objects::toString).orElse(null);
-            }
-        });
-        return context;
-    }
-
-    @Override
-    public void inject(final Context context, final Map<String, Object> 
carrier) {
-        textMapPropagator.inject(context, carrier, (cr, key, value) -> {
-            if (cr != null) {
-                cr.put(key, value);
-            }
-        });
-    }
-
-    @Override
-    public Span createSpan(final String spanName, final SpanKind spanKind, 
final long startTimestamp,
-        final TimeUnit timeUnit, final Context context,
-        final boolean isSpanFinishInOtherThread) throws TraceException {
-        return tracer.spanBuilder(spanName)
-            .setParent(context)
-            .setSpanKind(spanKind)
-            .setStartTimestamp(startTimestamp, timeUnit)
-            .startSpan();
-    }
-
-    @Override
-    public Span createSpan(final String spanName, final SpanKind spanKind, 
final Context context,
-        final boolean isSpanFinishInOtherThread) throws TraceException {
-        return tracer.spanBuilder(spanName)
-            .setParent(context)
-            .setSpanKind(spanKind)
-            .setStartTimestamp(System.currentTimeMillis(), 
TimeUnit.MILLISECONDS)
-            .startSpan();
-    }
-
-    @Override
-    public void shutdown() throws TraceException {
-        try {
-            if (sdkTracerProvider != null) {
-                sdkTracerProvider.close();
-            }
-        } catch (Exception e) {
-            throw new TraceException("trace close error", e);
-        }
+        initVars(spanProcessor, serviceNameResource);
     }
 
     public JaegerConfiguration getClientConfiguration() {
         return this.jaegerConfiguration;
     }
 
-    public ExporterConfiguration getExporterConfiguration() {
-        return this.exporterConfiguration;
-    }
 }
diff --git 
a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/common/JaegerConstants.java
 
b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/common/JaegerConstants.java
deleted file mode 100644
index 622b63774..000000000
--- 
a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/main/java/org/apache/eventmesh/trace/jaeger/common/JaegerConstants.java
+++ /dev/null
@@ -1,23 +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.eventmesh.trace.jaeger.common;
-
-public class JaegerConstants {
-
-    public static final String SERVICE_NAME = "eventmesh_trace";
-}
\ No newline at end of file
diff --git 
a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/JaegerTraceServiceTest.java
 
b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/JaegerTraceServiceTest.java
index 29defd544..5067ce3dd 100644
--- 
a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/JaegerTraceServiceTest.java
+++ 
b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/JaegerTraceServiceTest.java
@@ -17,13 +17,15 @@
 
 package org.apache.eventmesh.trace.jaeger;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThrows;
 
+import org.apache.eventmesh.common.utils.ReflectUtils;
 import org.apache.eventmesh.trace.api.TracePluginFactory;
 
 import java.lang.reflect.Field;
 
-import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
 
@@ -37,23 +39,31 @@ public class JaegerTraceServiceTest {
             (JaegerTraceService) 
TracePluginFactory.getEventMeshTraceService("jaeger");
         jaegerTraceService.init();
 
-        Assert.assertNotNull(jaegerTraceService.getSdkTracerProvider());
-        Assert.assertNotNull(jaegerTraceService.getShutdownHook());
+        assertNotNull(jaegerTraceService.getSdkTracerProvider());
+        assertNotNull(jaegerTraceService.getShutdownHook());
 
         IllegalArgumentException illegalArgumentException =
             assertThrows(IllegalArgumentException.class, () ->
                 
Runtime.getRuntime().addShutdownHook(jaegerTraceService.getShutdownHook()));
-        Assert.assertEquals(illegalArgumentException.getMessage(), "Hook 
previously registered");
+        assertEquals(illegalArgumentException.getMessage(), "Hook previously 
registered");
     }
 
     @Test
     public void testShutdown() throws NoSuchFieldException, 
IllegalAccessException {
-        SdkTracerProvider mockSdkTracerProvider = 
Mockito.mock(SdkTracerProvider.class);
         JaegerTraceService jaegerTraceService =
             (JaegerTraceService) 
TracePluginFactory.getEventMeshTraceService("jaeger");
         jaegerTraceService.init();
-        Field sdkTracerProviderField = 
JaegerTraceService.class.getDeclaredField("sdkTracerProvider");
+        Field sdkTracerProviderField = null;
+        try {
+            sdkTracerProviderField = 
JaegerTraceService.class.getDeclaredField("sdkTracerProvider");
+        } catch (NoSuchFieldException e) {
+            sdkTracerProviderField = 
ReflectUtils.lookUpField(JaegerTraceService.class, "sdkTracerProvider");
+            if (sdkTracerProviderField == null) {
+                throw e;
+            }
+        }
         sdkTracerProviderField.setAccessible(true);
+        SdkTracerProvider mockSdkTracerProvider = 
Mockito.mock(SdkTracerProvider.class);
         sdkTracerProviderField.set(jaegerTraceService, mockSdkTracerProvider);
 
         jaegerTraceService.shutdown();
diff --git 
a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/config/JaegerConfigurationTest.java
 
b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/config/JaegerConfigurationTest.java
index 4983dd176..f4b8f6a8f 100644
--- 
a/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/config/JaegerConfigurationTest.java
+++ 
b/eventmesh-trace-plugin/eventmesh-trace-jaeger/src/test/java/org/apache/eventmesh/trace/jaeger/config/JaegerConfigurationTest.java
@@ -17,11 +17,12 @@
 
 package org.apache.eventmesh.trace.jaeger.config;
 
+import static org.junit.Assert.assertEquals;
+
 import org.apache.eventmesh.trace.api.TracePluginFactory;
 import org.apache.eventmesh.trace.api.config.ExporterConfiguration;
 import org.apache.eventmesh.trace.jaeger.JaegerTraceService;
 
-import org.junit.Assert;
 import org.junit.Test;
 
 public class JaegerConfigurationTest {
@@ -38,14 +39,14 @@ public class JaegerConfigurationTest {
     }
 
     private void assertClientConfig(JaegerConfiguration config) {
-        Assert.assertEquals("localhost", config.getEventMeshJaegerIp());
-        Assert.assertEquals(14250, config.getEventMeshJaegerPort());
+        assertEquals("localhost", config.getEventMeshJaegerIp());
+        assertEquals(14250, config.getEventMeshJaegerPort());
     }
 
     private void assertBaseConfig(ExporterConfiguration config) {
-        Assert.assertEquals(816, config.getEventMeshTraceMaxExportSize());
-        Assert.assertEquals(1816, config.getEventMeshTraceMaxQueueSize());
-        Assert.assertEquals(2816, config.getEventMeshTraceExportTimeout());
-        Assert.assertEquals(3816, config.getEventMeshTraceExportInterval());
+        assertEquals(816, config.getEventMeshTraceMaxExportSize());
+        assertEquals(1816, config.getEventMeshTraceMaxQueueSize());
+        assertEquals(2816, config.getEventMeshTraceExportTimeout());
+        assertEquals(3816, config.getEventMeshTraceExportInterval());
     }
 }
diff --git 
a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceService.java
 
b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceService.java
index 7e6fcc6aa..f3907e180 100644
--- 
a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceService.java
+++ 
b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceService.java
@@ -18,31 +18,13 @@
 package org.apache.eventmesh.trace.pinpoint;
 
 import org.apache.eventmesh.common.config.Config;
-import org.apache.eventmesh.trace.api.EventMeshTraceService;
-import org.apache.eventmesh.trace.api.config.ExporterConfiguration;
+import org.apache.eventmesh.trace.api.AbstractTraceService;
 import org.apache.eventmesh.trace.api.exception.TraceException;
-import org.apache.eventmesh.trace.pinpoint.common.PinpointConstants;
 import org.apache.eventmesh.trace.pinpoint.config.PinpointConfiguration;
 import org.apache.eventmesh.trace.pinpoint.exporter.PinpointSpanExporter;
 
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 
-import javax.annotation.Nonnull;
-
-import io.opentelemetry.api.OpenTelemetry;
-import io.opentelemetry.api.trace.Span;
-import io.opentelemetry.api.trace.SpanKind;
-import io.opentelemetry.api.trace.Tracer;
-import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
-import io.opentelemetry.context.Context;
-import io.opentelemetry.context.propagation.ContextPropagators;
-import io.opentelemetry.context.propagation.TextMapGetter;
-import io.opentelemetry.context.propagation.TextMapPropagator;
-import io.opentelemetry.sdk.OpenTelemetrySdk;
-import io.opentelemetry.sdk.trace.SdkTracerProvider;
 import io.opentelemetry.sdk.trace.SpanProcessor;
 import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
 
@@ -54,28 +36,13 @@ import lombok.Data;
 @Config(field = "pinpointConfiguration")
 @Config(field = "exporterConfiguration")
 @Data
-public class PinpointTraceService implements EventMeshTraceService {
-
-    private transient SdkTracerProvider sdkTracerProvider;
-
-    private transient Tracer tracer;
-
-    private transient TextMapPropagator textMapPropagator;
+public class PinpointTraceService extends AbstractTraceService {
 
     /**
      * Unified configuration class corresponding to pinpoint.properties
      */
     private transient PinpointConfiguration pinpointConfiguration;
 
-    /**
-     * Unified configuration class corresponding to exporter.properties
-     */
-    private transient ExporterConfiguration exporterConfiguration;
-
-    private transient SpanProcessor spanProcessor;
-
-    private transient Thread shutdownHook;
-
     @Override
     public void init() throws TraceException {
         final long eventMeshTraceExportInterval = 
exporterConfiguration.getEventMeshTraceExportInterval();
@@ -83,7 +50,7 @@ public class PinpointTraceService implements 
EventMeshTraceService {
         final int eventMeshTraceMaxExportSize = 
exporterConfiguration.getEventMeshTraceMaxExportSize();
         final int eventMeshTraceMaxQueueSize = 
exporterConfiguration.getEventMeshTraceMaxQueueSize();
 
-        spanProcessor = BatchSpanProcessor.builder(
+        SpanProcessor spanProcessor = BatchSpanProcessor.builder(
                 new PinpointSpanExporter(
                     pinpointConfiguration.getAgentId(),
                     pinpointConfiguration.getAgentName(),
@@ -95,105 +62,11 @@ public class PinpointTraceService implements 
EventMeshTraceService {
             .setMaxQueueSize(eventMeshTraceMaxQueueSize)
             .build();
 
-        sdkTracerProvider = SdkTracerProvider.builder()
-            .addSpanProcessor(spanProcessor)
-            .build();
-
-        final OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
-            
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
-            .setTracerProvider(sdkTracerProvider)
-            .build();
-
-        tracer = openTelemetry.getTracer(PinpointConstants.SERVICE_NAME);
-
-        textMapPropagator = 
openTelemetry.getPropagators().getTextMapPropagator();
-
-        shutdownHook = new Thread(sdkTracerProvider::close);
-        shutdownHook.setDaemon(true);
-        Runtime.getRuntime().addShutdownHook(shutdownHook);
-    }
-
-    @Override
-    public Context extractFrom(final Context context, final Map<String, 
Object> carrier) throws TraceException {
-        textMapPropagator.extract(context, carrier, new 
TextMapGetter<Map<String, Object>>() {
-            @Override
-            public Iterable<String> keys(final @Nonnull Map<String, Object> 
carrier) {
-                return carrier.keySet();
-            }
-
-            @Override
-            public String get(final @Nonnull Map<String, Object> carrier, 
final @Nonnull String key) {
-                return 
Optional.ofNullable(carrier.get(key)).map(Objects::toString).orElse(null);
-            }
-        });
-        return context;
-
-    }
-
-    @Override
-    public void inject(final Context context, final Map<String, Object> 
carrier) {
-        textMapPropagator.inject(context, carrier, (cr, key, value) -> {
-            if (cr != null) {
-                cr.put(key, value);
-            }
-        });
-    }
-
-    @Override
-    public Span createSpan(final String spanName,
-        final SpanKind spanKind,
-        final long startTimestamp,
-        final TimeUnit timeUnit,
-        final Context context,
-        final boolean isSpanFinishInOtherThread) throws TraceException {
-        return tracer.spanBuilder(spanName)
-            .setParent(context)
-            .setSpanKind(spanKind)
-            .setStartTimestamp(startTimestamp, timeUnit)
-            .startSpan();
-    }
-
-    @Override
-    public Span createSpan(final String spanName, final SpanKind spanKind, 
final Context context,
-        final boolean isSpanFinishInOtherThread) throws TraceException {
-        return tracer.spanBuilder(spanName)
-            .setParent(context)
-            .setSpanKind(spanKind)
-            .setStartTimestamp(System.currentTimeMillis(), 
TimeUnit.MILLISECONDS)
-            .startSpan();
-    }
-
-    @Override
-    public void shutdown() throws TraceException {
-
-        Exception ex = null;
-
-        try {
-            if (sdkTracerProvider != null) {
-                sdkTracerProvider.close();
-            }
-        } catch (Exception e) {
-            ex = e;
-        }
-
-        try {
-            if (spanProcessor != null) {
-                spanProcessor.close();
-            }
-        } catch (Exception e) {
-            ex = e;
-        }
-
-        if (ex != null) {
-            throw new TraceException("trace close error", ex);
-        }
+        initVars(spanProcessor, null);
     }
 
     public PinpointConfiguration getClientConfiguration() {
         return this.pinpointConfiguration;
     }
 
-    public ExporterConfiguration getExporterConfiguration() {
-        return this.exporterConfiguration;
-    }
 }
diff --git 
a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/common/PinpointConstants.java
 
b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/common/PinpointConstants.java
index 9ebf68fd7..c704a0e87 100644
--- 
a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/common/PinpointConstants.java
+++ 
b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/common/PinpointConstants.java
@@ -19,8 +19,6 @@ package org.apache.eventmesh.trace.pinpoint.common;
 
 public class PinpointConstants {
 
-    public static final String SERVICE_NAME = "eventmesh_trace";
-
     public static final String REQ_IP = "req0ip";
 
     public static final String UNKNOWN_REQ_IP = "unknown";
diff --git 
a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/exporter/PinpointSpanExporter.java
 
b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/exporter/PinpointSpanExporter.java
index e1e6d3fdb..f7ddcfd3a 100644
--- 
a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/exporter/PinpointSpanExporter.java
+++ 
b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/main/java/org/apache/eventmesh/trace/pinpoint/exporter/PinpointSpanExporter.java
@@ -25,7 +25,7 @@ import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import org.apache.eventmesh.common.Constants;
 import org.apache.eventmesh.common.utils.IPUtils;
 import org.apache.eventmesh.common.utils.JsonUtils;
-import org.apache.eventmesh.trace.pinpoint.common.PinpointConstants;
+import org.apache.eventmesh.trace.api.common.EventMeshTraceConstants;
 
 import org.apache.commons.collections4.CollectionUtils;
 
@@ -178,7 +178,7 @@ public final class PinpointSpanExporter implements 
SpanExporter {
         final ServerMetaDataRegistryService serverMetaDataRegistryService = 
new DefaultServerMetaDataRegistryService(
             Collections.emptyList()
         );
-        
serverMetaDataRegistryService.setServerName(PinpointConstants.SERVICE_NAME);
+        
serverMetaDataRegistryService.setServerName(EventMeshTraceConstants.SERVICE_NAME);
 
         final AgentInfoFactory agentInfoFactory = new AgentInfoFactory(
             agentInformationProvider.createAgentInformation(),
diff --git 
a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/test/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceServiceTest.java
 
b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/test/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceServiceTest.java
index 770cd2065..4b06140c3 100644
--- 
a/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/test/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceServiceTest.java
+++ 
b/eventmesh-trace-plugin/eventmesh-trace-pinpoint/src/test/java/org/apache/eventmesh/trace/pinpoint/PinpointTraceServiceTest.java
@@ -19,6 +19,7 @@ package org.apache.eventmesh.trace.pinpoint;
 
 import static org.junit.Assert.assertThrows;
 
+import org.apache.eventmesh.common.utils.ReflectUtils;
 import org.apache.eventmesh.trace.api.TracePluginFactory;
 
 import java.lang.reflect.Field;
@@ -45,13 +46,20 @@ public class PinpointTraceServiceTest {
 
     @Test
     public void testShutdown() throws Exception {
-        SdkTracerProvider mockSdkTracerProvider = 
Mockito.mock(SdkTracerProvider.class);
-
         PinpointTraceService pinpointTraceService =
             (PinpointTraceService) 
TracePluginFactory.getEventMeshTraceService("pinpoint");
         pinpointTraceService.init();
-        Field sdkTracerProviderField = 
PinpointTraceService.class.getDeclaredField("sdkTracerProvider");
+        Field sdkTracerProviderField = null;
+        try {
+            sdkTracerProviderField = 
PinpointTraceService.class.getDeclaredField("sdkTracerProvider");
+        } catch (NoSuchFieldException e) {
+            sdkTracerProviderField = 
ReflectUtils.lookUpField(PinpointTraceService.class, "sdkTracerProvider");
+            if (sdkTracerProviderField == null) {
+                throw e;
+            }
+        }
         sdkTracerProviderField.setAccessible(true);
+        SdkTracerProvider mockSdkTracerProvider = 
Mockito.mock(SdkTracerProvider.class);
         sdkTracerProviderField.set(pinpointTraceService, 
mockSdkTracerProvider);
 
         pinpointTraceService.shutdown();
diff --git 
a/eventmesh-trace-plugin/eventmesh-trace-zipkin/src/main/java/org/apache/eventmesh/trace/zipkin/ZipkinTraceService.java
 
b/eventmesh-trace-plugin/eventmesh-trace-zipkin/src/main/java/org/apache/eventmesh/trace/zipkin/ZipkinTraceService.java
index ec7e1cb09..600563c92 100644
--- 
a/eventmesh-trace-plugin/eventmesh-trace-zipkin/src/main/java/org/apache/eventmesh/trace/zipkin/ZipkinTraceService.java
+++ 
b/eventmesh-trace-plugin/eventmesh-trace-zipkin/src/main/java/org/apache/eventmesh/trace/zipkin/ZipkinTraceService.java
@@ -20,32 +20,17 @@ package org.apache.eventmesh.trace.zipkin;
 import static io.opentelemetry.api.common.AttributeKey.stringKey;
 
 import org.apache.eventmesh.common.config.Config;
-import org.apache.eventmesh.trace.api.EventMeshTraceService;
-import org.apache.eventmesh.trace.api.config.ExporterConfiguration;
+import org.apache.eventmesh.trace.api.AbstractTraceService;
+import org.apache.eventmesh.trace.api.common.EventMeshTraceConstants;
 import org.apache.eventmesh.trace.api.exception.TraceException;
 import org.apache.eventmesh.trace.zipkin.common.ZipkinConstants;
 import org.apache.eventmesh.trace.zipkin.config.ZipkinConfiguration;
 
-import java.util.Map;
-import java.util.Optional;
 import java.util.concurrent.TimeUnit;
 
-import javax.annotation.Nonnull;
-
-import io.opentelemetry.api.OpenTelemetry;
 import io.opentelemetry.api.common.Attributes;
-import io.opentelemetry.api.trace.Span;
-import io.opentelemetry.api.trace.SpanKind;
-import io.opentelemetry.api.trace.Tracer;
-import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
-import io.opentelemetry.context.Context;
-import io.opentelemetry.context.propagation.ContextPropagators;
-import io.opentelemetry.context.propagation.TextMapGetter;
-import io.opentelemetry.context.propagation.TextMapPropagator;
 import io.opentelemetry.exporter.zipkin.ZipkinSpanExporter;
-import io.opentelemetry.sdk.OpenTelemetrySdk;
 import io.opentelemetry.sdk.resources.Resource;
-import io.opentelemetry.sdk.trace.SdkTracerProvider;
 import io.opentelemetry.sdk.trace.SpanProcessor;
 import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
 
@@ -58,27 +43,13 @@ import lombok.Data;
 @Config(field = "zipkinConfiguration")
 @Config(field = "exporterConfiguration")
 @Data
-public class ZipkinTraceService implements EventMeshTraceService {
-
-    private transient SdkTracerProvider sdkTracerProvider;
-    private transient SpanProcessor spanProcessor;
-
-    private transient Thread shutdownHook;
-
-
-    private transient Tracer tracer;
-    private transient TextMapPropagator textMapPropagator;
+public class ZipkinTraceService extends AbstractTraceService {
 
     /**
      * Unified configuration class corresponding to zipkin.properties
      */
     private transient ZipkinConfiguration zipkinConfiguration;
 
-    /**
-     * Unified configuration class corresponding to exporter.properties
-     */
-    private transient ExporterConfiguration exporterConfiguration;
-
     private transient ZipkinSpanExporter zipkinExporter;
 
     @Override
@@ -96,7 +67,7 @@ public class ZipkinTraceService implements 
EventMeshTraceService {
         final String httpUrl = String.format("http://%s:%s";, 
eventMeshZipkinIP, eventMeshZipkinPort);
         zipkinExporter =
             ZipkinSpanExporter.builder().setEndpoint(httpUrl + 
ZipkinConstants.ENDPOINT_V2_SPANS).build();
-        spanProcessor = BatchSpanProcessor.builder(zipkinExporter)
+        SpanProcessor spanProcessor = 
BatchSpanProcessor.builder(zipkinExporter)
             .setScheduleDelay(eventMeshTraceExportInterval, TimeUnit.SECONDS)
             .setExporterTimeout(eventMeshTraceExportTimeout, TimeUnit.SECONDS)
             .setMaxExportBatchSize(eventMeshTraceMaxExportSize)
@@ -105,71 +76,13 @@ public class ZipkinTraceService implements 
EventMeshTraceService {
 
         //set the trace service's name
         final Resource serviceNameResource =
-            Resource.create(Attributes.of(stringKey("service.name"), 
ZipkinConstants.SERVICE_NAME));
-
-        sdkTracerProvider = SdkTracerProvider.builder()
-            .addSpanProcessor(spanProcessor)
-            .setResource(Resource.getDefault().merge(serviceNameResource))
-            .build();
-
-        final OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
-            
.setPropagators(ContextPropagators.create(W3CTraceContextPropagator.getInstance()))
-            .setTracerProvider(sdkTracerProvider)
-            .build();
-
-        //TODO serviceName???
-        tracer = openTelemetry.getTracer(ZipkinConstants.SERVICE_NAME);
-        textMapPropagator = 
openTelemetry.getPropagators().getTextMapPropagator();
-        shutdownHook = new Thread(sdkTracerProvider::close);
-        shutdownHook.setDaemon(true);
-        Runtime.getRuntime().addShutdownHook(shutdownHook);
-    }
+            Resource.create(Attributes.of(stringKey("service.name"), 
EventMeshTraceConstants.SERVICE_NAME));
 
-    @Override
-    public Context extractFrom(Context context, Map<String, Object> map) 
throws TraceException {
-        textMapPropagator.extract(context, map, new TextMapGetter<Map<String, 
Object>>() {
-            @Override
-            public Iterable<String> keys(@Nonnull Map<String, Object> carrier) 
{
-                return carrier.keySet();
-            }
-
-            @Override
-            public String get(@Nonnull Map<String, Object> carrier, String 
key) {
-                return 
Optional.ofNullable(carrier.get(key)).map(Object::toString).orElse(null);
-            }
-        });
-        return context;
-    }
-
-    @Override
-    public void inject(Context context, Map<String, Object> map) {
-        textMapPropagator.inject(context, map, (carrier, key, value) -> 
map.put(key, value));
-    }
-
-    @Override
-    public Span createSpan(String spanName, SpanKind spanKind, long startTime, 
TimeUnit timeUnit,
-        Context context, boolean isSpanFinishInOtherThread)
-        throws TraceException {
-        return tracer.spanBuilder(spanName)
-            .setParent(context)
-            .setSpanKind(spanKind)
-            .setStartTimestamp(startTime, timeUnit)
-            .startSpan();
-    }
-
-    @Override
-    public Span createSpan(String spanName, SpanKind spanKind, Context context,
-        boolean isSpanFinishInOtherThread) throws TraceException {
-        return tracer.spanBuilder(spanName)
-            .setParent(context)
-            .setSpanKind(spanKind)
-            .setStartTimestamp(System.currentTimeMillis(), 
TimeUnit.MILLISECONDS)
-            .startSpan();
+        initVars(spanProcessor, serviceNameResource);
     }
 
     @Override
     public void shutdown() throws TraceException {
-        //todo: check the spanProcessor if it was already close
 
         Exception ex = null;
 
@@ -181,14 +94,6 @@ public class ZipkinTraceService implements 
EventMeshTraceService {
             ex = e;
         }
 
-        try {
-            if (spanProcessor != null) {
-                spanProcessor.close();
-            }
-        } catch (Exception e) {
-            ex = e;
-        }
-
         try {
             if (zipkinExporter != null) {
                 zipkinExporter.close();
@@ -207,8 +112,4 @@ public class ZipkinTraceService implements 
EventMeshTraceService {
     public ZipkinConfiguration getClientConfiguration() {
         return this.zipkinConfiguration;
     }
-
-    public ExporterConfiguration getExporterConfiguration() {
-        return this.exporterConfiguration;
-    }
 }
diff --git 
a/eventmesh-trace-plugin/eventmesh-trace-zipkin/src/main/java/org/apache/eventmesh/trace/zipkin/common/ZipkinConstants.java
 
b/eventmesh-trace-plugin/eventmesh-trace-zipkin/src/main/java/org/apache/eventmesh/trace/zipkin/common/ZipkinConstants.java
index 1ad22e972..259fad433 100644
--- 
a/eventmesh-trace-plugin/eventmesh-trace-zipkin/src/main/java/org/apache/eventmesh/trace/zipkin/common/ZipkinConstants.java
+++ 
b/eventmesh-trace-plugin/eventmesh-trace-zipkin/src/main/java/org/apache/eventmesh/trace/zipkin/common/ZipkinConstants.java
@@ -19,9 +19,6 @@ package org.apache.eventmesh.trace.zipkin.common;
 
 public class ZipkinConstants {
 
-    // Name of the service(using the instrumentationName)
-    public static final String SERVICE_NAME = "eventmesh_trace";
-
     // Zipkin API Endpoints for uploading spans
     public static final String ENDPOINT_V2_SPANS = "/api/v2/spans";
 }
diff --git 
a/eventmesh-trace-plugin/eventmesh-trace-zipkin/src/test/java/org/apache/eventmesh/trace/zipkin/ZipkinTraceServiceTest.java
 
b/eventmesh-trace-plugin/eventmesh-trace-zipkin/src/test/java/org/apache/eventmesh/trace/zipkin/ZipkinTraceServiceTest.java
index f00ee0cc6..747ec166d 100644
--- 
a/eventmesh-trace-plugin/eventmesh-trace-zipkin/src/test/java/org/apache/eventmesh/trace/zipkin/ZipkinTraceServiceTest.java
+++ 
b/eventmesh-trace-plugin/eventmesh-trace-zipkin/src/test/java/org/apache/eventmesh/trace/zipkin/ZipkinTraceServiceTest.java
@@ -19,6 +19,7 @@ package org.apache.eventmesh.trace.zipkin;
 
 import static org.junit.Assert.assertThrows;
 
+import org.apache.eventmesh.common.utils.ReflectUtils;
 import org.apache.eventmesh.trace.api.TracePluginFactory;
 
 import java.lang.reflect.Field;
@@ -48,13 +49,20 @@ public class ZipkinTraceServiceTest {
 
     @Test
     public void testShutdown() throws Exception {
-        SdkTracerProvider mockSdkTracerProvider = 
Mockito.mock(SdkTracerProvider.class);
-
         ZipkinTraceService zipkinTraceService =
             (ZipkinTraceService) 
TracePluginFactory.getEventMeshTraceService("zipkin");
         zipkinTraceService.init();
-        Field sdkTracerProviderField = 
ZipkinTraceService.class.getDeclaredField("sdkTracerProvider");
+        Field sdkTracerProviderField = null;
+        try {
+            sdkTracerProviderField = 
ZipkinTraceService.class.getDeclaredField("sdkTracerProvider");
+        } catch (NoSuchFieldException e) {
+            sdkTracerProviderField = 
ReflectUtils.lookUpField(ZipkinTraceService.class, "sdkTracerProvider");
+            if (sdkTracerProviderField == null) {
+                throw e;
+            }
+        }
         sdkTracerProviderField.setAccessible(true);
+        SdkTracerProvider mockSdkTracerProvider = 
Mockito.mock(SdkTracerProvider.class);
         sdkTracerProviderField.set(zipkinTraceService, mockSdkTracerProvider);
 
         zipkinTraceService.shutdown();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]


Reply via email to