From d48eab6aa96afea03b2f5aac0d59e9f1a6e9c375 Mon Sep 17 00:00:00 2001 From: Anuraag Agrawal Date: Wed, 23 Dec 2020 11:52:17 +0900 Subject: [PATCH] Allow registering TraceConfigSupplier and use it from zpages. (#2390) * Allow registering TraceConfigSupplier and use it from zpages. * Finish * Remove unnecessary method * Same method name --- build.gradle | 3 + .../zpages/TraceConfigzZPageHandler.java | 34 ++-- .../zpages/TracezTraceConfigSupplier.java | 27 ++++ .../sdk/extension/zpages/ZPageServer.java | 20 ++- .../zpages/TraceConfigzZPageHandlerTest.java | 150 +++++++----------- .../sdk/extension/zpages/ZPageServerTest.java | 6 + .../sdk/OpenTelemetrySdkTest.java | 9 +- .../sdk/trace/SdkTracerProvider.java | 5 +- .../sdk/trace/SdkTracerProviderBuilder.java | 20 ++- .../sdk/trace/TracerSharedState.java | 11 +- .../sdk/trace/SdkTracerProviderTest.java | 11 +- 11 files changed, 158 insertions(+), 138 deletions(-) create mode 100644 sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/TracezTraceConfigSupplier.java diff --git a/build.gradle b/build.gradle index ff1bca97e2..d8e452d1f8 100644 --- a/build.gradle +++ b/build.gradle @@ -131,6 +131,9 @@ subprojects { it.options.errorprone.disable("JdkObsolete") it.options.errorprone.disable("UnnecessaryAnonymousClass") + // Limits APIs + it.options.errorprone.disable("NoFunctionalReturnType") + it.options.compilerArgs += ["-Werror"] } diff --git a/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/TraceConfigzZPageHandler.java b/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/TraceConfigzZPageHandler.java index aad95dad90..2d84f192cb 100644 --- a/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/TraceConfigzZPageHandler.java +++ b/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/TraceConfigzZPageHandler.java @@ -5,7 +5,6 @@ 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.TraceConfigBuilder; 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 private static final String ZEBRA_STRIPE_COLOR = "#e6e6e6"; private static final Logger logger = Logger.getLogger(TraceConfigzZPageHandler.class.getName()); - private final SdkTracerManagement sdkTracerManagement; + private final TracezTraceConfigSupplier configSupplier; - TraceConfigzZPageHandler(SdkTracerManagement sdkTracerManagement) { - this.sdkTracerManagement = sdkTracerManagement; + TraceConfigzZPageHandler(TracezTraceConfigSupplier configSupplier) { + this.configSupplier = configSupplier; } @Override @@ -211,45 +210,37 @@ final class TraceConfigzZPageHandler extends ZPageHandler { emitActiveTableRow( /* out= */ out, /* paramName= */ "Sampler", - /* paramValue=*/ this.sdkTracerManagement - .getActiveTraceConfig() - .getSampler() - .getDescription(), + /* paramValue=*/ configSupplier.get().getSampler().getDescription(), /* zebraStripeColor= */ ZEBRA_STRIPE_COLOR, /* zebraStripe= */ false); emitActiveTableRow( /* out= */ out, /* paramName= */ "MaxNumOfAttributes", - /* paramValue=*/ Integer.toString( - this.sdkTracerManagement.getActiveTraceConfig().getMaxNumberOfAttributes()), + /* paramValue=*/ Integer.toString(configSupplier.get().getMaxNumberOfAttributes()), /* zebraStripeColor= */ ZEBRA_STRIPE_COLOR, /* zebraStripe= */ true); emitActiveTableRow( /* out= */ out, /* paramName= */ "MaxNumOfEvents", - /* paramValue=*/ Integer.toString( - this.sdkTracerManagement.getActiveTraceConfig().getMaxNumberOfEvents()), + /* paramValue=*/ Integer.toString(configSupplier.get().getMaxNumberOfEvents()), /* zebraStripeColor= */ ZEBRA_STRIPE_COLOR, /* zebraStripe= */ false); emitActiveTableRow( /* out= */ out, /* paramName= */ "MaxNumOfLinks", - /* paramValue=*/ Integer.toString( - this.sdkTracerManagement.getActiveTraceConfig().getMaxNumberOfLinks()), + /* paramValue=*/ Integer.toString(configSupplier.get().getMaxNumberOfLinks()), /* zebraStripeColor= */ ZEBRA_STRIPE_COLOR, /* zebraStripe= */ true); emitActiveTableRow( /* out= */ out, /* paramName= */ "MaxNumOfAttributesPerEvent", - /* paramValue=*/ Integer.toString( - this.sdkTracerManagement.getActiveTraceConfig().getMaxNumberOfAttributesPerEvent()), + /* paramValue=*/ Integer.toString(configSupplier.get().getMaxNumberOfAttributesPerEvent()), /* zebraStripeColor= */ ZEBRA_STRIPE_COLOR, /* zebraStripe= */ false); emitActiveTableRow( /* out= */ out, /* paramName= */ "MaxNumOfAttributesPerLink", - /* paramValue=*/ Integer.toString( - this.sdkTracerManagement.getActiveTraceConfig().getMaxNumberOfAttributesPerLink()), + /* paramValue=*/ Integer.toString(configSupplier.get().getMaxNumberOfAttributesPerLink()), /* zebraStripeColor= */ ZEBRA_STRIPE_COLOR, /* zebraStripe=*/ true); out.print(""); @@ -369,8 +360,7 @@ final class TraceConfigzZPageHandler extends ZPageHandler { return; } if (action.equals(QUERY_STRING_ACTION_CHANGE)) { - TraceConfigBuilder newConfigBuilder = - this.sdkTracerManagement.getActiveTraceConfig().toBuilder(); + TraceConfigBuilder newConfigBuilder = configSupplier.get().toBuilder(); String samplingProbabilityStr = queryMap.get(QUERY_STRING_SAMPLING_PROBABILITY); if (samplingProbabilityStr != null) { try { @@ -435,10 +425,10 @@ final class TraceConfigzZPageHandler extends ZPageHandler { "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)) { TraceConfig defaultConfig = TraceConfig.getDefault().toBuilder().build(); - this.sdkTracerManagement.updateActiveTraceConfig(defaultConfig); + configSupplier.setActiveTraceConfig(defaultConfig); } } } diff --git a/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/TracezTraceConfigSupplier.java b/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/TracezTraceConfigSupplier.java new file mode 100644 index 0000000000..6683b03592 --- /dev/null +++ b/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/TracezTraceConfigSupplier.java @@ -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 { + + private volatile TraceConfig activeTraceConfig; + + TracezTraceConfigSupplier() { + activeTraceConfig = TraceConfig.getDefault(); + } + + @Override + public TraceConfig get() { + return activeTraceConfig; + } + + void setActiveTraceConfig(TraceConfig traceConfig) { + activeTraceConfig = traceConfig; + } +} diff --git a/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/ZPageServer.java b/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/ZPageServer.java index 6301c9ff8d..21b1d6935c 100644 --- a/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/ZPageServer.java +++ b/sdk-extensions/zpages/src/main/java/io/opentelemetry/sdk/extension/zpages/ZPageServer.java @@ -6,19 +6,20 @@ package io.opentelemetry.sdk.extension.zpages; 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.config.TraceConfig; import java.io.IOException; import java.net.InetSocketAddress; import java.util.Arrays; +import java.util.function.Supplier; import javax.annotation.Nullable; import javax.annotation.concurrent.GuardedBy; import javax.annotation.concurrent.ThreadSafe; /** * 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 * made visible to a singleton {@link ZPageServer}. * @@ -30,6 +31,7 @@ import javax.annotation.concurrent.ThreadSafe; * OpenTelemetry openTelemetry = OpenTelemetrySdk.builder() * .setTracerProvider(SdkTracerProvider.builder() * .addSpanProcessor(ZPageServer.getSpanProcessor()) + * .setTraceConfigSupplier(ZPageServer.getTraceConfigSupplier()) * .build(); * .build(); * @@ -47,6 +49,7 @@ import javax.annotation.concurrent.ThreadSafe; * OpenTelemetry openTelemetry = OpenTelemetrySdk.builder() * .setTracerProvider(SdkTracerProvider.builder() * .addSpanProcessor(ZPageServer.getSpanProcessor()) + * .setTraceConfigSupplier(ZPageServer.getTraceConfigSupplier()) * .build(); * .build(); * @@ -67,16 +70,16 @@ public final class ZPageServer { // Tracez SpanProcessor and DataAggregator for constructing TracezZPageHandler private static final TracezSpanProcessor tracezSpanProcessor = TracezSpanProcessor.builder().build(); + private static final TracezTraceConfigSupplier tracezTraceConfigSupplier = + new TracezTraceConfigSupplier(); private static final TracezDataAggregator tracezDataAggregator = new TracezDataAggregator(tracezSpanProcessor); - private static final SdkTracerManagement TRACER_SDK_MANAGEMENT = - OpenTelemetrySdk.getGlobalTracerManagement(); // Handler for /tracez page private static final ZPageHandler tracezZPageHandler = new TracezZPageHandler(tracezDataAggregator); // Handler for /traceconfigz page 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** private static final ZPageHandler indexZPageHandler = new IndexZPageHandler(Arrays.asList(tracezZPageHandler, traceConfigzZPageHandler)); @@ -87,6 +90,11 @@ public final class ZPageServer { @Nullable private static HttpServer server; + /** Returns a supplier of {@link TraceConfig} which can be reconfigured using zpages. */ + public static Supplier getTracezTraceConfigSupplier() { + return tracezTraceConfigSupplier; + } + /** * Returns a {@link SpanProcessor} which will allow processing of spans by {@link ZPageServer}. */ diff --git a/sdk-extensions/zpages/src/test/java/io/opentelemetry/sdk/extension/zpages/TraceConfigzZPageHandlerTest.java b/sdk-extensions/zpages/src/test/java/io/opentelemetry/sdk/extension/zpages/TraceConfigzZPageHandlerTest.java index 4c5e3cfb4d..4a40a38499 100644 --- a/sdk-extensions/zpages/src/test/java/io/opentelemetry/sdk/extension/zpages/TraceConfigzZPageHandlerTest.java +++ b/sdk-extensions/zpages/src/test/java/io/opentelemetry/sdk/extension/zpages/TraceConfigzZPageHandlerTest.java @@ -8,8 +8,6 @@ package io.opentelemetry.sdk.extension.zpages; import static org.assertj.core.api.Assertions.assertThat; 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.samplers.Sampler; import java.io.ByteArrayOutputStream; @@ -18,35 +16,14 @@ import java.util.Map; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -/** Unit tests for {@link TraceConfigzZPageHandler}. */ -public final class TraceConfigzZPageHandlerTest { - private static final SdkTracerManagement TRACER_SDK_MANAGEMENT = - OpenTelemetrySdk.getGlobalTracerManagement(); +class TraceConfigzZPageHandlerTest { private static final Map emptyQueryMap = ImmutableMap.of(); + private TracezTraceConfigSupplier configSupplier; + @BeforeEach void setup() { - // Restore default config - OutputStream output = new ByteArrayOutputStream(); - Map 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()); + configSupplier = new TracezTraceConfigSupplier(); } @Test @@ -60,7 +37,7 @@ public final class TraceConfigzZPageHandlerTest { String queryMaxNumOfAttributesPerLink = "maxnumofattributesperlink"; TraceConfigzZPageHandler traceConfigzZPageHandler = - new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); + new TraceConfigzZPageHandler(configSupplier); traceConfigzZPageHandler.emitHtml(emptyQueryMap, output); assertThat(output.toString()).contains("SamplingProbability to"); @@ -101,48 +78,29 @@ public final class TraceConfigzZPageHandlerTest { OutputStream output = new ByteArrayOutputStream(); TraceConfigzZPageHandler traceConfigzZPageHandler = - new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); + new TraceConfigzZPageHandler(configSupplier); traceConfigzZPageHandler.emitHtml(emptyQueryMap, output); assertThat(output.toString()).contains("Sampler"); assertThat(output.toString()) - .contains( - ">" + TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getSampler().getDescription() + "<"); + .contains(">" + configSupplier.get().getSampler().getDescription() + "<"); assertThat(output.toString()).contains("MaxNumberOfAttributes"); assertThat(output.toString()) - .contains( - ">" - + Integer.toString( - TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributes()) - + "<"); + .contains(">" + Integer.toString(configSupplier.get().getMaxNumberOfAttributes()) + "<"); assertThat(output.toString()).contains("MaxNumberOfEvents"); assertThat(output.toString()) - .contains( - ">" - + Integer.toString( - TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfEvents()) - + "<"); + .contains(">" + Integer.toString(configSupplier.get().getMaxNumberOfEvents()) + "<"); assertThat(output.toString()).contains("MaxNumberOfLinks"); assertThat(output.toString()) - .contains( - ">" - + Integer.toString( - TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfLinks()) - + "<"); + .contains(">" + Integer.toString(configSupplier.get().getMaxNumberOfLinks()) + "<"); assertThat(output.toString()).contains("MaxNumberOfAttributesPerEvent"); assertThat(output.toString()) .contains( - ">" - + Integer.toString( - TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerEvent()) - + "<"); + ">" + Integer.toString(configSupplier.get().getMaxNumberOfAttributesPerEvent()) + "<"); assertThat(output.toString()).contains("MaxNumberOfAttributesPerLink"); assertThat(output.toString()) .contains( - ">" - + Integer.toString( - TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerLink()) - + "<"); + ">" + Integer.toString(configSupplier.get().getMaxNumberOfAttributesPerLink()) + "<"); } @Test @@ -173,22 +131,22 @@ public final class TraceConfigzZPageHandlerTest { .build(); TraceConfigzZPageHandler traceConfigzZPageHandler = - new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); + new TraceConfigzZPageHandler(configSupplier); traceConfigzZPageHandler.processRequest("POST", queryMap, output); traceConfigzZPageHandler.emitHtml(queryMap, output); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getSampler().getDescription()) + assertThat(configSupplier.get().getSampler().getDescription()) .isEqualTo( Sampler.traceIdRatioBased(Double.parseDouble(newSamplingProbability)).getDescription()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributes()) + assertThat(configSupplier.get().getMaxNumberOfAttributes()) .isEqualTo(Integer.parseInt(newMaxNumOfAttributes)); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfEvents()) + assertThat(configSupplier.get().getMaxNumberOfEvents()) .isEqualTo(Integer.parseInt(newMaxNumOfEvents)); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfLinks()) + assertThat(configSupplier.get().getMaxNumberOfLinks()) .isEqualTo(Integer.parseInt(newMaxNumOfLinks)); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerEvent()) + assertThat(configSupplier.get().getMaxNumberOfAttributesPerEvent()) .isEqualTo(Integer.parseInt(newMaxNumOfAttributesPerEvent)); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerLink()) + assertThat(configSupplier.get().getMaxNumberOfAttributesPerLink()) .isEqualTo(Integer.parseInt(newMaxNumOfAttributesPerLink)); } @@ -199,21 +157,21 @@ public final class TraceConfigzZPageHandlerTest { Map queryMap = ImmutableMap.of("action", "default"); TraceConfigzZPageHandler traceConfigzZPageHandler = - new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); + new TraceConfigzZPageHandler(configSupplier); traceConfigzZPageHandler.processRequest("POST", queryMap, output); traceConfigzZPageHandler.emitHtml(queryMap, output); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getSampler().getDescription()) + assertThat(configSupplier.get().getSampler().getDescription()) .isEqualTo(TraceConfig.getDefault().getSampler().getDescription()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributes()) + assertThat(configSupplier.get().getMaxNumberOfAttributes()) .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributes()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfEvents()) + assertThat(configSupplier.get().getMaxNumberOfEvents()) .isEqualTo(TraceConfig.getDefault().getMaxNumberOfEvents()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfLinks()) + assertThat(configSupplier.get().getMaxNumberOfLinks()) .isEqualTo(TraceConfig.getDefault().getMaxNumberOfLinks()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerEvent()) + assertThat(configSupplier.get().getMaxNumberOfAttributesPerEvent()) .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerEvent()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerLink()) + assertThat(configSupplier.get().getMaxNumberOfAttributesPerLink()) .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerLink()); } @@ -224,21 +182,21 @@ public final class TraceConfigzZPageHandlerTest { Map queryMap = ImmutableMap.of("action", "change"); TraceConfigzZPageHandler traceConfigzZPageHandler = - new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); + new TraceConfigzZPageHandler(configSupplier); traceConfigzZPageHandler.processRequest("POST", queryMap, output); traceConfigzZPageHandler.emitHtml(queryMap, output); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getSampler().getDescription()) + assertThat(configSupplier.get().getSampler().getDescription()) .isEqualTo(TraceConfig.getDefault().getSampler().getDescription()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributes()) + assertThat(configSupplier.get().getMaxNumberOfAttributes()) .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributes()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfEvents()) + assertThat(configSupplier.get().getMaxNumberOfEvents()) .isEqualTo(TraceConfig.getDefault().getMaxNumberOfEvents()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfLinks()) + assertThat(configSupplier.get().getMaxNumberOfLinks()) .isEqualTo(TraceConfig.getDefault().getMaxNumberOfLinks()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerEvent()) + assertThat(configSupplier.get().getMaxNumberOfAttributesPerEvent()) .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerEvent()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerLink()) + assertThat(configSupplier.get().getMaxNumberOfAttributesPerLink()) .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerLink()); } @@ -247,7 +205,7 @@ public final class TraceConfigzZPageHandlerTest { // Invalid samplingProbability (not type of double) OutputStream output = new ByteArrayOutputStream(); TraceConfigzZPageHandler traceConfigzZPageHandler = - new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); + new TraceConfigzZPageHandler(configSupplier); Map queryMap = ImmutableMap.of("action", "change", "samplingprobability", "invalid"); @@ -258,7 +216,7 @@ public final class TraceConfigzZPageHandlerTest { // Invalid samplingProbability (< 0) output = new ByteArrayOutputStream(); - traceConfigzZPageHandler = new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); + traceConfigzZPageHandler = new TraceConfigzZPageHandler(configSupplier); queryMap = ImmutableMap.of("action", "change", "samplingprobability", "-1"); traceConfigzZPageHandler.processRequest("POST", queryMap, output); @@ -268,7 +226,7 @@ public final class TraceConfigzZPageHandlerTest { // Invalid samplingProbability (> 1) output = new ByteArrayOutputStream(); - traceConfigzZPageHandler = new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); + traceConfigzZPageHandler = new TraceConfigzZPageHandler(configSupplier); queryMap = ImmutableMap.of("action", "change", "samplingprobability", "1.1"); traceConfigzZPageHandler.processRequest("POST", queryMap, output); @@ -278,7 +236,7 @@ public final class TraceConfigzZPageHandlerTest { // Invalid maxNumOfAttributes output = new ByteArrayOutputStream(); - traceConfigzZPageHandler = new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); + traceConfigzZPageHandler = new TraceConfigzZPageHandler(configSupplier); queryMap = ImmutableMap.of("action", "change", "maxnumofattributes", "invalid"); traceConfigzZPageHandler.processRequest("POST", queryMap, output); @@ -288,7 +246,7 @@ public final class TraceConfigzZPageHandlerTest { // Invalid maxNumOfEvents output = new ByteArrayOutputStream(); - traceConfigzZPageHandler = new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); + traceConfigzZPageHandler = new TraceConfigzZPageHandler(configSupplier); queryMap = ImmutableMap.of("action", "change", "maxnumofevents", "invalid"); traceConfigzZPageHandler.processRequest("POST", queryMap, output); @@ -298,7 +256,7 @@ public final class TraceConfigzZPageHandlerTest { // Invalid maxNumLinks output = new ByteArrayOutputStream(); - traceConfigzZPageHandler = new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); + traceConfigzZPageHandler = new TraceConfigzZPageHandler(configSupplier); queryMap = ImmutableMap.of("action", "change", "maxnumoflinks", "invalid"); traceConfigzZPageHandler.processRequest("POST", queryMap, output); @@ -308,7 +266,7 @@ public final class TraceConfigzZPageHandlerTest { // Invalid maxNumOfAttributesPerEvent output = new ByteArrayOutputStream(); - traceConfigzZPageHandler = new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); + traceConfigzZPageHandler = new TraceConfigzZPageHandler(configSupplier); queryMap = ImmutableMap.of("action", "change", "maxnumofattributesperevent", "invalid"); traceConfigzZPageHandler.processRequest("POST", queryMap, output); @@ -319,7 +277,7 @@ public final class TraceConfigzZPageHandlerTest { // Invalid maxNumOfAttributesPerLink output = new ByteArrayOutputStream(); - traceConfigzZPageHandler = new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); + traceConfigzZPageHandler = new TraceConfigzZPageHandler(configSupplier); queryMap = ImmutableMap.of("action", "change", "maxnumofattributesperlink", "invalid"); traceConfigzZPageHandler.processRequest("POST", queryMap, output); @@ -357,40 +315,40 @@ public final class TraceConfigzZPageHandlerTest { .build(); TraceConfigzZPageHandler traceConfigzZPageHandler = - new TraceConfigzZPageHandler(TRACER_SDK_MANAGEMENT); + new TraceConfigzZPageHandler(configSupplier); // GET request, Should not apply changes traceConfigzZPageHandler.emitHtml(queryMap, output); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getSampler().getDescription()) + assertThat(configSupplier.get().getSampler().getDescription()) .isEqualTo(TraceConfig.getDefault().getSampler().getDescription()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributes()) + assertThat(configSupplier.get().getMaxNumberOfAttributes()) .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributes()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfEvents()) + assertThat(configSupplier.get().getMaxNumberOfEvents()) .isEqualTo(TraceConfig.getDefault().getMaxNumberOfEvents()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfLinks()) + assertThat(configSupplier.get().getMaxNumberOfLinks()) .isEqualTo(TraceConfig.getDefault().getMaxNumberOfLinks()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerEvent()) + assertThat(configSupplier.get().getMaxNumberOfAttributesPerEvent()) .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerEvent()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerLink()) + assertThat(configSupplier.get().getMaxNumberOfAttributesPerLink()) .isEqualTo(TraceConfig.getDefault().getMaxNumberOfAttributesPerLink()); // POST request, Should apply changes traceConfigzZPageHandler.processRequest("POST", queryMap, output); traceConfigzZPageHandler.emitHtml(queryMap, output); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getSampler().getDescription()) + assertThat(configSupplier.get().getSampler().getDescription()) .isEqualTo( Sampler.traceIdRatioBased(Double.parseDouble(newSamplingProbability)).getDescription()); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributes()) + assertThat(configSupplier.get().getMaxNumberOfAttributes()) .isEqualTo(Integer.parseInt(newMaxNumOfAttributes)); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfEvents()) + assertThat(configSupplier.get().getMaxNumberOfEvents()) .isEqualTo(Integer.parseInt(newMaxNumOfEvents)); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfLinks()) + assertThat(configSupplier.get().getMaxNumberOfLinks()) .isEqualTo(Integer.parseInt(newMaxNumOfLinks)); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerEvent()) + assertThat(configSupplier.get().getMaxNumberOfAttributesPerEvent()) .isEqualTo(Integer.parseInt(newMaxNumOfAttributesPerEvent)); - assertThat(TRACER_SDK_MANAGEMENT.getActiveTraceConfig().getMaxNumberOfAttributesPerLink()) + assertThat(configSupplier.get().getMaxNumberOfAttributesPerLink()) .isEqualTo(Integer.parseInt(newMaxNumOfAttributesPerLink)); } } diff --git a/sdk-extensions/zpages/src/test/java/io/opentelemetry/sdk/extension/zpages/ZPageServerTest.java b/sdk-extensions/zpages/src/test/java/io/opentelemetry/sdk/extension/zpages/ZPageServerTest.java index 1bbfbe9edc..4d60f4b03d 100644 --- a/sdk-extensions/zpages/src/test/java/io/opentelemetry/sdk/extension/zpages/ZPageServerTest.java +++ b/sdk-extensions/zpages/src/test/java/io/opentelemetry/sdk/extension/zpages/ZPageServerTest.java @@ -15,4 +15,10 @@ class ZPageServerTest { void spanProcessor() { assertThat(ZPageServer.getSpanProcessor()).isInstanceOf(TracezSpanProcessor.class); } + + @Test + void traceConfigSupplier() { + assertThat(ZPageServer.getTracezTraceConfigSupplier()) + .isInstanceOf(TracezTraceConfigSupplier.class); + } } diff --git a/sdk/all/src/test/java/io/opentelemetry/sdk/OpenTelemetrySdkTest.java b/sdk/all/src/test/java/io/opentelemetry/sdk/OpenTelemetrySdkTest.java index f5f9f06569..0fe88f3eec 100644 --- a/sdk/all/src/test/java/io/opentelemetry/sdk/OpenTelemetrySdkTest.java +++ b/sdk/all/src/test/java/io/opentelemetry/sdk/OpenTelemetrySdkTest.java @@ -118,15 +118,18 @@ class OpenTelemetrySdkTest { TracerProvider unobfuscatedTracerProvider = ((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 // approach would be to make the fields public for testing which is worse than this. assertThat(unobfuscatedTracerProvider) .extracting("sharedState") .hasFieldOrPropertyWithValue("clock", clock) .hasFieldOrPropertyWithValue("resource", resource) - .hasFieldOrPropertyWithValue("idGenerator", idGenerator) - .hasFieldOrPropertyWithValue("activeTraceConfig", traceConfig); + .hasFieldOrPropertyWithValue("idGenerator", idGenerator); } @Test diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerProvider.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerProvider.java index 837def790e..932b97abb8 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerProvider.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerProvider.java @@ -14,6 +14,7 @@ import io.opentelemetry.sdk.internal.ComponentRegistry; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.config.TraceConfig; import java.util.List; +import java.util.function.Supplier; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.Nullable; @@ -44,10 +45,10 @@ public final class SdkTracerProvider implements TracerProvider, SdkTracerManagem Clock clock, IdGenerator idsGenerator, Resource resource, - TraceConfig traceConfig, + Supplier traceConfigSupplier, List spanProcessors) { this.sharedState = - new TracerSharedState(clock, idsGenerator, resource, traceConfig, spanProcessors); + new TracerSharedState(clock, idsGenerator, resource, traceConfigSupplier, spanProcessors); this.tracerSdkComponentRegistry = new ComponentRegistry<>( instrumentationLibraryInfo -> new SdkTracer(sharedState, instrumentationLibraryInfo)); diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerProviderBuilder.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerProviderBuilder.java index b042b26e95..3cfc39a6db 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerProviderBuilder.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerProviderBuilder.java @@ -13,6 +13,7 @@ import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.config.TraceConfig; import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; /** Builder of {@link SdkTracerProvider}. */ public final class SdkTracerProviderBuilder { @@ -21,7 +22,7 @@ public final class SdkTracerProviderBuilder { private Clock clock = SystemClock.getInstance(); private IdGenerator idsGenerator = IdGenerator.random(); private Resource resource = Resource.getDefault(); - private TraceConfig traceConfig = TraceConfig.getDefault(); + private Supplier traceConfigSupplier = TraceConfig::getDefault; /** * Assign a {@link Clock}. @@ -67,7 +68,19 @@ public final class SdkTracerProviderBuilder { */ public SdkTracerProviderBuilder setTraceConfig(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 traceConfigSupplier) { + requireNonNull(traceConfigSupplier, "traceConfig"); + this.traceConfigSupplier = traceConfigSupplier; return this; } @@ -87,7 +100,8 @@ public final class SdkTracerProviderBuilder { * @return An initialized TraceSdkProvider. */ public SdkTracerProvider build() { - return new SdkTracerProvider(clock, idsGenerator, resource, traceConfig, spanProcessors); + return new SdkTracerProvider( + clock, idsGenerator, resource, traceConfigSupplier, spanProcessors); } SdkTracerProviderBuilder() {} diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/TracerSharedState.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/TracerSharedState.java index 8f718650fc..c0f0908f90 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/TracerSharedState.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/TracerSharedState.java @@ -11,6 +11,7 @@ import io.opentelemetry.sdk.trace.config.TraceConfig; import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; +import java.util.function.Supplier; import javax.annotation.concurrent.GuardedBy; // 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 // operations are visible on other CPUs as well. - private volatile TraceConfig activeTraceConfig; + private volatile Supplier traceConfigSupplier; private volatile SpanProcessor activeSpanProcessor = NoopSpanProcessor.getInstance(); private volatile boolean isStopped = false; @@ -33,12 +34,12 @@ final class TracerSharedState { Clock clock, IdGenerator idGenerator, Resource resource, - TraceConfig traceConfig, + Supplier traceConfigSupplier, List spanProcessors) { this.clock = clock; this.idGenerator = idGenerator; this.resource = resource; - this.activeTraceConfig = traceConfig; + this.traceConfigSupplier = traceConfigSupplier; this.registeredSpanProcessors = new ArrayList<>(spanProcessors); activeSpanProcessor = SpanProcessor.composite(registeredSpanProcessors); } @@ -61,7 +62,7 @@ final class TracerSharedState { * @return the active {@code TraceConfig}. */ TraceConfig getActiveTraceConfig() { - return activeTraceConfig; + return traceConfigSupplier.get(); } /** @@ -70,7 +71,7 @@ final class TracerSharedState { * @param traceConfig the new active {@code TraceConfig}. */ void updateActiveTraceConfig(TraceConfig traceConfig) { - activeTraceConfig = traceConfig; + traceConfigSupplier = () -> traceConfig; } /** diff --git a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkTracerProviderTest.java b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkTracerProviderTest.java index 116c763d89..9ba779dd1f 100644 --- a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkTracerProviderTest.java +++ b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkTracerProviderTest.java @@ -18,6 +18,7 @@ import io.opentelemetry.sdk.common.InstrumentationLibraryInfo; import io.opentelemetry.sdk.resources.Resource; import io.opentelemetry.sdk.trace.config.TraceConfig; import io.opentelemetry.sdk.trace.samplers.Sampler; +import java.util.function.Supplier; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -55,7 +56,15 @@ class SdkTracerProviderTest { @Test 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) null)) .isInstanceOf(NullPointerException.class) .hasMessage("traceConfig"); }