Skip to content

Commit e118297

Browse files
authored
Use NoopLogEmitterBuilder when no log processors are registered (#4672)
1 parent b979ea1 commit e118297

File tree

6 files changed

+144
-8
lines changed

6 files changed

+144
-8
lines changed

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import io.opentelemetry.sdk.common.Clock;
99
import io.opentelemetry.sdk.common.CompletableResultCode;
1010
import io.opentelemetry.sdk.resources.Resource;
11-
import java.util.List;
1211
import java.util.function.Supplier;
1312
import javax.annotation.Nullable;
1413

@@ -27,11 +26,11 @@ final class LogEmitterSharedState {
2726
LogEmitterSharedState(
2827
Resource resource,
2928
Supplier<LogLimits> logLimitsSupplier,
30-
List<LogProcessor> logProcessors,
29+
LogProcessor logProcessor,
3130
Clock clock) {
3231
this.resource = resource;
3332
this.logLimitsSupplier = logLimitsSupplier;
34-
this.logProcessor = LogProcessor.composite(logProcessors);
33+
this.logProcessor = logProcessor;
3534
this.clock = clock;
3635
}
3736

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.logs;
7+
8+
import io.opentelemetry.api.common.AttributeKey;
9+
import io.opentelemetry.context.Context;
10+
import io.opentelemetry.sdk.logs.data.Severity;
11+
import java.time.Instant;
12+
import java.util.concurrent.TimeUnit;
13+
14+
class NoopLogEmitterBuilder implements LogEmitterBuilder {
15+
16+
private static final NoopLogEmitterBuilder INSTANCE = new NoopLogEmitterBuilder();
17+
private static final NoopLogEmitter NOOP_LOG_EMITTER = new NoopLogEmitter();
18+
19+
private NoopLogEmitterBuilder() {}
20+
21+
static LogEmitterBuilder getInstance() {
22+
return INSTANCE;
23+
}
24+
25+
@Override
26+
public LogEmitterBuilder setSchemaUrl(String schemaUrl) {
27+
return this;
28+
}
29+
30+
@Override
31+
public LogEmitterBuilder setInstrumentationVersion(String instrumentationScopeVersion) {
32+
return this;
33+
}
34+
35+
@Override
36+
public LogEmitter build() {
37+
return NOOP_LOG_EMITTER;
38+
}
39+
40+
private static class NoopLogEmitter implements LogEmitter {
41+
42+
private static final NoopLogBuilder NOOP_LOG_BUILDER = new NoopLogBuilder();
43+
44+
private NoopLogEmitter() {}
45+
46+
@Override
47+
public LogRecordBuilder logRecordBuilder() {
48+
return NOOP_LOG_BUILDER;
49+
}
50+
}
51+
52+
private static class NoopLogBuilder implements LogRecordBuilder {
53+
54+
private NoopLogBuilder() {}
55+
56+
@Override
57+
public LogRecordBuilder setEpoch(long timestamp, TimeUnit unit) {
58+
return this;
59+
}
60+
61+
@Override
62+
public LogRecordBuilder setEpoch(Instant instant) {
63+
return this;
64+
}
65+
66+
@Override
67+
public LogRecordBuilder setContext(Context context) {
68+
return this;
69+
}
70+
71+
@Override
72+
public LogRecordBuilder setSeverity(Severity severity) {
73+
return this;
74+
}
75+
76+
@Override
77+
public LogRecordBuilder setSeverityText(String severityText) {
78+
return this;
79+
}
80+
81+
@Override
82+
public LogRecordBuilder setBody(String body) {
83+
return this;
84+
}
85+
86+
@Override
87+
public <T> LogRecordBuilder setAttribute(AttributeKey<T> key, T value) {
88+
return this;
89+
}
90+
91+
@Override
92+
public void emit() {}
93+
}
94+
}

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public final class SdkLogEmitterProvider implements Closeable {
2424

2525
private final LogEmitterSharedState sharedState;
2626
private final ComponentRegistry<SdkLogEmitter> logEmitterComponentRegistry;
27+
private final boolean isNoopLogProcessor;
2728

2829
/**
2930
* Returns a new {@link SdkLogEmitterProviderBuilder} for {@link SdkLogEmitterProvider}.
@@ -39,10 +40,12 @@ public static SdkLogEmitterProviderBuilder builder() {
3940
Supplier<LogLimits> logLimitsSupplier,
4041
List<LogProcessor> processors,
4142
Clock clock) {
42-
this.sharedState = new LogEmitterSharedState(resource, logLimitsSupplier, processors, clock);
43+
LogProcessor logProcessor = LogProcessor.composite(processors);
44+
this.sharedState = new LogEmitterSharedState(resource, logLimitsSupplier, logProcessor, clock);
4345
this.logEmitterComponentRegistry =
4446
new ComponentRegistry<>(
4547
instrumentationScopeInfo -> new SdkLogEmitter(sharedState, instrumentationScopeInfo));
48+
this.isNoopLogProcessor = logProcessor instanceof NoopLogProcessor;
4649
}
4750

4851
/**
@@ -63,6 +66,9 @@ public LogEmitter get(String instrumentationScopeName) {
6366
* @return a log emitter builder instance
6467
*/
6568
public LogEmitterBuilder logEmitterBuilder(String instrumentationScopeName) {
69+
if (isNoopLogProcessor) {
70+
return NoopLogEmitterBuilder.getInstance();
71+
}
6672
if (instrumentationScopeName == null || instrumentationScopeName.isEmpty()) {
6773
LOGGER.fine("LogEmitter requested without instrumentation scope name.");
6874
instrumentationScopeName = DEFAULT_EMITTER_NAME;

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

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
import io.opentelemetry.sdk.common.Clock;
1414
import io.opentelemetry.sdk.common.CompletableResultCode;
1515
import io.opentelemetry.sdk.resources.Resource;
16-
import java.util.Collections;
17-
import java.util.List;
1816
import org.junit.jupiter.api.Test;
1917

2018
class LogEmitterSharedStateTest {
@@ -24,10 +22,9 @@ void shutdown() {
2422
LogProcessor logProcessor = mock(LogProcessor.class);
2523
CompletableResultCode code = new CompletableResultCode();
2624
when(logProcessor.shutdown()).thenReturn(code);
27-
List<LogProcessor> processors = Collections.singletonList(logProcessor);
2825
LogEmitterSharedState state =
2926
new LogEmitterSharedState(
30-
Resource.empty(), LogLimits::getDefault, processors, Clock.getDefault());
27+
Resource.empty(), LogLimits::getDefault, logProcessor, Clock.getDefault());
3128
state.shutdown();
3229
state.shutdown();
3330
verify(logProcessor, times(1)).shutdown();
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.logs;
7+
8+
import io.opentelemetry.api.common.AttributeKey;
9+
import io.opentelemetry.context.Context;
10+
import io.opentelemetry.sdk.logs.data.Severity;
11+
import java.time.Instant;
12+
import java.util.concurrent.TimeUnit;
13+
import org.junit.jupiter.api.Test;
14+
15+
class NoopLogEmitterBuilderTest {
16+
17+
@Test
18+
void buildAndEmit() {
19+
NoopLogEmitterBuilder.getInstance()
20+
.setSchemaUrl("http://endpoint")
21+
.setInstrumentationVersion("1.0.0")
22+
.build()
23+
.logRecordBuilder()
24+
.setAttribute(AttributeKey.stringKey("key"), "value")
25+
.setEpoch(Instant.now())
26+
.setEpoch(100, TimeUnit.SECONDS)
27+
.setSeverity(Severity.DEBUG)
28+
.setSeverityText("debug")
29+
.setContext(Context.root())
30+
.setBody("body")
31+
.emit();
32+
;
33+
}
34+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,12 @@ void logEmitterBuilder_DefaultEmitterName() {
212212
.isEqualTo(SdkLogEmitterProvider.DEFAULT_EMITTER_NAME);
213213
}
214214

215+
@Test
216+
void logEmitterBuilder_NoProcessor_UsesNoop() {
217+
assertThat(SdkLogEmitterProvider.builder().build().logEmitterBuilder("test"))
218+
.isInstanceOf(NoopLogEmitterBuilder.class);
219+
}
220+
215221
@Test
216222
void logEmitterBuilder_WithLogProcessor() {
217223
Resource resource = Resource.builder().put("r1", "v1").build();

0 commit comments

Comments
 (0)