Deprecate tracermanagement and SDK global access (#2547)

* Deprecate SdkTracerManagement

* Deprecate global SDK

* Deprecate more

* Fix

* Cleanup

* Fix

* Handle test order random

* Collector removed queued_retry
This commit is contained in:
Anuraag Agrawal 2021-01-21 14:39:32 +09:00 committed by GitHub
parent b4218426ee
commit 58bcf7fe88
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 108 additions and 42 deletions

View File

@ -13,10 +13,16 @@ import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
class OpenTracingShimTest {
@AfterEach
void tearDown() {
GlobalOpenTelemetry.resetForTest();
}
@Test
void createTracerShim_default() {
TracerShim tracerShim = (TracerShim) OpenTracingShim.createTracerShim();

View File

@ -25,7 +25,6 @@ import io.opentelemetry.sdk.metrics.data.PointData;
import io.opentelemetry.sdk.metrics.export.IntervalMetricReader;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporter;
import io.opentelemetry.sdk.trace.SdkTracerManagement;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
import io.opentelemetry.semconv.resource.attributes.ResourceAttributes;
@ -102,7 +101,7 @@ public class OtlpPipelineStressTest {
private final InMemoryMetricExporter metricExporter = InMemoryMetricExporter.create();
private SdkTracerManagement tracerManagement;
private SdkTracerProvider sdkTracerProvider;
private OpenTelemetry openTelemetry;
private IntervalMetricReader intervalMetricReader;
private Proxy collectorProxy;
@ -131,7 +130,7 @@ public class OtlpPipelineStressTest {
@AfterEach
void tearDown() throws IOException {
intervalMetricReader.shutdown();
tracerManagement.shutdown();
sdkTracerProvider.shutdown();
toxiproxyClient.reset();
collectorProxy.delete();
@ -274,6 +273,6 @@ public class OtlpPipelineStressTest {
SdkTracerProvider.builder().addSpanProcessor(spanProcessor).build();
openTelemetry =
OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).buildAndRegisterGlobal();
tracerManagement = tracerProvider;
sdkTracerProvider = tracerProvider;
}
}

View File

@ -11,7 +11,6 @@ exporters:
processors:
batch:
queued_retry:
extensions:
health_check:
@ -25,7 +24,7 @@ service:
pipelines:
traces:
receivers: [otlp]
processors: [batch, queued_retry]
processors: [batch]
exporters: [logging]
metrics:
receivers: [otlp]

View File

@ -10,12 +10,12 @@ import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.TracerProvider;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.sdk.trace.SdkTracerManagement;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import javax.annotation.concurrent.ThreadSafe;
/** The SDK implementation of {@link OpenTelemetry}. */
@ThreadSafe
@SuppressWarnings("deprecation") // Remove when SdkTracerManagement is removed
public final class OpenTelemetrySdk implements OpenTelemetry {
private final ObfuscatedTracerProvider tracerProvider;
private final ContextPropagators propagators;
@ -33,13 +33,23 @@ public final class OpenTelemetrySdk implements OpenTelemetry {
return new OpenTelemetrySdkBuilder();
}
/** Returns the global {@link OpenTelemetrySdk}. */
/**
* Returns the global {@link OpenTelemetrySdk}.
*
* @deprecated Will be removed without replacement
*/
@Deprecated
public static OpenTelemetrySdk get() {
return (OpenTelemetrySdk) GlobalOpenTelemetry.get();
}
/** Returns the global {@link SdkTracerManagement}. */
public static SdkTracerManagement getGlobalTracerManagement() {
/**
* Returns the global {@link io.opentelemetry.sdk.trace.SdkTracerManagement}.
*
* @deprecated Will be removed without replacement
*/
@Deprecated
public static io.opentelemetry.sdk.trace.SdkTracerManagement getGlobalTracerManagement() {
TracerProvider tracerProvider = GlobalOpenTelemetry.get().getTracerProvider();
if (!(tracerProvider instanceof ObfuscatedTracerProvider)) {
throw new IllegalStateException(
@ -54,13 +64,24 @@ public final class OpenTelemetrySdk implements OpenTelemetry {
return tracerProvider;
}
/** Returns the {@link SdkTracerProvider} for this {@link OpenTelemetrySdk}. */
public SdkTracerProvider getSdkTracerProvider() {
return tracerProvider.unobfuscate();
}
@Override
public ContextPropagators getPropagators() {
return propagators;
}
/** Returns the {@link SdkTracerManagement} for this {@link OpenTelemetrySdk}. */
public SdkTracerManagement getTracerManagement() {
/**
* Returns the {@link io.opentelemetry.sdk.trace.SdkTracerManagement} for this {@link
* OpenTelemetrySdk}.
*
* @deprecated Use {@link #getSdkTracerProvider()}
*/
@Deprecated
public io.opentelemetry.sdk.trace.SdkTracerManagement getTracerManagement() {
return tracerProvider.unobfuscate();
}

View File

@ -6,12 +6,9 @@
package io.opentelemetry.sdk;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.InstanceOfAssertFactories.type;
import static org.mockito.Mockito.mock;
import io.opentelemetry.api.DefaultOpenTelemetry;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.trace.TracerProvider;
@ -48,21 +45,9 @@ class OpenTelemetrySdkTest {
void testRegisterGlobal() {
OpenTelemetrySdk sdk = OpenTelemetrySdk.builder().buildAndRegisterGlobal();
assertThat(sdk).isSameAs(GlobalOpenTelemetry.get());
assertThat(OpenTelemetrySdk.get()).isSameAs(sdk);
assertThat(((SdkTracerProvider) OpenTelemetrySdk.getGlobalTracerManagement()).get(""))
assertThat(GlobalOpenTelemetry.get()).isSameAs(sdk);
assertThat(((OpenTelemetrySdk) GlobalOpenTelemetry.get()).getSdkTracerProvider().get(""))
.isSameAs(GlobalOpenTelemetry.getTracerProvider().get(""));
assertThat(OpenTelemetrySdk.getGlobalTracerManagement()).isNotNull();
}
@Test
void testGetTracerManagementWhenNotTracerSdk() {
OpenTelemetrySdk.builder().buildAndRegisterGlobal();
assertThatCode(OpenTelemetrySdk::getGlobalTracerManagement).doesNotThrowAnyException();
GlobalOpenTelemetry.resetForTest();
GlobalOpenTelemetry.set(
DefaultOpenTelemetry.builder().setTracerProvider(tracerProvider).build());
assertThatThrownBy(OpenTelemetrySdk::getGlobalTracerManagement)
.isInstanceOf(IllegalStateException.class);
}
@Test
@ -93,6 +78,7 @@ class OpenTelemetrySdkTest {
.build();
assertThat(((ObfuscatedTracerProvider) openTelemetry.getTracerProvider()).unobfuscate())
.isEqualTo(tracerProvider);
assertThat(openTelemetry.getSdkTracerProvider()).isEqualTo(tracerProvider);
assertThat(openTelemetry.getPropagators()).isEqualTo(propagators);
}
@ -136,7 +122,7 @@ class OpenTelemetrySdkTest {
.asInstanceOf(type(ObfuscatedTracerProvider.class))
.isNotNull()
.matches(obfuscated -> obfuscated.unobfuscate() == tracerProvider);
assertThat(openTelemetry.getTracerManagement()).isNotNull();
assertThat(openTelemetry.getSdkTracerProvider()).isNotNull();
}
// This is just a demonstration of maximum that one can do with OpenTelemetry configuration.

View File

@ -11,7 +11,6 @@ import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter;
import io.opentelemetry.sdk.trace.SdkTracerManagement;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.data.SpanData;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
@ -78,9 +77,14 @@ public final class OpenTelemetryRule extends ExternalResource {
return openTelemetry;
}
/** Returns the {@link SdkTracerManagement} created by this extension. */
public SdkTracerManagement getTracerManagement() {
return openTelemetry.getTracerManagement();
/**
* Returns the {@link io.opentelemetry.sdk.trace.SdkTracerManagement} created by this extension.
*
* @deprecated Will be removed without replacement
*/
@Deprecated
public io.opentelemetry.sdk.trace.SdkTracerManagement getTracerManagement() {
return openTelemetry.getSdkTracerProvider();
}
/** Returns all the exported {@link SpanData} so far. */

View File

@ -14,7 +14,6 @@ import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.testing.assertj.TracesAssert;
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter;
import io.opentelemetry.sdk.trace.SdkTracerManagement;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.data.SpanData;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
@ -85,9 +84,14 @@ public final class OpenTelemetryExtension
return openTelemetry;
}
/** Returns the {@link SdkTracerManagement} created by this extension. */
public SdkTracerManagement getTracerManagement() {
return openTelemetry.getTracerManagement();
/**
* Returns the {@link io.opentelemetry.sdk.trace.SdkTracerManagement} created by this extension.
*
* @deprecated Will be removed without replacement
*/
@Deprecated
public io.opentelemetry.sdk.trace.SdkTracerManagement getTracerManagement() {
return openTelemetry.getSdkTracerProvider();
}
/** Returns all the exported {@link SpanData} so far. */

View File

@ -14,7 +14,10 @@ import java.util.concurrent.TimeUnit;
/**
* "Management" interface for the Tracing SDK. This interface exposes methods for configuring the
* Tracing SDK, as well as several lifecycle methods.
*
* @deprecated Use {@link SdkTracerProvider} directly.
*/
@Deprecated
public interface SdkTracerManagement extends Closeable {
/**

View File

@ -13,7 +13,9 @@ import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.internal.ComponentRegistry;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.config.TraceConfig;
import java.io.Closeable;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
import java.util.logging.Level;
import java.util.logging.Logger;
@ -26,7 +28,8 @@ import javax.annotation.Nullable;
* OpenTelemetry}. However, if you need a custom implementation of the factory, you can create one
* as needed.
*/
public final class SdkTracerProvider implements TracerProvider, SdkTracerManagement {
@SuppressWarnings("deprecation") // Remove when SdkTracerManagement is removed
public final class SdkTracerProvider implements TracerProvider, SdkTracerManagement, Closeable {
private static final Logger logger = Logger.getLogger(SdkTracerProvider.class.getName());
static final String DEFAULT_TRACER_NAME = "unknown";
private final TracerSharedState sharedState;
@ -69,11 +72,28 @@ public final class SdkTracerProvider implements TracerProvider, SdkTracerManagem
return tracerSdkComponentRegistry.get(instrumentationName, instrumentationVersion);
}
/** Returns the active {@link TraceConfig}. */
@Override
public TraceConfig getActiveTraceConfig() {
return sharedState.getActiveTraceConfig();
}
/**
* Attempts to stop all the activity for this {@link Tracer}. Calls {@link
* SpanProcessor#shutdown()} for all registered {@link SpanProcessor}s.
*
* <p>The returned {@link CompletableResultCode} will be completed when all the Spans are
* processed.
*
* <p>After this is called, newly created {@code Span}s will be no-ops.
*
* <p>After this is called, further attempts at re-using or reconfiguring this instance will
* result in undefined behavior. It should be considered a terminal operation for the SDK
* implementation.
*
* @return a {@link CompletableResultCode} which is completed when all the span processors have
* been shut down.
*/
@Override
public CompletableResultCode shutdown() {
if (sharedState.isStopped()) {
@ -83,8 +103,32 @@ public final class SdkTracerProvider implements TracerProvider, SdkTracerManagem
return sharedState.shutdown();
}
/**
* Requests the active span processor to process all span events that have not yet been processed
* and returns a {@link CompletableResultCode} which is completed when the flush is finished.
*
* @see SpanProcessor#forceFlush()
*/
@Override
public CompletableResultCode forceFlush() {
return sharedState.getActiveSpanProcessor().forceFlush();
}
/**
* Attempts to stop all the activity for this {@link Tracer}. Calls {@link
* SpanProcessor#shutdown()} for all registered {@link SpanProcessor}s.
*
* <p>This operation may block until all the Spans are processed. Must be called before turning
* off the main application to ensure all data are processed and exported.
*
* <p>After this is called, newly created {@code Span}s will be no-ops.
*
* <p>After this is called, further attempts at re-using or reconfiguring this instance will
* result in undefined behavior. It should be considered a terminal operation for the SDK
* implementation.
*/
@Override
public void close() {
shutdown().join(10, TimeUnit.SECONDS);
}
}

View File

@ -6,7 +6,7 @@
package io.opentelemetry.sdk.trace.export;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.trace.SdkTracerManagement;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.data.SpanData;
import java.io.Closeable;
import java.util.ArrayList;
@ -77,8 +77,8 @@ public interface SpanExporter extends Closeable {
CompletableResultCode flush();
/**
* Called when {@link SdkTracerManagement#shutdown()} is called, if this {@code SpanExporter} is
* registered to a {@code TracerSdkManagement} object.
* Called when {@link SdkTracerProvider#shutdown()} is called, if this {@code SpanExporter} is
* registered to a {@link SdkTracerProvider} object.
*
* @return a {@link CompletableResultCode} which is completed when shutdown completes.
*/