Remove duplicate getters and builder options from SDK (#2231)

Signed-off-by: Bogdan Drutu <bogdandrutu@gmail.com>
This commit is contained in:
Bogdan Drutu 2020-12-15 20:12:04 -08:00 committed by GitHub
parent 5a93b77524
commit 2866424b90
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 212 deletions

View File

@ -5,8 +5,6 @@
package io.opentelemetry.sdk; package io.opentelemetry.sdk;
import static java.util.Objects.requireNonNull;
import io.opentelemetry.api.DefaultOpenTelemetry; import io.opentelemetry.api.DefaultOpenTelemetry;
import io.opentelemetry.api.DefaultOpenTelemetryBuilder; import io.opentelemetry.api.DefaultOpenTelemetryBuilder;
import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.GlobalOpenTelemetry;
@ -15,17 +13,9 @@ import io.opentelemetry.api.metrics.MeterProvider;
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 io.opentelemetry.sdk.common.Clock;
import io.opentelemetry.sdk.internal.SystemClock;
import io.opentelemetry.sdk.metrics.MeterSdkProvider; import io.opentelemetry.sdk.metrics.MeterSdkProvider;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.IdGenerator;
import io.opentelemetry.sdk.trace.SdkTracerManagement; import io.opentelemetry.sdk.trace.SdkTracerManagement;
import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.SpanProcessor;
import io.opentelemetry.sdk.trace.config.TraceConfig;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import javax.annotation.concurrent.ThreadSafe; import javax.annotation.concurrent.ThreadSafe;
@ -69,28 +59,11 @@ public final class OpenTelemetrySdk extends DefaultOpenTelemetry {
private static final AtomicBoolean INITIALIZED_GLOBAL = new AtomicBoolean(); private static final AtomicBoolean INITIALIZED_GLOBAL = new AtomicBoolean();
private final Clock clock;
private final Resource resource;
private OpenTelemetrySdk( private OpenTelemetrySdk(
TracerProvider tracerProvider, TracerProvider tracerProvider,
MeterProvider meterProvider, MeterProvider meterProvider,
ContextPropagators contextPropagators, ContextPropagators contextPropagators) {
Clock clock,
Resource resource) {
super(tracerProvider, meterProvider, contextPropagators); super(tracerProvider, meterProvider, contextPropagators);
this.clock = clock;
this.resource = resource;
}
/** Returns the {@link Resource} for this {@link OpenTelemetrySdk}. */
public Resource getResource() {
return resource;
}
/** Returns the {@link Clock} for this {@link OpenTelemetrySdk}. */
public Clock getClock() {
return clock;
} }
/** Returns the {@link SdkTracerManagement} for this {@link OpenTelemetrySdk}. */ /** Returns the {@link SdkTracerManagement} for this {@link OpenTelemetrySdk}. */
@ -100,12 +73,6 @@ public final class OpenTelemetrySdk extends DefaultOpenTelemetry {
/** A builder for configuring an {@link OpenTelemetrySdk}. */ /** A builder for configuring an {@link OpenTelemetrySdk}. */
public static class Builder extends DefaultOpenTelemetryBuilder { public static class Builder extends DefaultOpenTelemetryBuilder {
private Clock clock;
private Resource resource;
private final List<SpanProcessor> spanProcessors = new ArrayList<>();
private IdGenerator idGenerator;
private TraceConfig traceConfig;
/** /**
* Sets the {@link SdkTracerProvider} to use. This can be used to configure tracing settings by * Sets the {@link SdkTracerProvider} to use. This can be used to configure tracing settings by
* returning the instance created by a {@link SdkTracerProvider.Builder}. * returning the instance created by a {@link SdkTracerProvider.Builder}.
@ -152,130 +119,28 @@ public final class OpenTelemetrySdk extends DefaultOpenTelemetry {
return this; return this;
} }
/**
* Sets the {@link Clock} to be used for measuring timings.
*
* <p>If you use {@link #setTracerProvider(TracerProvider)}, this will be ignored for purposes
* of configuring the TracerProvider.
*
* @param clock The clock to use for all temporal needs.
* @return this
*/
public Builder setClock(Clock clock) {
requireNonNull(clock, "clock");
this.clock = clock;
return this;
}
/**
* Sets the {@link Resource} to be attached to all telemetry reported by this SDK.
*
* <p>If you use {@link #setTracerProvider(TracerProvider)}, this will be ignored for purposes
* of configuring the TracerProvider.
*
* @param resource A Resource implementation.
* @return this
*/
public Builder setResource(Resource resource) {
requireNonNull(resource, "resource");
this.resource = resource;
return this;
}
/**
* Add a SpanProcessor to the span pipeline that will be built.
*
* @return this
*/
public Builder addSpanProcessor(SpanProcessor spanProcessor) {
spanProcessors.add(spanProcessor);
return this;
}
/**
* Set the {@link IdGenerator} that will be used by the SDK for generating trace and span ids.
*
* <p>Using {@link #setTracerProvider(TracerProvider)} will override this setting.
*
* @return this
*/
public Builder setIdGenerator(IdGenerator idGenerator) {
this.idGenerator = idGenerator;
return this;
}
/**
* Set the {@link TraceConfig} that will be initially set on the Tracing SDK.
*
* <p>Using {@link #setTracerProvider(TracerProvider)} will override this setting.
*
* @return this
*/
public Builder setTraceConfig(TraceConfig traceConfig) {
this.traceConfig = traceConfig;
return this;
}
/** /**
* Returns a new {@link OpenTelemetrySdk} built with the configuration of this {@link Builder}. * Returns a new {@link OpenTelemetrySdk} built with the configuration of this {@link Builder}.
*/ */
@Override @Override
public OpenTelemetrySdk build() { public OpenTelemetrySdk build() {
MeterProvider meterProvider = buildMeterProvider(); if (meterProvider == null) {
SdkTracerProvider tracerProvider = buildTracerProvider(); meterProvider = MeterSdkProvider.builder().build();
}
for (SpanProcessor spanProcessor : spanProcessors) { if (tracerProvider == null) {
tracerProvider.addSpanProcessor(spanProcessor); tracerProvider = SdkTracerProvider.builder().build();
} }
OpenTelemetrySdk sdk = OpenTelemetrySdk sdk =
new OpenTelemetrySdk( new OpenTelemetrySdk(
new ObfuscatedTracerProvider(tracerProvider), new ObfuscatedTracerProvider(tracerProvider), meterProvider, super.propagators);
meterProvider,
super.propagators,
clock == null ? SystemClock.getInstance() : clock,
resource == null ? Resource.getDefault() : resource);
// Automatically initialize global OpenTelemetry with the first SDK we build. // Automatically initialize global OpenTelemetry with the first SDK we build.
if (INITIALIZED_GLOBAL.compareAndSet(/* expectedValue= */ false, /* newValue= */ true)) { if (INITIALIZED_GLOBAL.compareAndSet(/* expectedValue= */ false, /* newValue= */ true)) {
GlobalOpenTelemetry.set(sdk); GlobalOpenTelemetry.set(sdk);
} }
return sdk; return sdk;
} }
private SdkTracerProvider buildTracerProvider() {
TracerProvider tracerProvider = super.tracerProvider;
if (tracerProvider != null) {
return (SdkTracerProvider) tracerProvider;
}
SdkTracerProvider.Builder tracerProviderBuilder = SdkTracerProvider.builder();
if (clock != null) {
tracerProviderBuilder.setClock(clock);
}
if (resource != null) {
tracerProviderBuilder.setResource(resource);
}
if (idGenerator != null) {
tracerProviderBuilder.setIdGenerator(idGenerator);
}
if (traceConfig != null) {
tracerProviderBuilder.setTraceConfig(traceConfig);
}
return tracerProviderBuilder.build();
}
private MeterProvider buildMeterProvider() {
if (super.meterProvider != null) {
return super.meterProvider;
}
MeterSdkProvider.Builder meterProviderBuilder = MeterSdkProvider.builder();
if (clock != null) {
meterProviderBuilder.setClock(clock);
}
if (resource != null) {
meterProviderBuilder.setResource(resource);
}
return meterProviderBuilder.build();
}
} }
/** /**

View File

@ -11,28 +11,22 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.assertj.core.api.InstanceOfAssertFactories.type; import static org.assertj.core.api.InstanceOfAssertFactories.type;
import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import io.opentelemetry.api.DefaultOpenTelemetry; import io.opentelemetry.api.DefaultOpenTelemetry;
import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.common.Attributes;
import io.opentelemetry.api.metrics.MeterProvider; import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.api.trace.Span;
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 io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.sdk.OpenTelemetrySdk.ObfuscatedTracerProvider; import io.opentelemetry.sdk.OpenTelemetrySdk.ObfuscatedTracerProvider;
import io.opentelemetry.sdk.common.Clock; import io.opentelemetry.sdk.common.Clock;
import io.opentelemetry.sdk.internal.SystemClock;
import io.opentelemetry.sdk.metrics.MeterSdkProvider; import io.opentelemetry.sdk.metrics.MeterSdkProvider;
import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.IdGenerator; import io.opentelemetry.sdk.trace.IdGenerator;
import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.SpanProcessor;
import io.opentelemetry.sdk.trace.config.TraceConfig; import io.opentelemetry.sdk.trace.config.TraceConfig;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import io.opentelemetry.sdk.trace.export.SpanExporter;
import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.sdk.trace.samplers.Sampler;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
@ -98,27 +92,20 @@ class OpenTelemetrySdkTest {
assertThat(obfuscatedTracerProvider.unobfuscate()) assertThat(obfuscatedTracerProvider.unobfuscate())
.isInstanceOf(SdkTracerProvider.class)); .isInstanceOf(SdkTracerProvider.class));
assertThat(openTelemetry.getMeterProvider()).isInstanceOf(MeterSdkProvider.class); assertThat(openTelemetry.getMeterProvider()).isInstanceOf(MeterSdkProvider.class);
assertThat(openTelemetry.getResource()).isEqualTo(Resource.getDefault());
assertThat(openTelemetry.getClock()).isEqualTo(SystemClock.getInstance());
} }
@Test @Test
void building() { void building() {
Resource resource = Resource.create(Attributes.builder().put("cat", "meow").build());
OpenTelemetrySdk openTelemetry = OpenTelemetrySdk openTelemetry =
OpenTelemetrySdk.builder() OpenTelemetrySdk.builder()
.setTracerProvider(tracerProvider) .setTracerProvider(tracerProvider)
.setMeterProvider(meterProvider) .setMeterProvider(meterProvider)
.setPropagators(propagators) .setPropagators(propagators)
.setClock(clock)
.setResource(resource)
.build(); .build();
assertThat(((ObfuscatedTracerProvider) openTelemetry.getTracerProvider()).unobfuscate()) assertThat(((ObfuscatedTracerProvider) openTelemetry.getTracerProvider()).unobfuscate())
.isEqualTo(tracerProvider); .isEqualTo(tracerProvider);
assertThat(openTelemetry.getMeterProvider()).isEqualTo(meterProvider); assertThat(openTelemetry.getMeterProvider()).isEqualTo(meterProvider);
assertThat(openTelemetry.getPropagators()).isEqualTo(propagators); assertThat(openTelemetry.getPropagators()).isEqualTo(propagators);
assertThat(openTelemetry.getResource()).isEqualTo(resource);
assertThat(openTelemetry.getClock()).isEqualTo(clock);
} }
@Test @Test
@ -128,10 +115,15 @@ class OpenTelemetrySdkTest {
TraceConfig traceConfig = mock(TraceConfig.class); TraceConfig traceConfig = mock(TraceConfig.class);
OpenTelemetrySdk openTelemetry = OpenTelemetrySdk openTelemetry =
OpenTelemetrySdk.builder() OpenTelemetrySdk.builder()
.setClock(clock) .setTracerProvider(
.setResource(resource) SdkTracerProvider.builder()
.setIdGenerator(idGenerator) .setClock(clock)
.setTraceConfig(traceConfig) .setResource(resource)
.setIdGenerator(idGenerator)
.setTraceConfig(traceConfig)
.build())
.setMeterProvider(
MeterSdkProvider.builder().setResource(resource).setClock(clock).build())
.build(); .build();
TracerProvider unobfuscatedTracerProvider = TracerProvider unobfuscatedTracerProvider =
((ObfuscatedTracerProvider) openTelemetry.getTracerProvider()).unobfuscate(); ((ObfuscatedTracerProvider) openTelemetry.getTracerProvider()).unobfuscate();
@ -153,29 +145,6 @@ class OpenTelemetrySdkTest {
.extracting("sharedState") .extracting("sharedState")
.hasFieldOrPropertyWithValue("clock", clock) .hasFieldOrPropertyWithValue("clock", clock)
.hasFieldOrPropertyWithValue("resource", resource); .hasFieldOrPropertyWithValue("resource", resource);
assertThat(openTelemetry.getResource()).isSameAs(resource);
assertThat(openTelemetry.getClock()).isSameAs(clock);
}
@Test
void addSpanProcessors() {
SpanProcessor spanProcessor1 = mock(SpanProcessor.class);
SpanProcessor spanProcessor2 = mock(SpanProcessor.class);
OpenTelemetrySdk openTelemetrySdk =
OpenTelemetrySdk.builder()
.addSpanProcessor(spanProcessor1)
.addSpanProcessor(spanProcessor2)
.build();
TracerProvider tracerProvider = openTelemetrySdk.getTracerProvider();
Span span = tracerProvider.get("test").spanBuilder("test").startSpan();
span.end();
verify(spanProcessor1).isStartRequired();
verify(spanProcessor1).isEndRequired();
verify(spanProcessor2).isStartRequired();
verify(spanProcessor2).isEndRequired();
} }
@Test @Test
@ -212,30 +181,23 @@ class OpenTelemetrySdkTest {
OpenTelemetrySdk.Builder sdkBuilder = OpenTelemetrySdk.Builder sdkBuilder =
OpenTelemetrySdk.builder() OpenTelemetrySdk.builder()
.addSpanProcessor(mock(SpanProcessor.class)) .setTracerProvider(
.addSpanProcessor(SimpleSpanProcessor.builder(mock(SpanExporter.class)).build()) SdkTracerProvider.builder()
.setIdGenerator(mock(IdGenerator.class)) // TODO: Add support to configure SpanProcessor the builder.
.setPropagators(ContextPropagators.create(mock(TextMapPropagator.class))) // .addSpanProcessor(SimpleSpanProcessor.builder(
.setClock(mock(Clock.class)) // mock(SpanExporter.class)).build())
.setResource(mock(Resource.class)); // .addSpanProcessor(SimpleSpanProcessor.builder(
// mock(SpanExporter.class)).build())
SdkTracerProvider sdkTracerProvider = .setClock(mock(Clock.class))
SdkTracerProvider.builder() .setIdGenerator(mock(IdGenerator.class))
.setClock(mock(Clock.class)) .setResource(mock(Resource.class))
.setIdGenerator(mock(IdGenerator.class)) .setTraceConfig(newConfig)
.setResource(mock(Resource.class)) .build())
.setTraceConfig(newConfig) .setMeterProvider(
.build(); MeterSdkProvider.builder()
.setClock(mock(Clock.class))
MeterSdkProvider meterSdkProvider = .setResource(mock(Resource.class))
MeterSdkProvider.builder() .build());
.setClock(mock(Clock.class))
.setResource(mock(Resource.class))
.build();
sdkBuilder.setTracerProvider(sdkTracerProvider);
sdkBuilder.setMeterProvider(meterSdkProvider);
sdkBuilder.setTraceConfig(newConfig);
sdkBuilder.build(); sdkBuilder.build();
} }
@ -246,7 +208,11 @@ class OpenTelemetrySdkTest {
@Test @Test
void trivialOpenTelemetrySdkConfigurationDemo() { void trivialOpenTelemetrySdkConfigurationDemo() {
OpenTelemetrySdk.builder() OpenTelemetrySdk.builder()
.addSpanProcessor(SimpleSpanProcessor.builder(mock(SpanExporter.class)).build()) .setTracerProvider(
SdkTracerProvider.builder()
// TODO: Add support to configure SpanProcessor the builder.
// .addSpanProcessor(SimpleSpanProcessor.builder(mock(SpanExporter.class)).build())
.build())
.setPropagators(ContextPropagators.create(mock(TextMapPropagator.class))) .setPropagators(ContextPropagators.create(mock(TextMapPropagator.class)))
.build(); .build();
} }
@ -256,16 +222,26 @@ class OpenTelemetrySdkTest {
@Test @Test
void minimalOpenTelemetrySdkConfigurationDemo() { void minimalOpenTelemetrySdkConfigurationDemo() {
OpenTelemetrySdk.builder() OpenTelemetrySdk.builder()
.addSpanProcessor(SimpleSpanProcessor.builder(mock(SpanExporter.class)).build()) .setTracerProvider(
SdkTracerProvider.builder()
// TODO: Add support to configure SpanProcessor the builder.
// .addSpanProcessor(SimpleSpanProcessor.builder(mock(SpanExporter.class)).build())
.setTraceConfig(
TraceConfig.getDefault().toBuilder().setSampler(mock(Sampler.class)).build())
.build())
.setPropagators(ContextPropagators.create(mock(TextMapPropagator.class))) .setPropagators(ContextPropagators.create(mock(TextMapPropagator.class)))
.setTraceConfig(
TraceConfig.getDefault().toBuilder().setSampler(mock(Sampler.class)).build())
.build(); .build();
OpenTelemetrySdk.builder() OpenTelemetrySdk.builder()
.addSpanProcessor(SimpleSpanProcessor.builder(mock(SpanExporter.class)).build()) .setTracerProvider(
SdkTracerProvider.builder()
// TODO: Add support to configure SpanProcessor the builder.
// .addSpanProcessor(SimpleSpanProcessor.builder(mock(SpanExporter.class)).build())
.setTraceConfig(
TraceConfig.getDefault().toBuilder().setSampler(mock(Sampler.class)).build())
.setIdGenerator(mock(IdGenerator.class))
.build())
.setPropagators(ContextPropagators.create(mock(TextMapPropagator.class))) .setPropagators(ContextPropagators.create(mock(TextMapPropagator.class)))
.setIdGenerator(mock(IdGenerator.class))
.build(); .build();
} }
} }