Customizer for SdkTracerProviderBuilder (#4004)

This commit is contained in:
Roberto Cortez 2022-01-08 02:18:38 +00:00 committed by GitHub
parent 03e0ad0660
commit 07a2d2eb28
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 61 additions and 10 deletions

View File

@ -1,2 +1,4 @@
Comparing source compatibility of against
No changes.
***! MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer (not serializable)
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
+++! NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.autoconfigure.spi.AutoConfigurationCustomizer addTracerProviderCustomizer(java.util.function.BiFunction)

View File

@ -7,6 +7,7 @@ package io.opentelemetry.sdk.autoconfigure.spi;
import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
import io.opentelemetry.sdk.trace.export.SpanExporter;
import io.opentelemetry.sdk.trace.samplers.Sampler;
import java.util.Map;
@ -66,4 +67,16 @@ public interface AutoConfigurationCustomizer {
*/
AutoConfigurationCustomizer addPropertiesSupplier(
Supplier<Map<String, String>> propertiesSupplier);
/**
* Adds a {@link BiFunction} to invoke the with the {@link SdkTracerProviderBuilder} to allow
* customization. The return value of the {@link BiFunction} will replace the passed-in argument.
*
* <p>Multiple calls will execute the customizers in order.
*/
default AutoConfigurationCustomizer addTracerProviderCustomizer(
BiFunction<SdkTracerProviderBuilder, ConfigProperties, SdkTracerProviderBuilder>
tracerProviderCustomizer) {
return this;
}
}

View File

@ -20,6 +20,7 @@ import io.opentelemetry.sdk.logs.SdkLogEmitterProvider;
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
import io.opentelemetry.sdk.trace.export.SpanExporter;
import io.opentelemetry.sdk.trace.samplers.Sampler;
import java.util.Collections;
@ -44,6 +45,8 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
@Nullable private ConfigProperties config;
private BiFunction<SdkTracerProviderBuilder, ConfigProperties, SdkTracerProviderBuilder>
tracerProviderCustomizer = (a, unused) -> a;
private BiFunction<? super TextMapPropagator, ConfigProperties, ? extends TextMapPropagator>
propagatorCustomizer = (a, unused) -> a;
private BiFunction<? super SpanExporter, ConfigProperties, ? extends SpanExporter>
@ -74,6 +77,22 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
return this;
}
/**
* Adds a {@link BiFunction} to invoke the with the {@link SdkTracerProviderBuilder} to allow
* customization. The return value of the {@link BiFunction} will replace the passed-in argument.
*
* <p>Multiple calls will execute the customizers in order.
*/
@Override
public AutoConfiguredOpenTelemetrySdkBuilder addTracerProviderCustomizer(
BiFunction<SdkTracerProviderBuilder, ConfigProperties, SdkTracerProviderBuilder>
tracerProviderCustomizer) {
requireNonNull(tracerProviderCustomizer, "tracerProviderCustomizer");
this.tracerProviderCustomizer =
mergeCustomizer(this.tracerProviderCustomizer, tracerProviderCustomizer);
return this;
}
/**
* Adds a {@link BiFunction} to invoke with the default autoconfigured {@link TextMapPropagator}
* to allow customization. The return value of the {@link BiFunction} will replace the passed-in
@ -181,16 +200,20 @@ public final class AutoConfiguredOpenTelemetrySdkBuilder implements AutoConfigur
}
}
SdkTracerProviderBuilder tracerProviderBuilder = SdkTracerProvider.builder();
ConfigProperties config = getConfig();
tracerProviderBuilder = tracerProviderCustomizer.apply(tracerProviderBuilder, config);
Resource resource =
ResourceConfiguration.configureResource(config, serviceClassLoader, resourceCustomizer);
tracerProviderBuilder.setResource(resource);
MeterProvider meterProvider =
MeterProviderConfiguration.configureMeterProvider(resource, config, serviceClassLoader);
SdkTracerProvider tracerProvider =
TracerProviderConfiguration.configureTracerProvider(
resource,
tracerProviderBuilder,
config,
serviceClassLoader,
meterProvider,

View File

@ -10,7 +10,6 @@ import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties;
import io.opentelemetry.sdk.autoconfigure.spi.ConfigurationException;
import io.opentelemetry.sdk.autoconfigure.spi.traces.ConfigurableSamplerProvider;
import io.opentelemetry.sdk.autoconfigure.spi.traces.SdkTracerProviderConfigurer;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.SdkTracerProviderBuilder;
import io.opentelemetry.sdk.trace.SpanLimits;
@ -33,17 +32,15 @@ import java.util.function.BiFunction;
final class TracerProviderConfiguration {
static SdkTracerProvider configureTracerProvider(
Resource resource,
SdkTracerProviderBuilder tracerProviderBuilder,
ConfigProperties config,
ClassLoader serviceClassLoader,
MeterProvider meterProvider,
BiFunction<? super SpanExporter, ConfigProperties, ? extends SpanExporter>
spanExporterCustomizer,
BiFunction<? super Sampler, ConfigProperties, ? extends Sampler> samplerCustomizer) {
SdkTracerProviderBuilder tracerProviderBuilder =
SdkTracerProvider.builder()
.setResource(resource)
.setSpanLimits(configureSpanLimits(config));
tracerProviderBuilder.setSpanLimits(configureSpanLimits(config));
String sampler = config.getString("otel.traces.sampler");
if (sampler == null) {

View File

@ -12,6 +12,9 @@ import static org.mockito.Mockito.when;
import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.OpenTelemetry;
import io.opentelemetry.api.trace.Span;
import io.opentelemetry.api.trace.SpanId;
import io.opentelemetry.api.trace.TraceId;
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
import io.opentelemetry.context.Context;
import io.opentelemetry.context.ContextKey;
@ -20,6 +23,7 @@ import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.common.CompletableResultCode;
import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.IdGenerator;
import io.opentelemetry.sdk.trace.export.SpanExporter;
import io.opentelemetry.sdk.trace.samplers.Sampler;
import io.opentelemetry.sdk.trace.samplers.SamplingResult;
@ -38,6 +42,7 @@ class AutoConfiguredOpenTelemetrySdkTest {
private static final ContextKey<String> CONTEXT_KEY = ContextKey.named("animal");
@Mock private IdGenerator idGenerator;
@Mock private TextMapPropagator propagator1;
@Mock private TextMapPropagator propagator2;
@Mock private TextMapGetter<Map<String, String>> getter;
@ -54,6 +59,10 @@ class AutoConfiguredOpenTelemetrySdkTest {
@Test
void customize() {
Context extracted = Context.root().with(CONTEXT_KEY, "bear");
when(idGenerator.generateTraceId()).thenReturn(TraceId.fromLongs(9999999999L, 9999999999L));
when(idGenerator.generateSpanId()).thenReturn(SpanId.fromLong(9999999999L));
when(propagator2.extract(any(), any(), any())).thenReturn(extracted);
when(sampler2.shouldSample(any(), any(), any(), any(), any(), any()))
@ -65,6 +74,9 @@ class AutoConfiguredOpenTelemetrySdkTest {
AutoConfiguredOpenTelemetrySdkBuilder autoConfiguration =
AutoConfiguredOpenTelemetrySdk.builder()
.addTracerProviderCustomizer(
(tracerProviderBuilder, config) ->
tracerProviderBuilder.setIdGenerator(idGenerator))
.addPropagatorCustomizer(
(previous, config) -> {
assertThat(previous).isSameAs(W3CTraceContextPropagator.getInstance());
@ -129,7 +141,11 @@ class AutoConfiguredOpenTelemetrySdkTest {
.extract(Context.root(), Collections.emptyMap(), getter))
.isEqualTo(extracted);
sdk.getTracerProvider().get("test").spanBuilder("test").startSpan().end();
Span span = sdk.getTracerProvider().get("test").spanBuilder("test").startSpan();
assertThat(span.getSpanContext().getSpanId()).isEqualTo(SpanId.fromLong(9999999999L));
assertThat(span.getSpanContext().getTraceId())
.isEqualTo(TraceId.fromLongs(9999999999L, 9999999999L));
span.end();
// Ensures the export happened.
sdk.getSdkTracerProvider().shutdown().join(10, TimeUnit.SECONDS);

View File

@ -63,7 +63,7 @@ class TracerProviderConfigurationTest {
// are verified in other test sets like testFullConfig.
SdkTracerProvider tracerProvider =
TracerProviderConfiguration.configureTracerProvider(
resource,
SdkTracerProvider.builder().setResource(resource),
DefaultConfigProperties.createForTest(properties),
TracerProviderConfiguration.class.getClassLoader(),
MeterProvider.noop(),