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:
parent
202d782f9c
commit
d48eab6aa9
|
|
@ -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"]
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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}.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,4 +15,10 @@ class ZPageServerTest {
|
|||
void spanProcessor() {
|
||||
assertThat(ZPageServer.getSpanProcessor()).isInstanceOf(TracezSpanProcessor.class);
|
||||
}
|
||||
|
||||
@Test
|
||||
void traceConfigSupplier() {
|
||||
assertThat(ZPageServer.getTracezTraceConfigSupplier())
|
||||
.isInstanceOf(TracezTraceConfigSupplier.class);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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() {}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue