Move SdkTracerProviderBuilder and OpenTelemetrySdkBuilder to top-level. (#2318)

This commit is contained in:
Anuraag Agrawal 2020-12-17 03:56:49 +09:00 committed by GitHub
parent 718f512701
commit 7c0b452097
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 183 additions and 159 deletions

View File

@ -6,7 +6,6 @@
package io.opentelemetry.sdk;
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;
@ -24,11 +23,11 @@ import javax.annotation.concurrent.ThreadSafe;
public final class OpenTelemetrySdk extends DefaultOpenTelemetry {
/**
* Returns a new {@link Builder} for configuring an instance of {@linkplain OpenTelemetrySdk the
* OpenTelemetry SDK}.
* Returns a new {@link OpenTelemetrySdkBuilder} for configuring an instance of {@linkplain
* OpenTelemetrySdk the OpenTelemetry SDK}.
*/
public static Builder builder() {
return new Builder();
public static OpenTelemetrySdkBuilder builder() {
return new OpenTelemetrySdkBuilder();
}
/** Returns the global {@link OpenTelemetrySdk}. */
@ -57,9 +56,9 @@ public final class OpenTelemetrySdk extends DefaultOpenTelemetry {
return (MeterSdkProvider) GlobalOpenTelemetry.get().getMeterProvider();
}
private static final AtomicBoolean INITIALIZED_GLOBAL = new AtomicBoolean();
static final AtomicBoolean INITIALIZED_GLOBAL = new AtomicBoolean();
private OpenTelemetrySdk(
OpenTelemetrySdk(
TracerProvider tracerProvider,
MeterProvider meterProvider,
ContextPropagators contextPropagators) {
@ -71,78 +70,6 @@ public final class OpenTelemetrySdk extends DefaultOpenTelemetry {
return (SdkTracerProvider) ((ObfuscatedTracerProvider) getTracerProvider()).unobfuscate();
}
/** A builder for configuring an {@link OpenTelemetrySdk}. */
public static class Builder extends DefaultOpenTelemetryBuilder {
/**
* Sets the {@link SdkTracerProvider} to use. This can be used to configure tracing settings by
* returning the instance created by a {@link SdkTracerProvider.Builder}.
*
* <p>If you use this method, it is assumed that you are providing a fully configured
* TracerSdkProvider, and other settings will be ignored.
*
* <p>Note: the parameter passed in here must be a {@link SdkTracerProvider} instance.
*
* @param tracerProvider A {@link SdkTracerProvider} to use with this instance.
* @see SdkTracerProvider#builder()
*/
@Override
public Builder setTracerProvider(TracerProvider tracerProvider) {
if (!(tracerProvider instanceof SdkTracerProvider)) {
throw new IllegalArgumentException(
"The OpenTelemetrySdk can only be configured with a TracerSdkProvider");
}
super.setTracerProvider(tracerProvider);
return this;
}
/**
* Sets the {@link MeterProvider} to use.. This can be used to configure tracing settings by
* returning the instance created by a {@link MeterSdkProvider.Builder}.
*
* @see MeterSdkProvider#builder()
*/
@Override
@Deprecated
public Builder setMeterProvider(MeterProvider meterProvider) {
if (!(meterProvider instanceof MeterSdkProvider)) {
throw new IllegalArgumentException(
"The OpenTelemetrySdk can only be configured with a MeterSdkProvider");
}
super.setMeterProvider(meterProvider);
return this;
}
/** Sets the {@link ContextPropagators} to use. */
@Override
public Builder setPropagators(ContextPropagators propagators) {
super.setPropagators(propagators);
return this;
}
/**
* Returns a new {@link OpenTelemetrySdk} built with the configuration of this {@link Builder}.
*/
@Override
public OpenTelemetrySdk build() {
if (meterProvider == null) {
meterProvider = MeterSdkProvider.builder().build();
}
if (tracerProvider == null) {
tracerProvider = SdkTracerProvider.builder().build();
}
OpenTelemetrySdk sdk =
new OpenTelemetrySdk(
new ObfuscatedTracerProvider(tracerProvider), meterProvider, super.propagators);
// Automatically initialize global OpenTelemetry with the first SDK we build.
if (INITIALIZED_GLOBAL.compareAndSet(/* expectedValue= */ false, /* newValue= */ true)) {
GlobalOpenTelemetry.set(sdk);
}
return sdk;
}
}
/**
* This class allows the SDK to unobfuscate an obfuscated static global provider.
*
@ -156,7 +83,7 @@ public final class OpenTelemetrySdk extends DefaultOpenTelemetry {
private final TracerProvider delegate;
private ObfuscatedTracerProvider(TracerProvider delegate) {
ObfuscatedTracerProvider(TracerProvider delegate) {
this.delegate = delegate;
}

View File

@ -0,0 +1,90 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk;
import io.opentelemetry.api.DefaultOpenTelemetryBuilder;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.metrics.MeterProvider;
import io.opentelemetry.api.trace.TracerProvider;
import io.opentelemetry.context.propagation.ContextPropagators;
import io.opentelemetry.sdk.OpenTelemetrySdk.ObfuscatedTracerProvider;
import io.opentelemetry.sdk.metrics.MeterSdkProvider;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
/** A builder for configuring an {@link OpenTelemetrySdk}. */
public final class OpenTelemetrySdkBuilder extends DefaultOpenTelemetryBuilder {
/**
* Sets the {@link SdkTracerProvider} to use. This can be used to configure tracing settings by
* returning the instance created by a {@link SdkTracerProviderBuilder}.
*
* <p>If you use this method, it is assumed that you are providing a fully configured
* TracerSdkProvider, and other settings will be ignored.
*
* <p>Note: the parameter passed in here must be a {@link SdkTracerProvider} instance.
*
* @param tracerProvider A {@link SdkTracerProvider} to use with this instance.
* @see SdkTracerProvider#builder()
*/
@Override
public OpenTelemetrySdkBuilder setTracerProvider(TracerProvider tracerProvider) {
if (!(tracerProvider instanceof SdkTracerProvider)) {
throw new IllegalArgumentException(
"The OpenTelemetrySdk can only be configured with a TracerSdkProvider");
}
super.setTracerProvider(tracerProvider);
return this;
}
/**
* Sets the {@link MeterProvider} to use.. This can be used to configure tracing settings by
* returning the instance created by a {@link MeterSdkProvider.Builder}.
*
* @see MeterSdkProvider#builder()
*/
@Override
@Deprecated
public OpenTelemetrySdkBuilder setMeterProvider(MeterProvider meterProvider) {
if (!(meterProvider instanceof MeterSdkProvider)) {
throw new IllegalArgumentException(
"The OpenTelemetrySdk can only be configured with a MeterSdkProvider");
}
super.setMeterProvider(meterProvider);
return this;
}
/** Sets the {@link ContextPropagators} to use. */
@Override
public OpenTelemetrySdkBuilder setPropagators(ContextPropagators propagators) {
super.setPropagators(propagators);
return this;
}
/**
* Returns a new {@link OpenTelemetrySdk} built with the configuration of this {@link
* OpenTelemetrySdkBuilder}.
*/
@Override
public OpenTelemetrySdk build() {
if (meterProvider == null) {
meterProvider = MeterSdkProvider.builder().build();
}
if (tracerProvider == null) {
tracerProvider = SdkTracerProvider.builder().build();
}
OpenTelemetrySdk sdk =
new OpenTelemetrySdk(
new ObfuscatedTracerProvider(tracerProvider), meterProvider, super.propagators);
// Automatically initialize global OpenTelemetry with the first SDK we build.
if (OpenTelemetrySdk.INITIALIZED_GLOBAL.compareAndSet(
/* expectedValue= */ false, /* newValue= */ true)) {
GlobalOpenTelemetry.set(sdk);
}
return sdk;
}
}

View File

@ -179,7 +179,7 @@ class OpenTelemetrySdkTest {
.setMaxLengthOfAttributeValues(128)
.build();
OpenTelemetrySdk.Builder sdkBuilder =
OpenTelemetrySdkBuilder sdkBuilder =
OpenTelemetrySdk.builder()
.setTracerProvider(
SdkTracerProvider.builder()

View File

@ -11,10 +11,8 @@ import io.opentelemetry.api.trace.TracerProvider;
import io.opentelemetry.sdk.common.Clock;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.internal.ComponentRegistry;
import io.opentelemetry.sdk.internal.SystemClock;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.config.TraceConfig;
import java.util.Objects;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Nullable;
@ -33,15 +31,15 @@ public final class SdkTracerProvider implements TracerProvider, SdkTracerManagem
private final ComponentRegistry<SdkTracer> tracerSdkComponentRegistry;
/**
* Returns a new {@link Builder} for {@link SdkTracerProvider}.
* Returns a new {@link SdkTracerProviderBuilder} for {@link SdkTracerProvider}.
*
* @return a new {@link Builder} for {@link SdkTracerProvider}.
* @return a new {@link SdkTracerProviderBuilder} for {@link SdkTracerProvider}.
*/
public static Builder builder() {
return new Builder();
public static SdkTracerProviderBuilder builder() {
return new SdkTracerProviderBuilder();
}
private SdkTracerProvider(
SdkTracerProvider(
Clock clock, IdGenerator idsGenerator, Resource resource, TraceConfig traceConfig) {
this.sharedState = new TracerSharedState(clock, idsGenerator, resource, traceConfig);
this.tracerSdkComponentRegistry =
@ -92,75 +90,4 @@ public final class SdkTracerProvider implements TracerProvider, SdkTracerManagem
public CompletableResultCode forceFlush() {
return sharedState.getActiveSpanProcessor().forceFlush();
}
/**
* Builder class for the TraceSdkProvider. Has fully functional default implementations of all
* three required interfaces.
*/
public static class Builder {
private Clock clock = SystemClock.getInstance();
private IdGenerator idsGenerator = IdGenerator.random();
private Resource resource = Resource.getDefault();
private TraceConfig traceConfig = TraceConfig.getDefault();
/**
* Assign a {@link Clock}.
*
* @param clock The clock to use for all temporal needs.
* @return this
*/
public Builder setClock(Clock clock) {
Objects.requireNonNull(clock, "clock");
this.clock = clock;
return this;
}
/**
* Assign an {@link IdGenerator}.
*
* @param idGenerator A generator for trace and span ids. Note: this should be thread-safe and
* as contention free as possible.
* @return this
*/
public Builder setIdGenerator(IdGenerator idGenerator) {
Objects.requireNonNull(idGenerator, "idGenerator");
this.idsGenerator = idGenerator;
return this;
}
/**
* Assign a {@link Resource} to be attached to all Spans created by Tracers.
*
* @param resource A Resource implementation.
* @return this
*/
public Builder setResource(Resource resource) {
Objects.requireNonNull(resource, "resource");
this.resource = resource;
return this;
}
/**
* Assign an initial {@link TraceConfig} that should be used with this SDK.
*
* @return this
*/
public Builder setTraceConfig(TraceConfig traceConfig) {
this.traceConfig = traceConfig;
Objects.requireNonNull(traceConfig);
return this;
}
/**
* Create a new TraceSdkProvider instance.
*
* @return An initialized TraceSdkProvider.
*/
public SdkTracerProvider build() {
return new SdkTracerProvider(clock, idsGenerator, resource, traceConfig);
}
private Builder() {}
}
}

View File

@ -0,0 +1,80 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.trace;
import io.opentelemetry.sdk.common.Clock;
import io.opentelemetry.sdk.internal.SystemClock;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.config.TraceConfig;
import java.util.Objects;
/** Builder of {@link SdkTracerProvider}. */
public final class SdkTracerProviderBuilder {
private Clock clock = SystemClock.getInstance();
private IdGenerator idsGenerator = IdGenerator.random();
private Resource resource = Resource.getDefault();
private TraceConfig traceConfig = TraceConfig.getDefault();
/**
* Assign a {@link Clock}.
*
* @param clock The clock to use for all temporal needs.
* @return this
*/
public SdkTracerProviderBuilder setClock(Clock clock) {
Objects.requireNonNull(clock, "clock");
this.clock = clock;
return this;
}
/**
* Assign an {@link IdGenerator}.
*
* @param idGenerator A generator for trace and span ids. Note: this should be thread-safe and as
* contention free as possible.
* @return this
*/
public SdkTracerProviderBuilder setIdGenerator(IdGenerator idGenerator) {
Objects.requireNonNull(idGenerator, "idGenerator");
this.idsGenerator = idGenerator;
return this;
}
/**
* Assign a {@link Resource} to be attached to all Spans created by Tracers.
*
* @param resource A Resource implementation.
* @return this
*/
public SdkTracerProviderBuilder setResource(Resource resource) {
Objects.requireNonNull(resource, "resource");
this.resource = resource;
return this;
}
/**
* Assign an initial {@link TraceConfig} that should be used with this SDK.
*
* @return this
*/
public SdkTracerProviderBuilder setTraceConfig(TraceConfig traceConfig) {
this.traceConfig = traceConfig;
Objects.requireNonNull(traceConfig);
return this;
}
/**
* Create a new TraceSdkProvider instance.
*
* @return An initialized TraceSdkProvider.
*/
public SdkTracerProvider build() {
return new SdkTracerProvider(clock, idsGenerator, resource, traceConfig);
}
SdkTracerProviderBuilder() {}
}