Avoid using mutable addSpanProcessor when trivial to change (#2365)

* Run go mod tidy on the master

* Fixes

Co-authored-by: Anuraag Agrawal <aanuraag@amazon.co.jp>
This commit is contained in:
Bogdan Drutu 2020-12-20 19:22:36 -08:00 committed by GitHub
parent 8dfdce3fe9
commit 95163d71fb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 148 additions and 117 deletions

View File

@ -25,6 +25,7 @@ import io.opentelemetry.sdk.metrics.data.MetricData.Point;
import io.opentelemetry.sdk.metrics.export.IntervalMetricReader; import io.opentelemetry.sdk.metrics.export.IntervalMetricReader;
import io.opentelemetry.sdk.metrics.export.MetricExporter; import io.opentelemetry.sdk.metrics.export.MetricExporter;
import io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporter; import io.opentelemetry.sdk.testing.exporter.InMemoryMetricExporter;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.export.BatchSpanProcessor; import io.opentelemetry.sdk.trace.export.BatchSpanProcessor;
import java.io.IOException; import java.io.IOException;
import java.util.Collections; import java.util.Collections;
@ -267,6 +268,10 @@ public class OtlpPipelineStressTest {
// .setMaxExportBatchSize(1024) // .setMaxExportBatchSize(1024)
// .setScheduleDelayMillis(1000) // .setScheduleDelayMillis(1000)
.build(); .build();
OpenTelemetrySdk.getGlobalTracerManagement().addSpanProcessor(spanProcessor);
GlobalOpenTelemetry.set(
OpenTelemetrySdk.builder()
.setTracerProvider(SdkTracerProvider.builder().addSpanProcessor(spanProcessor).build())
.build());
} }
} }

View File

