Remove OpenTelemetry SPI (#2504)

This commit is contained in:
Anuraag Agrawal 2021-01-14 11:35:41 +09:00 committed by GitHub
parent e0f6260bc9
commit 6bee59e912
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 7 additions and 380 deletions

View File

@ -14,7 +14,7 @@ import io.opentelemetry.context.propagation.ContextPropagators;
@SuppressWarnings("deprecation") // Remove after deleting OpenTelemetry SPI @SuppressWarnings("deprecation") // Remove after deleting OpenTelemetry SPI
public final class DefaultOpenTelemetryBuilder { public final class DefaultOpenTelemetryBuilder {
private ContextPropagators propagators = ContextPropagators.noop(); private ContextPropagators propagators = ContextPropagators.noop();
private TracerProvider tracerProvider; private TracerProvider tracerProvider = TracerProvider.getDefault();
/** /**
* Package protected to disallow direct initialization. * Package protected to disallow direct initialization.
@ -53,17 +53,6 @@ public final class DefaultOpenTelemetryBuilder {
* @return a new {@link OpenTelemetry}. * @return a new {@link OpenTelemetry}.
*/ */
public OpenTelemetry build() { 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); return new DefaultOpenTelemetry(tracerProvider, propagators);
} }
} }

View File

@ -29,6 +29,8 @@ import javax.annotation.Nullable;
@SuppressWarnings("deprecation") // Remove after deleting OpenTelemetry SPI @SuppressWarnings("deprecation") // Remove after deleting OpenTelemetry SPI
public final class GlobalOpenTelemetry { 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 Logger logger = Logger.getLogger(GlobalOpenTelemetry.class.getName());
private static final Object mutex = new Object(); private static final Object mutex = new Object();
@ -54,13 +56,7 @@ public final class GlobalOpenTelemetry {
return autoConfigured; return autoConfigured;
} }
io.opentelemetry.spi.OpenTelemetryFactory openTelemetryFactory = return NOOP;
Utils.loadSpi(io.opentelemetry.spi.OpenTelemetryFactory.class);
if (openTelemetryFactory != null) {
set(openTelemetryFactory.create());
} else {
set(DefaultOpenTelemetry.builder().build());
}
} }
} }
} }

View File

@ -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();
}

View File

@ -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();
}

View File

@ -6,20 +6,12 @@
package io.opentelemetry.api; package io.opentelemetry.api;
import static org.assertj.core.api.Assertions.assertThat; 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.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import io.opentelemetry.api.trace.SpanBuilder;
import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.api.trace.TracerProvider; import io.opentelemetry.api.trace.TracerProvider;
import io.opentelemetry.context.propagation.ContextPropagators; 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.AfterEach;
import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -35,7 +27,6 @@ class OpenTelemetryTest {
@AfterEach @AfterEach
void after() { void after() {
GlobalOpenTelemetry.reset(); GlobalOpenTelemetry.reset();
System.clearProperty(io.opentelemetry.spi.trace.TracerProviderFactory.class.getName());
} }
@Test @Test
@ -62,51 +53,6 @@ class OpenTelemetryTest {
assertThat(openTelemetry.getPropagators()).isSameAs(contextPropagators); 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 @Test
void independentNonGlobalTracers() { void independentNonGlobalTracers() {
TracerProvider provider1 = mock(TracerProvider.class); TracerProvider provider1 = mock(TracerProvider.class);
@ -136,62 +82,4 @@ class OpenTelemetryTest {
assertThat(otel1.getPropagators()).isSameAs(propagators1); assertThat(otel1.getPropagators()).isSameAs(propagators1);
assertThat(otel2.getPropagators()).isSameAs(propagators2); 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();
}
}
} }

View File

@ -5,10 +5,7 @@
package io.opentelemetry.api.metrics; package io.opentelemetry.api.metrics;
import io.opentelemetry.spi.metrics.MeterProviderFactory;
import java.util.ServiceLoader;
import java.util.concurrent.atomic.AtomicReference; 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 * 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) { if (meterProvider == null) {
synchronized (mutex) { synchronized (mutex) {
if (globalMeterProvider.get() == null) { if (globalMeterProvider.get() == null) {
MeterProviderFactory meterProviderFactory = loadSpi(); return MeterProvider.getDefault();
if (meterProviderFactory != null) {
meterProvider = meterProviderFactory.create();
} else {
meterProvider = MeterProvider.getDefault();
}
globalMeterProvider.compareAndSet(null, meterProvider);
} }
} }
} }
@ -77,27 +68,4 @@ public class GlobalMetricsProvider {
public static Meter getMeter(String instrumentationName, String instrumentationVersion) { public static Meter getMeter(String instrumentationName, String instrumentationVersion) {
return get().get(instrumentationName, 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;
}
} }

View File

@ -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();
}

View File

@ -10,8 +10,8 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import io.github.netmikey.logunit.api.LogCapturer; import io.github.netmikey.logunit.api.LogCapturer;
import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.context.propagation.ContextPropagators; import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.extension.RegisterExtension;
import org.junitpioneer.jupiter.SetSystemProperty; import org.junitpioneer.jupiter.SetSystemProperty;
@ -64,7 +64,7 @@ class ConfigErrorTest {
@SetSystemProperty(key = "otel.trace.sampler.arg", value = "bar") @SetSystemProperty(key = "otel.trace.sampler.arg", value = "bar")
void globalOpenTelemetryWhenError() { void globalOpenTelemetryWhenError() {
assertThat(GlobalOpenTelemetry.get()) assertThat(GlobalOpenTelemetry.get())
.isInstanceOf(OpenTelemetrySdk.class) .isInstanceOf(OpenTelemetry.class)
.extracting("propagators") .extracting("propagators")
// Failed to initialize so is no-op // Failed to initialize so is no-op
.isEqualTo(ContextPropagators.noop()); .isEqualTo(ContextPropagators.noop());

View File

@ -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();
}
}

View File

@ -1 +0,0 @@
io.opentelemetry.sdk.OpenTelemetrySdkFactory

View File

@ -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();
}
}

View File

@ -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;

View File

@ -1 +0,0 @@
io.opentelemetry.sdk.metrics.spi.SdkMeterProviderFactory

View File

@ -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);
}
}

View File

@ -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();
}
}

View File

@ -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;

View File

@ -1 +0,0 @@
io.opentelemetry.sdk.trace.spi.SdkTracerProviderFactory

View File

@ -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());
}
}