Allow registering TraceConfigSupplier and use it from zpages. (#2390)

* Allow registering TraceConfigSupplier and use it from zpages.

* Finish

* Remove unnecessary method

* Same method name
This commit is contained in:
Anuraag Agrawal 2020-12-23 11:52:17 +09:00 committed by GitHub
parent 202d782f9c
commit d48eab6aa9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 158 additions and 138 deletions

View File

@ -131,6 +131,9 @@ subprojects {
it.options.errorprone.disable("JdkObsolete") it.options.errorprone.disable("JdkObsolete")
it.options.errorprone.disable("UnnecessaryAnonymousClass") it.options.errorprone.disable("UnnecessaryAnonymousClass")
// Limits APIs
it.options.errorprone.disable("NoFunctionalReturnType")
it.options.compilerArgs += ["-Werror"] it.options.compilerArgs += ["-Werror"]
} }

View File

@ -5,7 +5,6 @@
package io.opentelemetry.sdk.extension.zpages; package io.opentelemetry.sdk.extension.zpages;
import io.opentelemetry.sdk.trace.SdkTracerManagement;
import io.opentelemetry.sdk.trace.config.TraceConfig; import io.opentelemetry.sdk.trace.config.TraceConfig;
import io.opentelemetry.sdk.trace.config.TraceConfigBuilder; import io.opentelemetry.sdk.trace.config.TraceConfigBuilder;
import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.sdk.trace.samplers.Sampler;
@ -35,10 +34,10 @@ final class TraceConfigzZPageHandler extends ZPageHandler {
// Background color used for zebra striping rows in table // Background color used for zebra striping rows in table
private static final String ZEBRA_STRIPE_COLOR = "#e6e6e6"; private static final String ZEBRA_STRIPE_COLOR = "#e6e6e6";
private static final Logger logger = Logger.getLogger(TraceConfigzZPageHandler.class.getName()); private static final Logger logger = Logger.getLogger(TraceConfigzZPageHandler.class.getName());
private final SdkTracerManagement sdkTracerManagement; private final TracezTraceConfigSupplier configSupplier;
TraceConfigzZPageHandler(SdkTracerManagement sdkTracerManagement) { TraceConfigzZPageHandler(TracezTraceConfigSupplier configSupplier) {
this.sdkTracerManagement = sdkTracerManagement; this.configSupplier = configSupplier;
} }
@Override @Override
@ -211,45 +210,37 @@ final class TraceConfigzZPageHandler extends ZPageHandler {
emitActiveTableRow( emitActiveTableRow(
/* out= */ out, /* out= */ out,
/* paramName= */ "Sampler", /* paramName= */ "Sampler",
/* paramValue=*/ this.sdkTracerManagement /* paramValue=*/ configSupplier.get().getSampler().getDescription(),
.getActiveTraceConfig()
.getSampler()
.getDescription(),
/* zebraStripeColor= */ ZEBRA_STRIPE_COLOR, /* zebraStripeColor= */ ZEBRA_STRIPE_COLOR,
/* zebraStripe= */ false); /* zebraStripe= */ false);
emitActiveTableRow( emitActiveTableRow(
/* out= */ out, /* out= */ out,
/* paramName= */ "MaxNumOfAttributes", /* paramName= */ "MaxNumOfAttributes",
/* paramValue=*/ Integer.toString( /* paramValue=*/ Integer.toString(configSupplier.get().getMaxNumberOfAttributes()),
this.sdkTracerManagement.getActiveTraceConfig().getMaxNumberOfAttributes()),
/* zebraStripeColor= */ ZEBRA_STRIPE_COLOR, /* zebraStripeColor= */ ZEBRA_STRIPE_COLOR,
/* zebraStripe= */ true); /* zebraStripe= */ true);
emitActiveTableRow( emitActiveTableRow(
/* out= */ out, /* out= */ out,
/* paramName= */ "MaxNumOfEvents", /* paramName= */ "MaxNumOfEvents",
/* paramValue=*/ Integer.toString( /* paramValue=*/ Integer.toString(configSupplier.get().getMaxNumberOfEvents()),
this.sdkTracerManagement.getActiveTraceConfig().getMaxNumberOfEvents()),
/* zebraStripeColor= */ ZEBRA_STRIPE_COLOR, /* zebraStripeColor= */ ZEBRA_STRIPE_COLOR,
/* zebraStripe= */ false); /* zebraStripe= */ false);
emitActiveTableRow( emitActiveTableRow(
/* out= */ out, /* out= */ out,
/* paramName= */ "MaxNumOfLinks", /* paramName= */ "MaxNumOfLinks",
/* paramValue=*/ Integer.toString( /* paramValue=*/ Integer.toString(configSupplier.get().getMaxNumberOfLinks()),
this.sdkTracerManagement.getActiveTraceConfig().getMaxNumberOfLinks()),
/* zebraStripeColor= */ ZEBRA_STRIPE_COLOR, /* zebraStripeColor= */ ZEBRA_STRIPE_COLOR,
/* zebraStripe= */ true); /* zebraStripe= */ true);
emitActiveTableRow( emitActiveTableRow(
/* out= */ out, /* out= */ out,
/* paramName= */ "MaxNumOfAttributesPerEvent", /* paramName= */ "MaxNumOfAttributesPerEvent",
/* paramValue=*/ Integer.toString( /* paramValue=*/ Integer.toString(configSupplier.get().getMaxNumberOfAttributesPerEvent()),
this.sdkTracerManagement.getActiveTraceConfig().getMaxNumberOfAttributesPerEvent()),
/* zebraStripeColor= */ ZEBRA_STRIPE_COLOR, /* zebraStripeColor= */ ZEBRA_STRIPE_COLOR,
/* zebraStripe= */ false); /* zebraStripe= */ false);
emitActiveTableRow( emitActiveTableRow(
/* out= */ out, /* out= */ out,
/* paramName= */ "MaxNumOfAttributesPerLink", /* paramName= */ "MaxNumOfAttributesPerLink",
/* paramValue=*/ Integer.toString( /* paramValue=*/ Integer.toString(configSupplier.get().getMaxNumberOfAttributesPerLink()),
this.sdkTracerManagement.getActiveTraceConfig().getMaxNumberOfAttributesPerLink()),
/* zebraStripeColor= */ ZEBRA_STRIPE_COLOR, /* zebraStripeColor= */ ZEBRA_STRIPE_COLOR,
/* zebraStripe=*/ true); /* zebraStripe=*/ true);
out.print("</table>"); out.print("</table>");
@ -369,8 +360,7 @@ final class TraceConfigzZPageHandler extends ZPageHandler {
return; return;
} }
if (action.equals(QUERY_STRING_ACTION_CHANGE)) { if (action.equals(QUERY_STRING_ACTION_CHANGE)) {
TraceConfigBuilder newConfigBuilder = TraceConfigBuilder newConfigBuilder = configSupplier.get().toBuilder();
this.sdkTracerManagement.getActiveTraceConfig().toBuilder();
String samplingProbabilityStr = queryMap.get(QUERY_STRING_SAMPLING_PROBABILITY); String samplingProbabilityStr = queryMap.get(QUERY_STRING_SAMPLING_PROBABILITY);
if (samplingProbabilityStr != null) { if (samplingProbabilityStr != null) {
try { try {
@ -435,10 +425,10 @@ final class TraceConfigzZPageHandler extends ZPageHandler {
"MaxNumOfAttributesPerLink must be of the type integer", e); "MaxNumOfAttributesPerLink must be of the type integer", e);
} }
} }
this.sdkTracerManagement.updateActiveTraceConfig(newConfigBuilder.build()); configSupplier.setActiveTraceConfig(newConfigBuilder.build());
} else if (action.equals(QUERY_STRING_ACTION_DEFAULT)) { } else if (action.equals(QUERY_STRING_ACTION_DEFAULT)) {
TraceConfig defaultConfig = TraceConfig.getDefault().toBuilder().build(); TraceConfig defaultConfig = TraceConfig.getDefault().toBuilder().build();
this.sdkTracerManagement.updateActiveTraceConfig(defaultConfig); configSupplier.setActiveTraceConfig(defaultConfig);
} }
} }
} }

