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]