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("UnnecessaryAnonymousClass")
// Limits APIs
it.options.errorprone.disable("NoFunctionalReturnType")
it.options.compilerArgs += ["-Werror"]
}

View File

@ -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("</table>");
@ -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);
}
}
}

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;
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<TraceConfig> getTracezTraceConfigSupplier() {
return tracezTraceConfigSupplier;
}
/**
* 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 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<String, String> emptyQueryMap = ImmutableMap.of();
private TracezTraceConfigSupplier configSupplier;
@BeforeEach
void setup() {
// Restore default config
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());
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<String, String> 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<String, String> 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<String, String> 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));
}
}

View File

@ -15,4 +15,10 @@ class ZPageServerTest {
void spanProcessor() {
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 =
((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

View File

@ -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<TraceConfig> traceConfigSupplier,
List<SpanProcessor> 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));

View File

@ -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<TraceConfig> 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<TraceConfig> 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() {}

View File

@ -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<TraceConfig> 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<TraceConfig> traceConfigSupplier,
List<SpanProcessor> 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;
}
/**

View File

@ -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<TraceConfig>) null))
.isInstanceOf(NullPointerException.class)
.hasMessage("traceConfig");
}