Remove OpenTelemetryBuilder interface, every implementation will have it's own builder (#2275)

This PR also fixes the DefaultOpenTelemetry builder to be it's own class and not a sub-class.

Signed-off-by: Bogdan Drutu <bogdandrutu@gmail.com>
This commit is contained in:
Bogdan Drutu 2020-12-11 20:09:58 -08:00 committed by GitHub
parent 5e891ccad9
commit c8f1f27f07
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 101 additions and 71 deletions

View File

@ -5,14 +5,10 @@
package io.opentelemetry.api;
import static java.util.Objects.requireNonNull;
import io.opentelemetry.api.metrics.MeterProvider;
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 java.util.ServiceLoader;
import javax.annotation.Nullable;
import javax.annotation.concurrent.ThreadSafe;
@ -45,8 +41,13 @@ public class DefaultOpenTelemetry implements OpenTelemetry {
globalOpenTelemetry = openTelemetry;
}
static Builder builder() {
return new Builder();
/**
* Returns a builder for the {@link DefaultOpenTelemetry}.
*
* @return a builder for the {@link DefaultOpenTelemetry}.
*/
public static DefaultOpenTelemetryBuilder builder() {
return new DefaultOpenTelemetryBuilder();
}
@Nullable private static volatile OpenTelemetry globalOpenTelemetry;
@ -93,7 +94,7 @@ public class DefaultOpenTelemetry implements OpenTelemetry {
* @throws IllegalStateException if a specified provider is not found
*/
@Nullable
private static <T> T loadSpi(Class<T> providerClass) {
static <T> T loadSpi(Class<T> providerClass) {
String specifiedProvider = System.getProperty(providerClass.getName());
ServiceLoader<T> providers = ServiceLoader.load(providerClass);
for (T provider : providers) {
@ -112,57 +113,4 @@ public class DefaultOpenTelemetry implements OpenTelemetry {
static void reset() {
globalOpenTelemetry = null;
}
protected static class Builder implements OpenTelemetryBuilder<Builder> {
protected ContextPropagators propagators = ContextPropagators.noop();
protected TracerProvider tracerProvider;
protected MeterProvider meterProvider;
@Override
public Builder setTracerProvider(TracerProvider tracerProvider) {
requireNonNull(tracerProvider, "tracerProvider");
this.tracerProvider = tracerProvider;
return this;
}
@Override
public Builder setMeterProvider(MeterProvider meterProvider) {
requireNonNull(meterProvider, "meterProvider");
this.meterProvider = meterProvider;
return this;
}
@Override
public Builder setPropagators(ContextPropagators propagators) {
requireNonNull(propagators, "propagators");
this.propagators = propagators;
return this;
}
@Override
public OpenTelemetry build() {
MeterProvider meterProvider = this.meterProvider;
if (meterProvider == null) {
MeterProviderFactory meterProviderFactory = loadSpi(MeterProviderFactory.class);
if (meterProviderFactory != null) {
meterProvider = meterProviderFactory.create();
} else {
meterProvider = MeterProvider.getDefault();
}
}
TracerProvider tracerProvider = this.tracerProvider;
if (tracerProvider == null) {
TracerProviderFactory tracerProviderFactory = loadSpi(TracerProviderFactory.class);
if (tracerProviderFactory != null) {
tracerProvider = tracerProviderFactory.create();
} else {
tracerProvider = TracerProvider.getDefault();
}
}
return new DefaultOpenTelemetry(tracerProvider, meterProvider, propagators);
}
}
}

View File

@ -0,0 +1,72 @@
/*
* 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.MeterProvider;
import io.opentelemetry.api.trace.TracerProvider;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.spi.metrics.MeterProviderFactory;
import io.opentelemetry.spi.trace.TracerProviderFactory;
/** Builder class for {@link DefaultOpenTelemetry}. */
@SuppressWarnings("deprecation")
public class DefaultOpenTelemetryBuilder
implements OpenTelemetryBuilder<DefaultOpenTelemetryBuilder> {
protected ContextPropagators propagators = ContextPropagators.noop();
protected TracerProvider tracerProvider;
protected MeterProvider meterProvider;
@Override
public DefaultOpenTelemetryBuilder setTracerProvider(TracerProvider tracerProvider) {
requireNonNull(tracerProvider, "tracerProvider");
this.tracerProvider = tracerProvider;
return this;
}
@Override
public DefaultOpenTelemetryBuilder setMeterProvider(MeterProvider meterProvider) {
requireNonNull(meterProvider, "meterProvider");
this.meterProvider = meterProvider;
return this;
}
@Override
public DefaultOpenTelemetryBuilder setPropagators(ContextPropagators propagators) {
requireNonNull(propagators, "propagators");
this.propagators = propagators;
return this;
}
@Override
public OpenTelemetry build() {
MeterProvider meterProvider = this.meterProvider;
if (meterProvider == null) {
MeterProviderFactory meterProviderFactory =
DefaultOpenTelemetry.loadSpi(MeterProviderFactory.class);
if (meterProviderFactory != null) {
meterProvider = meterProviderFactory.create();
} else {
meterProvider = MeterProvider.getDefault();
}
}
TracerProvider tracerProvider = this.tracerProvider;
if (tracerProvider == null) {
TracerProviderFactory tracerProviderFactory =
DefaultOpenTelemetry.loadSpi(TracerProviderFactory.class);
if (tracerProviderFactory != null) {
tracerProvider = tracerProviderFactory.create();
} else {
tracerProvider = TracerProvider.getDefault();
}
}
return new DefaultOpenTelemetry(tracerProvider, meterProvider, propagators);
}
}

View File

@ -205,8 +205,13 @@ public interface OpenTelemetry {
/** Returns the {@link ContextPropagators} for this {@link OpenTelemetry}. */
ContextPropagators getPropagators();
/** Returns a new {@link OpenTelemetryBuilder}. */
/**
* Returns a new {@link OpenTelemetryBuilder}.
*
* @deprecated use {@link DefaultOpenTelemetry#builder()}.
*/
@Deprecated
static OpenTelemetryBuilder<?> builder() {
return new DefaultOpenTelemetry.Builder();
return new DefaultOpenTelemetryBuilder();
}
}

View File

@ -12,7 +12,10 @@ import io.opentelemetry.context.propagation.ContextPropagators;
/**
* A builder of an implementation of the OpenTelemetry API. Generally used to reconfigure SDK
* implementations.
*
* @deprecated use the {@link DefaultOpenTelemetryBuilder} instead.
*/
@Deprecated
public interface OpenTelemetryBuilder<T extends OpenTelemetryBuilder<T>> {
/** Sets the {@link TracerProvider} to use. */

View File

@ -74,7 +74,7 @@ class OpenTelemetryTest {
TracerProvider tracerProvider = mock(TracerProvider.class);
ContextPropagators contextPropagators = mock(ContextPropagators.class);
OpenTelemetry openTelemetry =
OpenTelemetry.builder()
DefaultOpenTelemetry.builder()
.setMeterProvider(meterProvider)
.setTracerProvider(tracerProvider)
.setPropagators(contextPropagators)
@ -193,12 +193,12 @@ class OpenTelemetryTest {
Tracer tracer1 = mock(Tracer.class);
when(provider1.get("foo")).thenReturn(tracer1);
when(provider1.get("foo", "1.0")).thenReturn(tracer1);
OpenTelemetry otel1 = OpenTelemetry.builder().setTracerProvider(provider1).build();
OpenTelemetry otel1 = DefaultOpenTelemetry.builder().setTracerProvider(provider1).build();
TracerProvider provider2 = mock(TracerProvider.class);
Tracer tracer2 = mock(Tracer.class);
when(provider2.get("foo")).thenReturn(tracer2);
when(provider2.get("foo", "1.0")).thenReturn(tracer2);
OpenTelemetry otel2 = OpenTelemetry.builder().setTracerProvider(provider2).build();
OpenTelemetry otel2 = DefaultOpenTelemetry.builder().setTracerProvider(provider2).build();
assertThat(otel1.getTracer("foo")).isSameAs(tracer1);
assertThat(otel1.getTracer("foo", "1.0")).isSameAs(tracer1);
@ -212,12 +212,12 @@ class OpenTelemetryTest {
Meter meter1 = mock(Meter.class);
when(provider1.get("foo")).thenReturn(meter1);
when(provider1.get("foo", "1.0")).thenReturn(meter1);
OpenTelemetry otel1 = OpenTelemetry.builder().setMeterProvider(provider1).build();
OpenTelemetry otel1 = DefaultOpenTelemetry.builder().setMeterProvider(provider1).build();
MeterProvider provider2 = mock(MeterProvider.class);
Meter meter2 = mock(Meter.class);
when(provider2.get("foo")).thenReturn(meter2);
when(provider2.get("foo", "1.0")).thenReturn(meter2);
OpenTelemetry otel2 = OpenTelemetry.builder().setMeterProvider(provider2).build();
OpenTelemetry otel2 = DefaultOpenTelemetry.builder().setMeterProvider(provider2).build();
assertThat(otel1.getMeter("foo")).isSameAs(meter1);
assertThat(otel1.getMeter("foo", "1.0")).isSameAs(meter1);
@ -228,9 +228,9 @@ class OpenTelemetryTest {
@Test
void independentNonGlobalPropagators() {
ContextPropagators propagators1 = mock(ContextPropagators.class);
OpenTelemetry otel1 = OpenTelemetry.builder().setPropagators(propagators1).build();
OpenTelemetry otel1 = DefaultOpenTelemetry.builder().setPropagators(propagators1).build();
ContextPropagators propagators2 = mock(ContextPropagators.class);
OpenTelemetry otel2 = OpenTelemetry.builder().setPropagators(propagators2).build();
OpenTelemetry otel2 = DefaultOpenTelemetry.builder().setPropagators(propagators2).build();
assertThat(otel1.getPropagators()).isSameAs(propagators1);
assertThat(otel2.getPropagators()).isSameAs(propagators2);

View File

@ -8,6 +8,7 @@ package io.opentelemetry.sdk;
import static java.util.Objects.requireNonNull;
import io.opentelemetry.api.DefaultOpenTelemetry;
import io.opentelemetry.api.DefaultOpenTelemetryBuilder;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.api.trace.Tracer;
@ -92,7 +93,7 @@ public final class OpenTelemetrySdk extends DefaultOpenTelemetry {
}
/** A builder for configuring an {@link OpenTelemetrySdk}. */
public static class Builder extends DefaultOpenTelemetry.Builder {
public static class Builder extends DefaultOpenTelemetryBuilder {
private Clock clock;
private Resource resource;
private final List<SpanProcessor> spanProcessors = new ArrayList<>();

View File

@ -13,6 +13,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import io.opentelemetry.api.DefaultOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.MeterProvider;
@ -55,7 +56,7 @@ class OpenTelemetrySdkTest {
OpenTelemetry previous = OpenTelemetry.get();
assertThatCode(OpenTelemetrySdk::getGlobalTracerManagement).doesNotThrowAnyException();
try {
OpenTelemetry.set(OpenTelemetry.builder().setTracerProvider(tracerProvider).build());
OpenTelemetry.set(DefaultOpenTelemetry.builder().setTracerProvider(tracerProvider).build());
assertThatThrownBy(OpenTelemetrySdk::getGlobalTracerManagement)
.isInstanceOf(IllegalStateException.class);
} finally {