Skip to content

Commit 6460057

Browse files
committed
SdkTracerProviderBuilder.addSpanProcessorFirst added
1 parent a493302 commit 6460057

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkTracerProviderBuilder.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,27 @@ public SdkTracerProviderBuilder setSampler(Sampler sampler) {
151151
* @return this
152152
*/
153153
public SdkTracerProviderBuilder addSpanProcessor(SpanProcessor spanProcessor) {
154+
requireNonNull(spanProcessor, "spanProcessor");
154155
spanProcessors.add(spanProcessor);
155156
return this;
156157
}
157158

159+
/**
160+
* Add a SpanProcessor to the beginning of the span pipeline that will be built. {@link
161+
* SpanProcessor} will be called each time a {@link Span} is started or ended.
162+
*
163+
* <p>The {@code spanProcessor} must be thread-safe and return immediately (no remote calls, as
164+
* contention free as possible).
165+
*
166+
* @param spanProcessor the processor to be added to the beginning of the span pipeline.
167+
* @return this
168+
*/
169+
public SdkTracerProviderBuilder addSpanProcessorFirst(SpanProcessor spanProcessor) {
170+
requireNonNull(spanProcessor, "spanProcessor");
171+
spanProcessors.add(0, spanProcessor);
172+
return this;
173+
}
174+
158175
/**
159176
* Set the tracer configurator, which computes {@link TracerConfig} for each {@link
160177
* InstrumentationScopeInfo}.

sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkTracerProviderBuilderTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
package io.opentelemetry.sdk.trace;
77

88
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.mockito.Mockito.mock;
910

1011
import io.opentelemetry.api.common.AttributeKey;
1112
import io.opentelemetry.api.common.Attributes;
1213
import io.opentelemetry.sdk.resources.Resource;
14+
import org.assertj.core.api.InstanceOfAssertFactories;
1315
import org.junit.jupiter.api.Test;
1416

1517
public class SdkTracerProviderBuilderTest {
@@ -28,4 +30,23 @@ void addResource() {
2830
.extracting("sharedState")
2931
.hasFieldOrPropertyWithValue("resource", Resource.getDefault().merge(customResource));
3032
}
33+
34+
@Test
35+
void addSpanProcessorFirst() {
36+
SpanProcessor firstProcessor = mock(SpanProcessor.class);
37+
SpanProcessor anotherProcessor = mock(SpanProcessor.class);
38+
39+
SdkTracerProvider sdkTracerProvider =
40+
SdkTracerProvider.builder()
41+
.addSpanProcessor(anotherProcessor)
42+
.addSpanProcessorFirst(firstProcessor)
43+
.build();
44+
45+
assertThat(sdkTracerProvider)
46+
.extracting("sharedState")
47+
.extracting("activeSpanProcessor")
48+
.extracting("spanProcessorsAll", InstanceOfAssertFactories.list(SpanProcessor.class))
49+
.hasSize(2)
50+
.containsExactly(firstProcessor, anotherProcessor);
51+
}
3152
}

0 commit comments

Comments
 (0)