View File

@ -0,0 +1,27 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.sdk.extension.zpages;
import io.opentelemetry.sdk.trace.config.TraceConfig;
import java.util.function.Supplier;
final class TracezTraceConfigSupplier implements Supplier<TraceConfig> {
private volatile TraceConfig activeTraceConfig;
TracezTraceConfigSupplier() {
activeTraceConfig = TraceConfig.getDefault();
}
@Override
public TraceConfig get() {
return activeTraceConfig;
}
void setActiveTraceConfig(TraceConfig traceConfig) {
activeTraceConfig = traceConfig;
}
}

View File

@ -6,19 +6,20 @@
package io.opentelemetry.sdk.extension.zpages; package io.opentelemetry.sdk.extension.zpages;
import com.sun.net.httpserver.HttpServer; import com.sun.net.httpserver.HttpServer;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SdkTracerManagement;
import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.sdk.trace.SpanProcessor;
import io.opentelemetry.sdk.trace.config.TraceConfig;
import java.io.IOException; import java.io.IOException;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.Arrays; import java.util.Arrays;
import java.util.function.Supplier;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.GuardedBy;
import javax.annotation.concurrent.ThreadSafe; import javax.annotation.concurrent.ThreadSafe;
/** /**
* A collection of HTML pages to display stats and trace data and allow library configuration * A collection of HTML pages to display stats and trace data and allow library configuration
* control. To use, add {@linkplain ZPageServer#getSpanProcessor() the z-pages span processor} to a * control. To use, add {@linkplain ZPageServer#getSpanProcessor() the z-pages span processor} and
* {@linkplain ZPageServer#getTracezTraceConfigSupplier() the z-pages dynamic trace config} to a
* {@link io.opentelemetry.sdk.trace.SdkTracerProviderBuilder}. Currently all tracers can only be * {@link io.opentelemetry.sdk.trace.SdkTracerProviderBuilder}. Currently all tracers can only be
* made visible to a singleton {@link ZPageServer}. * made visible to a singleton {@link ZPageServer}.
* *
@ -30,6 +31,7 @@ import javax.annotation.concurrent.ThreadSafe;
* OpenTelemetry openTelemetry = OpenTelemetrySdk.builder() * OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
* .setTracerProvider(SdkTracerProvider.builder() * .setTracerProvider(SdkTracerProvider.builder()
* .addSpanProcessor(ZPageServer.getSpanProcessor()) * .addSpanProcessor(ZPageServer.getSpanProcessor())
* .setTraceConfigSupplier(ZPageServer.getTraceConfigSupplier())
* .build(); * .build();
* .build(); * .build();
* *
@ -47,6 +49,7 @@ import javax.annotation.concurrent.ThreadSafe;
* OpenTelemetry openTelemetry = OpenTelemetrySdk.builder() * OpenTelemetry openTelemetry = OpenTelemetrySdk.builder()
* .setTracerProvider(SdkTracerProvider.builder() * .setTracerProvider(SdkTracerProvider.builder()
* .addSpanProcessor(ZPageServer.getSpanProcessor()) * .addSpanProcessor(ZPageServer.getSpanProcessor())
* .setTraceConfigSupplier(ZPageServer.getTraceConfigSupplier())
* .build(); * .build();
* .build(); * .build();
* *
@ -67,16 +70,16 @@ public final class ZPageServer {
// Tracez SpanProcessor and DataAggregator for constructing TracezZPageHandler // Tracez SpanProcessor and DataAggregator for constructing TracezZPageHandler
private static final TracezSpanProcessor tracezSpanProcessor = private static final TracezSpanProcessor tracezSpanProcessor =
TracezSpanProcessor.builder().build(); TracezSpanProcessor.builder().build();
private static final TracezTraceConfigSupplier tracezTraceConfigSupplier =
new TracezTraceConfigSupplier();
private static final TracezDataAggregator tracezDataAggregator = private static final TracezDataAggregator tracezDataAggregator =
new TracezDataAggregator(tracezSpanProcessor); new TracezDataAggregator(tracezSpanProcessor);
private static final SdkTracerManagement TRACER_SDK_MANAGEMENT =
OpenTelemetrySdk.getGlobalTracerManagement();
// Handler for /tracez page // Handler for /tracez page
private static final ZPageHandler tracezZPageHandler = private static final ZPageHandler tracezZPageHandler =
new TracezZPageHandler(tracezDataAggregator); new TracezZPageHandler(tracezDataAggregator);
// Handler for /traceconfigz page // Handler for /traceconfigz page
private static final ZPageHandler traceConfigzZPageHandler = private static final ZPageHandler traceConfigzZPageHandler =
new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); new TraceConfigzZPageHandler(tracezTraceConfigSupplier);
// Handler for index page, **please include all available ZPageHandlers in the constructor** // Handler for index page, **please include all available ZPageHandlers in the constructor**
private static final ZPageHandler indexZPageHandler = private static final ZPageHandler indexZPageHandler =
new IndexZPageHandler(Arrays.asList(tracezZPageHandler, traceConfigzZPageHandler)); new IndexZPageHandler(Arrays.asList(tracezZPageHandler, traceConfigzZPageHandler));
@ -87,6 +90,11 @@ public final class ZPageServer {
@Nullable @Nullable
private static HttpServer server; private static HttpServer server;
/** Returns a supplier of {@link TraceConfig} which can be reconfigured using zpages. */
public static Supplier<TraceConfig> getTracezTraceConfigSupplier() {
return tracezTraceConfigSupplier;
}
/** /**
* Returns a {@link SpanProcessor} which will allow processing of spans by {@link ZPageServer}. * Returns a {@link SpanProcessor} which will allow processing of spans by {@link ZPageServer}.
*/ */