@ -13,6 +13,7 @@ import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.context.ContextStorage; import io.opentelemetry.context.ContextStorage;
import io.opentelemetry.context.Scope; import io.opentelemetry.context.Scope;
import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.OpenTelemetrySdk;
import io.opentelemetry.sdk.trace.SdkTracerProvider;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
@ -29,7 +30,11 @@ class JfrSpanProcessorTest {
static { static {
ContextStorage.addWrapper(JfrContextStorageWrapper::new); ContextStorage.addWrapper(JfrContextStorageWrapper::new);
OpenTelemetrySdk.getGlobalTracerManagement().addSpanProcessor(new JfrSpanProcessor()); GlobalOpenTelemetry.set(
OpenTelemetrySdk.builder()
.setTracerProvider(
SdkTracerProvider.builder().addSpanProcessor(new JfrSpanProcessor()).build())
.build());
} }
/** Simple test to validate JFR events for Span and Scope. */ /** Simple test to validate JFR events for Span and Scope. */

View File

@ -17,7 +17,6 @@ import io.opentelemetry.sdk.trace.data.SpanData;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
/** Unit tests for {@link TracezDataAggregator}. */ /** Unit tests for {@link TracezDataAggregator}. */
@ -25,17 +24,12 @@ public final class TracezDataAggregatorTest {
private static final String SPAN_NAME_ONE = "one"; private static final String SPAN_NAME_ONE = "one";
private static final String SPAN_NAME_TWO = "two"; private static final String SPAN_NAME_TWO = "two";
private final TestClock testClock = TestClock.create(); private final TestClock testClock = TestClock.create();
private final SdkTracerProvider sdkTracerProvider =
SdkTracerProvider.builder().setClock(testClock).build();
private final Tracer tracer = sdkTracerProvider.get("TracezDataAggregatorTest");
private final TracezSpanProcessor spanProcessor = TracezSpanProcessor.builder().build(); private final TracezSpanProcessor spanProcessor = TracezSpanProcessor.builder().build();
private final SdkTracerProvider sdkTracerProvider =
SdkTracerProvider.builder().setClock(testClock).addSpanProcessor(spanProcessor).build();
private final Tracer tracer = sdkTracerProvider.get("TracezDataAggregatorTest");
private final TracezDataAggregator dataAggregator = new TracezDataAggregator(spanProcessor); private final TracezDataAggregator dataAggregator = new TracezDataAggregator(spanProcessor);
@BeforeEach
void setup() {
sdkTracerProvider.addSpanProcessor(spanProcessor);
}
@Test @Test
void getSpanNames_noSpans() { void getSpanNames_noSpans() {
assertThat(dataAggregator.getSpanNames()).isEmpty(); assertThat(dataAggregator.getSpanNames()).isEmpty();

View File

@ -21,7 +21,6 @@ import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.Map; import java.util.Map;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoExtension;
@ -38,18 +37,13 @@ class TracezZPageHandlerTest {
private static final String LATENCY_SPAN = "LatencySpan"; private static final String LATENCY_SPAN = "LatencySpan";
private static final String ERROR_SPAN = "ErrorSpan"; private static final String ERROR_SPAN = "ErrorSpan";
private final TestClock testClock = TestClock.create(); private final TestClock testClock = TestClock.create();
private final SdkTracerProvider sdkTracerProvider =
SdkTracerProvider.builder().setClock(testClock).build();
private final Tracer tracer = sdkTracerProvider.get("TracezZPageHandlerTest");
private final TracezSpanProcessor spanProcessor = TracezSpanProcessor.builder().build(); private final TracezSpanProcessor spanProcessor = TracezSpanProcessor.builder().build();
private final SdkTracerProvider sdkTracerProvider =
SdkTracerProvider.builder().setClock(testClock).addSpanProcessor(spanProcessor).build();
private final Tracer tracer = sdkTracerProvider.get("TracezZPageHandlerTest");
private final TracezDataAggregator dataAggregator = new TracezDataAggregator(spanProcessor); private final TracezDataAggregator dataAggregator = new TracezDataAggregator(spanProcessor);
private final Map<String, String> emptyQueryMap = ImmutableMap.of(); private final Map<String, String> emptyQueryMap = ImmutableMap.of();
@BeforeEach
void setup() {
sdkTracerProvider.addSpanProcessor(spanProcessor);
}
@Test @Test
void summaryTable_emitRowForEachSpan() { void summaryTable_emitRowForEachSpan() {
OutputStream output = new ByteArrayOutputStream(); OutputStream output = new ByteArrayOutputStream();

View File

@ -72,8 +72,10 @@ public class SpanPipelineBenchmark {
TraceConfig.getDefault().toBuilder().setSampler(Sampler.alwaysOn()).build(); TraceConfig.getDefault().toBuilder().setSampler(Sampler.alwaysOn()).build();
SdkTracerProvider tracerProvider = SdkTracerProvider tracerProvider =
SdkTracerProvider.builder().setTraceConfig(alwaysOn).build(); SdkTracerProvider.builder()
tracerProvider.addSpanProcessor(getSpanProcessor(address)); .setTraceConfig(alwaysOn)
.addSpanProcessor(getSpanProcessor(address))
.build();
Tracer tracerSdk = tracerProvider.get("PipelineBenchmarkTracer"); Tracer tracerSdk = tracerProvider.get("PipelineBenchmarkTracer");
sdkSpanBuilder = (SdkSpanBuilder) tracerSdk.spanBuilder("PipelineBenchmarkSpan"); sdkSpanBuilder = (SdkSpanBuilder) tracerSdk.spanBuilder("PipelineBenchmarkSpan");

View File

@ -26,6 +26,8 @@ import io.opentelemetry.sdk.trace.IdGenerator;
import io.opentelemetry.sdk.trace.SdkTracerProvider; import io.opentelemetry.sdk.trace.SdkTracerProvider;
import io.opentelemetry.sdk.trace.SpanProcessor; import io.opentelemetry.sdk.trace.SpanProcessor;
import io.opentelemetry.sdk.trace.config.TraceConfig; import io.opentelemetry.sdk.trace.config.TraceConfig;
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
import io.opentelemetry.sdk.trace.export.SpanExporter;
import io.opentelemetry.sdk.trace.samplers.Sampler; import io.opentelemetry.sdk.trace.samplers.Sampler;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.ExtendWith;
@ -153,11 +155,8 @@ class OpenTelemetrySdkTest {
OpenTelemetrySdk.builder() OpenTelemetrySdk.builder()
.setTracerProvider( .setTracerProvider(
SdkTracerProvider.builder() SdkTracerProvider.builder()
// TODO: Add support to configure SpanProcessor the builder. .addSpanProcessor(SimpleSpanProcessor.builder(mock(SpanExporter.class)).build())
// .addSpanProcessor(SimpleSpanProcessor.builder( .addSpanProcessor(SimpleSpanProcessor.builder(mock(SpanExporter.class)).build())
// mock(SpanExporter.class)).build())
// .addSpanProcessor(SimpleSpanProcessor.builder(
// mock(SpanExporter.class)).build())
.setClock(mock(Clock.class)) .setClock(mock(Clock.class))
.setIdGenerator(mock(IdGenerator.class)) .setIdGenerator(mock(IdGenerator.class))
.setResource(mock(Resource.class)) .setResource(mock(Resource.class))
@ -175,8 +174,7 @@ class OpenTelemetrySdkTest {
OpenTelemetrySdk.builder() OpenTelemetrySdk.builder()
.setTracerProvider( .setTracerProvider(
SdkTracerProvider.builder() SdkTracerProvider.builder()
// TODO: Add support to configure SpanProcessor the builder. .addSpanProcessor(SimpleSpanProcessor.builder(mock(SpanExporter.class)).build())
// .addSpanProcessor(SimpleSpanProcessor.builder(mock(SpanExporter.class)).build())
.build()) .build())
.setPropagators(ContextPropagators.create(mock(TextMapPropagator.class))) .setPropagators(ContextPropagators.create(mock(TextMapPropagator.class)))
.build(); .build();
@ -189,8 +187,7 @@ class OpenTelemetrySdkTest {
OpenTelemetrySdk.builder() OpenTelemetrySdk.builder()
.setTracerProvider( .setTracerProvider(
SdkTracerProvider.builder() SdkTracerProvider.builder()
// TODO: Add support to configure SpanProcessor the builder. .addSpanProcessor(SimpleSpanProcessor.builder(mock(SpanExporter.class)).build())
// .addSpanProcessor(SimpleSpanProcessor.builder(mock(SpanExporter.class)).build())
.setTraceConfig( .setTraceConfig(
TraceConfig.getDefault().toBuilder().setSampler(mock(Sampler.class)).build()) TraceConfig.getDefault().toBuilder().setSampler(mock(Sampler.class)).build())
.build()) .build())
@ -200,8 +197,7 @@ class OpenTelemetrySdkTest {
OpenTelemetrySdk.builder() OpenTelemetrySdk.builder()
.setTracerProvider( .setTracerProvider(
SdkTracerProvider.builder() SdkTracerProvider.builder()
// TODO: Add support to configure SpanProcessor the builder. .addSpanProcessor(SimpleSpanProcessor.builder(mock(SpanExporter.class)).build())
// .addSpanProcessor(SimpleSpanProcessor.builder(mock(SpanExporter.class)).build())
.setTraceConfig( .setTraceConfig(
TraceConfig.getDefault().toBuilder().setSampler(mock(Sampler.class)).build()) TraceConfig.getDefault().toBuilder().setSampler(mock(Sampler.class)).build())
.setIdGenerator(mock(IdGenerator.class)) .setIdGenerator(mock(IdGenerator.class))

View File

@ -27,7 +27,7 @@ final class TracerSharedState {
private volatile boolean isStopped = false; private volatile boolean isStopped = false;
@GuardedBy("lock") @GuardedBy("lock")
private final List<SpanProcessor> registeredSpanProcessors = new ArrayList<>(); private final List<SpanProcessor> registeredSpanProcessors;
TracerSharedState( TracerSharedState(
Clock clock, Clock clock,
@ -39,7 +39,8 @@ final class TracerSharedState {
this.idGenerator = idGenerator; this.idGenerator = idGenerator;
this.resource = resource; this.resource = resource;
this.activeTraceConfig = traceConfig; this.activeTraceConfig = traceConfig;
spanProcessors.forEach(this::addSpanProcessor); this.registeredSpanProcessors = new ArrayList<>(spanProcessors);
activeSpanProcessor = SpanProcessor.composite(registeredSpanProcessors);
} }
Clock getClock() { Clock getClock() {

View File

@ -58,14 +58,16 @@ class SdkSpanBuilderTest {
TraceState.getDefault()); TraceState.getDefault());
private final SpanProcessor mockedSpanProcessor = Mockito.mock(SpanProcessor.class); private final SpanProcessor mockedSpanProcessor = Mockito.mock(SpanProcessor.class);
private final SdkTracerProvider tracerSdkFactory = SdkTracerProvider.builder().build(); private SdkTracerProvider tracerSdkFactory;
private final SdkTracer sdkTracer = (SdkTracer) tracerSdkFactory.get("SpanBuilderSdkTest"); private SdkTracer sdkTracer;
@BeforeEach @BeforeEach
public void setUp() { public void setUp() {
tracerSdkFactory = SdkTracerProvider.builder().addSpanProcessor(mockedSpanProcessor).build();
sdkTracer = (SdkTracer) tracerSdkFactory.get("SpanBuilderSdkTest");
Mockito.when(mockedSpanProcessor.isStartRequired()).thenReturn(true); Mockito.when(mockedSpanProcessor.isStartRequired()).thenReturn(true);
Mockito.when(mockedSpanProcessor.isEndRequired()).thenReturn(true); Mockito.when(mockedSpanProcessor.isEndRequired()).thenReturn(true);
tracerSdkFactory.addSpanProcessor(mockedSpanProcessor);
} }
@Test @Test

View File

@ -32,13 +32,13 @@ import org.mockito.quality.Strictness;
@MockitoSettings(strictness = Strictness.LENIENT) @MockitoSettings(strictness = Strictness.LENIENT)
class SdkTracerProviderTest { class SdkTracerProviderTest {
@Mock private SpanProcessor spanProcessor; @Mock private SpanProcessor spanProcessor;
private final SdkTracerProvider tracerFactory = SdkTracerProvider.builder().build(); private SdkTracerProvider tracerFactory;
@BeforeEach @BeforeEach
void setUp() { void setUp() {
tracerFactory = SdkTracerProvider.builder().addSpanProcessor(spanProcessor).build();
when(spanProcessor.forceFlush()).thenReturn(CompletableResultCode.ofSuccess()); when(spanProcessor.forceFlush()).thenReturn(CompletableResultCode.ofSuccess());
when(spanProcessor.shutdown()).thenReturn(CompletableResultCode.ofSuccess()); when(spanProcessor.shutdown()).thenReturn(CompletableResultCode.ofSuccess());
tracerFactory.addSpanProcessor(spanProcessor);
} }
@Test @Test

View File

@ -63,8 +63,8 @@ class SdkTracerTest {
@Test @Test
void stressTest() { void stressTest() {
CountingSpanProcessor spanProcessor = new CountingSpanProcessor(); CountingSpanProcessor spanProcessor = new CountingSpanProcessor();
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder().build(); SdkTracerProvider sdkTracerProvider =
sdkTracerProvider.addSpanProcessor(spanProcessor); SdkTracerProvider.builder().addSpanProcessor(spanProcessor).build();
SdkTracer tracer = SdkTracer tracer =
(SdkTracer) (SdkTracer)
sdkTracerProvider.get(INSTRUMENTATION_LIBRARY_NAME, INSTRUMENTATION_LIBRARY_VERSION); sdkTracerProvider.get(INSTRUMENTATION_LIBRARY_NAME, INSTRUMENTATION_LIBRARY_VERSION);
@ -86,8 +86,8 @@ class SdkTracerTest {
void stressTest_withBatchSpanProcessor() { void stressTest_withBatchSpanProcessor() {
CountingSpanExporter countingSpanExporter = new CountingSpanExporter(); CountingSpanExporter countingSpanExporter = new CountingSpanExporter();
SpanProcessor spanProcessor = BatchSpanProcessor.builder(countingSpanExporter).build(); SpanProcessor spanProcessor = BatchSpanProcessor.builder(countingSpanExporter).build();
SdkTracerProvider sdkTracerProvider = SdkTracerProvider.builder().build(); SdkTracerProvider sdkTracerProvider =
sdkTracerProvider.addSpanProcessor(spanProcessor); SdkTracerProvider.builder().addSpanProcessor(spanProcessor).build();
SdkTracer tracer = SdkTracer tracer =
(SdkTracer) (SdkTracer)
sdkTracerProvider.get(INSTRUMENTATION_LIBRARY_NAME, INSTRUMENTATION_LIBRARY_VERSION); sdkTracerProvider.get(INSTRUMENTATION_LIBRARY_NAME, INSTRUMENTATION_LIBRARY_VERSION);

View File

@ -42,14 +42,15 @@ class BatchSpanProcessorTest {
private static final String SPAN_NAME_1 = "MySpanName/1"; private static final String SPAN_NAME_1 = "MySpanName/1";
private static final String SPAN_NAME_2 = "MySpanName/2"; private static final String SPAN_NAME_2 = "MySpanName/2";
private static final long MAX_SCHEDULE_DELAY_MILLIS = 500; private static final long MAX_SCHEDULE_DELAY_MILLIS = 500;
private final SdkTracerProvider tracerSdkFactory = SdkTracerProvider.builder().build(); private SdkTracerProvider sdkTracerProvider;
private final Tracer tracer = tracerSdkFactory.get("BatchSpanProcessorTest");
private final BlockingSpanExporter blockingSpanExporter = new BlockingSpanExporter(); private final BlockingSpanExporter blockingSpanExporter = new BlockingSpanExporter();
@Mock private SpanExporter mockServiceHandler; @Mock private SpanExporter mockServiceHandler;
@AfterEach @AfterEach
void cleanup() { void cleanup() {
tracerSdkFactory.shutdown(); if (sdkTracerProvider != null) {
sdkTracerProvider.shutdown();
}
} }
// TODO(bdrutu): Fix this when Sampler return RECORD_ONLY option. // TODO(bdrutu): Fix this when Sampler return RECORD_ONLY option.
@ -63,15 +64,17 @@ class BatchSpanProcessorTest {
*/ */
private ReadableSpan createSampledEndedSpan(String spanName) { private ReadableSpan createSampledEndedSpan(String spanName) {
Tracer tracer = sdkTracerProvider.get(getClass().getName());
Span span = Span span =
TestUtils.startSpanWithSampler(tracerSdkFactory, tracer, spanName, Sampler.alwaysOn()) TestUtils.startSpanWithSampler(sdkTracerProvider, tracer, spanName, Sampler.alwaysOn())
.startSpan(); .startSpan();
span.end(); span.end();
return (ReadableSpan) span; return (ReadableSpan) span;
} }
private void createNotSampledEndedSpan(String spanName) { private void createNotSampledEndedSpan(String spanName) {
TestUtils.startSpanWithSampler(tracerSdkFactory, tracer, spanName, Sampler.alwaysOff()) Tracer tracer = sdkTracerProvider.get(getClass().getName());
TestUtils.startSpanWithSampler(sdkTracerProvider, tracer, spanName, Sampler.alwaysOff())
.startSpan() .startSpan()
.end(); .end();
} }
@ -124,10 +127,13 @@ class BatchSpanProcessorTest {
void exportDifferentSampledSpans() { void exportDifferentSampledSpans() {
WaitingSpanExporter waitingSpanExporter = WaitingSpanExporter waitingSpanExporter =
new WaitingSpanExporter(2, CompletableResultCode.ofSuccess()); new WaitingSpanExporter(2, CompletableResultCode.ofSuccess());
tracerSdkFactory.addSpanProcessor( sdkTracerProvider =
BatchSpanProcessor.builder(waitingSpanExporter) SdkTracerProvider.builder()
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS) .addSpanProcessor(
.build()); BatchSpanProcessor.builder(waitingSpanExporter)
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS)
.build())
.build();
ReadableSpan span1 = createSampledEndedSpan(SPAN_NAME_1); ReadableSpan span1 = createSampledEndedSpan(SPAN_NAME_1);
ReadableSpan span2 = createSampledEndedSpan(SPAN_NAME_2); ReadableSpan span2 = createSampledEndedSpan(SPAN_NAME_2);
@ -138,14 +144,16 @@ class BatchSpanProcessorTest {
@Test @Test
void exportMoreSpansThanTheBufferSize() { void exportMoreSpansThanTheBufferSize() {
CompletableSpanExporter spanExporter = new CompletableSpanExporter(); CompletableSpanExporter spanExporter = new CompletableSpanExporter();
BatchSpanProcessor batchSpanProcessor =
BatchSpanProcessor.builder(spanExporter)
.setMaxQueueSize(6)
.setMaxExportBatchSize(2)
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS)
.build();
tracerSdkFactory.addSpanProcessor(batchSpanProcessor); sdkTracerProvider =
SdkTracerProvider.builder()
.addSpanProcessor(
BatchSpanProcessor.builder(spanExporter)
.setMaxQueueSize(6)
.setMaxExportBatchSize(2)
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS)
.build())
.build();
ReadableSpan span1 = createSampledEndedSpan(SPAN_NAME_1); ReadableSpan span1 = createSampledEndedSpan(SPAN_NAME_1);
ReadableSpan span2 = createSampledEndedSpan(SPAN_NAME_1); ReadableSpan span2 = createSampledEndedSpan(SPAN_NAME_1);
@ -182,7 +190,7 @@ class BatchSpanProcessorTest {
.setScheduleDelayMillis(10_000) // 10s .setScheduleDelayMillis(10_000) // 10s
.build(); .build();
tracerSdkFactory.addSpanProcessor(batchSpanProcessor); sdkTracerProvider = SdkTracerProvider.builder().addSpanProcessor(batchSpanProcessor).build();
for (int i = 0; i < 100; i++) { for (int i = 0; i < 100; i++) {
createSampledEndedSpan("notExported"); createSampledEndedSpan("notExported");
} }
@ -202,11 +210,15 @@ class BatchSpanProcessorTest {
new WaitingSpanExporter(2, CompletableResultCode.ofSuccess()); new WaitingSpanExporter(2, CompletableResultCode.ofSuccess());
WaitingSpanExporter waitingSpanExporter2 = WaitingSpanExporter waitingSpanExporter2 =
new WaitingSpanExporter(2, CompletableResultCode.ofSuccess()); new WaitingSpanExporter(2, CompletableResultCode.ofSuccess());
tracerSdkFactory.addSpanProcessor( sdkTracerProvider =
BatchSpanProcessor.builder( SdkTracerProvider.builder()
SpanExporter.composite(Arrays.asList(waitingSpanExporter, waitingSpanExporter2))) .addSpanProcessor(
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS) BatchSpanProcessor.builder(
.build()); SpanExporter.composite(
Arrays.asList(waitingSpanExporter, waitingSpanExporter2)))
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS)
.build())
.build();
ReadableSpan span1 = createSampledEndedSpan(SPAN_NAME_1); ReadableSpan span1 = createSampledEndedSpan(SPAN_NAME_1);
ReadableSpan span2 = createSampledEndedSpan(SPAN_NAME_2); ReadableSpan span2 = createSampledEndedSpan(SPAN_NAME_2);
@ -221,14 +233,17 @@ class BatchSpanProcessorTest {
final int maxQueuedSpans = 8; final int maxQueuedSpans = 8;
WaitingSpanExporter waitingSpanExporter = WaitingSpanExporter waitingSpanExporter =
new WaitingSpanExporter(maxQueuedSpans, CompletableResultCode.ofSuccess()); new WaitingSpanExporter(maxQueuedSpans, CompletableResultCode.ofSuccess());
BatchSpanProcessor batchSpanProcessor = sdkTracerProvider =
BatchSpanProcessor.builder( SdkTracerProvider.builder()
SpanExporter.composite(Arrays.asList(blockingSpanExporter, waitingSpanExporter))) .addSpanProcessor(
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS) BatchSpanProcessor.builder(
.setMaxQueueSize(maxQueuedSpans) SpanExporter.composite(
.setMaxExportBatchSize(maxQueuedSpans / 2) Arrays.asList(blockingSpanExporter, waitingSpanExporter)))
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS)
.setMaxQueueSize(maxQueuedSpans)
.setMaxExportBatchSize(maxQueuedSpans / 2)
.build())
.build(); .build();
tracerSdkFactory.addSpanProcessor(batchSpanProcessor);
List<SpanData> spansToExport = new ArrayList<>(maxQueuedSpans + 1); List<SpanData> spansToExport = new ArrayList<>(maxQueuedSpans + 1);
// Wait to block the worker thread in the BatchSampledSpansProcessor. This ensures that no items // Wait to block the worker thread in the BatchSampledSpansProcessor. This ensures that no items
@ -286,11 +301,15 @@ class BatchSpanProcessorTest {
doThrow(new IllegalArgumentException("No export for you.")) doThrow(new IllegalArgumentException("No export for you."))
.when(mockServiceHandler) .when(mockServiceHandler)
.export(ArgumentMatchers.anyList()); .export(ArgumentMatchers.anyList());
tracerSdkFactory.addSpanProcessor( sdkTracerProvider =
BatchSpanProcessor.builder( SdkTracerProvider.builder()
SpanExporter.composite(Arrays.asList(mockServiceHandler, waitingSpanExporter))) .addSpanProcessor(
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS) BatchSpanProcessor.builder(
.build()); SpanExporter.composite(
Arrays.asList(mockServiceHandler, waitingSpanExporter)))
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS)
.build())
.build();
ReadableSpan span1 = createSampledEndedSpan(SPAN_NAME_1); ReadableSpan span1 = createSampledEndedSpan(SPAN_NAME_1);
List<SpanData> exported = waitingSpanExporter.waitForExport(); List<SpanData> exported = waitingSpanExporter.waitForExport();
assertThat(exported).containsExactly(span1.toSpanData()); assertThat(exported).containsExactly(span1.toSpanData());
@ -332,15 +351,16 @@ class BatchSpanProcessorTest {
}; };
int exporterTimeoutMillis = 100; int exporterTimeoutMillis = 100;
BatchSpanProcessor batchSpanProcessor = sdkTracerProvider =
BatchSpanProcessor.builder(waitingSpanExporter) SdkTracerProvider.builder()
.setExporterTimeoutMillis(exporterTimeoutMillis) .addSpanProcessor(
.setScheduleDelayMillis(1) BatchSpanProcessor.builder(waitingSpanExporter)
.setMaxQueueSize(1) .setExporterTimeoutMillis(exporterTimeoutMillis)
.setScheduleDelayMillis(1)
.setMaxQueueSize(1)
.build())
.build(); .build();
tracerSdkFactory.addSpanProcessor(batchSpanProcessor);
ReadableSpan span = createSampledEndedSpan(SPAN_NAME_1); ReadableSpan span = createSampledEndedSpan(SPAN_NAME_1);
List<SpanData> exported = waitingSpanExporter.waitForExport(); List<SpanData> exported = waitingSpanExporter.waitForExport();
assertThat(exported).containsExactly(span.toSpanData()); assertThat(exported).containsExactly(span.toSpanData());
@ -354,11 +374,13 @@ class BatchSpanProcessorTest {
void exportNotSampledSpans() { void exportNotSampledSpans() {
WaitingSpanExporter waitingSpanExporter = WaitingSpanExporter waitingSpanExporter =
new WaitingSpanExporter(1, CompletableResultCode.ofSuccess()); new WaitingSpanExporter(1, CompletableResultCode.ofSuccess());
BatchSpanProcessor batchSpanProcessor = sdkTracerProvider =
BatchSpanProcessor.builder(waitingSpanExporter) SdkTracerProvider.builder()
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS) .addSpanProcessor(
BatchSpanProcessor.builder(waitingSpanExporter)
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS)
.build())
.build(); .build();
tracerSdkFactory.addSpanProcessor(batchSpanProcessor);
createNotSampledEndedSpan(SPAN_NAME_1); createNotSampledEndedSpan(SPAN_NAME_1);
createNotSampledEndedSpan(SPAN_NAME_2); createNotSampledEndedSpan(SPAN_NAME_2);
@ -377,7 +399,7 @@ class BatchSpanProcessorTest {
void exportNotSampledSpans_recordingEvents() { void exportNotSampledSpans_recordingEvents() {
// TODO(bdrutu): Fix this when Sampler return RECORD_ONLY option. // TODO(bdrutu): Fix this when Sampler return RECORD_ONLY option.
/* /*
tracerSdkFactory.addSpanProcessor( sdkTracerProvider.addSpanProcessor(
BatchSpanProcessor.builder(waitingSpanExporter) BatchSpanProcessor.builder(waitingSpanExporter)
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS) .setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS)
.reportOnlySampled(false) .reportOnlySampled(false)
@ -393,7 +415,7 @@ class BatchSpanProcessorTest {
void exportNotSampledSpans_reportOnlySampled() { void exportNotSampledSpans_reportOnlySampled() {
// TODO(bdrutu): Fix this when Sampler return RECORD_ONLY option. // TODO(bdrutu): Fix this when Sampler return RECORD_ONLY option.
/* /*
tracerSdkFactory.addSpanProcessor( sdkTracerProvider.addSpanProcessor(
BatchSpanProcessor.builder(waitingSpanExporter) BatchSpanProcessor.builder(waitingSpanExporter)
.reportOnlySampled(true) .reportOnlySampled(true)
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS) .setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS)
@ -413,13 +435,18 @@ class BatchSpanProcessorTest {
new WaitingSpanExporter(1, CompletableResultCode.ofSuccess()); new WaitingSpanExporter(1, CompletableResultCode.ofSuccess());
// Set the export delay to large value, in order to confirm the #flush() below works // Set the export delay to large value, in order to confirm the #flush() below works
tracerSdkFactory.addSpanProcessor( sdkTracerProvider =
BatchSpanProcessor.builder(waitingSpanExporter).setScheduleDelayMillis(10_000).build()); SdkTracerProvider.builder()
.addSpanProcessor(
BatchSpanProcessor.builder(waitingSpanExporter)
.setScheduleDelayMillis(10_000)
.build())
.build();
ReadableSpan span2 = createSampledEndedSpan(SPAN_NAME_2); ReadableSpan span2 = createSampledEndedSpan(SPAN_NAME_2);
// Force a shutdown, which forces processing of all remaining spans. // Force a shutdown, which forces processing of all remaining spans.
tracerSdkFactory.shutdown(); sdkTracerProvider.shutdown();
List<SpanData> exported = waitingSpanExporter.getExported(); List<SpanData> exported = waitingSpanExporter.getExported();
assertThat(exported).containsExactly(span2.toSpanData()); assertThat(exported).containsExactly(span2.toSpanData());

View File

@ -47,8 +47,6 @@ class SimpleSpanProcessorTest {
@Mock private ReadableSpan readableSpan; @Mock private ReadableSpan readableSpan;
@Mock private ReadWriteSpan readWriteSpan; @Mock private ReadWriteSpan readWriteSpan;
@Mock private SpanExporter spanExporter; @Mock private SpanExporter spanExporter;
private final SdkTracerProvider tracerSdkFactory = SdkTracerProvider.builder().build();
private final Tracer tracer = tracerSdkFactory.get("SimpleSpanProcessor");
private static final SpanContext SAMPLED_SPAN_CONTEXT = private static final SpanContext SAMPLED_SPAN_CONTEXT =
SpanContext.create( SpanContext.create(
TraceId.getInvalid(), TraceId.getInvalid(),
@ -129,30 +127,37 @@ class SimpleSpanProcessorTest {
void tracerSdk_NotSampled_Span() { void tracerSdk_NotSampled_Span() {
WaitingSpanExporter waitingSpanExporter = WaitingSpanExporter waitingSpanExporter =
new WaitingSpanExporter(1, CompletableResultCode.ofSuccess()); new WaitingSpanExporter(1, CompletableResultCode.ofSuccess());
SdkTracerProvider sdkTracerProvider =
SdkTracerProvider.builder()
.addSpanProcessor(
BatchSpanProcessor.builder(waitingSpanExporter)
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS)
.build())
.build();
tracerSdkFactory.addSpanProcessor( try {
BatchSpanProcessor.builder(waitingSpanExporter) Tracer tracer = sdkTracerProvider.get(getClass().getName());
.setScheduleDelayMillis(MAX_SCHEDULE_DELAY_MILLIS) TestUtils.startSpanWithSampler(sdkTracerProvider, tracer, SPAN_NAME, Sampler.alwaysOff())
.build()); .startSpan()
.end();
TestUtils.startSpanWithSampler(sdkTracerProvider, tracer, SPAN_NAME, Sampler.alwaysOff())
.startSpan()
.end();
TestUtils.startSpanWithSampler(tracerSdkFactory, tracer, SPAN_NAME, Sampler.alwaysOff()) Span span = tracer.spanBuilder(SPAN_NAME).startSpan();
.startSpan() span.end();
.end();
TestUtils.startSpanWithSampler(tracerSdkFactory, tracer, SPAN_NAME, Sampler.alwaysOff())
.startSpan()
.end();
Span span = tracer.spanBuilder(SPAN_NAME).startSpan(); // Spans are recorded and exported in the same order as they are ended, we test that a non
span.end(); // 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
// Spans are recorded and exported in the same order as they are ended, we test that a non // exported).
// sampled span is not exported by creating and ending a sampled span after a non sampled span List<SpanData> exported = waitingSpanExporter.waitForExport();
// and checking that the first exported span is the sampled span (the non sampled did not get // Need to check this because otherwise the variable span1 is unused, other option is to not
// exported). // have a span1 variable.
List<SpanData> exported = waitingSpanExporter.waitForExport(); assertThat(exported).containsExactly(((ReadableSpan) span).toSpanData());
// Need to check this because otherwise the variable span1 is unused, other option is to not } finally {
// have a span1 variable. sdkTracerProvider.shutdown();
assertThat(exported).containsExactly(((ReadableSpan) span).toSpanData()); }
} }
@Test @Test