diff --git a/sdk/all/src/jmh/java/io/opentelemetry/sdk/trace/SpanBenchmark.java b/sdk/all/src/jmh/java/io/opentelemetry/sdk/trace/SpanBenchmark.java index fba41d225b..d1dfe0d6b5 100644 --- a/sdk/all/src/jmh/java/io/opentelemetry/sdk/trace/SpanBenchmark.java +++ b/sdk/all/src/jmh/java/io/opentelemetry/sdk/trace/SpanBenchmark.java @@ -36,12 +36,11 @@ public class SpanBenchmark { @Setup(Level.Trial) public final void setup() { - SdkTracerProvider tracerProvider = - SdkTracerProvider.builder().setResource(serviceResource).build(); TraceConfig alwaysOn = - tracerProvider.getActiveTraceConfig().toBuilder().setSampler(Sampler.alwaysOn()).build(); - tracerProvider.updateActiveTraceConfig(alwaysOn); + TraceConfig.getDefault().toBuilder().setSampler(Sampler.alwaysOn()).build(); + SdkTracerProvider tracerProvider = + SdkTracerProvider.builder().setResource(serviceResource).setTraceConfig(alwaysOn).build(); Tracer tracerSdk = tracerProvider.get("benchmarkTracer"); sdkSpanBuilder = diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/config/TraceConfig.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/config/TraceConfig.java index 11474669a7..517606d38e 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/config/TraceConfig.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/config/TraceConfig.java @@ -7,18 +7,16 @@ package io.opentelemetry.sdk.trace.config; import com.google.auto.value.AutoValue; import io.opentelemetry.api.trace.Span; -import io.opentelemetry.sdk.trace.SdkTracerManagement; import io.opentelemetry.sdk.trace.samplers.Sampler; import javax.annotation.concurrent.Immutable; /** * Class that holds global trace parameters. * - *

Note: To update the TraceConfig associated with a {@link SdkTracerManagement}, you should use - * the {@link #toBuilder()} method on the TraceConfig currently assigned to the provider, make the - * changes desired to the {@link TraceConfigBuilder} instance, then use the {@link - * SdkTracerManagement#updateActiveTraceConfig(TraceConfig)} with the resulting TraceConfig - * instance. + *

Note: To allow dynamic updates of {@link TraceConfig} you should register a {@link + * java.util.function.Supplier} with {@link + * io.opentelemetry.sdk.trace.SdkTracerProviderBuilder#setTraceConfig(java.util.function.Supplier)} + * which supplies dynamic configs when queried. * *

Configuration options for {@link TraceConfig} can be read from system properties, environment * variables, or {@link java.util.Properties} objects. diff --git a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanBuilderTest.java b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanBuilderTest.java index 5cb4adf90f..b8e0954c7b 100644 --- a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanBuilderTest.java +++ b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanBuilderTest.java @@ -28,6 +28,7 @@ import io.opentelemetry.api.trace.StatusCode; import io.opentelemetry.api.trace.TraceFlags; import io.opentelemetry.api.trace.TraceId; import io.opentelemetry.api.trace.TraceState; +import io.opentelemetry.api.trace.TracerProvider; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.sdk.trace.config.TraceConfig; @@ -37,7 +38,6 @@ import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.sdk.trace.samplers.SamplingResult; import java.time.Instant; import java.util.Arrays; -import java.util.Collections; import java.util.List; import java.util.concurrent.TimeUnit; import javax.annotation.Nullable; @@ -58,12 +58,12 @@ class SdkSpanBuilderTest { TraceState.getDefault()); private final SpanProcessor mockedSpanProcessor = Mockito.mock(SpanProcessor.class); - private SdkTracerProvider tracerSdkFactory; private SdkTracer sdkTracer; @BeforeEach public void setUp() { - tracerSdkFactory = SdkTracerProvider.builder().addSpanProcessor(mockedSpanProcessor).build(); + SdkTracerProvider tracerSdkFactory = + SdkTracerProvider.builder().addSpanProcessor(mockedSpanProcessor).build(); sdkTracer = (SdkTracer) tracerSdkFactory.get("SpanBuilderSdkTest"); Mockito.when(mockedSpanProcessor.isStartRequired()).thenReturn(true); @@ -101,12 +101,10 @@ class SdkSpanBuilderTest { void truncateLink() { final int maxNumberOfLinks = 8; TraceConfig traceConfig = - tracerSdkFactory.getActiveTraceConfig().toBuilder() - .setMaxNumberOfLinks(maxNumberOfLinks) - .build(); - tracerSdkFactory.updateActiveTraceConfig(traceConfig); + TraceConfig.getDefault().toBuilder().setMaxNumberOfLinks(maxNumberOfLinks).build(); + TracerProvider tracerProvider = SdkTracerProvider.builder().setTraceConfig(traceConfig).build(); // Verify methods do not crash. - SpanBuilder spanBuilder = sdkTracer.spanBuilder(SPAN_NAME); + SpanBuilder spanBuilder = tracerProvider.get("test").spanBuilder(SPAN_NAME); for (int i = 0; i < 2 * maxNumberOfLinks; i++) { spanBuilder.addLink(sampledSpanContext); } @@ -121,18 +119,16 @@ class SdkSpanBuilderTest { } } finally { span.end(); - tracerSdkFactory.updateActiveTraceConfig(TraceConfig.getDefault()); } } @Test void truncateLinkAttributes() { TraceConfig traceConfig = - tracerSdkFactory.getActiveTraceConfig().toBuilder() - .setMaxNumberOfAttributesPerLink(1) - .build(); - tracerSdkFactory.updateActiveTraceConfig(traceConfig); - SpanBuilder spanBuilder = sdkTracer.spanBuilder(SPAN_NAME); + TraceConfig.getDefault().toBuilder().setMaxNumberOfAttributesPerLink(1).build(); + TracerProvider tracerProvider = SdkTracerProvider.builder().setTraceConfig(traceConfig).build(); + // Verify methods do not crash. + SpanBuilder spanBuilder = tracerProvider.get("test").spanBuilder(SPAN_NAME); Attributes attributes = Attributes.of( stringKey("key0"), "str", @@ -146,7 +142,6 @@ class SdkSpanBuilderTest { Link.create(sampledSpanContext, Attributes.of(stringKey("key0"), "str"), 3)); } finally { span.end(); - tracerSdkFactory.updateActiveTraceConfig(TraceConfig.getDefault()); } } @@ -356,11 +351,10 @@ class SdkSpanBuilderTest { void droppingAttributes() { final int maxNumberOfAttrs = 8; TraceConfig traceConfig = - tracerSdkFactory.getActiveTraceConfig().toBuilder() - .setMaxNumberOfAttributes(maxNumberOfAttrs) - .build(); - tracerSdkFactory.updateActiveTraceConfig(traceConfig); - SpanBuilder spanBuilder = sdkTracer.spanBuilder(SPAN_NAME); + TraceConfig.getDefault().toBuilder().setMaxNumberOfAttributes(maxNumberOfAttrs).build(); + TracerProvider tracerProvider = SdkTracerProvider.builder().setTraceConfig(traceConfig).build(); + // Verify methods do not crash. + SpanBuilder spanBuilder = tracerProvider.get("test").spanBuilder(SPAN_NAME); for (int i = 0; i < 2 * maxNumberOfAttrs; i++) { spanBuilder.setAttribute("key" + i, i); } @@ -373,18 +367,16 @@ class SdkSpanBuilderTest { } } finally { span.end(); - tracerSdkFactory.updateActiveTraceConfig(TraceConfig.getDefault()); } } @Test public void tooLargeAttributeValuesAreTruncated() { TraceConfig traceConfig = - tracerSdkFactory.getActiveTraceConfig().toBuilder() - .setMaxLengthOfAttributeValues(10) - .build(); - tracerSdkFactory.updateActiveTraceConfig(traceConfig); - SpanBuilder spanBuilder = sdkTracer.spanBuilder(SPAN_NAME); + TraceConfig.getDefault().toBuilder().setMaxLengthOfAttributeValues(10).build(); + TracerProvider tracerProvider = SdkTracerProvider.builder().setTraceConfig(traceConfig).build(); + // Verify methods do not crash. + SpanBuilder spanBuilder = tracerProvider.get("test").spanBuilder(SPAN_NAME); spanBuilder.setAttribute("builderStringNull", null); spanBuilder.setAttribute("builderStringSmall", "small"); spanBuilder.setAttribute("builderStringLarge", "very large string that we have to cut"); @@ -422,18 +414,16 @@ class SdkSpanBuilderTest { .isEqualTo(Arrays.asList("small", null, "very large")); } finally { span.end(); - tracerSdkFactory.updateActiveTraceConfig(TraceConfig.getDefault()); } } @Test void addAttributes_OnlyViaSampler() { TraceConfig traceConfig = - tracerSdkFactory.getActiveTraceConfig().toBuilder() - .setSampler(Sampler.traceIdRatioBased(1)) - .build(); - tracerSdkFactory.updateActiveTraceConfig(traceConfig); - SpanBuilder spanBuilder = sdkTracer.spanBuilder(SPAN_NAME); + TraceConfig.getDefault().toBuilder().setSampler(Sampler.traceIdRatioBased(1)).build(); + TracerProvider tracerProvider = SdkTracerProvider.builder().setTraceConfig(traceConfig).build(); + // Verify methods do not crash. + SpanBuilder spanBuilder = tracerProvider.get("test").spanBuilder(SPAN_NAME); RecordEventsReadableSpan span = (RecordEventsReadableSpan) spanBuilder.startSpan(); try { assertThat(span.toSpanData().getAttributes().size()).isEqualTo(1); @@ -443,7 +433,6 @@ class SdkSpanBuilderTest { .isEqualTo(1); } finally { span.end(); - tracerSdkFactory.updateActiveTraceConfig(TraceConfig.getDefault()); } } @@ -483,7 +472,12 @@ class SdkSpanBuilderTest { @Test void sampler() { Span span = - TestUtils.startSpanWithSampler(tracerSdkFactory, sdkTracer, SPAN_NAME, Sampler.alwaysOff()) + SdkTracerProvider.builder() + .setTraceConfig( + TraceConfig.getDefault().toBuilder().setSampler(Sampler.alwaysOff()).build()) + .build() + .get("test") + .spanBuilder(SPAN_NAME) .startSpan(); try { assertThat(span.getSpanContext().isSampled()).isFalse(); @@ -498,38 +492,43 @@ class SdkSpanBuilderTest { AttributeKey samplerAttributeKey = stringKey(samplerAttributeName); RecordEventsReadableSpan span = (RecordEventsReadableSpan) - TestUtils.startSpanWithSampler( - tracerSdkFactory, - sdkTracer, - SPAN_NAME, - new Sampler() { - @Override - public SamplingResult shouldSample( - @Nullable Context parentContext, - String traceId, - String name, - Kind spanKind, - Attributes attributes, - List parentLinks) { - return new SamplingResult() { - @Override - public Decision getDecision() { - return Decision.RECORD_AND_SAMPLE; - } + SdkTracerProvider.builder() + .setTraceConfig( + TraceConfig.getDefault().toBuilder() + .setSampler( + new Sampler() { + @Override + public SamplingResult shouldSample( + @Nullable Context parentContext, + String traceId, + String name, + Kind spanKind, + Attributes attributes, + List parentLinks) { + return new SamplingResult() { + @Override + public Decision getDecision() { + return Decision.RECORD_AND_SAMPLE; + } - @Override - public Attributes getAttributes() { - return Attributes.of(samplerAttributeKey, "bar"); - } - }; - } + @Override + public Attributes getAttributes() { + return Attributes.of(samplerAttributeKey, "bar"); + } + }; + } - @Override - public String getDescription() { - return "test sampler"; - } - }, - Collections.singletonMap(samplerAttributeKey.getKey(), "none")) + @Override + public String getDescription() { + return "test sampler"; + } + }) + .build()) + .addSpanProcessor(mockedSpanProcessor) + .build() + .get("test") + .spanBuilder(SPAN_NAME) + .setAttribute(samplerAttributeKey, "none") .startSpan(); try { assertThat(span.getSpanContext().isSampled()).isTrue(); @@ -546,43 +545,50 @@ class SdkSpanBuilderTest { AttributeKey samplerAttributeKey = stringKey(samplerAttributeName); RecordEventsReadableSpan span = (RecordEventsReadableSpan) - TestUtils.startSpanWithSampler( - tracerSdkFactory, - sdkTracer, - SPAN_NAME, - new Sampler() { - @Override - public SamplingResult shouldSample( - Context parentContext, - String traceId, - String name, - Kind spanKind, - Attributes attributes, - List parentLinks) { - return new SamplingResult() { - @Override - public Decision getDecision() { - return Decision.RECORD_AND_SAMPLE; - } + SdkTracerProvider.builder() + .setTraceConfig( + TraceConfig.getDefault().toBuilder() + .setSampler( + new Sampler() { + @Override + public SamplingResult shouldSample( + Context parentContext, + String traceId, + String name, + Kind spanKind, + Attributes attributes, + List parentLinks) { + return new SamplingResult() { + @Override + public Decision getDecision() { + return Decision.RECORD_AND_SAMPLE; + } - @Override - public Attributes getAttributes() { - return Attributes.empty(); - } + @Override + public Attributes getAttributes() { + return Attributes.empty(); + } - @Override - public TraceState getUpdatedTraceState(TraceState parentTraceState) { - return parentTraceState.toBuilder().set("newkey", "newValue").build(); - } - }; - } + @Override + public TraceState getUpdatedTraceState( + TraceState parentTraceState) { + return parentTraceState.toBuilder() + .set("newkey", "newValue") + .build(); + } + }; + } - @Override - public String getDescription() { - return "test sampler"; - } - }, - Collections.singletonMap(samplerAttributeKey.getKey(), "none")) + @Override + public String getDescription() { + return "test sampler"; + } + }) + .build()) + .build() + .get("test") + .spanBuilder(SPAN_NAME) + .setAttribute(samplerAttributeKey, "none") .startSpan(); try { assertThat(span.getSpanContext().isSampled()).isTrue(); @@ -594,12 +600,16 @@ class SdkSpanBuilderTest { } } + // TODO(anuraaga): Is this test correct? It's not sampled @Test void sampledViaParentLinks() { Span span = - TestUtils.startSpanWithSampler( - tracerSdkFactory, sdkTracer, SPAN_NAME, Sampler.traceIdRatioBased(0.0)) - .addLink(sampledSpanContext) + SdkTracerProvider.builder() + .setTraceConfig( + TraceConfig.getDefault().toBuilder().setSampler(Sampler.alwaysOff()).build()) + .build() + .get("test") + .spanBuilder(SPAN_NAME) .startSpan(); try { assertThat(span.getSpanContext().isSampled()).isFalse(); diff --git a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/TestUtils.java b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/TestUtils.java index 70824b7ab2..cbc2723912 100644 --- a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/TestUtils.java +++ b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/TestUtils.java @@ -9,17 +9,11 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.Span.Kind; -import io.opentelemetry.api.trace.SpanBuilder; import io.opentelemetry.api.trace.SpanId; import io.opentelemetry.api.trace.TraceId; -import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.sdk.testing.trace.TestSpanData; -import io.opentelemetry.sdk.trace.config.TraceConfig; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.data.SpanData.Status; -import io.opentelemetry.sdk.trace.samplers.Sampler; -import java.util.Collections; -import java.util.Map; import java.util.UUID; import java.util.concurrent.TimeUnit; @@ -57,41 +51,4 @@ public final class TestUtils { .setTotalRecordedEvents(0) .build(); } - - /** - * Create a very basic SpanData instance, suitable for testing. It has the bare minimum viable - * data. - * - * @return A SpanData instance. - */ - public static SpanBuilder startSpanWithSampler( - SdkTracerManagement sdkTracerManagement, Tracer tracer, String spanName, Sampler sampler) { - return startSpanWithSampler( - sdkTracerManagement, tracer, spanName, sampler, Collections.emptyMap()); - } - - /** - * Create a very basic SpanData instance, suitable for testing. It has the bare minimum viable - * data. - * - * @return A SpanData instance. - */ - public static SpanBuilder startSpanWithSampler( - SdkTracerManagement sdkTracerManagement, - Tracer tracer, - String spanName, - Sampler sampler, - Map attributes) { - TraceConfig originalConfig = sdkTracerManagement.getActiveTraceConfig(); - sdkTracerManagement.updateActiveTraceConfig( - originalConfig.toBuilder().setSampler(sampler).build()); - try { - SpanBuilder builder = tracer.spanBuilder(spanName); - attributes.forEach(builder::setAttribute); - - return builder; - } finally { - sdkTracerManagement.updateActiveTraceConfig(originalConfig); - } - } } diff --git a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java index 4b55ed200e..dde9492070 100644 --- a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java +++ b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/BatchSpanProcessorTest.java @@ -15,7 +15,7 @@ import io.opentelemetry.api.trace.Tracer; import io.opentelemetry.sdk.common.CompletableResultCode; import io.opentelemetry.sdk.trace.ReadableSpan; import io.opentelemetry.sdk.trace.SdkTracerProvider; -import io.opentelemetry.sdk.trace.TestUtils; +import io.opentelemetry.sdk.trace.config.TraceConfig; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.samplers.Sampler; import java.util.ArrayList; @@ -26,6 +26,7 @@ import java.util.Properties; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; import javax.annotation.Nullable; import javax.annotation.concurrent.GuardedBy; import org.junit.jupiter.api.AfterEach; @@ -63,22 +64,13 @@ class BatchSpanProcessorTest { } */ - private ReadableSpan createSampledEndedSpan(String spanName) { + private ReadableSpan createEndedSpan(String spanName) { Tracer tracer = sdkTracerProvider.get(getClass().getName()); - Span span = - TestUtils.startSpanWithSampler(sdkTracerProvider, tracer, spanName, Sampler.alwaysOn()) - .startSpan(); + Span span = tracer.spanBuilder(spanName).startSpan(); span.end(); return (ReadableSpan) span; } - private void createNotSampledEndedSpan(String spanName) { - Tracer tracer = sdkTracerProvider.get(getClass().getName()); - TestUtils.startSpanWithSampler(sdkTracerProvider, tracer, spanName, Sampler.alwaysOff()) - .startSpan() - .end(); - } - @Test void configTest() { Properties options = new Properties(); @@ -135,8 +127,8 @@ class BatchSpanProcessorTest { .build()) .build(); - ReadableSpan span1 = createSampledEndedSpan(SPAN_NAME_1); - ReadableSpan span2 = createSampledEndedSpan(SPAN_NAME_2); + ReadableSpan span1 = createEndedSpan(SPAN_NAME_1); + ReadableSpan span2 = createEndedSpan(SPAN_NAME_2); List exported = waitingSpanExporter.waitForExport(); assertThat(exported).containsExactly(span1.toSpanData(), span2.toSpanData()); } @@ -155,12 +147,12 @@ class BatchSpanProcessorTest { .build()) .build(); - ReadableSpan span1 = createSampledEndedSpan(SPAN_NAME_1); - ReadableSpan span2 = createSampledEndedSpan(SPAN_NAME_1); - ReadableSpan span3 = createSampledEndedSpan(SPAN_NAME_1); - ReadableSpan span4 = createSampledEndedSpan(SPAN_NAME_1); - ReadableSpan span5 = createSampledEndedSpan(SPAN_NAME_1); - ReadableSpan span6 = createSampledEndedSpan(SPAN_NAME_1); + ReadableSpan span1 = createEndedSpan(SPAN_NAME_1); + ReadableSpan span2 = createEndedSpan(SPAN_NAME_1); + ReadableSpan span3 = createEndedSpan(SPAN_NAME_1); + ReadableSpan span4 = createEndedSpan(SPAN_NAME_1); + ReadableSpan span5 = createEndedSpan(SPAN_NAME_1); + ReadableSpan span6 = createEndedSpan(SPAN_NAME_1); spanExporter.succeed(); @@ -192,7 +184,7 @@ class BatchSpanProcessorTest { sdkTracerProvider = SdkTracerProvider.builder().addSpanProcessor(batchSpanProcessor).build(); for (int i = 0; i < 100; i++) { - createSampledEndedSpan("notExported"); + createEndedSpan("notExported"); } List exported = waitingSpanExporter.waitForExport(); assertThat(exported).isNotNull(); @@ -220,8 +212,8 @@ class BatchSpanProcessorTest { .build()) .build(); - ReadableSpan span1 = createSampledEndedSpan(SPAN_NAME_1); - ReadableSpan span2 = createSampledEndedSpan(SPAN_NAME_2); + ReadableSpan span1 = createEndedSpan(SPAN_NAME_1); + ReadableSpan span2 = createEndedSpan(SPAN_NAME_2); List exported1 = waitingSpanExporter.waitForExport(); List exported2 = waitingSpanExporter2.waitForExport(); assertThat(exported1).containsExactly(span1.toSpanData(), span2.toSpanData()); @@ -249,19 +241,19 @@ class BatchSpanProcessorTest { // Wait to block the worker thread in the BatchSampledSpansProcessor. This ensures that no items // can be removed from the queue. Need to add a span to trigger the export otherwise the // pipeline is never called. - spansToExport.add(createSampledEndedSpan("blocking_span").toSpanData()); + spansToExport.add(createEndedSpan("blocking_span").toSpanData()); blockingSpanExporter.waitUntilIsBlocked(); for (int i = 0; i < maxQueuedSpans; i++) { // First export maxQueuedSpans, the worker thread is blocked so all items should be queued. - spansToExport.add(createSampledEndedSpan("span_1_" + i).toSpanData()); + spansToExport.add(createEndedSpan("span_1_" + i).toSpanData()); } // TODO: assertThat(spanExporter.getReferencedSpans()).isEqualTo(maxQueuedSpans); // Now we should start dropping. for (int i = 0; i < 7; i++) { - createSampledEndedSpan("span_2_" + i); + createEndedSpan("span_2_" + i); // TODO: assertThat(getDroppedSpans()).isEqualTo(i + 1); } @@ -284,7 +276,7 @@ class BatchSpanProcessorTest { // TODO: assertThat(getPushedSpans()).isAtLeast((long) maxQueuedSpans - maxBatchSize); for (int i = 0; i < maxQueuedSpans; i++) { - spansToExport.add(createSampledEndedSpan("span_3_" + i).toSpanData()); + spansToExport.add(createEndedSpan("span_3_" + i).toSpanData()); // No more dropped spans. // TODO: assertThat(getDroppedSpans()).isEqualTo(7); } @@ -310,12 +302,12 @@ class BatchSpanProcessorTest { .setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS) .build()) .build(); - ReadableSpan span1 = createSampledEndedSpan(SPAN_NAME_1); + ReadableSpan span1 = createEndedSpan(SPAN_NAME_1); List exported = waitingSpanExporter.waitForExport(); assertThat(exported).containsExactly(span1.toSpanData()); waitingSpanExporter.reset(); // Continue to export after the exception was received. - ReadableSpan span2 = createSampledEndedSpan(SPAN_NAME_2); + ReadableSpan span2 = createEndedSpan(SPAN_NAME_2); exported = waitingSpanExporter.waitForExport(); assertThat(exported).containsExactly(span2.toSpanData()); } @@ -361,7 +353,7 @@ class BatchSpanProcessorTest { .build()) .build(); - ReadableSpan span = createSampledEndedSpan(SPAN_NAME_1); + ReadableSpan span = createEndedSpan(SPAN_NAME_1); List exported = waitingSpanExporter.waitForExport(); assertThat(exported).containsExactly(span.toSpanData()); @@ -374,17 +366,22 @@ class BatchSpanProcessorTest { void exportNotSampledSpans() { WaitingSpanExporter waitingSpanExporter = new WaitingSpanExporter(1, CompletableResultCode.ofSuccess()); + AtomicReference traceConfig = + new AtomicReference<>( + TraceConfig.getDefault().toBuilder().setSampler(Sampler.alwaysOff()).build()); sdkTracerProvider = SdkTracerProvider.builder() .addSpanProcessor( BatchSpanProcessor.builder(waitingSpanExporter) .setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS) .build()) + .setTraceConfig(traceConfig::get) .build(); - createNotSampledEndedSpan(SPAN_NAME_1); - createNotSampledEndedSpan(SPAN_NAME_2); - ReadableSpan span2 = createSampledEndedSpan(SPAN_NAME_2); + sdkTracerProvider.get("test").spanBuilder(SPAN_NAME_1).startSpan().end(); + sdkTracerProvider.get("test").spanBuilder(SPAN_NAME_2).startSpan().end(); + traceConfig.set(traceConfig.get().toBuilder().setSampler(Sampler.alwaysOn()).build()); + ReadableSpan span2 = createEndedSpan(SPAN_NAME_2); // Spans are recorded and exported in the same order as they are ended, we test that a non // sampled span is not exported by creating and ending a sampled span after a non sampled span // and checking that the first exported span is the sampled span (the non sampled did not get @@ -443,7 +440,7 @@ class BatchSpanProcessorTest { .build()) .build(); - ReadableSpan span2 = createSampledEndedSpan(SPAN_NAME_2); + ReadableSpan span2 = createEndedSpan(SPAN_NAME_2); // Force a shutdown, which forces processing of all remaining spans. sdkTracerProvider.shutdown(); diff --git a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/SimpleSpanProcessorTest.java b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/SimpleSpanProcessorTest.java index abe466a618..a0d7f5366d 100644 --- a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/SimpleSpanProcessorTest.java +++ b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/export/SimpleSpanProcessorTest.java @@ -26,12 +26,14 @@ import io.opentelemetry.sdk.trace.ReadableSpan; import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.sdk.trace.TestUtils; +import io.opentelemetry.sdk.trace.config.TraceConfig; import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.export.BatchSpanProcessorTest.WaitingSpanExporter; import io.opentelemetry.sdk.trace.samplers.Sampler; import java.util.Collections; import java.util.List; import java.util.Properties; +import java.util.concurrent.atomic.AtomicReference; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -138,23 +140,24 @@ class SimpleSpanProcessorTest { void tracerSdk_NotSampled_Span() { WaitingSpanExporter waitingSpanExporter = new WaitingSpanExporter(1, CompletableResultCode.ofSuccess()); + AtomicReference traceConfig = + new AtomicReference<>( + TraceConfig.getDefault().toBuilder().setSampler(Sampler.alwaysOff()).build()); SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder() .addSpanProcessor( BatchSpanProcessor.builder(waitingSpanExporter) .setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS) .build()) + .setTraceConfig(traceConfig::get) .build(); try { Tracer tracer = sdkTracerProvider.get(getClass().getName()); - TestUtils.startSpanWithSampler(sdkTracerProvider, tracer, SPAN_NAME, Sampler.alwaysOff()) - .startSpan() - .end(); - TestUtils.startSpanWithSampler(sdkTracerProvider, tracer, SPAN_NAME, Sampler.alwaysOff()) - .startSpan() - .end(); + tracer.spanBuilder(SPAN_NAME).startSpan(); + tracer.spanBuilder(SPAN_NAME).startSpan(); + traceConfig.set(traceConfig.get().toBuilder().setSampler(Sampler.alwaysOn()).build()); Span span = tracer.spanBuilder(SPAN_NAME).startSpan(); span.end();