Skip to content

Commit 8fda429

Browse files
authored
Sdk builders extended with addProcessorFirst methods (#7243)
1 parent 9e3f702 commit 8fda429

File tree

6 files changed

+67
-2
lines changed

6 files changed

+67
-2
lines changed

docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt

+3
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@ Comparing source compatibility of opentelemetry-sdk-logs-1.50.0-SNAPSHOT.jar aga
77
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
88
+++ NEW METHOD: PUBLIC(+) java.lang.String getEventName()
99
+++ NEW ANNOTATION: javax.annotation.Nullable
10+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder (not serializable)
11+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
12+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.logs.SdkLoggerProviderBuilder addLogRecordProcessorFirst(io.opentelemetry.sdk.logs.LogRecordProcessor)
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
Comparing source compatibility of opentelemetry-sdk-trace-1.50.0-SNAPSHOT.jar against opentelemetry-sdk-trace-1.49.0.jar
2-
No changes.
2+
*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.trace.SdkTracerProviderBuilder (not serializable)
3+
=== CLASS FILE FORMAT VERSION: 52.0 <- 52.0
4+
+++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.trace.SdkTracerProviderBuilder addSpanProcessorFirst(io.opentelemetry.sdk.trace.SpanProcessor)

sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLoggerProviderBuilder.java

+18
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,24 @@ public SdkLoggerProviderBuilder addLogRecordProcessor(LogRecordProcessor process
9696
return this;
9797
}
9898

99+
/**
100+
* Add a log processor as first. {@link LogRecordProcessor#onEmit(Context, ReadWriteLogRecord)}
101+
* will be called each time a log is emitted by {@link Logger} instances obtained from the {@link
102+
* SdkLoggerProvider}.
103+
*
104+
* <p>Compared to {@link SdkLoggerProviderBuilder#addLogRecordProcessor(LogRecordProcessor)}, this
105+
* method adds the processor to the beginning of the processor pipeline. So the {@code processor}
106+
* given will be executed before than the other processors already added.
107+
*
108+
* @param processor the log processor
109+
* @return this
110+
*/
111+
public SdkLoggerProviderBuilder addLogRecordProcessorFirst(LogRecordProcessor processor) {
112+
requireNonNull(processor, "processor");
113+
logRecordProcessors.add(0, processor);
114+
return this;
115+
}
116+
99117
/**
100118
* Assign a {@link Clock}.
101119
*

sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLoggerProviderTest.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,12 @@ void builder_clockProvided() {
124124

125125
@Test
126126
void builder_multipleProcessors() {
127+
LogRecordProcessor firstProcessor = mock(LogRecordProcessor.class);
127128
assertThat(
128129
SdkLoggerProvider.builder()
129130
.addLogRecordProcessor(logRecordProcessor)
130131
.addLogRecordProcessor(logRecordProcessor)
132+
.addLogRecordProcessorFirst(firstProcessor)
131133
.build())
132134
.extracting("sharedState", as(InstanceOfAssertFactories.type(LoggerSharedState.class)))
133135
.extracting(LoggerSharedState::getLogRecordProcessor)
@@ -138,7 +140,9 @@ void builder_multipleProcessors() {
138140
.extracting(
139141
"logRecordProcessors",
140142
as(InstanceOfAssertFactories.list(LogRecordProcessor.class)))
141-
.hasSize(2);
143+
.hasSize(3)
144+
.first()
145+
.isEqualTo(firstProcessor);
142146
});
143147
}
144148

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

+17
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

+21
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)