Skip to content

Commit 33c96c0

Browse files
committed
BatchLogRecordProcessor enforced to end of processor pipeline
1 parent e6f90f5 commit 33c96c0

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.opentelemetry.api.logs.Logger;
1010
import io.opentelemetry.context.Context;
1111
import io.opentelemetry.sdk.common.CompletableResultCode;
12+
import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor;
1213
import java.io.Closeable;
1314
import java.util.ArrayList;
1415
import java.util.Arrays;
@@ -39,15 +40,26 @@ static LogRecordProcessor composite(LogRecordProcessor... processors) {
3940
*/
4041
static LogRecordProcessor composite(Iterable<LogRecordProcessor> processors) {
4142
List<LogRecordProcessor> processorList = new ArrayList<>();
43+
BatchLogRecordProcessor batchProcessor = null;
4244
for (LogRecordProcessor processor : processors) {
43-
processorList.add(processor);
45+
if (!BatchLogRecordProcessor.class.equals(processor.getClass())) {
46+
processorList.add(processor);
47+
} else {
48+
batchProcessor = (BatchLogRecordProcessor) processor;
49+
}
4450
}
51+
if (batchProcessor != null) {
52+
processorList.add(batchProcessor);
53+
}
54+
4555
if (processorList.isEmpty()) {
4656
return NoopLogRecordProcessor.getInstance();
4757
}
58+
4859
if (processorList.size() == 1) {
4960
return processorList.get(0);
5061
}
62+
5163
return MultiLogRecordProcessor.create(processorList);
5264
}
5365

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import io.opentelemetry.sdk.common.CompletableResultCode;
3030
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
3131
import io.opentelemetry.sdk.logs.data.LogRecordData;
32+
import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor;
3233
import io.opentelemetry.sdk.resources.Resource;
3334
import java.util.Optional;
3435
import java.util.concurrent.TimeUnit;
@@ -142,6 +143,29 @@ void builder_multipleProcessors() {
142143
});
143144
}
144145

146+
@Test
147+
void builder_multipleProcessorsWithBatchProcessor() {
148+
assertThat(
149+
SdkLoggerProvider.builder()
150+
.addLogRecordProcessor(mock(BatchLogRecordProcessor.class))
151+
.addLogRecordProcessor(logRecordProcessor)
152+
.addLogRecordProcessor(logRecordProcessor)
153+
.build())
154+
.extracting("sharedState", as(InstanceOfAssertFactories.type(LoggerSharedState.class)))
155+
.extracting(LoggerSharedState::getLogRecordProcessor)
156+
.satisfies(
157+
activeLogRecordProcessor -> {
158+
assertThat(activeLogRecordProcessor).isInstanceOf(MultiLogRecordProcessor.class);
159+
assertThat(activeLogRecordProcessor)
160+
.extracting(
161+
"logRecordProcessors",
162+
as(InstanceOfAssertFactories.list(LogRecordProcessor.class)))
163+
.hasSize(3)
164+
.last()
165+
.isInstanceOf(BatchLogRecordProcessor.class);
166+
});
167+
}
168+
145169
@Test
146170
void loggerBuilder_SameName() {
147171
assertThat(sdkLoggerProvider.loggerBuilder("test").build())

0 commit comments

Comments
 (0)