Remove OpenTelemetry SPI (#2504)
This commit is contained in:
parent
e0f6260bc9
commit
6bee59e912
|
|
@ -14,7 +14,7 @@ import io.opentelemetry.context.propagation.ContextPropagators;
|
|||
@SuppressWarnings("deprecation") // Remove after deleting OpenTelemetry SPI
|
||||
public final class DefaultOpenTelemetryBuilder {
|
||||
private ContextPropagators propagators = ContextPropagators.noop();
|
||||
private TracerProvider tracerProvider;
|
||||
private TracerProvider tracerProvider = TracerProvider.getDefault();
|
||||
|
||||
/**
|
||||
* Package protected to disallow direct initialization.
|
||||
|
|
@ -53,17 +53,6 @@ public final class DefaultOpenTelemetryBuilder {
|
|||
* @return a new {@link OpenTelemetry}.
|
||||
*/
|
||||
public OpenTelemetry build() {
|
||||
TracerProvider tracerProvider = this.tracerProvider;
|
||||
if (tracerProvider == null) {
|
||||
io.opentelemetry.spi.trace.TracerProviderFactory tracerProviderFactory =
|
||||
Utils.loadSpi(io.opentelemetry.spi.trace.TracerProviderFactory.class);
|
||||
if (tracerProviderFactory != null) {
|
||||
tracerProvider = tracerProviderFactory.create();
|
||||
} else {
|
||||
tracerProvider = TracerProvider.getDefault();
|
||||
}
|
||||
}
|
||||
|
||||
return new DefaultOpenTelemetry(tracerProvider, propagators);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@ import javax.annotation.Nullable;
|
|||
@SuppressWarnings("deprecation") // Remove after deleting OpenTelemetry SPI
|
||||
public final class GlobalOpenTelemetry {
|
||||
|
||||
private static final OpenTelemetry NOOP = DefaultOpenTelemetry.builder().build();
|
||||
|
||||
private static final Logger logger = Logger.getLogger(GlobalOpenTelemetry.class.getName());
|
||||
|
||||
private static final Object mutex = new Object();
|
||||
|
|
@ -54,13 +56,7 @@ public final class GlobalOpenTelemetry {
|
|||
return autoConfigured;
|
||||
}
|
||||
|
||||
io.opentelemetry.spi.OpenTelemetryFactory openTelemetryFactory =
|
||||
Utils.loadSpi(io.opentelemetry.spi.OpenTelemetryFactory.class);
|
||||
if (openTelemetryFactory != null) {
|
||||
set(openTelemetryFactory.create());
|
||||
} else {
|
||||
set(DefaultOpenTelemetry.builder().build());
|
||||
}
|
||||
return NOOP;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,27 +0,0 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.spi;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
|
||||
/**
|
||||
* A service provider interface (SPI) for a {@link OpenTelemetry}. Fully qualified class name of the
|
||||
* implementation should be registered in a resource file {@code
|
||||
* META-INF/services/io.opentelemetry.spi.OpenTelemetryFactory}.
|
||||
*
|
||||
* <p>A specific implementation can be selected by setting the system property {@code
|
||||
* io.opentelemetry.spi.OpenTelemetryFactory} with the value of the fully qualified class name.
|
||||
*
|
||||
* @deprecated Use {@link io.opentelemetry.api.DefaultOpenTelemetry#builder} to initialize
|
||||
* OpenTelemetry with a custom provider, or {@code OpenTelemetrySdk#builder} or {@code
|
||||
* opentelemetry-sdk-extension-autoconfigure} to configure the default SDK.
|
||||
*/
|
||||
@Deprecated
|
||||
public interface OpenTelemetryFactory {
|
||||
|
||||
/** Returns a new {@link OpenTelemetry} instance. */
|
||||
OpenTelemetry create();
|
||||
}
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.spi.trace;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.trace.TracerProvider;
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
|
||||
/**
|
||||
* TracerProviderFactory is a service provider for a {@link TracerProvider}. Fully qualified class
|
||||
* name of the implementation should be registered in {@code
|
||||
* META-INF/services/io.opentelemetry.trace.spi.TracerProviderFactory}. <br>
|
||||
* <br>
|
||||
* A specific implementation can be selected by a system property {@code
|
||||
* io.opentelemetry.trace.spi.TracerProviderFactory} with value of fully qualified class name.
|
||||
*
|
||||
* @see OpenTelemetry
|
||||
* @deprecated Use {@link io.opentelemetry.api.DefaultOpenTelemetry#builder} to initialize
|
||||
* OpenTelemetry with a custom provider, or {@code OpenTelemetrySdk#builder} or {@code
|
||||
* opentelemetry-sdk-extension-autoconfigure} to configure the default SDK.
|
||||
*/
|
||||
@ThreadSafe
|
||||
@Deprecated
|
||||
public interface TracerProviderFactory {
|
||||
|
||||
/**
|
||||
* Creates a new TracerProvider.
|
||||
*
|
||||
* @return a new TracerProvider.
|
||||
*/
|
||||
TracerProvider create();
|
||||
}
|
||||
|
|
@ -6,20 +6,12 @@
|
|||
package io.opentelemetry.api;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import io.opentelemetry.api.trace.SpanBuilder;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.api.trace.TracerProvider;
|
||||
import io.opentelemetry.context.propagation.ContextPropagators;
|
||||
import java.io.File;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.Writer;
|
||||
import java.net.URL;
|
||||
import javax.annotation.Nullable;
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeAll;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
|
@ -35,7 +27,6 @@ class OpenTelemetryTest {
|
|||
@AfterEach
|
||||
void after() {
|
||||
GlobalOpenTelemetry.reset();
|
||||
System.clearProperty(io.opentelemetry.spi.trace.TracerProviderFactory.class.getName());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
@ -62,51 +53,6 @@ class OpenTelemetryTest {
|
|||
assertThat(openTelemetry.getPropagators()).isSameAs(contextPropagators);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testTracerLoadArbitrary() throws IOException {
|
||||
File serviceFile =
|
||||
createService(
|
||||
io.opentelemetry.spi.trace.TracerProviderFactory.class,
|
||||
FirstTracerProviderFactory.class,
|
||||
SecondTracerProviderFactory.class);
|
||||
try {
|
||||
assertThat(
|
||||
(GlobalOpenTelemetry.getTracerProvider().get("")
|
||||
instanceof FirstTracerProviderFactory)
|
||||
|| (GlobalOpenTelemetry.getTracerProvider().get("")
|
||||
instanceof SecondTracerProviderFactory))
|
||||
.isTrue();
|
||||
} finally {
|
||||
assertThat(serviceFile.delete()).isTrue();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testTracerSystemProperty() throws IOException {
|
||||
File serviceFile =
|
||||
createService(
|
||||
io.opentelemetry.spi.trace.TracerProviderFactory.class,
|
||||
FirstTracerProviderFactory.class,
|
||||
SecondTracerProviderFactory.class);
|
||||
System.setProperty(
|
||||
io.opentelemetry.spi.trace.TracerProviderFactory.class.getName(),
|
||||
SecondTracerProviderFactory.class.getName());
|
||||
try {
|
||||
assertThat(GlobalOpenTelemetry.getTracerProvider().get(""))
|
||||
.isInstanceOf(SecondTracerProviderFactory.class);
|
||||
} finally {
|
||||
assertThat(serviceFile.delete()).isTrue();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testTracerNotFound() {
|
||||
System.setProperty(
|
||||
io.opentelemetry.spi.trace.TracerProviderFactory.class.getName(), "io.does.not.exists");
|
||||
assertThatThrownBy(() -> GlobalOpenTelemetry.getTracer("testTracer"))
|
||||
.isInstanceOf(IllegalStateException.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
void independentNonGlobalTracers() {
|
||||
TracerProvider provider1 = mock(TracerProvider.class);
|
||||
|
|
@ -136,62 +82,4 @@ class OpenTelemetryTest {
|
|||
assertThat(otel1.getPropagators()).isSameAs(propagators1);
|
||||
assertThat(otel2.getPropagators()).isSameAs(propagators2);
|
||||
}
|
||||
|
||||
private static File createService(Class<?> service, Class<?>... impls) throws IOException {
|
||||
URL location = OpenTelemetryTest.class.getProtectionDomain().getCodeSource().getLocation();
|
||||
File file = new File(location.getPath() + "META-INF/services/" + service.getName());
|
||||
file.getParentFile().mkdirs();
|
||||
|
||||
@SuppressWarnings("DefaultCharset")
|
||||
Writer output = new FileWriter(file);
|
||||
for (Class<?> impl : impls) {
|
||||
output.write(impl.getName());
|
||||
output.write(System.getProperty("line.separator"));
|
||||
}
|
||||
output.close();
|
||||
return file;
|
||||
}
|
||||
|
||||
public static class SecondTracerProviderFactory extends FirstTracerProviderFactory {
|
||||
|
||||
@Override
|
||||
public Tracer get(String instrumentationName) {
|
||||
return new SecondTracerProviderFactory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tracer get(String instrumentationName, String instrumentationVersion) {
|
||||
return get(instrumentationName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public TracerProvider create() {
|
||||
return new SecondTracerProviderFactory();
|
||||
}
|
||||
}
|
||||
|
||||
public static class FirstTracerProviderFactory
|
||||
implements Tracer, TracerProvider, io.opentelemetry.spi.trace.TracerProviderFactory {
|
||||
|
||||
@Override
|
||||
public Tracer get(String instrumentationName) {
|
||||
return new FirstTracerProviderFactory();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Tracer get(String instrumentationName, String instrumentationVersion) {
|
||||
return get(instrumentationName);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public SpanBuilder spanBuilder(String spanName) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TracerProvider create() {
|
||||
return new FirstTracerProviderFactory();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,10 +5,7 @@
|
|||
|
||||
package io.opentelemetry.api.metrics;
|
||||
|
||||
import io.opentelemetry.spi.metrics.MeterProviderFactory;
|
||||
import java.util.ServiceLoader;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* IMPORTANT: This is a temporary class, and solution for the metrics package until it will be
|
||||
|
|
@ -26,13 +23,7 @@ public class GlobalMetricsProvider {
|
|||
if (meterProvider == null) {
|
||||
synchronized (mutex) {
|
||||
if (globalMeterProvider.get() == null) {
|
||||
MeterProviderFactory meterProviderFactory = loadSpi();
|
||||
if (meterProviderFactory != null) {
|
||||
meterProvider = meterProviderFactory.create();
|
||||
} else {
|
||||
meterProvider = MeterProvider.getDefault();
|
||||
}
|
||||
globalMeterProvider.compareAndSet(null, meterProvider);
|
||||
return MeterProvider.getDefault();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -77,27 +68,4 @@ public class GlobalMetricsProvider {
|
|||
public static Meter getMeter(String instrumentationName, String instrumentationVersion) {
|
||||
return get().get(instrumentationName, instrumentationVersion);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load provider class via {@link ServiceLoader}. A specific provider class can be requested via
|
||||
* setting a system property with FQCN.
|
||||
*
|
||||
* @return a provider or null if not found
|
||||
* @throws IllegalStateException if a specified provider is not found
|
||||
*/
|
||||
@Nullable
|
||||
private static MeterProviderFactory loadSpi() {
|
||||
String specifiedProvider = System.getProperty(MeterProviderFactory.class.getName());
|
||||
ServiceLoader<MeterProviderFactory> providers = ServiceLoader.load(MeterProviderFactory.class);
|
||||
for (MeterProviderFactory provider : providers) {
|
||||
if (specifiedProvider == null || specifiedProvider.equals(provider.getClass().getName())) {
|
||||
return provider;
|
||||
}
|
||||
}
|
||||
if (specifiedProvider != null) {
|
||||
throw new IllegalStateException(
|
||||
String.format("Service provider %s not found", specifiedProvider));
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,28 +0,0 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.spi.metrics;
|
||||
|
||||
import io.opentelemetry.api.metrics.MeterProvider;
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
|
||||
/**
|
||||
* MeterProviderFactory is a service provider for {@link MeterProvider}. Fully qualified class name
|
||||
* of the implementation should be registered in {@code
|
||||
* META-INF/services/io.opentelemetry.metrics.spi.MeterProviderFactory}. <br>
|
||||
* <br>
|
||||
* A specific implementation can be selected by a system property {@code
|
||||
* io.opentelemetry.metrics.spi.MeterProviderFactory} with value of fully qualified class name.
|
||||
*/
|
||||
@ThreadSafe
|
||||
public interface MeterProviderFactory {
|
||||
|
||||
/**
|
||||
* Creates a new meter registry instance.
|
||||
*
|
||||
* @return a meter factory instance.
|
||||
*/
|
||||
MeterProvider create();
|
||||
}
|
||||
|
|
@ -10,8 +10,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
|||
|
||||
import io.github.netmikey.logunit.api.LogCapturer;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.context.propagation.ContextPropagators;
|
||||
import io.opentelemetry.sdk.OpenTelemetrySdk;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.api.extension.RegisterExtension;
|
||||
import org.junitpioneer.jupiter.SetSystemProperty;
|
||||
|
|
@ -64,7 +64,7 @@ class ConfigErrorTest {
|
|||
@SetSystemProperty(key = "otel.trace.sampler.arg", value = "bar")
|
||||
void globalOpenTelemetryWhenError() {
|
||||
assertThat(GlobalOpenTelemetry.get())
|
||||
.isInstanceOf(OpenTelemetrySdk.class)
|
||||
.isInstanceOf(OpenTelemetry.class)
|
||||
.extracting("propagators")
|
||||
// Failed to initialize so is no-op
|
||||
.isEqualTo(ContextPropagators.noop());
|
||||
|
|
|
|||
|
|
@ -1,20 +0,0 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.sdk;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
|
||||
/**
|
||||
* Factory SPI implementation to register a {@link OpenTelemetrySdk} as the default {@link
|
||||
* OpenTelemetry}.
|
||||
*/
|
||||
@SuppressWarnings("deprecation") // Remove after deleting OpenTelemetry SPI
|
||||
public final class OpenTelemetrySdkFactory implements io.opentelemetry.spi.OpenTelemetryFactory {
|
||||
@Override
|
||||
public OpenTelemetry create() {
|
||||
return OpenTelemetrySdk.builder().build();
|
||||
}
|
||||
}
|
||||
|
|
@ -1 +0,0 @@
|
|||
io.opentelemetry.sdk.OpenTelemetrySdkFactory
|
||||
|
|
@ -1,18 +0,0 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.sdk.metrics.spi;
|
||||
|
||||
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
|
||||
import io.opentelemetry.spi.metrics.MeterProviderFactory;
|
||||
|
||||
/** SDK implementation of the {@link MeterProviderFactory} for SPI. */
|
||||
public final class SdkMeterProviderFactory implements MeterProviderFactory {
|
||||
|
||||
@Override
|
||||
public SdkMeterProvider create() {
|
||||
return SdkMeterProvider.builder().build();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
/** The SPI implementation which provides the SDK implementation of metrics. */
|
||||
@ParametersAreNonnullByDefault
|
||||
package io.opentelemetry.sdk.metrics.spi;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
|
|
@ -1 +0,0 @@
|
|||
io.opentelemetry.sdk.metrics.spi.SdkMeterProviderFactory
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.sdk.metrics.spi;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import io.opentelemetry.api.metrics.GlobalMetricsProvider;
|
||||
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/** Unit tests for {@link SdkMeterProviderFactory}. */
|
||||
class SdkMeterProviderFactoryTest {
|
||||
@Test
|
||||
void testDefault() {
|
||||
assertThat(GlobalMetricsProvider.get()).isInstanceOf(SdkMeterProvider.class);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.sdk.trace.spi;
|
||||
|
||||
import io.opentelemetry.api.trace.TracerProvider;
|
||||
import io.opentelemetry.sdk.trace.SdkTracerProvider;
|
||||
|
||||
/** SDK implementation of tracing. */
|
||||
@SuppressWarnings("deprecation") // Remove after deleting OpenTelemetry SPI
|
||||
public final class SdkTracerProviderFactory
|
||||
implements io.opentelemetry.spi.trace.TracerProviderFactory {
|
||||
|
||||
@Override
|
||||
public TracerProvider create() {
|
||||
return SdkTracerProvider.builder().build();
|
||||
}
|
||||
}
|
||||
|
|
@ -1,10 +0,0 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
/** The SPI implementation which provides the SDK implementation of tracing. */
|
||||
@ParametersAreNonnullByDefault
|
||||
package io.opentelemetry.sdk.trace.spi;
|
||||
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
|
|
@ -1 +0,0 @@
|
|||
io.opentelemetry.sdk.trace.spi.SdkTracerProviderFactory
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.sdk.trace.spi;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.sdk.trace.SdkTracerProvider;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/** Unit tests for {@link SdkTracerProviderFactory}. */
|
||||
class SdkTracerProviderFactoryTest {
|
||||
|
||||
@Test
|
||||
void testDefault() {
|
||||
Tracer tracerSdk = SdkTracerProvider.builder().build().get("");
|
||||
assertThat(GlobalOpenTelemetry.getTracerProvider().get("")).isInstanceOf(tracerSdk.getClass());
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue