Skip to content

Commit b979ea1

Browse files
authored
Allow logs to be mutated by LogProcessor (#4643)
* Allow logs to be mutated by LogProcessor * wip * Improve test coverage
1 parent dcb9bbb commit b979ea1

File tree

23 files changed

+433
-195
lines changed

23 files changed

+433
-195
lines changed

integration-tests/otlp/src/main/java/io/opentelemetry/integrationtest/OtlpExporterIntegrationTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -519,9 +519,9 @@ private static void testLogExporter(LogExporter logExporter) {
519519

520520
try (Scope unused = Span.wrap(spanContext).makeCurrent()) {
521521
logEmitter
522-
.logBuilder()
522+
.logRecordBuilder()
523523
.setBody("log body")
524-
.setAttributes(Attributes.builder().put("key", "value").build())
524+
.setAllAttributes(Attributes.builder().put("key", "value").build())
525525
.setSeverity(Severity.DEBUG)
526526
.setSeverityText("DEBUG")
527527
.setEpoch(Instant.now())

sdk-extensions/autoconfigure/src/testFullConfig/java/io/opentelemetry/sdk/autoconfigure/FullConfigTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,8 @@ void configures() throws Exception {
213213

214214
LogEmitter logEmitter =
215215
autoConfiguredOpenTelemetrySdk.getOpenTelemetrySdk().getSdkLogEmitterProvider().get("test");
216-
logEmitter.logBuilder().setBody("debug log message").setSeverity(Severity.DEBUG).emit();
217-
logEmitter.logBuilder().setBody("info log message").setSeverity(Severity.INFO).emit();
216+
logEmitter.logRecordBuilder().setBody("debug log message").setSeverity(Severity.DEBUG).emit();
217+
logEmitter.logRecordBuilder().setBody("info log message").setSeverity(Severity.INFO).emit();
218218

219219
await().untilAsserted(() -> assertThat(otlpTraceRequests).hasSize(1));
220220

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

Lines changed: 0 additions & 45 deletions
This file was deleted.

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,17 +10,17 @@
1010
/**
1111
* A {@link LogEmitter} is the entry point into a log pipeline.
1212
*
13-
* <p>Obtain a log builder via {@link #logBuilder()}, add properties using the setters, and emit it
14-
* to downstream {@link LogProcessor}(s) via {@link LogBuilder#emit()}.
13+
* <p>Obtain a {@link #logRecordBuilder()}, add properties using the setters, and emit it to
14+
* downstream {@link LogProcessor}(s) via {@link LogRecordBuilder#emit()}.
1515
*/
1616
@ThreadSafe
1717
public interface LogEmitter {
1818

1919
/**
20-
* Return a {@link LogBuilder} to emit a log.
20+
* Return a {@link LogRecordBuilder} to emit a log record.
2121
*
22-
* <p>Build the log using the {@link LogBuilder} setters, and emit it to downstream {@link
23-
* LogProcessor}(s) via {@link LogBuilder#emit()}.
22+
* <p>Build the log record using the {@link LogRecordBuilder} setters, and emit it to downstream
23+
* {@link LogProcessor}(s) via {@link LogRecordBuilder#emit()}.
2424
*/
25-
LogBuilder logBuilder();
25+
LogRecordBuilder logRecordBuilder();
2626
}

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

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
package io.opentelemetry.sdk.logs;
77

88
import io.opentelemetry.sdk.common.CompletableResultCode;
9-
import io.opentelemetry.sdk.logs.data.LogData;
109
import java.io.Closeable;
1110
import java.util.ArrayList;
1211
import java.util.Arrays;
@@ -15,8 +14,8 @@
1514
import javax.annotation.concurrent.ThreadSafe;
1615

1716
/**
18-
* {@link LogProcessor} is the interface to allow synchronous hooks for logs emitted by {@link
19-
* LogEmitter}s.
17+
* {@link LogProcessor} is the interface to allow synchronous hooks for log records emitted by
18+
* {@link LogEmitter}s.
2019
*/
2120
@ThreadSafe
2221
public interface LogProcessor extends Closeable {
@@ -48,11 +47,11 @@ static LogProcessor composite(Iterable<LogProcessor> processors) {
4847
}
4948

5049
/**
51-
* Emit a log.
50+
* Called when a {@link LogEmitter} {@link LogRecordBuilder#emit()}s a log record.
5251
*
53-
* @param logData the log
52+
* @param logRecord the log record
5453
*/
55-
void emit(LogData logData);
54+
void onEmit(ReadWriteLogRecord logRecord);
5655

5756
/**
5857
* Shutdown the log processor.
@@ -64,7 +63,7 @@ default CompletableResultCode shutdown() {
6463
}
6564

6665
/**
67-
* Process all logs that have not yet been processed.
66+
* Process all log records that have not yet been processed.
6867
*
6968
* @return result
7069
*/
@@ -73,7 +72,8 @@ default CompletableResultCode forceFlush() {
7372
}
7473

7574
/**
76-
* Closes this {@link LogProcessor} after processing any remaining logs, releasing any resources.
75+
* Closes this {@link LogProcessor} after processing any remaining log records, releasing any
76+
* resources.
7777
*/
7878
@Override
7979
default void close() {
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
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.api.common.Attributes;
10+
import io.opentelemetry.context.Context;
11+
import io.opentelemetry.sdk.logs.data.Severity;
12+
import java.time.Instant;
13+
import java.util.concurrent.TimeUnit;
14+
15+
/**
16+
* Used to construct and emit logs from a {@link LogEmitter}.
17+
*
18+
* <p>Obtain a {@link LogEmitter#logRecordBuilder()}, add properties using the setters, and emit the
19+
* log to downstream {@link LogProcessor}(s) by calling {@link #emit()}.
20+
*/
21+
public interface LogRecordBuilder {
22+
23+
/** Set the epoch timestamp using the timestamp and unit. */
24+
LogRecordBuilder setEpoch(long timestamp, TimeUnit unit);
25+
26+
/** Set the epoch timestamp using the instant. */
27+
LogRecordBuilder setEpoch(Instant instant);
28+
29+
/** Set the context. */
30+
LogRecordBuilder setContext(Context context);
31+
32+
/** Set the severity. */
33+
LogRecordBuilder setSeverity(Severity severity);
34+
35+
/** Set the severity text. */
36+
LogRecordBuilder setSeverityText(String severityText);
37+
38+
/** Set the body string. */
39+
LogRecordBuilder setBody(String body);
40+
41+
/**
42+
* Sets attributes. If the {@link LogRecordBuilder} previously contained a mapping for any of the
43+
* keys, the old values are replaced by the specified values.
44+
*/
45+
@SuppressWarnings("unchecked")
46+
default LogRecordBuilder setAllAttributes(Attributes attributes) {
47+
if (attributes == null || attributes.isEmpty()) {
48+
return this;
49+
}
50+
attributes.forEach(
51+
(attributeKey, value) -> setAttribute((AttributeKey<Object>) attributeKey, value));
52+
return this;
53+
}
54+
55+
/** Sets an attribute. */
56+
<T> LogRecordBuilder setAttribute(AttributeKey<T> key, T value);
57+
58+
/** Emit the log to downstream {@link LogProcessor}(s). */
59+
void emit();
60+
}

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
package io.opentelemetry.sdk.logs;
77

88
import io.opentelemetry.sdk.common.CompletableResultCode;
9-
import io.opentelemetry.sdk.logs.data.LogData;
109
import java.util.ArrayList;
1110
import java.util.List;
1211
import java.util.Objects;
@@ -32,9 +31,9 @@ static LogProcessor create(List<LogProcessor> logProcessorsList) {
3231
}
3332

3433
@Override
35-
public void emit(LogData logData) {
34+
public void onEmit(ReadWriteLogRecord logRecord) {
3635
for (LogProcessor logProcessor : logProcessors) {
37-
logProcessor.emit(logData);
36+
logProcessor.onEmit(logRecord);
3837
}
3938
}
4039

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55

66
package io.opentelemetry.sdk.logs;
77

8-
import io.opentelemetry.sdk.logs.data.LogData;
9-
108
final class NoopLogProcessor implements LogProcessor {
119
private static final NoopLogProcessor INSTANCE = new NoopLogProcessor();
1210

@@ -17,5 +15,5 @@ static LogProcessor getInstance() {
1715
private NoopLogProcessor() {}
1816

1917
@Override
20-
public void emit(LogData logData) {}
18+
public void onEmit(ReadWriteLogRecord logRecord) {}
2119
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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.sdk.logs.data.LogData;
10+
11+
/** A log record that can be read from and written to. */
12+
public interface ReadWriteLogRecord {
13+
14+
/**
15+
* Sets an attribute on the log record. If the log record previously contained a mapping for the
16+
* key, the old value is replaced by the specified value.
17+
*
18+
* <p>Note: the behavior of null values is undefined, and hence strongly discouraged.
19+
*/
20+
<T> ReadWriteLogRecord setAttribute(AttributeKey<T> key, T value);
21+
22+
// TODO: add additional setters
23+
24+
/** Return an immutable {@link LogData} instance representing this log record. */
25+
LogData toLogData();
26+
27+
// TODO: add additional log record accessors. Currently, all fields can be accessed indirectly via
28+
// #toLogData() with at the expense of additional allocations.
29+
30+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ final class SdkLogEmitter implements LogEmitter {
2121
}
2222

2323
@Override
24-
public LogBuilder logBuilder() {
25-
return new SdkLogBuilder(logEmitterSharedState, instrumentationScopeInfo);
24+
public LogRecordBuilder logRecordBuilder() {
25+
return new SdkLogRecordBuilder(logEmitterSharedState, instrumentationScopeInfo);
2626
}
2727

2828
// VisibleForTesting

0 commit comments

Comments
 (0)