View File

@ -8,8 +8,6 @@ package io.opentelemetry.sdk.extension.zpages;
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SdkTracerManagement;
import io.opentelemetry.sdk.trace.config.TraceConfig; import io.opentelemetry.sdk.trace.config.TraceConfig;
import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.sdk.trace.samplers.Sampler;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
@ -18,35 +16,14 @@ import java.util.Map;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
/** Unit tests for {@link TraceConfigzZPageHandler}. */ class TraceConfigzZPageHandlerTest {
public final class TraceConfigzZPageHandlerTest {
private static final SdkTracerManagement TRACER_SDK_MANAGEMENT =
OpenTelemetrySdk.getGlobalTracerManagement();
private static final Map<String, String> emptyQueryMap = ImmutableMap.of(); private static final Map<String, String> emptyQueryMap = ImmutableMap.of();
private TracezTraceConfigSupplier configSupplier;
@BeforeEach @BeforeEach
void setup() { void setup() {
// Restore default config configSupplier = new TracezTraceConfigSupplier();
OutputStream output = new ByteArrayOutputStream();
Map<String, String> queryMap = ImmutableMap.of("action", "default");
TraceConfigzZPageHandler traceConfigzZPageHandler =
new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT);
traceConfigzZPageHandler.processRequest("POST", queryMap, output);
traceConfigzZPageHandler.emitHtml(queryMap, output);
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getSampler().getDescription())
.isEqualTo(TraceConfig.getDefault().getSampler().getDescription());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributes())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributes());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfEvents())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfEvents());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfLinks())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfLinks());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerEvent())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerEvent());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerLink())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerLink());
} }
@Test @Test
@ -60,7 +37,7 @@ public final class TraceConfigzZPageHandlerTest {
String queryMaxNumOfAttributesPerLink = "maxnumofattributesperlink"; String queryMaxNumOfAttributesPerLink = "maxnumofattributesperlink";
TraceConfigzZPageHandler traceConfigzZPageHandler = TraceConfigzZPageHandler traceConfigzZPageHandler =
new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); new TraceConfigzZPageHandler(configSupplier);
traceConfigzZPageHandler.emitHtml(emptyQueryMap, output); traceConfigzZPageHandler.emitHtml(emptyQueryMap, output);
assertThat(output.toString()).contains("SamplingProbability to"); assertThat(output.toString()).contains("SamplingProbability to");
@ -101,48 +78,29 @@ public final class TraceConfigzZPageHandlerTest {
OutputStream output = new ByteArrayOutputStream(); OutputStream output = new ByteArrayOutputStream();
TraceConfigzZPageHandler traceConfigzZPageHandler = TraceConfigzZPageHandler traceConfigzZPageHandler =
new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); new TraceConfigzZPageHandler(configSupplier);
traceConfigzZPageHandler.emitHtml(emptyQueryMap, output); traceConfigzZPageHandler.emitHtml(emptyQueryMap, output);
assertThat(output.toString()).contains("Sampler"); assertThat(output.toString()).contains("Sampler");
assertThat(output.toString()) assertThat(output.toString())
.contains( .contains(">" + configSupplier.get().getSampler().getDescription() + "<");
">" + TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getSampler().getDescription() + "<");
assertThat(output.toString()).contains("MaxNumberOfAttributes"); assertThat(output.toString()).contains("MaxNumberOfAttributes");
assertThat(output.toString()) assertThat(output.toString())
.contains( .contains(">" + Integer.toString(configSupplier.get().getMaxNumberOfAttributes()) + "<");
">"
+ Integer.toString(
TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributes())
+ "<");
assertThat(output.toString()).contains("MaxNumberOfEvents"); assertThat(output.toString()).contains("MaxNumberOfEvents");
assertThat(output.toString()) assertThat(output.toString())
.contains( .contains(">" + Integer.toString(configSupplier.get().getMaxNumberOfEvents()) + "<");
">"
+ Integer.toString(
TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfEvents())
+ "<");
assertThat(output.toString()).contains("MaxNumberOfLinks"); assertThat(output.toString()).contains("MaxNumberOfLinks");
assertThat(output.toString()) assertThat(output.toString())
.contains( .contains(">" + Integer.toString(configSupplier.get().getMaxNumberOfLinks()) + "<");
">"
+ Integer.toString(
TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfLinks())
+ "<");
assertThat(output.toString()).contains("MaxNumberOfAttributesPerEvent"); assertThat(output.toString()).contains("MaxNumberOfAttributesPerEvent");
assertThat(output.toString()) assertThat(output.toString())
.contains( .contains(
">" ">" + Integer.toString(configSupplier.get().getMaxNumberOfAttributesPerEvent()) + "<");
+ Integer.toString(
TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerEvent())
+ "<");
assertThat(output.toString()).contains("MaxNumberOfAttributesPerLink"); assertThat(output.toString()).contains("MaxNumberOfAttributesPerLink");
assertThat(output.toString()) assertThat(output.toString())
.contains( .contains(
">" ">" + Integer.toString(configSupplier.get().getMaxNumberOfAttributesPerLink()) + "<");
+ Integer.toString(
TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerLink())
+ "<");
} }
@Test @Test
@ -173,22 +131,22 @@ public final class TraceConfigzZPageHandlerTest {
.build(); .build();
TraceConfigzZPageHandler traceConfigzZPageHandler = TraceConfigzZPageHandler traceConfigzZPageHandler =
new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); new TraceConfigzZPageHandler(configSupplier);
traceConfigzZPageHandler.processRequest("POST", queryMap, output); traceConfigzZPageHandler.processRequest("POST", queryMap, output);
traceConfigzZPageHandler.emitHtml(queryMap, output); traceConfigzZPageHandler.emitHtml(queryMap, output);
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getSampler().getDescription()) assertThat(configSupplier.get().getSampler().getDescription())
.isEqualTo( .isEqualTo(
Sampler.traceIdRatioBased(Double.parseDouble(newSamplingProbability)).getDescription()); Sampler.traceIdRatioBased(Double.parseDouble(newSamplingProbability)).getDescription());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributes()) assertThat(configSupplier.get().getMaxNumberOfAttributes())
.isEqualTo(Integer.parseInt(newMaxNumOfAttributes)); .isEqualTo(Integer.parseInt(newMaxNumOfAttributes));
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfEvents()) assertThat(configSupplier.get().getMaxNumberOfEvents())
.isEqualTo(Integer.parseInt(newMaxNumOfEvents)); .isEqualTo(Integer.parseInt(newMaxNumOfEvents));
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfLinks()) assertThat(configSupplier.get().getMaxNumberOfLinks())
.isEqualTo(Integer.parseInt(newMaxNumOfLinks)); .isEqualTo(Integer.parseInt(newMaxNumOfLinks));
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerEvent()) assertThat(configSupplier.get().getMaxNumberOfAttributesPerEvent())
.isEqualTo(Integer.parseInt(newMaxNumOfAttributesPerEvent)); .isEqualTo(Integer.parseInt(newMaxNumOfAttributesPerEvent));
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerLink()) assertThat(configSupplier.get().getMaxNumberOfAttributesPerLink())
.isEqualTo(Integer.parseInt(newMaxNumOfAttributesPerLink)); .isEqualTo(Integer.parseInt(newMaxNumOfAttributesPerLink));
} }
@ -199,21 +157,21 @@ public final class TraceConfigzZPageHandlerTest {
Map<String, String> queryMap = ImmutableMap.of("action", "default"); Map<String, String> queryMap = ImmutableMap.of("action", "default");
TraceConfigzZPageHandler traceConfigzZPageHandler = TraceConfigzZPageHandler traceConfigzZPageHandler =
new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); new TraceConfigzZPageHandler(configSupplier);
traceConfigzZPageHandler.processRequest("POST", queryMap, output); traceConfigzZPageHandler.processRequest("POST", queryMap, output);
traceConfigzZPageHandler.emitHtml(queryMap, output); traceConfigzZPageHandler.emitHtml(queryMap, output);
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getSampler().getDescription()) assertThat(configSupplier.get().getSampler().getDescription())
.isEqualTo(TraceConfig.getDefault().getSampler().getDescription()); .isEqualTo(TraceConfig.getDefault().getSampler().getDescription());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributes()) assertThat(configSupplier.get().getMaxNumberOfAttributes())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributes()); .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributes());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfEvents()) assertThat(configSupplier.get().getMaxNumberOfEvents())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfEvents()); .isEqualTo(TraceConfig.getDefault().getMaxNumberOfEvents());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfLinks()) assertThat(configSupplier.get().getMaxNumberOfLinks())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfLinks()); .isEqualTo(TraceConfig.getDefault().getMaxNumberOfLinks());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerEvent()) assertThat(configSupplier.get().getMaxNumberOfAttributesPerEvent())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerEvent()); .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerEvent());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerLink()) assertThat(configSupplier.get().getMaxNumberOfAttributesPerLink())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerLink()); .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerLink());
} }
@ -224,21 +182,21 @@ public final class TraceConfigzZPageHandlerTest {
Map<String, String> queryMap = ImmutableMap.of("action", "change"); Map<String, String> queryMap = ImmutableMap.of("action", "change");
TraceConfigzZPageHandler traceConfigzZPageHandler = TraceConfigzZPageHandler traceConfigzZPageHandler =
new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); new TraceConfigzZPageHandler(configSupplier);
traceConfigzZPageHandler.processRequest("POST", queryMap, output); traceConfigzZPageHandler.processRequest("POST", queryMap, output);
traceConfigzZPageHandler.emitHtml(queryMap, output); traceConfigzZPageHandler.emitHtml(queryMap, output);
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getSampler().getDescription()) assertThat(configSupplier.get().getSampler().getDescription())
.isEqualTo(TraceConfig.getDefault().getSampler().getDescription()); .isEqualTo(TraceConfig.getDefault().getSampler().getDescription());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributes()) assertThat(configSupplier.get().getMaxNumberOfAttributes())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributes()); .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributes());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfEvents()) assertThat(configSupplier.get().getMaxNumberOfEvents())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfEvents()); .isEqualTo(TraceConfig.getDefault().getMaxNumberOfEvents());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfLinks()) assertThat(configSupplier.get().getMaxNumberOfLinks())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfLinks()); .isEqualTo(TraceConfig.getDefault().getMaxNumberOfLinks());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerEvent()) assertThat(configSupplier.get().getMaxNumberOfAttributesPerEvent())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerEvent()); .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerEvent());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerLink()) assertThat(configSupplier.get().getMaxNumberOfAttributesPerLink())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerLink()); .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerLink());
} }
@ -247,7 +205,7 @@ public final class TraceConfigzZPageHandlerTest {
// Invalid samplingProbability (not type of double) // Invalid samplingProbability (not type of double)
OutputStream output = new ByteArrayOutputStream(); OutputStream output = new ByteArrayOutputStream();
TraceConfigzZPageHandler traceConfigzZPageHandler = TraceConfigzZPageHandler traceConfigzZPageHandler =
new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); new TraceConfigzZPageHandler(configSupplier);
Map<String, String> queryMap = Map<String, String> queryMap =
ImmutableMap.of("action", "change", "samplingprobability", "invalid"); ImmutableMap.of("action", "change", "samplingprobability", "invalid");
@ -258,7 +216,7 @@ public final class TraceConfigzZPageHandlerTest {
// Invalid samplingProbability (< 0) // Invalid samplingProbability (< 0)
output = new ByteArrayOutputStream(); output = new ByteArrayOutputStream();
traceConfigzZPageHandler = new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); traceConfigzZPageHandler = new TraceConfigzZPageHandler(configSupplier);
queryMap = ImmutableMap.of("action", "change", "samplingprobability", "-1"); queryMap = ImmutableMap.of("action", "change", "samplingprobability", "-1");
traceConfigzZPageHandler.processRequest("POST", queryMap, output); traceConfigzZPageHandler.processRequest("POST", queryMap, output);
@ -268,7 +226,7 @@ public final class TraceConfigzZPageHandlerTest {
// Invalid samplingProbability (> 1) // Invalid samplingProbability (> 1)
output = new ByteArrayOutputStream(); output = new ByteArrayOutputStream();
traceConfigzZPageHandler = new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); traceConfigzZPageHandler = new TraceConfigzZPageHandler(configSupplier);
queryMap = ImmutableMap.of("action", "change", "samplingprobability", "1.1"); queryMap = ImmutableMap.of("action", "change", "samplingprobability", "1.1");
traceConfigzZPageHandler.processRequest("POST", queryMap, output); traceConfigzZPageHandler.processRequest("POST", queryMap, output);
@ -278,7 +236,7 @@ public final class TraceConfigzZPageHandlerTest {
// Invalid maxNumOfAttributes // Invalid maxNumOfAttributes
output = new ByteArrayOutputStream(); output = new ByteArrayOutputStream();
traceConfigzZPageHandler = new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); traceConfigzZPageHandler = new TraceConfigzZPageHandler(configSupplier);
queryMap = ImmutableMap.of("action", "change", "maxnumofattributes", "invalid"); queryMap = ImmutableMap.of("action", "change", "maxnumofattributes", "invalid");
traceConfigzZPageHandler.processRequest("POST", queryMap, output); traceConfigzZPageHandler.processRequest("POST", queryMap, output);
@ -288,7 +246,7 @@ public final class TraceConfigzZPageHandlerTest {
// Invalid maxNumOfEvents // Invalid maxNumOfEvents
output = new ByteArrayOutputStream(); output = new ByteArrayOutputStream();
traceConfigzZPageHandler = new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); traceConfigzZPageHandler = new TraceConfigzZPageHandler(configSupplier);
queryMap = ImmutableMap.of("action", "change", "maxnumofevents", "invalid"); queryMap = ImmutableMap.of("action", "change", "maxnumofevents", "invalid");
traceConfigzZPageHandler.processRequest("POST", queryMap, output); traceConfigzZPageHandler.processRequest("POST", queryMap, output);
@ -298,7 +256,7 @@ public final class TraceConfigzZPageHandlerTest {
// Invalid maxNumLinks // Invalid maxNumLinks
output = new ByteArrayOutputStream(); output = new ByteArrayOutputStream();
traceConfigzZPageHandler = new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); traceConfigzZPageHandler = new TraceConfigzZPageHandler(configSupplier);
queryMap = ImmutableMap.of("action", "change", "maxnumoflinks", "invalid"); queryMap = ImmutableMap.of("action", "change", "maxnumoflinks", "invalid");
traceConfigzZPageHandler.processRequest("POST", queryMap, output); traceConfigzZPageHandler.processRequest("POST", queryMap, output);
@ -308,7 +266,7 @@ public final class TraceConfigzZPageHandlerTest {
// Invalid maxNumOfAttributesPerEvent // Invalid maxNumOfAttributesPerEvent
output = new ByteArrayOutputStream(); output = new ByteArrayOutputStream();
traceConfigzZPageHandler = new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); traceConfigzZPageHandler = new TraceConfigzZPageHandler(configSupplier);
queryMap = ImmutableMap.of("action", "change", "maxnumofattributesperevent", "invalid"); queryMap = ImmutableMap.of("action", "change", "maxnumofattributesperevent", "invalid");
traceConfigzZPageHandler.processRequest("POST", queryMap, output); traceConfigzZPageHandler.processRequest("POST", queryMap, output);
@ -319,7 +277,7 @@ public final class TraceConfigzZPageHandlerTest {
// Invalid maxNumOfAttributesPerLink // Invalid maxNumOfAttributesPerLink
output = new ByteArrayOutputStream(); output = new ByteArrayOutputStream();
traceConfigzZPageHandler = new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); traceConfigzZPageHandler = new TraceConfigzZPageHandler(configSupplier);
queryMap = ImmutableMap.of("action", "change", "maxnumofattributesperlink", "invalid"); queryMap = ImmutableMap.of("action", "change", "maxnumofattributesperlink", "invalid");
traceConfigzZPageHandler.processRequest("POST", queryMap, output); traceConfigzZPageHandler.processRequest("POST", queryMap, output);
@ -357,40 +315,40 @@ public final class TraceConfigzZPageHandlerTest {
.build(); .build();
TraceConfigzZPageHandler traceConfigzZPageHandler = TraceConfigzZPageHandler traceConfigzZPageHandler =
new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); new TraceConfigzZPageHandler(configSupplier);
// GET request, Should not apply changes // GET request, Should not apply changes
traceConfigzZPageHandler.emitHtml(queryMap, output); traceConfigzZPageHandler.emitHtml(queryMap, output);
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getSampler().getDescription()) assertThat(configSupplier.get().getSampler().getDescription())
.isEqualTo(TraceConfig.getDefault().getSampler().getDescription()); .isEqualTo(TraceConfig.getDefault().getSampler().getDescription());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributes()) assertThat(configSupplier.get().getMaxNumberOfAttributes())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributes()); .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributes());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfEvents()) assertThat(configSupplier.get().getMaxNumberOfEvents())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfEvents()); .isEqualTo(TraceConfig.getDefault().getMaxNumberOfEvents());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfLinks()) assertThat(configSupplier.get().getMaxNumberOfLinks())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfLinks()); .isEqualTo(TraceConfig.getDefault().getMaxNumberOfLinks());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerEvent()) assertThat(configSupplier.get().getMaxNumberOfAttributesPerEvent())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerEvent()); .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerEvent());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerLink()) assertThat(configSupplier.get().getMaxNumberOfAttributesPerLink())
.isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerLink()); .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerLink());
// POST request, Should apply changes // POST request, Should apply changes
traceConfigzZPageHandler.processRequest("POST", queryMap, output); traceConfigzZPageHandler.processRequest("POST", queryMap, output);
traceConfigzZPageHandler.emitHtml(queryMap, output); traceConfigzZPageHandler.emitHtml(queryMap, output);
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getSampler().getDescription()) assertThat(configSupplier.get().getSampler().getDescription())
.isEqualTo( .isEqualTo(
Sampler.traceIdRatioBased(Double.parseDouble(newSamplingProbability)).getDescription()); Sampler.traceIdRatioBased(Double.parseDouble(newSamplingProbability)).getDescription());
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributes()) assertThat(configSupplier.get().getMaxNumberOfAttributes())
.isEqualTo(Integer.parseInt(newMaxNumOfAttributes)); .isEqualTo(Integer.parseInt(newMaxNumOfAttributes));
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfEvents()) assertThat(configSupplier.get().getMaxNumberOfEvents())
.isEqualTo(Integer.parseInt(newMaxNumOfEvents)); .isEqualTo(Integer.parseInt(newMaxNumOfEvents));
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfLinks()) assertThat(configSupplier.get().getMaxNumberOfLinks())
.isEqualTo(Integer.parseInt(newMaxNumOfLinks)); .isEqualTo(Integer.parseInt(newMaxNumOfLinks));
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerEvent()) assertThat(configSupplier.get().getMaxNumberOfAttributesPerEvent())
.isEqualTo(Integer.parseInt(newMaxNumOfAttributesPerEvent)); .isEqualTo(Integer.parseInt(newMaxNumOfAttributesPerEvent));
assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerLink()) assertThat(configSupplier.get().getMaxNumberOfAttributesPerLink())
.isEqualTo(Integer.parseInt(newMaxNumOfAttributesPerLink)); .isEqualTo(Integer.parseInt(newMaxNumOfAttributesPerLink));
} }
} }

