Split global functionality into a separate class (#2233)
This ensure clear separation of functionality. This PR does not change any functionality, it just restructures the code to separate global functionality from the Default implementation. Also helps to ensure that Global initialization does not happen by mistake when working only with the default implementation. Also it helps with methods like `OpenTelemetry.get()` and `OpenTelemetry.set()` to understand they are interacting with global instance Signed-off-by: Bogdan Drutu <bogdandrutu@gmail.com>
This commit is contained in:
parent
44186bc110
commit
25bf879df7
|
@ -8,9 +8,6 @@ package io.opentelemetry.api;
|
|||
import io.opentelemetry.api.metrics.MeterProvider;
|
||||
import io.opentelemetry.api.trace.TracerProvider;
|
||||
import io.opentelemetry.context.propagation.ContextPropagators;
|
||||
import io.opentelemetry.spi.OpenTelemetryFactory;
|
||||
import java.util.ServiceLoader;
|
||||
import javax.annotation.Nullable;
|
||||
import javax.annotation.concurrent.ThreadSafe;
|
||||
|
||||
/**
|
||||
|
@ -19,32 +16,6 @@ import javax.annotation.concurrent.ThreadSafe;
|
|||
*/
|
||||
@ThreadSafe
|
||||
public class DefaultOpenTelemetry implements OpenTelemetry {
|
||||
private static final Object mutex = new Object();
|
||||
@Nullable private static volatile OpenTelemetry globalOpenTelemetry;
|
||||
|
||||
private final TracerProvider tracerProvider;
|
||||
private final MeterProvider meterProvider;
|
||||
private volatile ContextPropagators propagators;
|
||||
|
||||
static OpenTelemetry getGlobalOpenTelemetry() {
|
||||
if (globalOpenTelemetry == null) {
|
||||
synchronized (mutex) {
|
||||
if (globalOpenTelemetry == null) {
|
||||
OpenTelemetryFactory openTelemetryFactory = loadSpi(OpenTelemetryFactory.class);
|
||||
if (openTelemetryFactory != null) {
|
||||
globalOpenTelemetry = openTelemetryFactory.create();
|
||||
} else {
|
||||
globalOpenTelemetry = builder().build();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return globalOpenTelemetry;
|
||||
}
|
||||
|
||||
static void setGlobalOpenTelemetry(OpenTelemetry openTelemetry) {
|
||||
globalOpenTelemetry = openTelemetry;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a builder for the {@link DefaultOpenTelemetry}.
|
||||
|
@ -55,6 +26,11 @@ public class DefaultOpenTelemetry implements OpenTelemetry {
|
|||
return new DefaultOpenTelemetryBuilder();
|
||||
}
|
||||
|
||||
private final TracerProvider tracerProvider;
|
||||
private final MeterProvider meterProvider;
|
||||
|
||||
private volatile ContextPropagators propagators;
|
||||
|
||||
@Override
|
||||
public void setPropagators(ContextPropagators propagators) {
|
||||
this.propagators = propagators;
|
||||
|
@ -81,34 +57,4 @@ public class DefaultOpenTelemetry implements OpenTelemetry {
|
|||
this.meterProvider = meterProvider;
|
||||
this.propagators = propagators;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load provider class via {@link ServiceLoader}. A specific provider class can be requested via
|
||||
* setting a system property with FQCN.
|
||||
*
|
||||
* @param providerClass a provider class
|
||||
* @param <T> provider type
|
||||
* @return a provider or null if not found
|
||||
* @throws IllegalStateException if a specified provider is not found
|
||||
*/
|
||||
@Nullable
|
||||
static <T> T loadSpi(Class<T> providerClass) {
|
||||
String specifiedProvider = System.getProperty(providerClass.getName());
|
||||
ServiceLoader<T> providers = ServiceLoader.load(providerClass);
|
||||
for (T 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;
|
||||
}
|
||||
|
||||
// for testing
|
||||
static void reset() {
|
||||
globalOpenTelemetry = null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -47,8 +47,7 @@ public class DefaultOpenTelemetryBuilder
|
|||
public OpenTelemetry build() {
|
||||
MeterProvider meterProvider = this.meterProvider;
|
||||
if (meterProvider == null) {
|
||||
MeterProviderFactory meterProviderFactory =
|
||||
DefaultOpenTelemetry.loadSpi(MeterProviderFactory.class);
|
||||
MeterProviderFactory meterProviderFactory = Utils.loadSpi(MeterProviderFactory.class);
|
||||
if (meterProviderFactory != null) {
|
||||
meterProvider = meterProviderFactory.create();
|
||||
} else {
|
||||
|
@ -58,8 +57,7 @@ public class DefaultOpenTelemetryBuilder
|
|||
|
||||
TracerProvider tracerProvider = this.tracerProvider;
|
||||
if (tracerProvider == null) {
|
||||
TracerProviderFactory tracerProviderFactory =
|
||||
DefaultOpenTelemetry.loadSpi(TracerProviderFactory.class);
|
||||
TracerProviderFactory tracerProviderFactory = Utils.loadSpi(TracerProviderFactory.class);
|
||||
if (tracerProviderFactory != null) {
|
||||
tracerProvider = tracerProviderFactory.create();
|
||||
} else {
|
||||
|
|
|
@ -0,0 +1,166 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.api;
|
||||
|
||||
import static java.util.Objects.requireNonNull;
|
||||
|
||||
import io.opentelemetry.api.metrics.Meter;
|
||||
import io.opentelemetry.api.metrics.MeterProvider;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.api.trace.TracerProvider;
|
||||
import io.opentelemetry.context.propagation.ContextPropagators;
|
||||
import io.opentelemetry.spi.OpenTelemetryFactory;
|
||||
import io.opentelemetry.spi.metrics.MeterProviderFactory;
|
||||
import io.opentelemetry.spi.trace.TracerProviderFactory;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
/**
|
||||
* A global singleton for the entrypoint to telemetry functionality for tracing, metrics and
|
||||
* baggage.
|
||||
*
|
||||
* <p>The global singleton can be retrieved by {@link #get()}. The default for the returned {@link
|
||||
* OpenTelemetry}, if none has been set via {@link #set(OpenTelemetry)}, will be created with any
|
||||
* {@link OpenTelemetryFactory}, {@link TracerProviderFactory} or {@link MeterProviderFactory} found
|
||||
* on the classpath, or otherwise will be default, with no-op behavior.
|
||||
*
|
||||
* <p>If using the OpenTelemetry SDK, you may want to instantiate the {@link OpenTelemetry} to
|
||||
* provide configuration, for example of {@code Resource} or {@code Sampler}. See {@code
|
||||
* OpenTelemetrySdk} and {@code OpenTelemetrySdk.builder} for information on how to construct the
|
||||
* SDK {@link OpenTelemetry}.
|
||||
*
|
||||
* @see TracerProvider
|
||||
* @see MeterProvider
|
||||
* @see ContextPropagators
|
||||
*/
|
||||
public final class GlobalOpenTelemetry {
|
||||
private static final Object mutex = new Object();
|
||||
@Nullable private static volatile OpenTelemetry globalOpenTelemetry;
|
||||
|
||||
private GlobalOpenTelemetry() {}
|
||||
|
||||
/**
|
||||
* Returns the registered global {@link OpenTelemetry}. If no call to {@link #set(OpenTelemetry)}
|
||||
* has been made so far, a default {@link OpenTelemetry} composed of functionality any {@link
|
||||
* OpenTelemetryFactory}, {@link TracerProviderFactory} or{@link MeterProviderFactory}, found on
|
||||
* the classpath, or otherwise will be default, with no-op behavior.
|
||||
*
|
||||
* @throws IllegalStateException if a provider has been specified by system property using the
|
||||
* interface FQCN but the specified provider cannot be found.
|
||||
*/
|
||||
public static OpenTelemetry get() {
|
||||
if (globalOpenTelemetry == null) {
|
||||
synchronized (mutex) {
|
||||
if (globalOpenTelemetry == null) {
|
||||
OpenTelemetryFactory openTelemetryFactory = Utils.loadSpi(OpenTelemetryFactory.class);
|
||||
if (openTelemetryFactory != null) {
|
||||
set(openTelemetryFactory.create());
|
||||
} else {
|
||||
set(DefaultOpenTelemetry.builder().build());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return globalOpenTelemetry;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the {@link OpenTelemetry} that should be the global instance. Future calls to {@link
|
||||
* #get()} will return the provided {@link OpenTelemetry} instance. This should be called once as
|
||||
* early as possible in your application initialization logic, often in a {@code static} block in
|
||||
* your main class.
|
||||
*/
|
||||
public static void set(OpenTelemetry openTelemetry) {
|
||||
globalOpenTelemetry = openTelemetry;
|
||||
}
|
||||
|
||||
// for testing
|
||||
static void reset() {
|
||||
globalOpenTelemetry = null;
|
||||
}
|
||||
|
||||
/** Returns the globally registered {@link TracerProvider}. */
|
||||
public static TracerProvider getTracerProvider() {
|
||||
return get().getTracerProvider();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets or creates a named tracer instance from the globally registered {@link TracerProvider}.
|
||||
*
|
||||
* <p>This is a shortcut method for {@code getTracerProvider().get(instrumentationName)}
|
||||
*
|
||||
* @param instrumentationName The name of the instrumentation library, not the name of the
|
||||
* instrument*ed* library (e.g., "io.opentelemetry.contrib.mongodb"). Must not be null.
|
||||
* @return a tracer instance.
|
||||
*/
|
||||
public static Tracer getTracer(String instrumentationName) {
|
||||
return get().getTracer(instrumentationName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets or creates a named and versioned tracer instance from the globally registered {@link
|
||||
* TracerProvider}.
|
||||
*
|
||||
* <p>This is a shortcut method for {@code getTracerProvider().get(instrumentationName,
|
||||
* instrumentationVersion)}
|
||||
*
|
||||
* @param instrumentationName The name of the instrumentation library, not the name of the
|
||||
* instrument*ed* library (e.g., "io.opentelemetry.contrib.mongodb"). Must not be null.
|
||||
* @param instrumentationVersion The version of the instrumentation library (e.g., "1.0.0").
|
||||
* @return a tracer instance.
|
||||
*/
|
||||
public static Tracer getTracer(String instrumentationName, String instrumentationVersion) {
|
||||
return get().getTracer(instrumentationName, instrumentationVersion);
|
||||
}
|
||||
|
||||
/** Returns the globally registered {@link MeterProvider}. */
|
||||
public static MeterProvider getMeterProvider() {
|
||||
return get().getMeterProvider();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets or creates a named meter instance from the globally registered {@link MeterProvider}.
|
||||
*
|
||||
* <p>This is a shortcut method for {@code getMeterProvider().get(instrumentationName)}
|
||||
*
|
||||
* @param instrumentationName The name of the instrumentation library, not the name of the
|
||||
* instrument*ed* library.
|
||||
* @return a tracer instance.
|
||||
*/
|
||||
public static Meter getMeter(String instrumentationName) {
|
||||
return get().getMeter(instrumentationName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets or creates a named and versioned meter instance from the globally registered {@link
|
||||
* MeterProvider}.
|
||||
*
|
||||
* <p>This is a shortcut method for {@code getMeterProvider().get(instrumentationName,
|
||||
* instrumentationVersion)}
|
||||
*
|
||||
* @param instrumentationName The name of the instrumentation library, not the name of the
|
||||
* instrument*ed* library.
|
||||
* @param instrumentationVersion The version of the instrumentation library.
|
||||
* @return a tracer instance.
|
||||
*/
|
||||
public static Meter getMeter(String instrumentationName, String instrumentationVersion) {
|
||||
return get().getMeter(instrumentationName, instrumentationVersion);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the globally registered {@link ContextPropagators} for remote propagation of a context.
|
||||
*/
|
||||
public static ContextPropagators getPropagators() {
|
||||
return get().getPropagators();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the globally registered {@link ContextPropagators} for remote propagation of a context.
|
||||
*/
|
||||
public static void setPropagators(ContextPropagators propagators) {
|
||||
requireNonNull(propagators, "propagators");
|
||||
get().setPropagators(propagators);
|
||||
}
|
||||
}
|
|
@ -36,108 +36,103 @@ import io.opentelemetry.spi.trace.TracerProviderFactory;
|
|||
public interface OpenTelemetry {
|
||||
|
||||
/**
|
||||
* Returns the registered global {@link OpenTelemetry}. If no call to {@link #set(OpenTelemetry)}
|
||||
* has been made so far, a default {@link OpenTelemetry} composed of functionality any {@link
|
||||
* OpenTelemetryFactory}, {@link TracerProviderFactory} or{@link MeterProviderFactory}, found on
|
||||
* the classpath, or otherwise will be default, with no-op behavior.
|
||||
* Returns the registered global {@link OpenTelemetry}.
|
||||
*
|
||||
* @throws IllegalStateException if a provider has been specified by system property using the
|
||||
* interface FQCN but the specified provider cannot be found.
|
||||
* @deprecated use {@link GlobalOpenTelemetry#get()}
|
||||
*/
|
||||
@Deprecated
|
||||
static OpenTelemetry get() {
|
||||
return DefaultOpenTelemetry.getGlobalOpenTelemetry();
|
||||
return GlobalOpenTelemetry.get();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the {@link OpenTelemetry} that should be the global instance. Future calls to {@link
|
||||
* #get()} will return the provided {@link OpenTelemetry} instance. This should be called once as
|
||||
* early as possible in your application initialization logic, often in a {@code static} block in
|
||||
* your main class.
|
||||
* Sets the {@link OpenTelemetry} that should be the global instance.
|
||||
*
|
||||
* @deprecated use {@link GlobalOpenTelemetry#set(OpenTelemetry)}
|
||||
*/
|
||||
@Deprecated
|
||||
static void set(OpenTelemetry openTelemetry) {
|
||||
DefaultOpenTelemetry.setGlobalOpenTelemetry(openTelemetry);
|
||||
GlobalOpenTelemetry.set(openTelemetry);
|
||||
}
|
||||
|
||||
/** Returns the globally registered {@link TracerProvider}. */
|
||||
/**
|
||||
* Returns the globally registered {@link TracerProvider}.
|
||||
*
|
||||
* @deprecated use {@link GlobalOpenTelemetry#getTracerProvider()}
|
||||
*/
|
||||
@Deprecated
|
||||
static TracerProvider getGlobalTracerProvider() {
|
||||
return DefaultOpenTelemetry.getGlobalOpenTelemetry().getTracerProvider();
|
||||
return get().getTracerProvider();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets or creates a named tracer instance from the globally registered {@link TracerProvider}.
|
||||
*
|
||||
* <p>This is a shortcut method for {@code getGlobalTracerProvider().get(instrumentationName)}
|
||||
*
|
||||
* @param instrumentationName The name of the instrumentation library, not the name of the
|
||||
* instrument*ed* library (e.g., "io.opentelemetry.contrib.mongodb"). Must not be null.
|
||||
* @return a tracer instance.
|
||||
* @deprecated use {@link GlobalOpenTelemetry#getTracer(String)}
|
||||
*/
|
||||
@Deprecated
|
||||
static Tracer getGlobalTracer(String instrumentationName) {
|
||||
return DefaultOpenTelemetry.getGlobalOpenTelemetry().getTracer(instrumentationName);
|
||||
return get().getTracer(instrumentationName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets or creates a named and versioned tracer instance from the globally registered {@link
|
||||
* TracerProvider}.
|
||||
*
|
||||
* <p>This is a shortcut method for {@code getGlobalTracerProvider().get(instrumentationName,
|
||||
* instrumentationVersion)}
|
||||
*
|
||||
* @param instrumentationName The name of the instrumentation library, not the name of the
|
||||
* instrument*ed* library (e.g., "io.opentelemetry.contrib.mongodb"). Must not be null.
|
||||
* @param instrumentationVersion The version of the instrumentation library (e.g., "1.0.0").
|
||||
* @return a tracer instance.
|
||||
* @deprecated use {@link GlobalOpenTelemetry#getTracer(String, String)}
|
||||
*/
|
||||
@Deprecated
|
||||
static Tracer getGlobalTracer(String instrumentationName, String instrumentationVersion) {
|
||||
return DefaultOpenTelemetry.getGlobalOpenTelemetry()
|
||||
.getTracer(instrumentationName, instrumentationVersion);
|
||||
return get().getTracer(instrumentationName, instrumentationVersion);
|
||||
}
|
||||
|
||||
/** Returns the globally registered {@link MeterProvider}. */
|
||||
/**
|
||||
* Returns the globally registered {@link MeterProvider}.
|
||||
*
|
||||
* @deprecated use {@link GlobalOpenTelemetry#getMeterProvider()}
|
||||
*/
|
||||
@Deprecated
|
||||
static MeterProvider getGlobalMeterProvider() {
|
||||
return DefaultOpenTelemetry.getGlobalOpenTelemetry().getMeterProvider();
|
||||
return get().getMeterProvider();
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets or creates a named meter instance from the globally registered {@link MeterProvider}.
|
||||
*
|
||||
* <p>This is a shortcut method for {@code getGlobalMeterProvider().get(instrumentationName)}
|
||||
*
|
||||
* @param instrumentationName The name of the instrumentation library, not the name of the
|
||||
* instrument*ed* library.
|
||||
* @return a tracer instance.
|
||||
* @deprecated use {@link GlobalOpenTelemetry#getMeter(String)}
|
||||
*/
|
||||
@Deprecated
|
||||
static Meter getGlobalMeter(String instrumentationName) {
|
||||
return DefaultOpenTelemetry.getGlobalOpenTelemetry().getMeter(instrumentationName);
|
||||
return get().getMeter(instrumentationName);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets or creates a named and versioned meter instance from the globally registered {@link
|
||||
* MeterProvider}.
|
||||
*
|
||||
* <p>This is a shortcut method for {@code getGlobalMeterProvider().get(instrumentationName,
|
||||
* instrumentationVersion)}
|
||||
*
|
||||
* @param instrumentationName The name of the instrumentation library, not the name of the
|
||||
* instrument*ed* library.
|
||||
* @param instrumentationVersion The version of the instrumentation library.
|
||||
* @return a tracer instance.
|
||||
* @deprecated use {@link GlobalOpenTelemetry#getMeter(String, String)}
|
||||
*/
|
||||
@Deprecated
|
||||
static Meter getGlobalMeter(String instrumentationName, String instrumentationVersion) {
|
||||
return DefaultOpenTelemetry.getGlobalOpenTelemetry()
|
||||
.getMeter(instrumentationName, instrumentationVersion);
|
||||
return get().getMeter(instrumentationName, instrumentationVersion);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the globally registered {@link ContextPropagators} for remote propagation of a context.
|
||||
*
|
||||
* @deprecated use {@link GlobalOpenTelemetry#getPropagators()}
|
||||
*/
|
||||
@Deprecated
|
||||
static ContextPropagators getGlobalPropagators() {
|
||||
return DefaultOpenTelemetry.getGlobalOpenTelemetry().getPropagators();
|
||||
return get().getPropagators();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the globally registered {@link ContextPropagators} for remote propagation of a context.
|
||||
*
|
||||
* @deprecated use {@link GlobalOpenTelemetry#setPropagators(ContextPropagators)}
|
||||
*/
|
||||
@Deprecated
|
||||
static void setGlobalPropagators(ContextPropagators propagators) {
|
||||
requireNonNull(propagators, "propagators");
|
||||
get().setPropagators(propagators);
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
/*
|
||||
* Copyright The OpenTelemetry Authors
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
package io.opentelemetry.api;
|
||||
|
||||
import java.util.ServiceLoader;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
final class Utils {
|
||||
private Utils() {}
|
||||
|
||||
/**
|
||||
* Load provider class via {@link ServiceLoader}. A specific provider class can be requested via
|
||||
* setting a system property with FQCN.
|
||||
*
|
||||
* @param providerClass a provider class
|
||||
* @param <T> provider type
|
||||
* @return a provider or null if not found
|
||||
* @throws IllegalStateException if a specified provider is not found
|
||||
*/
|
||||
@Nullable
|
||||
static <T> T loadSpi(Class<T> providerClass) {
|
||||
String specifiedProvider = System.getProperty(providerClass.getName());
|
||||
ServiceLoader<T> providers = ServiceLoader.load(providerClass);
|
||||
for (T 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;
|
||||
}
|
||||
}
|
|
@ -45,27 +45,27 @@ class OpenTelemetryTest {
|
|||
|
||||
@BeforeAll
|
||||
static void beforeClass() {
|
||||
DefaultOpenTelemetry.reset();
|
||||
GlobalOpenTelemetry.reset();
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
void after() {
|
||||
DefaultOpenTelemetry.reset();
|
||||
GlobalOpenTelemetry.reset();
|
||||
System.clearProperty(TracerProviderFactory.class.getName());
|
||||
System.clearProperty(MeterProviderFactory.class.getName());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testDefault() {
|
||||
assertThat(OpenTelemetry.getGlobalTracerProvider().getClass().getSimpleName())
|
||||
assertThat(GlobalOpenTelemetry.getTracerProvider().getClass().getSimpleName())
|
||||
.isEqualTo("DefaultTracerProvider");
|
||||
assertThat(OpenTelemetry.getGlobalTracerProvider())
|
||||
.isSameAs(OpenTelemetry.getGlobalTracerProvider());
|
||||
assertThat(OpenTelemetry.getGlobalMeterProvider().getClass().getSimpleName())
|
||||
assertThat(GlobalOpenTelemetry.getTracerProvider())
|
||||
.isSameAs(GlobalOpenTelemetry.getTracerProvider());
|
||||
assertThat(GlobalOpenTelemetry.getMeterProvider().getClass().getSimpleName())
|
||||
.isEqualTo("DefaultMeterProvider");
|
||||
assertThat(OpenTelemetry.getGlobalMeterProvider())
|
||||
.isSameAs(OpenTelemetry.getGlobalMeterProvider());
|
||||
assertThat(OpenTelemetry.getGlobalPropagators()).isSameAs(OpenTelemetry.getGlobalPropagators());
|
||||
assertThat(GlobalOpenTelemetry.getMeterProvider())
|
||||
.isSameAs(GlobalOpenTelemetry.getMeterProvider());
|
||||
assertThat(GlobalOpenTelemetry.getPropagators()).isSameAs(GlobalOpenTelemetry.getPropagators());
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -95,9 +95,9 @@ class OpenTelemetryTest {
|
|||
SecondTracerProviderFactory.class);
|
||||
try {
|
||||
assertThat(
|
||||
(OpenTelemetry.getGlobalTracerProvider().get("")
|
||||
(GlobalOpenTelemetry.getTracerProvider().get("")
|
||||
instanceof FirstTracerProviderFactory)
|
||||
|| (OpenTelemetry.getGlobalTracerProvider().get("")
|
||||
|| (GlobalOpenTelemetry.getTracerProvider().get("")
|
||||
instanceof SecondTracerProviderFactory))
|
||||
.isTrue();
|
||||
} finally {
|
||||
|
@ -115,7 +115,7 @@ class OpenTelemetryTest {
|
|||
System.setProperty(
|
||||
TracerProviderFactory.class.getName(), SecondTracerProviderFactory.class.getName());
|
||||
try {
|
||||
assertThat(OpenTelemetry.getGlobalTracerProvider().get(""))
|
||||
assertThat(GlobalOpenTelemetry.getTracerProvider().get(""))
|
||||
.isInstanceOf(SecondTracerProviderFactory.class);
|
||||
} finally {
|
||||
assertThat(serviceFile.delete()).isTrue();
|
||||
|
@ -125,7 +125,7 @@ class OpenTelemetryTest {
|
|||
@Test
|
||||
void testTracerNotFound() {
|
||||
System.setProperty(TracerProviderFactory.class.getName(), "io.does.not.exists");
|
||||
assertThrows(IllegalStateException.class, () -> OpenTelemetry.getGlobalTracer("testTracer"));
|
||||
assertThrows(IllegalStateException.class, () -> GlobalOpenTelemetry.getTracer("testTracer"));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -137,11 +137,11 @@ class OpenTelemetryTest {
|
|||
SecondMeterProviderFactory.class);
|
||||
try {
|
||||
assertThat(
|
||||
(OpenTelemetry.getGlobalMeterProvider() instanceof FirstMeterProviderFactory)
|
||||
|| (OpenTelemetry.getGlobalMeterProvider() instanceof SecondMeterProviderFactory))
|
||||
(GlobalOpenTelemetry.getMeterProvider() instanceof FirstMeterProviderFactory)
|
||||
|| (GlobalOpenTelemetry.getMeterProvider() instanceof SecondMeterProviderFactory))
|
||||
.isTrue();
|
||||
assertThat(OpenTelemetry.getGlobalMeterProvider())
|
||||
.isEqualTo(OpenTelemetry.getGlobalMeterProvider());
|
||||
assertThat(GlobalOpenTelemetry.getMeterProvider())
|
||||
.isEqualTo(GlobalOpenTelemetry.getMeterProvider());
|
||||
} finally {
|
||||
assertThat(serviceFile.delete()).isTrue();
|
||||
}
|
||||
|
@ -157,10 +157,10 @@ class OpenTelemetryTest {
|
|||
System.setProperty(
|
||||
MeterProviderFactory.class.getName(), SecondMeterProviderFactory.class.getName());
|
||||
try {
|
||||
assertThat(OpenTelemetry.getGlobalMeterProvider())
|
||||
assertThat(GlobalOpenTelemetry.getMeterProvider())
|
||||
.isInstanceOf(SecondMeterProviderFactory.class);
|
||||
assertThat(OpenTelemetry.getGlobalMeterProvider())
|
||||
.isEqualTo(OpenTelemetry.getGlobalMeterProvider());
|
||||
assertThat(GlobalOpenTelemetry.getMeterProvider())
|
||||
.isEqualTo(GlobalOpenTelemetry.getMeterProvider());
|
||||
} finally {
|
||||
assertThat(serviceFile.delete()).isTrue();
|
||||
}
|
||||
|
@ -169,14 +169,14 @@ class OpenTelemetryTest {
|
|||
@Test
|
||||
void testMeterNotFound() {
|
||||
System.setProperty(MeterProviderFactory.class.getName(), "io.does.not.exists");
|
||||
assertThrows(IllegalStateException.class, OpenTelemetry::getGlobalMeterProvider);
|
||||
assertThrows(IllegalStateException.class, GlobalOpenTelemetry::getMeterProvider);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGlobalPropagatorsSet() {
|
||||
ContextPropagators propagators = ContextPropagators.noop();
|
||||
OpenTelemetry.setGlobalPropagators(propagators);
|
||||
assertThat(OpenTelemetry.getGlobalPropagators()).isEqualTo(propagators);
|
||||
GlobalOpenTelemetry.setPropagators(propagators);
|
||||
assertThat(GlobalOpenTelemetry.getPropagators()).isEqualTo(propagators);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -238,7 +238,7 @@ class OpenTelemetryTest {
|
|||
|
||||
@Test
|
||||
void testPropagatorsSetNull() {
|
||||
assertThrows(NullPointerException.class, () -> OpenTelemetry.setGlobalPropagators(null));
|
||||
assertThrows(NullPointerException.class, () -> GlobalOpenTelemetry.setPropagators(null));
|
||||
}
|
||||
|
||||
private static File createService(Class<?> service, Class<?>... impls) throws IOException {
|
||||
|
|
|
@ -7,7 +7,7 @@ package io.opentelemetry.exporter.jaeger.thrift;
|
|||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.sdk.OpenTelemetrySdk;
|
||||
|
@ -36,7 +36,7 @@ class JaegerThriftIntegrationTest {
|
|||
private static final String JAEGER_VERSION = "1.17";
|
||||
private static final String SERVICE_NAME = "E2E-test";
|
||||
private static final String JAEGER_URL = "http://localhost";
|
||||
private final Tracer tracer = OpenTelemetry.getGlobalTracer(getClass().getCanonicalName());
|
||||
private final Tracer tracer = GlobalOpenTelemetry.getTracer(getClass().getCanonicalName());
|
||||
|
||||
@Container
|
||||
public static GenericContainer<?> jaegerContainer =
|
||||
|
|
|
@ -9,7 +9,7 @@ import com.fasterxml.jackson.databind.JsonNode;
|
|||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import io.grpc.ManagedChannel;
|
||||
import io.grpc.ManagedChannelBuilder;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.sdk.OpenTelemetrySdk;
|
||||
|
@ -36,7 +36,7 @@ class JaegerIntegrationTest {
|
|||
private static final int COLLECTOR_PORT = 14250;
|
||||
private static final String SERVICE_NAME = "E2E-test";
|
||||
private static final String JAEGER_URL = "http://localhost";
|
||||
private final Tracer tracer = OpenTelemetry.getGlobalTracer(getClass().getCanonicalName());
|
||||
private final Tracer tracer = GlobalOpenTelemetry.getTracer(getClass().getCanonicalName());
|
||||
|
||||
@Container
|
||||
public static GenericContainer<?> jaegerContainer =
|
||||
|
|
|
@ -10,7 +10,7 @@ import com.google.common.util.concurrent.Futures;
|
|||
import com.google.common.util.concurrent.MoreExecutors;
|
||||
import io.grpc.ConnectivityState;
|
||||
import io.grpc.ManagedChannel;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.common.Labels;
|
||||
import io.opentelemetry.api.metrics.LongCounter;
|
||||
import io.opentelemetry.proto.collector.trace.v1.ExportTraceServiceRequest;
|
||||
|
@ -78,12 +78,12 @@ public final class OtlpGrpcSpanExporter implements SpanExporter {
|
|||
private final long deadlineMs;
|
||||
|
||||
private final LongCounter spansSeen =
|
||||
OpenTelemetry.getGlobalMeter("io.opentelemetry.exporters.otlp")
|
||||
GlobalOpenTelemetry.getMeter("io.opentelemetry.exporters.otlp")
|
||||
.longCounterBuilder("spansSeenByExporter")
|
||||
.build();
|
||||
|
||||
private final LongCounter spansExported =
|
||||
OpenTelemetry.getGlobalMeter("io.opentelemetry.exporters.otlp")
|
||||
GlobalOpenTelemetry.getMeter("io.opentelemetry.exporters.otlp")
|
||||
.longCounterBuilder("spansExportedByExporter")
|
||||
.build();
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package io.opentelemetry.extension.kotlin
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry
|
||||
import io.opentelemetry.api.trace.Span
|
||||
import io.opentelemetry.context.Context
|
||||
import io.opentelemetry.context.ContextKey
|
||||
|
@ -37,7 +37,7 @@ class KotlinCoroutinesTest {
|
|||
|
||||
@Test
|
||||
fun runWithSpan() {
|
||||
val span = OpenTelemetry.getGlobalTracer("test").spanBuilder("test").startSpan()
|
||||
val span = GlobalOpenTelemetry.getTracer("test").spanBuilder("test").startSpan()
|
||||
assertThat(Span.current()).isEqualTo(Span.getInvalid())
|
||||
runBlocking(Dispatchers.Default + span.asContextElement()) {
|
||||
assertThat(Span.current()).isEqualTo(span)
|
||||
|
|
|
@ -7,7 +7,7 @@ package io.opentelemetry;
|
|||
|
||||
import io.grpc.ManagedChannel;
|
||||
import io.grpc.ManagedChannelBuilder;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.exporter.jaeger.JaegerGrpcSpanExporter;
|
||||
|
@ -20,7 +20,7 @@ public class SendTraceToJaeger {
|
|||
private final int port; // = 14250;
|
||||
|
||||
// OTel API
|
||||
private final Tracer tracer = OpenTelemetry.getGlobalTracer("io.opentelemetry.SendTraceToJaeger");
|
||||
private final Tracer tracer = GlobalOpenTelemetry.getTracer("io.opentelemetry.SendTraceToJaeger");
|
||||
|
||||
public SendTraceToJaeger(String ip, int port) {
|
||||
this.ip = ip;
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
package io.opentelemetry;
|
||||
|
||||
import com.google.gson.Gson;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
|
||||
|
@ -33,9 +34,9 @@ public class Application {
|
|||
private static final OpenTelemetry openTelemetry;
|
||||
|
||||
static {
|
||||
OpenTelemetry.setGlobalPropagators(
|
||||
GlobalOpenTelemetry.setPropagators(
|
||||
ContextPropagators.create(W3CTraceContextPropagator.getInstance()));
|
||||
openTelemetry = OpenTelemetry.get();
|
||||
openTelemetry = GlobalOpenTelemetry.get();
|
||||
}
|
||||
|
||||
private Application() {}
|
||||
|
|
|
@ -18,7 +18,7 @@ import io.opencensus.trace.TraceOptions;
|
|||
import io.opencensus.trace.Tracestate;
|
||||
import io.opencensus.trace.export.SpanData;
|
||||
import io.opencensus.trace.export.SpanData.TimedEvent;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.common.AttributeKey;
|
||||
import io.opentelemetry.api.common.Attributes;
|
||||
import io.opentelemetry.api.common.AttributesBuilder;
|
||||
|
@ -70,7 +70,7 @@ class SpanConverter {
|
|||
"message.event.size.compressed";
|
||||
|
||||
private static final Tracer TRACER =
|
||||
OpenTelemetry.getGlobalTracer("io.opencensus.opentelemetry.migration");
|
||||
GlobalOpenTelemetry.getTracer("io.opencensus.opentelemetry.migration");
|
||||
|
||||
private SpanConverter() {}
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ import static org.mockito.Mockito.when;
|
|||
|
||||
import io.opencensus.trace.Tracing;
|
||||
import io.opencensus.trace.samplers.Samplers;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.context.Context;
|
||||
|
@ -51,7 +51,7 @@ class TraceInteroperabilityTest {
|
|||
|
||||
@Test
|
||||
void testParentChildRelationshipsAreExportedCorrectly() {
|
||||
Tracer tracer = OpenTelemetry.getGlobalTracer("io.opentelemetry.test.scoped.span.1");
|
||||
Tracer tracer = GlobalOpenTelemetry.getTracer("io.opentelemetry.test.scoped.span.1");
|
||||
Span span = tracer.spanBuilder("OpenTelemetrySpan").startSpan();
|
||||
try (Scope scope = Context.current().with(span).makeCurrent()) {
|
||||
span.addEvent("OpenTelemetry: Event 1");
|
||||
|
@ -179,7 +179,7 @@ class TraceInteroperabilityTest {
|
|||
}
|
||||
|
||||
private static void createOpenTelemetryScopedSpan() {
|
||||
Tracer tracer = OpenTelemetry.getGlobalTracer("io.opentelemetry.test.scoped.span.2");
|
||||
Tracer tracer = GlobalOpenTelemetry.getTracer("io.opentelemetry.test.scoped.span.2");
|
||||
Span span = tracer.spanBuilder("OpenTelemetrySpan2").startSpan();
|
||||
try (Scope scope = Context.current().with(span).makeCurrent()) {
|
||||
span.addEvent("OpenTelemetry2: Event 1");
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
package io.opentelemetry.opentracingshim;
|
||||
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.api.trace.TracerProvider;
|
||||
|
@ -17,16 +18,16 @@ public final class OpenTracingShim {
|
|||
private OpenTracingShim() {}
|
||||
|
||||
/**
|
||||
* Creates a {@code io.opentracing.Tracer} shim out of {@code
|
||||
* OpenTelemetry.getGlobalTracerProvider()} and {@code OpenTelemetry.getGlobalPropagators()}.
|
||||
* Creates a {@code io.opentracing.Tracer} shim out of {@code OpenTelemetry.getTracerProvider()}
|
||||
* and {@code OpenTelemetry.getPropagators()}.
|
||||
*
|
||||
* @return a {@code io.opentracing.Tracer}.
|
||||
*/
|
||||
public static io.opentracing.Tracer createTracerShim() {
|
||||
return new TracerShim(
|
||||
new TelemetryInfo(
|
||||
getTracer(OpenTelemetry.getGlobalTracerProvider()),
|
||||
OpenTelemetry.getGlobalPropagators()));
|
||||
getTracer(GlobalOpenTelemetry.getTracerProvider()),
|
||||
GlobalOpenTelemetry.getPropagators()));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -9,6 +9,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.context.propagation.ContextPropagators;
|
||||
import io.opentelemetry.sdk.trace.SdkTracerProvider;
|
||||
|
@ -19,7 +20,7 @@ class OpenTracingShimTest {
|
|||
@Test
|
||||
void createTracerShim_default() {
|
||||
TracerShim tracerShim = (TracerShim) OpenTracingShim.createTracerShim();
|
||||
assertThat(tracerShim.tracer()).isEqualTo(OpenTelemetry.getGlobalTracer("opentracingshim"));
|
||||
assertThat(tracerShim.tracer()).isEqualTo(GlobalOpenTelemetry.getTracer("opentracingshim"));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -8,7 +8,7 @@ package io.opentelemetry.opentracingshim;
|
|||
import static io.opentelemetry.opentracingshim.TestUtils.getBaggageMap;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.sdk.trace.SdkTracerProvider;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
@ -18,7 +18,7 @@ class SpanBuilderShimTest {
|
|||
private final SdkTracerProvider tracerSdkFactory = SdkTracerProvider.builder().build();
|
||||
private final Tracer tracer = tracerSdkFactory.get("SpanShimTest");
|
||||
private final TelemetryInfo telemetryInfo =
|
||||
new TelemetryInfo(tracer, OpenTelemetry.getGlobalPropagators());
|
||||
new TelemetryInfo(tracer, GlobalOpenTelemetry.getPropagators());
|
||||
|
||||
private static final String SPAN_NAME = "Span";
|
||||
|
||||
|
|
|
@ -8,7 +8,7 @@ package io.opentelemetry.opentracingshim;
|
|||
import static io.opentelemetry.opentracingshim.TestUtils.getBaggageMap;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.sdk.trace.SdkTracerProvider;
|
||||
|
@ -22,7 +22,7 @@ class SpanShimTest {
|
|||
private final SdkTracerProvider tracerSdkFactory = SdkTracerProvider.builder().build();
|
||||
private final Tracer tracer = tracerSdkFactory.get("SpanShimTest");
|
||||
private final TelemetryInfo telemetryInfo =
|
||||
new TelemetryInfo(tracer, OpenTelemetry.getGlobalPropagators());
|
||||
new TelemetryInfo(tracer, GlobalOpenTelemetry.getPropagators());
|
||||
private Span span;
|
||||
|
||||
private static final String SPAN_NAME = "Span";
|
||||
|
|
|
@ -7,7 +7,7 @@ package io.opentelemetry.opentracingshim;
|
|||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentracing.Scope;
|
||||
import io.opentracing.Span;
|
||||
import io.opentracing.SpanContext;
|
||||
|
@ -33,8 +33,8 @@ class TracerShimTest {
|
|||
tracerShim =
|
||||
new TracerShim(
|
||||
new TelemetryInfo(
|
||||
OpenTelemetry.getGlobalTracer("opentracingshim"),
|
||||
OpenTelemetry.getGlobalPropagators()));
|
||||
GlobalOpenTelemetry.getTracer("opentracingshim"),
|
||||
GlobalOpenTelemetry.getPropagators()));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -10,7 +10,7 @@ import eu.rekawek.toxiproxy.ToxiproxyClient;
|
|||
import eu.rekawek.toxiproxy.model.ToxicDirection;
|
||||
import eu.rekawek.toxiproxy.model.ToxicList;
|
||||
import eu.rekawek.toxiproxy.model.toxic.Timeout;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.common.Labels;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
|
@ -203,7 +203,7 @@ public class OtlpPipelineStressTest {
|
|||
|
||||
private static void runOnce(Integer numberOfSpans, int numberOfMillisToRunFor)
|
||||
throws InterruptedException {
|
||||
Tracer tracer = OpenTelemetry.getGlobalTracer("io.opentelemetry.perf");
|
||||
Tracer tracer = GlobalOpenTelemetry.getTracer("io.opentelemetry.perf");
|
||||
long start = System.currentTimeMillis();
|
||||
int i = 0;
|
||||
while (numberOfSpans == null
|
||||
|
|
|
@ -7,7 +7,7 @@ package io.opentelemetry.sdk.extension.jfr;
|
|||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.context.ContextStorage;
|
||||
|
@ -34,7 +34,7 @@ class JfrSpanProcessorTest {
|
|||
|
||||
/** Simple test to validate JFR events for Span and Scope. */
|
||||
public JfrSpanProcessorTest() {
|
||||
tracer = OpenTelemetry.getGlobalTracer("JfrSpanProcessorTest");
|
||||
tracer = GlobalOpenTelemetry.getTracer("JfrSpanProcessorTest");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
package io.opentelemetry.sdk.logging.export;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.common.Labels;
|
||||
import io.opentelemetry.api.internal.Utils;
|
||||
import io.opentelemetry.api.metrics.LongCounter;
|
||||
|
@ -70,7 +70,7 @@ public class BatchLogProcessor implements LogProcessor {
|
|||
|
||||
private static class Worker implements Runnable {
|
||||
static {
|
||||
Meter meter = OpenTelemetry.getGlobalMeter("io.opentelemetry.sdk.logging");
|
||||
Meter meter = GlobalOpenTelemetry.getMeter("io.opentelemetry.sdk.logging");
|
||||
LongCounter logRecordsProcessed =
|
||||
meter
|
||||
.longCounterBuilder("logRecordsProcessed")
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
package io.opentelemetry.sdk.extension.zpages;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.StatusCode;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
|
@ -30,7 +30,7 @@ public class TracezDataAggregatorBenchmark {
|
|||
private static final String runningSpan = "RUNNING_SPAN";
|
||||
private static final String latencySpan = "LATENCY_SPAN";
|
||||
private static final String errorSpan = "ERROR_SPAN";
|
||||
private final Tracer tracer = OpenTelemetry.getGlobalTracer("TracezDataAggregatorBenchmark");
|
||||
private final Tracer tracer = GlobalOpenTelemetry.getTracer("TracezDataAggregatorBenchmark");
|
||||
private final TracezSpanProcessor spanProcessor = TracezSpanProcessor.builder().build();
|
||||
private final TracezDataAggregator dataAggregator = new TracezDataAggregator(spanProcessor);
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
package io.opentelemetry.sdk.extension.zpages;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.sdk.trace.ReadableSpan;
|
||||
|
@ -32,7 +32,7 @@ public class TracezSpanBucketsBenchmark {
|
|||
@Setup(Level.Trial)
|
||||
public final void setup() {
|
||||
bucket = new TracezSpanBuckets();
|
||||
Tracer tracer = OpenTelemetry.getGlobalTracer("TracezZPageBenchmark");
|
||||
Tracer tracer = GlobalOpenTelemetry.getTracer("TracezZPageBenchmark");
|
||||
Span span = tracer.spanBuilder(spanName).startSpan();
|
||||
span.end();
|
||||
readableSpan = (ReadableSpan) span;
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
package io.opentelemetry.sdk.trace;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span.Kind;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.sdk.OpenTelemetrySdk;
|
||||
|
@ -26,7 +26,7 @@ import org.openjdk.jmh.annotations.Warmup;
|
|||
@State(Scope.Benchmark)
|
||||
public class SpanAttributeTruncateBenchmark {
|
||||
|
||||
private final Tracer tracerSdk = OpenTelemetry.getGlobalTracer("benchmarkTracer");
|
||||
private final Tracer tracerSdk = GlobalOpenTelemetry.getTracer("benchmarkTracer");
|
||||
private SdkSpanBuilder sdkSpanBuilder;
|
||||
|
||||
public final String shortValue = "short";
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
package io.opentelemetry.sdk.trace.export;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.sdk.common.CompletableResultCode;
|
||||
|
@ -79,7 +79,7 @@ public class BatchSpanProcessorBenchmark {
|
|||
processor = BatchSpanProcessor.builder(exporter).build();
|
||||
|
||||
ImmutableList.Builder<Span> spans = ImmutableList.builderWithExpectedSize(spanCount);
|
||||
Tracer tracer = OpenTelemetry.getGlobalTracerProvider().get("benchmarkTracer");
|
||||
Tracer tracer = GlobalOpenTelemetry.getTracerProvider().get("benchmarkTracer");
|
||||
for (int i = 0; i < spanCount; i++) {
|
||||
spans.add(tracer.spanBuilder("span").startSpan());
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
package io.opentelemetry.sdk.trace.export;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.sdk.OpenTelemetrySdk;
|
||||
import io.opentelemetry.sdk.common.CompletableResultCode;
|
||||
|
@ -65,7 +65,7 @@ public class BatchSpanProcessorDroppedSpansBenchmark {
|
|||
SpanExporter exporter = new DelayingSpanExporter();
|
||||
processor = BatchSpanProcessor.builder(exporter).build();
|
||||
|
||||
tracer = OpenTelemetry.getGlobalTracerProvider().get("benchmarkTracer");
|
||||
tracer = GlobalOpenTelemetry.getTracerProvider().get("benchmarkTracer");
|
||||
}
|
||||
|
||||
@TearDown(Level.Trial)
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
package io.opentelemetry.sdk.trace.export;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.sdk.common.CompletableResultCode;
|
||||
|
@ -79,7 +79,7 @@ public class BatchSpanProcessorFlushBenchmark {
|
|||
processor = BatchSpanProcessor.builder(exporter).build();
|
||||
|
||||
ImmutableList.Builder<Span> spans = ImmutableList.builderWithExpectedSize(spanCount);
|
||||
Tracer tracer = OpenTelemetry.getGlobalTracerProvider().get("benchmarkTracer");
|
||||
Tracer tracer = GlobalOpenTelemetry.getTracerProvider().get("benchmarkTracer");
|
||||
for (int i = 0; i < spanCount; i++) {
|
||||
spans.add(tracer.spanBuilder("span").startSpan());
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import static java.util.Objects.requireNonNull;
|
|||
|
||||
import io.opentelemetry.api.DefaultOpenTelemetry;
|
||||
import io.opentelemetry.api.DefaultOpenTelemetryBuilder;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.metrics.MeterProvider;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
|
@ -42,12 +43,12 @@ public final class OpenTelemetrySdk extends DefaultOpenTelemetry {
|
|||
|
||||
/** Returns the global {@link OpenTelemetrySdk}. */
|
||||
public static OpenTelemetrySdk get() {
|
||||
return (OpenTelemetrySdk) OpenTelemetry.get();
|
||||
return (OpenTelemetrySdk) GlobalOpenTelemetry.get();
|
||||
}
|
||||
|
||||
/** Returns the global {@link SdkTracerManagement}. */
|
||||
public static SdkTracerManagement getGlobalTracerManagement() {
|
||||
TracerProvider tracerProvider = OpenTelemetry.get().getTracerProvider();
|
||||
TracerProvider tracerProvider = GlobalOpenTelemetry.get().getTracerProvider();
|
||||
if (!(tracerProvider instanceof ObfuscatedTracerProvider)) {
|
||||
throw new IllegalStateException(
|
||||
"Trying to access global TracerSdkManagement but global TracerProvider is not an "
|
||||
|
@ -58,7 +59,7 @@ public final class OpenTelemetrySdk extends DefaultOpenTelemetry {
|
|||
|
||||
/** Returns the global {@link MeterSdkProvider}. */
|
||||
public static MeterSdkProvider getGlobalMeterProvider() {
|
||||
return (MeterSdkProvider) OpenTelemetry.get().getMeterProvider();
|
||||
return (MeterSdkProvider) GlobalOpenTelemetry.get().getMeterProvider();
|
||||
}
|
||||
|
||||
private static final AtomicBoolean INITIALIZED_GLOBAL = new AtomicBoolean();
|
||||
|
@ -230,7 +231,7 @@ public final class OpenTelemetrySdk extends DefaultOpenTelemetry {
|
|||
resource == null ? Resource.getDefault() : resource);
|
||||
// Automatically initialize global OpenTelemetry with the first SDK we build.
|
||||
if (INITIALIZED_GLOBAL.compareAndSet(/* expectedValue= */ false, /* newValue= */ true)) {
|
||||
OpenTelemetry.set(sdk);
|
||||
GlobalOpenTelemetry.set(sdk);
|
||||
}
|
||||
return sdk;
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ import static org.mockito.Mockito.mock;
|
|||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import io.opentelemetry.api.DefaultOpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.common.Attributes;
|
||||
import io.opentelemetry.api.metrics.MeterProvider;
|
||||
|
@ -48,41 +49,42 @@ class OpenTelemetrySdkTest {
|
|||
|
||||
@Test
|
||||
void testGetGlobal() {
|
||||
assertThat(OpenTelemetrySdk.get()).isSameAs(OpenTelemetry.get());
|
||||
assertThat(OpenTelemetrySdk.get()).isSameAs(GlobalOpenTelemetry.get());
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGetTracerManagementWhenNotTracerSdk() {
|
||||
OpenTelemetry previous = OpenTelemetry.get();
|
||||
OpenTelemetry previous = GlobalOpenTelemetry.get();
|
||||
assertThatCode(OpenTelemetrySdk::getGlobalTracerManagement).doesNotThrowAnyException();
|
||||
try {
|
||||
OpenTelemetry.set(DefaultOpenTelemetry.builder().setTracerProvider(tracerProvider).build());
|
||||
GlobalOpenTelemetry.set(
|
||||
DefaultOpenTelemetry.builder().setTracerProvider(tracerProvider).build());
|
||||
assertThatThrownBy(OpenTelemetrySdk::getGlobalTracerManagement)
|
||||
.isInstanceOf(IllegalStateException.class);
|
||||
} finally {
|
||||
OpenTelemetry.set(previous);
|
||||
GlobalOpenTelemetry.set(previous);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
void testGlobalDefault() {
|
||||
assertThat(((SdkTracerProvider) OpenTelemetrySdk.getGlobalTracerManagement()).get(""))
|
||||
.isSameAs(OpenTelemetry.getGlobalTracerProvider().get(""));
|
||||
.isSameAs(GlobalOpenTelemetry.getTracerProvider().get(""));
|
||||
assertThat(OpenTelemetrySdk.getGlobalMeterProvider())
|
||||
.isSameAs(OpenTelemetry.getGlobalMeterProvider());
|
||||
.isSameAs(GlobalOpenTelemetry.getMeterProvider());
|
||||
assertThat(OpenTelemetrySdk.getGlobalTracerManagement()).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
void testShortcutVersions() {
|
||||
assertThat(OpenTelemetry.getGlobalTracer("testTracer1"))
|
||||
.isEqualTo(OpenTelemetry.getGlobalTracerProvider().get("testTracer1"));
|
||||
assertThat(OpenTelemetry.getGlobalTracer("testTracer2", "testVersion"))
|
||||
.isEqualTo(OpenTelemetry.getGlobalTracerProvider().get("testTracer2", "testVersion"));
|
||||
assertThat(OpenTelemetry.getGlobalMeter("testMeter1"))
|
||||
.isEqualTo(OpenTelemetry.getGlobalMeterProvider().get("testMeter1"));
|
||||
assertThat(OpenTelemetry.getGlobalMeter("testMeter2", "testVersion"))
|
||||
.isEqualTo(OpenTelemetry.getGlobalMeterProvider().get("testMeter2", "testVersion"));
|
||||
assertThat(GlobalOpenTelemetry.getTracer("testTracer1"))
|
||||
.isEqualTo(GlobalOpenTelemetry.getTracerProvider().get("testTracer1"));
|
||||
assertThat(GlobalOpenTelemetry.getTracer("testTracer2", "testVersion"))
|
||||
.isEqualTo(GlobalOpenTelemetry.getTracerProvider().get("testTracer2", "testVersion"));
|
||||
assertThat(GlobalOpenTelemetry.getMeter("testMeter1"))
|
||||
.isEqualTo(GlobalOpenTelemetry.getMeterProvider().get("testMeter1"));
|
||||
assertThat(GlobalOpenTelemetry.getMeter("testMeter2", "testVersion"))
|
||||
.isEqualTo(GlobalOpenTelemetry.getMeterProvider().get("testMeter2", "testVersion"));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
|
|
@ -7,7 +7,7 @@ package io.opentelemetry.sdk.metrics.spi;
|
|||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.sdk.metrics.MeterSdkProvider;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
|
@ -15,6 +15,6 @@ import org.junit.jupiter.api.Test;
|
|||
class MeterProviderFactorySdkTest {
|
||||
@Test
|
||||
void testDefault() {
|
||||
assertThat(OpenTelemetry.getGlobalMeterProvider()).isInstanceOf(MeterSdkProvider.class);
|
||||
assertThat(GlobalOpenTelemetry.getMeterProvider()).isInstanceOf(MeterSdkProvider.class);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@ import java.util.concurrent.LinkedBlockingQueue;
|
|||
*
|
||||
* // creating InMemoryMetricExporter
|
||||
* private final InMemoryMetricExporter exporter = InMemoryMetricExporter.create();
|
||||
* private final MeterSdkProvider meterSdkProvider = OpenTelemetrySdk.getGlobalMeterProvider();
|
||||
* private final MeterSdkProvider meterSdkProvider = OpenTelemetrySdk.getMeterProvider();
|
||||
* private final Meter meter = meterSdkProvider.get("InMemoryMetricExporterExample");
|
||||
* private IntervalMetricReader intervalMetricReader;
|
||||
*
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
|
||||
package io.opentelemetry.sdk.testing.junit4;
|
||||
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
|
||||
import io.opentelemetry.context.propagation.ContextPropagators;
|
||||
|
@ -97,13 +98,13 @@ public class OpenTelemetryRule extends ExternalResource {
|
|||
|
||||
@Override
|
||||
protected void before() throws Throwable {
|
||||
previousGlobalOpenTelemetry = OpenTelemetry.get();
|
||||
OpenTelemetry.set(openTelemetry);
|
||||
previousGlobalOpenTelemetry = GlobalOpenTelemetry.get();
|
||||
GlobalOpenTelemetry.set(openTelemetry);
|
||||
clearSpans();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void after() {
|
||||
OpenTelemetry.set(previousGlobalOpenTelemetry);
|
||||
GlobalOpenTelemetry.set(previousGlobalOpenTelemetry);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ package io.opentelemetry.sdk.testing.junit5;
|
|||
|
||||
import static io.opentelemetry.sdk.testing.assertj.TracesAssert.assertThat;
|
||||
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
|
||||
import io.opentelemetry.context.propagation.ContextPropagators;
|
||||
|
@ -125,12 +126,12 @@ public class OpenTelemetryExtension
|
|||
|
||||
@Override
|
||||
public void beforeAll(ExtensionContext context) {
|
||||
previousGlobalOpenTelemetry = OpenTelemetry.get();
|
||||
OpenTelemetry.set(openTelemetry);
|
||||
previousGlobalOpenTelemetry = GlobalOpenTelemetry.get();
|
||||
GlobalOpenTelemetry.set(openTelemetry);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void afterAll(ExtensionContext context) {
|
||||
OpenTelemetry.set(previousGlobalOpenTelemetry);
|
||||
GlobalOpenTelemetry.set(previousGlobalOpenTelemetry);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,6 +7,7 @@ package io.opentelemetry.sdk.testing.junit4;
|
|||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import org.junit.AfterClass;
|
||||
|
@ -24,12 +25,12 @@ public class OpenTelemetryRuleTest {
|
|||
// Class callbacks happen outside the rule so we can verify the restoration behavior in them.
|
||||
@BeforeClass
|
||||
public static void beforeTest() {
|
||||
openTelemetryBeforeTest = OpenTelemetry.get();
|
||||
openTelemetryBeforeTest = GlobalOpenTelemetry.get();
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
public static void afterTest() {
|
||||
assertThat(OpenTelemetry.get()).isSameAs(openTelemetryBeforeTest);
|
||||
assertThat(GlobalOpenTelemetry.get()).isSameAs(openTelemetryBeforeTest);
|
||||
}
|
||||
|
||||
private Tracer tracer;
|
||||
|
|
|
@ -8,6 +8,7 @@ package io.opentelemetry.sdk.testing.junit5;
|
|||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
|
@ -30,12 +31,12 @@ class OpenTelemetryExtensionTest {
|
|||
// Class callbacks happen outside the rule so we can verify the restoration behavior in them.
|
||||
@BeforeAll
|
||||
public static void beforeTest() {
|
||||
openTelemetryBeforeTest = OpenTelemetry.get();
|
||||
openTelemetryBeforeTest = GlobalOpenTelemetry.get();
|
||||
}
|
||||
|
||||
@AfterAll
|
||||
public static void afterTest() {
|
||||
assertThat(OpenTelemetry.get()).isSameAs(openTelemetryBeforeTest);
|
||||
assertThat(GlobalOpenTelemetry.get()).isSameAs(openTelemetryBeforeTest);
|
||||
}
|
||||
|
||||
private final Tracer tracer = otelTesting.getOpenTelemetry().getTracer("test");
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
package io.opentelemetry.sdk.trace.export;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.common.Labels;
|
||||
import io.opentelemetry.api.metrics.LongCounter;
|
||||
import io.opentelemetry.api.metrics.LongCounter.BoundLongCounter;
|
||||
|
@ -169,7 +169,7 @@ public final class BatchSpanProcessor implements SpanProcessor {
|
|||
this.maxExportBatchSize = maxExportBatchSize;
|
||||
this.exporterTimeoutMillis = exporterTimeoutMillis;
|
||||
this.queue = queue;
|
||||
Meter meter = OpenTelemetry.getGlobalMeter("io.opentelemetry.sdk.trace");
|
||||
Meter meter = GlobalOpenTelemetry.getMeter("io.opentelemetry.sdk.trace");
|
||||
meter
|
||||
.longValueObserverBuilder("queueSize")
|
||||
.setDescription("The number of spans queued")
|
||||
|
|
|
@ -7,7 +7,7 @@ package io.opentelemetry.sdk.trace.spi;
|
|||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
import io.opentelemetry.sdk.trace.SdkTracerProvider;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
@ -18,6 +18,6 @@ class TracerProviderFactorySdkTest {
|
|||
@Test
|
||||
void testDefault() {
|
||||
Tracer tracerSdk = SdkTracerProvider.builder().build().get("");
|
||||
assertThat(OpenTelemetry.getGlobalTracerProvider().get("")).isInstanceOf(tracerSdk.getClass());
|
||||
assertThat(GlobalOpenTelemetry.getTracerProvider().get("")).isInstanceOf(tracerSdk.getClass());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
package io.opentelemetry.sdk.trace.testbed.clientserver;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.Span.Kind;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
|
@ -30,7 +30,7 @@ final class Client {
|
|||
span.setAttribute("component", "example-client");
|
||||
|
||||
try (Scope ignored = span.makeCurrent()) {
|
||||
OpenTelemetry.getGlobalPropagators()
|
||||
GlobalOpenTelemetry.getPropagators()
|
||||
.getTextMapPropagator()
|
||||
.inject(Context.current(), message, Message::put);
|
||||
queue.put(message);
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
package io.opentelemetry.sdk.trace.testbed.clientserver;
|
||||
|
||||
import io.opentelemetry.api.OpenTelemetry;
|
||||
import io.opentelemetry.api.GlobalOpenTelemetry;
|
||||
import io.opentelemetry.api.trace.Span;
|
||||
import io.opentelemetry.api.trace.Span.Kind;
|
||||
import io.opentelemetry.api.trace.Tracer;
|
||||
|
@ -27,7 +27,7 @@ final class Server extends Thread {
|
|||
|
||||
private void process(Message message) {
|
||||
Context context =
|
||||
OpenTelemetry.getGlobalPropagators()
|
||||
GlobalOpenTelemetry.getPropagators()
|
||||
.getTextMapPropagator()
|
||||
.extract(
|
||||
Context.current(),
|
||||
|
|
Loading…
Reference in New Issue