Skip to content

Commit 747bc91

Browse files
committed
Add minimum severity and trace-based logger configuration
1 parent 613e5d6 commit 747bc91

File tree

6 files changed

+144
-11
lines changed

6 files changed

+144
-11
lines changed

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,10 @@ final class ExtendedSdkLogRecordBuilder extends SdkLogRecordBuilder
2525
@Nullable private ExtendedAttributesMap extendedAttributes;
2626

2727
ExtendedSdkLogRecordBuilder(
28-
LoggerSharedState loggerSharedState, InstrumentationScopeInfo instrumentationScopeInfo) {
29-
super(loggerSharedState, instrumentationScopeInfo);
28+
LoggerSharedState loggerSharedState,
29+
InstrumentationScopeInfo instrumentationScopeInfo,
30+
SdkLogger logger) {
31+
super(loggerSharedState, instrumentationScopeInfo, logger);
3032
}
3133

3234
@Override
@@ -132,7 +134,20 @@ public void emit() {
132134
if (loggerSharedState.hasBeenShutdown()) {
133135
return;
134136
}
137+
138+
if (severity != Severity.UNDEFINED_SEVERITY_NUMBER
139+
&& severity.getSeverityNumber() < logger.minimumSeverity) {
140+
return;
141+
}
142+
135143
Context context = this.context == null ? Context.current() : this.context;
144+
if (logger.traceBased) {
145+
Span span = Span.fromContext(context);
146+
if (span.getSpanContext().isValid() && !span.getSpanContext().getTraceFlags().isSampled()) {
147+
return;
148+
}
149+
}
150+
136151
long observedTimestampEpochNanos =
137152
this.observedTimestampEpochNanos == 0
138153
? this.loggerSharedState.getClock().now()

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ static SdkLogger createExtendedLogger(
2525
}
2626

2727
static SdkLogRecordBuilder createExtendedLogRecordBuilder(
28-
LoggerSharedState loggerSharedState, InstrumentationScopeInfo instrumentationScopeInfo) {
29-
return new ExtendedSdkLogRecordBuilder(loggerSharedState, instrumentationScopeInfo);
28+
LoggerSharedState loggerSharedState, InstrumentationScopeInfo instrumentationScopeInfo, SdkLogger logger) {
29+
return new ExtendedSdkLogRecordBuilder(loggerSharedState, instrumentationScopeInfo, logger);
3030
}
3131
}

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class SdkLogRecordBuilder implements LogRecordBuilder {
2222

2323
protected final LoggerSharedState loggerSharedState;
2424
protected final LogLimits logLimits;
25+
protected final SdkLogger logger;
2526

2627
protected final InstrumentationScopeInfo instrumentationScopeInfo;
2728
protected long timestampEpochNanos;
@@ -34,10 +35,13 @@ class SdkLogRecordBuilder implements LogRecordBuilder {
3435
@Nullable private AttributesMap attributes;
3536

3637
SdkLogRecordBuilder(
37-
LoggerSharedState loggerSharedState, InstrumentationScopeInfo instrumentationScopeInfo) {
38+
LoggerSharedState loggerSharedState,
39+
InstrumentationScopeInfo instrumentationScopeInfo,
40+
SdkLogger logger) {
3841
this.loggerSharedState = loggerSharedState;
3942
this.logLimits = loggerSharedState.getLogLimits();
4043
this.instrumentationScopeInfo = instrumentationScopeInfo;
44+
this.logger = logger;
4145
}
4246

4347
@Override

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

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import io.opentelemetry.api.logs.Logger;
1010
import io.opentelemetry.api.logs.LoggerProvider;
1111
import io.opentelemetry.api.logs.Severity;
12+
import io.opentelemetry.api.trace.Span;
13+
import io.opentelemetry.api.trace.SpanContext;
1214
import io.opentelemetry.context.Context;
1315
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
1416
import io.opentelemetry.sdk.logs.internal.LoggerConfig;
@@ -36,6 +38,8 @@ class SdkLogger implements Logger {
3638
// deliberately not volatile because of performance concerns
3739
// - which means its eventually consistent
3840
protected boolean loggerEnabled;
41+
protected int minimumSeverity;
42+
protected boolean traceBased;
3943

4044
SdkLogger(
4145
LoggerSharedState loggerSharedState,
@@ -44,6 +48,8 @@ class SdkLogger implements Logger {
4448
this.loggerSharedState = loggerSharedState;
4549
this.instrumentationScopeInfo = instrumentationScopeInfo;
4650
this.loggerEnabled = loggerConfig.isEnabled();
51+
this.minimumSeverity = loggerConfig.getMinimumSeverity();
52+
this.traceBased = loggerConfig.isTraceBased();
4753
}
4854

4955
static SdkLogger create(
@@ -60,8 +66,8 @@ public LogRecordBuilder logRecordBuilder() {
6066
if (loggerEnabled) {
6167
return INCUBATOR_AVAILABLE
6268
? IncubatingUtil.createExtendedLogRecordBuilder(
63-
loggerSharedState, instrumentationScopeInfo)
64-
: new SdkLogRecordBuilder(loggerSharedState, instrumentationScopeInfo);
69+
loggerSharedState, instrumentationScopeInfo, this)
70+
: new SdkLogRecordBuilder(loggerSharedState, instrumentationScopeInfo, this);
6571
}
6672
return NOOP_LOGGER.logRecordBuilder();
6773
}
@@ -73,10 +79,28 @@ InstrumentationScopeInfo getInstrumentationScopeInfo() {
7379

7480
// Visible for testing
7581
public boolean isEnabled(Severity severity, Context context) {
76-
return loggerEnabled;
82+
if (!loggerEnabled) {
83+
return false;
84+
}
85+
86+
if (severity != Severity.UNDEFINED_SEVERITY_NUMBER
87+
&& severity.getSeverityNumber() < minimumSeverity) {
88+
return false;
89+
}
90+
91+
if (traceBased) {
92+
SpanContext spanContext = Span.fromContext(context).getSpanContext();
93+
if (spanContext.isValid() && !spanContext.getTraceFlags().isSampled()) {
94+
return false;
95+
}
96+
}
97+
98+
return true;
7799
}
78100

79101
void updateLoggerConfig(LoggerConfig loggerConfig) {
80102
loggerEnabled = loggerConfig.isEnabled();
103+
minimumSeverity = loggerConfig.getMinimumSeverity();
104+
traceBased = loggerConfig.isTraceBased();
81105
}
82106
}

sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/LoggerConfig.java

Lines changed: 90 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,9 @@
3030
public abstract class LoggerConfig {
3131

3232
private static final LoggerConfig DEFAULT_CONFIG =
33-
new AutoValue_LoggerConfig(/* enabled= */ true);
33+
new AutoValue_LoggerConfig(/* enabled= */ true, /* minimumSeverity= */ 0, /* traceBased= */ false);
3434
private static final LoggerConfig DISABLED_CONFIG =
35-
new AutoValue_LoggerConfig(/* enabled= */ false);
35+
new AutoValue_LoggerConfig(/* enabled= */ false, /* minimumSeverity= */ 0, /* traceBased= */ false);
3636

3737
/** Returns a disabled {@link LoggerConfig}. */
3838
public static LoggerConfig disabled() {
@@ -44,6 +44,13 @@ public static LoggerConfig enabled() {
4444
return DEFAULT_CONFIG;
4545
}
4646

47+
/**
48+
* Returns a new {@link Builder} for creating a {@link LoggerConfig}.
49+
*/
50+
public static Builder builder() {
51+
return new Builder();
52+
}
53+
4754
/**
4855
* Returns the default {@link LoggerConfig}, which is used when no configurator is set or when the
4956
* logger configurator returns {@code null} for a {@link InstrumentationScopeInfo}.
@@ -62,6 +69,87 @@ public static ScopeConfiguratorBuilder<LoggerConfig> configuratorBuilder() {
6269

6370
LoggerConfig() {}
6471

72+
/**
73+
* Builder for {@link LoggerConfig}.
74+
*
75+
* <p>This class is internal and experimental. Its APIs are unstable and can change at any time. Its
76+
* APIs (or a version of them) may be promoted to the public stable API in the future, but no
77+
* guarantees are made.
78+
*/
79+
public static final class Builder {
80+
private boolean enabled = true;
81+
private int minimumSeverity = 0;
82+
private boolean traceBased = false;
83+
84+
private Builder() {}
85+
86+
/**
87+
* Sets whether the logger is enabled.
88+
*
89+
* @param enabled whether the logger is enabled
90+
* @return this builder
91+
*/
92+
public Builder setEnabled(boolean enabled) {
93+
this.enabled = enabled;
94+
return this;
95+
}
96+
97+
/**
98+
* Sets the minimum severity level for log records to be processed.
99+
*
100+
* <p>Log records with a severity number less than this value will be dropped.
101+
* Log records without a specified severity are not affected by this setting.
102+
*
103+
* @param minimumSeverity minimum severity level for log records to be processed
104+
* @return this builder
105+
*/
106+
public Builder setMinimumSeverity(int minimumSeverity) {
107+
this.minimumSeverity = minimumSeverity;
108+
return this;
109+
}
110+
111+
/**
112+
* Sets whether to only process log records from sampled traces.
113+
*
114+
* <p>When enabled, log records from unsampled traces will be dropped.
115+
* Log records that are not associated with a trace context are unaffected.
116+
*
117+
* @param traceBased whether to only process log records from sampled traces
118+
* @return this builder
119+
*/
120+
public Builder setTraceBased(boolean traceBased) {
121+
this.traceBased = traceBased;
122+
return this;
123+
}
124+
125+
/**
126+
* Builds and returns a {@link LoggerConfig}.
127+
*/
128+
public LoggerConfig build() {
129+
return new AutoValue_LoggerConfig(enabled, minimumSeverity, traceBased);
130+
}
131+
}
132+
65133
/** Returns {@code true} if this logger is enabled. Defaults to {@code true}. */
66134
public abstract boolean isEnabled();
135+
136+
/**
137+
* Returns the minimum severity level for log records to be processed.
138+
*
139+
* <p>Log records with a severity number less than this value will be dropped.
140+
* Log records without a specified severity are not affected by this setting.
141+
*
142+
* <p>Defaults to {@code 0}.
143+
*/
144+
public abstract int getMinimumSeverity();
145+
146+
/**
147+
* Returns {@code true} if this logger should only process log records from sampled traces.
148+
*
149+
* <p>When enabled, log records from unsampled traces will be dropped.
150+
* Log records that are not associated with a trace context are unaffected.
151+
*
152+
* <p>Defaults to {@code false}.
153+
*/
154+
public abstract boolean isTraceBased();
67155
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.opentelemetry.context.Context;
2525
import io.opentelemetry.sdk.common.Clock;
2626
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
27+
import io.opentelemetry.sdk.logs.internal.LoggerConfig;
2728
import io.opentelemetry.sdk.resources.Resource;
2829
import java.time.Instant;
2930
import java.util.concurrent.TimeUnit;
@@ -57,7 +58,8 @@ void setup() {
5758
when(loggerSharedState.getResource()).thenReturn(RESOURCE);
5859
when(loggerSharedState.getClock()).thenReturn(clock);
5960

60-
builder = new SdkLogRecordBuilder(loggerSharedState, SCOPE_INFO);
61+
SdkLogger logger = new SdkLogger(loggerSharedState, SCOPE_INFO, LoggerConfig.enabled());
62+
builder = new SdkLogRecordBuilder(loggerSharedState, SCOPE_INFO, logger);
6163
}
6264

6365
@Test

0 commit comments

Comments
 (0)