View File

@ -15,4 +15,10 @@ class ZPageServerTest {
void spanProcessor() { void spanProcessor() {
assertThat(ZPageServer.getSpanProcessor()).isInstanceOf(TracezSpanProcessor.class); assertThat(ZPageServer.getSpanProcessor()).isInstanceOf(TracezSpanProcessor.class);
} }
@Test
void traceConfigSupplier() {
assertThat(ZPageServer.getTracezTraceConfigSupplier())
.isInstanceOf(TracezTraceConfigSupplier.class);
}
} }

View File

@ -118,15 +118,18 @@ class OpenTelemetrySdkTest {
TracerProvider unobfuscatedTracerProvider = TracerProvider unobfuscatedTracerProvider =
((ObfuscatedTracerProvider) openTelemetry.getTracerProvider()).unobfuscate(); ((ObfuscatedTracerProvider) openTelemetry.getTracerProvider()).unobfuscate();
assertThat(unobfuscatedTracerProvider).isInstanceOf(SdkTracerProvider.class); assertThat(unobfuscatedTracerProvider)
.isInstanceOfSatisfying(
SdkTracerProvider.class,
sdkTracerProvider ->
assertThat(sdkTracerProvider.getActiveTraceConfig()).isEqualTo(traceConfig));
// Since TracerProvider is in a different package, the only alternative to this reflective // Since TracerProvider is in a different package, the only alternative to this reflective
// approach would be to make the fields public for testing which is worse than this. // approach would be to make the fields public for testing which is worse than this.
assertThat(unobfuscatedTracerProvider) assertThat(unobfuscatedTracerProvider)
.extracting("sharedState") .extracting("sharedState")
.hasFieldOrPropertyWithValue("clock", clock) .hasFieldOrPropertyWithValue("clock", clock)
.hasFieldOrPropertyWithValue("resource", resource) .hasFieldOrPropertyWithValue("resource", resource)
.hasFieldOrPropertyWithValue("idGenerator", idGenerator) .hasFieldOrPropertyWithValue("idGenerator", idGenerator);
.hasFieldOrPropertyWithValue("activeTraceConfig", traceConfig);
} }
@Test @Test

View File

@ -14,6 +14,7 @@ import io.opentelemetry.sdk.internal.ComponentRegistry;
import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.config.TraceConfig; import io.opentelemetry.sdk.trace.config.TraceConfig;
import java.util.List; import java.util.List;
import java.util.function.Supplier;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@ -44,10 +45,10 @@ public final class SdkTracerProvider implements TracerProvider, SdkTracerManagem
Clock clock, Clock clock,
IdGenerator idsGenerator, IdGenerator idsGenerator,
Resource resource, Resource resource,
TraceConfig traceConfig, Supplier<TraceConfig> traceConfigSupplier,
List<SpanProcessor> spanProcessors) { List<SpanProcessor> spanProcessors) {
this.sharedState = this.sharedState =
new TracerSharedState(clock, idsGenerator, resource, traceConfig, spanProcessors); new TracerSharedState(clock, idsGenerator, resource, traceConfigSupplier, spanProcessors);
this.tracerSdkComponentRegistry = this.tracerSdkComponentRegistry =
new ComponentRegistry<>( new ComponentRegistry<>(
instrumentationLibraryInfo -> new SdkTracer(sharedState, instrumentationLibraryInfo)); instrumentationLibraryInfo -> new SdkTracer(sharedState, instrumentationLibraryInfo));

View File

@ -13,6 +13,7 @@ import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.config.TraceConfig; import io.opentelemetry.sdk.trace.config.TraceConfig;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Supplier;
/** Builder of {@link SdkTracerProvider}. */ /** Builder of {@link SdkTracerProvider}. */
public final class SdkTracerProviderBuilder { public final class SdkTracerProviderBuilder {
@ -21,7 +22,7 @@ public final class SdkTracerProviderBuilder {
private Clock clock = SystemClock.getInstance(); private Clock clock = SystemClock.getInstance();
private IdGenerator idsGenerator = IdGenerator.random(); private IdGenerator idsGenerator = IdGenerator.random();
private Resource resource = Resource.getDefault(); private Resource resource = Resource.getDefault();
private TraceConfig traceConfig = TraceConfig.getDefault(); private Supplier<TraceConfig> traceConfigSupplier = TraceConfig::getDefault;
/** /**
* Assign a {@link Clock}. * Assign a {@link Clock}.
@ -67,7 +68,19 @@ public final class SdkTracerProviderBuilder {
*/ */
public SdkTracerProviderBuilder setTraceConfig(TraceConfig traceConfig) { public SdkTracerProviderBuilder setTraceConfig(TraceConfig traceConfig) {
requireNonNull(traceConfig, "traceConfig"); requireNonNull(traceConfig, "traceConfig");
this.traceConfig = traceConfig; this.traceConfigSupplier = () -> traceConfig;
return this;
}
/**
* Assign a {@link Supplier} of {@link TraceConfig}. {@link TraceConfig} will be retrieved each
* time a {@link io.opentelemetry.api.trace.Span} is started.
*
* @return this
*/
public SdkTracerProviderBuilder setTraceConfig(Supplier<TraceConfig> traceConfigSupplier) {
requireNonNull(traceConfigSupplier, "traceConfig");
this.traceConfigSupplier = traceConfigSupplier;
return this; return this;
} }
@ -87,7 +100,8 @@ public final class SdkTracerProviderBuilder {
* @return An initialized TraceSdkProvider. * @return An initialized TraceSdkProvider.
*/ */
public SdkTracerProvider build() { public SdkTracerProvider build() {
return new SdkTracerProvider(clock, idsGenerator, resource, traceConfig, spanProcessors); return new SdkTracerProvider(
clock, idsGenerator, resource, traceConfigSupplier, spanProcessors);
} }
SdkTracerProviderBuilder() {} SdkTracerProviderBuilder() {}

View File

@ -11,6 +11,7 @@ import io.opentelemetry.sdk.trace.config.TraceConfig;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.GuardedBy;
// Represents the shared state/config between all Tracers created by the same TracerProvider. // Represents the shared state/config between all Tracers created by the same TracerProvider.
@ -22,7 +23,7 @@ final class TracerSharedState {
// Reads and writes are atomic for reference variables. Use volatile to ensure that these // Reads and writes are atomic for reference variables. Use volatile to ensure that these
// operations are visible on other CPUs as well. // operations are visible on other CPUs as well.
private volatile TraceConfig activeTraceConfig; private volatile Supplier<TraceConfig> traceConfigSupplier;
private volatile SpanProcessor activeSpanProcessor = NoopSpanProcessor.getInstance(); private volatile SpanProcessor activeSpanProcessor = NoopSpanProcessor.getInstance();
private volatile boolean isStopped = false; private volatile boolean isStopped = false;
@ -33,12 +34,12 @@ final class TracerSharedState {
Clock clock, Clock clock,
IdGenerator idGenerator, IdGenerator idGenerator,
Resource resource, Resource resource,
TraceConfig traceConfig, Supplier<TraceConfig> traceConfigSupplier,
List<SpanProcessor> spanProcessors) { List<SpanProcessor> spanProcessors) {
this.clock = clock; this.clock = clock;
this.idGenerator = idGenerator; this.idGenerator = idGenerator;
this.resource = resource; this.resource = resource;
this.activeTraceConfig = traceConfig; this.traceConfigSupplier = traceConfigSupplier;
this.registeredSpanProcessors = new ArrayList<>(spanProcessors); this.registeredSpanProcessors = new ArrayList<>(spanProcessors);
activeSpanProcessor = SpanProcessor.composite(registeredSpanProcessors); activeSpanProcessor = SpanProcessor.composite(registeredSpanProcessors);
} }
@ -61,7 +62,7 @@ final class TracerSharedState {
* @return the active {@code TraceConfig}. * @return the active {@code TraceConfig}.
*/ */
TraceConfig getActiveTraceConfig() { TraceConfig getActiveTraceConfig() {
return activeTraceConfig; return traceConfigSupplier.get();
} }
/** /**
@ -70,7 +71,7 @@ final class TracerSharedState {
* @param traceConfig the new active {@code TraceConfig}. * @param traceConfig the new active {@code TraceConfig}.
*/ */
void updateActiveTraceConfig(TraceConfig traceConfig) { void updateActiveTraceConfig(TraceConfig traceConfig) {
activeTraceConfig = traceConfig; traceConfigSupplier = () -> traceConfig;
} }
/** /**

View File

@ -18,6 +18,7 @@ import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.resources.Resource;
import io.opentelemetry.sdk.trace.config.TraceConfig; import io.opentelemetry.sdk.trace.config.TraceConfig;
import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.sdk.trace.samplers.Sampler;
import java.util.function.Supplier;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
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;
@ -55,7 +56,15 @@ class SdkTracerProviderTest {
@Test @Test
void builder_NullTraceConfig() { void builder_NullTraceConfig() {
assertThatThrownBy(() -> SdkTracerProvider.builder().setTraceConfig(null)) assertThatThrownBy(() -> SdkTracerProvider.builder().setTraceConfig((TraceConfig) null))
.isInstanceOf(NullPointerException.class)
.hasMessage("traceConfig");
}
@Test
void builder_NullTraceConfigSupplier() {
assertThatThrownBy(
() -> SdkTracerProvider.builder().setTraceConfig((Supplier<TraceConfig>) null))
.isInstanceOf(NullPointerException.class) .isInstanceOf(NullPointerException.class)
.hasMessage("traceConfig"); .hasMessage("traceConfig");
} }