Skip to content

Commit f171884

Browse files
authored
Refactor Log SDK to implement OTEP-0150 (#3759)
* Add log processors to the builder so LogSinkSdkProvider is immutable * Add api diff * Rename to SdkLogSinkProvider * Rework log sdk * Refactor logging sdk to implement OTEP-0150 * Fix typo * Add unit tests * Reorganize to facilitate potential future API * Rename ReadableLog* to SdkLog*, make SdkLog* package private * Add LogEmitterProvider interface, tidy up some javadoc * Respond to PR feedback * Make SdkLogEmitterBuilder final * Switch to LogEmitter.logBuilder().emit() pattern
1 parent 4755217 commit f171884

43 files changed

Lines changed: 1221 additions & 500 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@
77
- New `AttributesBuilder#remove(String)` and `AttributeBuilder#removeIf(Predicate<AttributeKey<?>>)`
88
methods improve ergonomics of modifying attributes.
99

10+
### SDK
11+
12+
#### Logging (alpha)
13+
14+
- This release includes a rework of the Log SDK to
15+
implement [OTEP-0150](https://github.com/open-telemetry/oteps/blob/main/text/logs/0150-logging-library-sdk.md)
16+
and to have more symmetry to the Trace SDK. `LogSink` is now `LogEmitter`. `LogEmitter` instances
17+
are obtained from `SdkLogEmitterProvider`. Other additions include `MultiLogProcessor` (accessed
18+
via `LogProcessor#composite(...)`), `SimpleLogProcessor`, and `InMemoryLogExporter`.
19+
1020
### Auto-configuration (alpha)
1121

1222
- BREAKING CHANGE: Remove deprecated `otel.experimental.exporter.otlp.protocol`,

exporters/logging-otlp/src/test/java/io/opentelemetry/exporter/logging/otlp/OtlpJsonLoggingLogExporterTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@
1414
import io.opentelemetry.api.common.Attributes;
1515
import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
1616
import io.opentelemetry.sdk.logs.data.LogData;
17-
import io.opentelemetry.sdk.logs.data.LogRecord;
1817
import io.opentelemetry.sdk.logs.data.Severity;
1918
import io.opentelemetry.sdk.logs.export.LogExporter;
2019
import io.opentelemetry.sdk.resources.Resource;
2120
import java.util.Arrays;
21+
import java.util.concurrent.TimeUnit;
2222
import org.junit.jupiter.api.BeforeEach;
2323
import org.junit.jupiter.api.Test;
2424
import org.junit.jupiter.api.extension.RegisterExtension;
@@ -31,28 +31,28 @@ class OtlpJsonLoggingLogExporterTest {
3131
Resource.create(Attributes.builder().put("key", "value").build());
3232

3333
private static final LogData LOG1 =
34-
LogRecord.builder(RESOURCE, InstrumentationLibraryInfo.create("instrumentation", "1"))
34+
LogData.builder(RESOURCE, InstrumentationLibraryInfo.create("instrumentation", "1"))
3535
.setName("testLog1")
3636
.setBody("body1")
3737
.setFlags(0)
3838
.setSeverity(Severity.INFO)
3939
.setSeverityText("INFO")
4040
.setSpanId("8765432112345876")
4141
.setTraceId("12345678876543211234567887654322")
42-
.setEpochMillis(1631533710L)
42+
.setEpoch(1631533710L, TimeUnit.MILLISECONDS)
4343
.setAttributes(Attributes.of(stringKey("animal"), "cat", longKey("lives"), 9L))
4444
.build();
4545

4646
private static final LogData LOG2 =
47-
LogRecord.builder(RESOURCE, InstrumentationLibraryInfo.create("instrumentation2", "2"))
47+
LogData.builder(RESOURCE, InstrumentationLibraryInfo.create("instrumentation2", "2"))
4848
.setName("testLog2")
4949
.setBody("body2")
5050
.setFlags(0)
5151
.setSeverity(Severity.INFO)
5252
.setSeverityText("INFO")
5353
.setSpanId("8765432112345875")
5454
.setTraceId("12345678876543211234567887654322")
55-
.setEpochMillis(1631533710L)
55+
.setEpoch(1631533710L, TimeUnit.MILLISECONDS)
5656
.setAttributes(Attributes.of(booleanKey("important"), true))
5757
.build();
5858

exporters/logging/src/test/java/io/opentelemetry/exporter/logging/SystemOutLogExporterTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,12 @@
1717
import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
1818
import io.opentelemetry.sdk.logs.data.Body;
1919
import io.opentelemetry.sdk.logs.data.LogData;
20-
import io.opentelemetry.sdk.logs.data.LogRecord;
2120
import io.opentelemetry.sdk.logs.data.Severity;
2221
import io.opentelemetry.sdk.resources.Resource;
2322
import java.time.LocalDateTime;
2423
import java.time.Month;
2524
import java.time.ZoneOffset;
25+
import java.util.concurrent.TimeUnit;
2626
import org.junit.jupiter.api.Test;
2727

2828
class SystemOutLogExporterTest {
@@ -50,11 +50,11 @@ void format() {
5050
}
5151

5252
private static LogData sampleLog(long timestamp) {
53-
return LogRecord.builder(Resource.empty(), InstrumentationLibraryInfo.create("logTest", "1.0"))
53+
return LogData.builder(Resource.empty(), InstrumentationLibraryInfo.create("logTest", "1.0"))
5454
.setAttributes(Attributes.of(stringKey("cheese"), "cheddar", longKey("amount"), 1L))
5555
.setBody(Body.stringBody("message"))
5656
.setSeverity(Severity.ERROR3)
57-
.setEpochMillis(timestamp)
57+
.setEpoch(timestamp, TimeUnit.MILLISECONDS)
5858
.setTraceId(TraceId.fromLongs(1, 2))
5959
.setSpanId(SpanId.fromLong(3))
6060
.build();

exporters/otlp-http/logs/src/test/java/io/opentelemetry/exporter/otlp/http/logs/OtlpHttpLogExporterTest.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
3232
import io.opentelemetry.sdk.logs.data.Body;
3333
import io.opentelemetry.sdk.logs.data.LogData;
34-
import io.opentelemetry.sdk.logs.data.LogRecord;
3534
import io.opentelemetry.sdk.logs.data.Severity;
3635
import io.opentelemetry.sdk.resources.Resource;
3736
import io.opentelemetry.sdk.trace.IdGenerator;
@@ -319,7 +318,7 @@ private static <T extends Message> HttpResponse buildResponse(HttpStatus httpSta
319318
}
320319

321320
private static LogData generateFakeLog() {
322-
return LogRecord.builder(
321+
return LogData.builder(
323322
Resource.getDefault(),
324323
InstrumentationLibraryInfo.create("testLib", "1.0", "http://url"))
325324
.setName("log-name")
@@ -329,7 +328,7 @@ private static LogData generateFakeLog() {
329328
.setSeverityText(Severity.INFO.name())
330329
.setTraceId(IdGenerator.random().generateTraceId())
331330
.setSpanId(IdGenerator.random().generateSpanId())
332-
.setEpochNanos(TimeUnit.MILLISECONDS.toNanos(Instant.now().toEpochMilli()))
331+
.setEpoch(Instant.now())
333332
.setFlags(0)
334333
.build();
335334
}

exporters/otlp/common/src/main/java/io/opentelemetry/exporter/otlp/internal/logs/LogsRequestMarshaler.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,12 @@
1111
import io.opentelemetry.exporter.otlp.internal.Serializer;
1212
import io.opentelemetry.proto.collector.logs.v1.internal.ExportLogsServiceRequest;
1313
import io.opentelemetry.sdk.logs.data.LogData;
14-
import io.opentelemetry.sdk.logs.data.LogRecord;
1514
import io.opentelemetry.sdk.trace.data.SpanData;
1615
import java.io.IOException;
1716
import java.util.Collection;
1817

1918
/**
20-
* {@link Marshaler} to convert SDK {@link LogRecord} to OTLP ExportLogsServiceRequest.
19+
* {@link Marshaler} to convert SDK {@link LogData} to OTLP ExportLogsServiceRequest.
2120
*
2221
* <p>This class is internal and is hence not for public use. Its APIs are unstable and can change
2322
* at any time.

exporters/otlp/common/src/test/java/io/opentelemetry/exporter/otlp/internal/logs/LogsRequestMarshalerTest.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.opentelemetry.proto.logs.v1.LogRecord;
2525
import io.opentelemetry.proto.logs.v1.ResourceLogs;
2626
import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
27+
import io.opentelemetry.sdk.logs.data.LogData;
2728
import io.opentelemetry.sdk.logs.data.Severity;
2829
import io.opentelemetry.sdk.resources.Resource;
2930
import java.io.ByteArrayOutputStream;
@@ -33,6 +34,7 @@
3334
import java.util.Base64;
3435
import java.util.Collections;
3536
import java.util.Locale;
37+
import java.util.concurrent.TimeUnit;
3638
import org.junit.jupiter.api.Test;
3739

3840
class LogsRequestMarshalerTest {
@@ -49,7 +51,7 @@ void toProtoResourceLogs() {
4951
ResourceLogsMarshaler[] resourceLogsMarshalers =
5052
ResourceLogsMarshaler.create(
5153
Collections.singleton(
52-
io.opentelemetry.sdk.logs.data.LogRecord.builder(
54+
LogData.builder(
5355
Resource.builder().put("one", 1).setSchemaUrl("http://url").build(),
5456
InstrumentationLibraryInfo.create("testLib", "1.0", "http://url"))
5557
.setName(NAME)
@@ -59,7 +61,7 @@ void toProtoResourceLogs() {
5961
.setTraceId(TRACE_ID)
6062
.setSpanId(SPAN_ID)
6163
.setAttributes(Attributes.of(AttributeKey.booleanKey("key"), true))
62-
.setEpochNanos(12345)
64+
.setEpoch(12345, TimeUnit.NANOSECONDS)
6365
.build()));
6466

6567
assertThat(resourceLogsMarshalers).hasSize(1);
@@ -82,7 +84,7 @@ void toProtoLogRecord() {
8284
parse(
8385
LogRecord.getDefaultInstance(),
8486
LogMarshaler.create(
85-
io.opentelemetry.sdk.logs.data.LogRecord.builder(
87+
LogData.builder(
8688
Resource.create(Attributes.builder().put("testKey", "testValue").build()),
8789
InstrumentationLibraryInfo.create("instrumentation", "1"))
8890
.setName(NAME)
@@ -92,7 +94,7 @@ void toProtoLogRecord() {
9294
.setTraceId(TRACE_ID)
9395
.setSpanId(SPAN_ID)
9496
.setAttributes(Attributes.of(AttributeKey.booleanKey("key"), true))
95-
.setEpochNanos(12345)
97+
.setEpoch(12345, TimeUnit.NANOSECONDS)
9698
.build()));
9799

98100
assertThat(logRecord.getTraceId().toByteArray()).isEqualTo(TRACE_ID_BYTES);
@@ -115,13 +117,13 @@ void toProtoLogRecord_MinimalFields() {
115117
parse(
116118
LogRecord.getDefaultInstance(),
117119
LogMarshaler.create(
118-
io.opentelemetry.sdk.logs.data.LogRecord.builder(
120+
LogData.builder(
119121
Resource.create(Attributes.builder().put("testKey", "testValue").build()),
120122
InstrumentationLibraryInfo.create("instrumentation", "1"))
121123
.setBody(BODY)
122124
.setSeverity(Severity.INFO)
123125
.setAttributes(Attributes.of(AttributeKey.booleanKey("key"), true))
124-
.setEpochNanos(12345)
126+
.setEpoch(12345, TimeUnit.NANOSECONDS)
125127
.build()));
126128

127129
assertThat(logRecord.getTraceId().toByteArray()).isEmpty();

exporters/otlp/logs/src/test/java/io/opentelemetry/exporter/otlp/logs/OtlpGrpcLogsExporterTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,14 @@
3232
import io.opentelemetry.sdk.common.CompletableResultCode;
3333
import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
3434
import io.opentelemetry.sdk.logs.data.LogData;
35-
import io.opentelemetry.sdk.logs.data.LogRecord;
3635
import io.opentelemetry.sdk.logs.data.Severity;
3736
import io.opentelemetry.sdk.resources.Resource;
3837
import java.io.ByteArrayOutputStream;
3938
import java.io.IOException;
4039
import java.io.UncheckedIOException;
4140
import java.nio.charset.StandardCharsets;
4241
import java.time.Duration;
42+
import java.time.Instant;
4343
import java.util.ArrayList;
4444
import java.util.Arrays;
4545
import java.util.Collections;
@@ -357,10 +357,10 @@ void usingGrpc() {
357357
}
358358

359359
private static LogData generateFakeLog() {
360-
return LogRecord.builder(
360+
return LogData.builder(
361361
Resource.create(Attributes.builder().put("testKey", "testValue").build()),
362362
InstrumentationLibraryInfo.create("instrumentation", "1"))
363-
.setEpochMillis(System.currentTimeMillis())
363+
.setEpoch(Instant.now())
364364
.setTraceId(TraceId.getInvalid())
365365
.setSpanId(SpanId.getInvalid())
366366
.setFlags(TraceFlags.getDefault().asByte())

exporters/otlp/logs/src/testGrpcNetty/java/io/opentelemetry/exporter/otlp/logs/ExportTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@
2323
import io.opentelemetry.proto.collector.logs.v1.LogsServiceGrpc;
2424
import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
2525
import io.opentelemetry.sdk.logs.data.LogData;
26-
import io.opentelemetry.sdk.logs.data.LogRecord;
2726
import io.opentelemetry.sdk.logs.data.Severity;
2827
import io.opentelemetry.sdk.resources.Resource;
2928
import java.nio.charset.StandardCharsets;
3029
import java.nio.file.Files;
30+
import java.time.Instant;
3131
import java.util.Collections;
3232
import java.util.List;
3333
import java.util.concurrent.TimeUnit;
@@ -39,10 +39,10 @@ class ExportTest {
3939

4040
private static final List<LogData> LOGS =
4141
Collections.singletonList(
42-
LogRecord.builder(
42+
LogData.builder(
4343
Resource.create(Attributes.builder().put("testKey", "testValue").build()),
4444
InstrumentationLibraryInfo.create("instrumentation", "1"))
45-
.setEpochMillis(System.currentTimeMillis())
45+
.setEpoch(Instant.now())
4646
.setTraceId(TraceId.getInvalid())
4747
.setSpanId(SpanId.getInvalid())
4848
.setFlags(TraceFlags.getDefault().asByte())

exporters/otlp/logs/src/testGrpcNettyShaded/java/io/opentelemetry/exporter/otlp/logs/ExportTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@
2323
import io.opentelemetry.proto.collector.logs.v1.LogsServiceGrpc;
2424
import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
2525
import io.opentelemetry.sdk.logs.data.LogData;
26-
import io.opentelemetry.sdk.logs.data.LogRecord;
2726
import io.opentelemetry.sdk.logs.data.Severity;
2827
import io.opentelemetry.sdk.resources.Resource;
2928
import java.nio.charset.StandardCharsets;
3029
import java.nio.file.Files;
30+
import java.time.Instant;
3131
import java.util.Collections;
3232
import java.util.List;
3333
import java.util.concurrent.TimeUnit;
@@ -39,10 +39,10 @@ class ExportTest {
3939

4040
private static final List<LogData> LOGS =
4141
Collections.singletonList(
42-
LogRecord.builder(
42+
LogData.builder(
4343
Resource.create(Attributes.builder().put("testKey", "testValue").build()),
4444
InstrumentationLibraryInfo.create("instrumentation", "1"))
45-
.setEpochMillis(System.currentTimeMillis())
45+
.setEpoch(Instant.now())
4646
.setTraceId(TraceId.getInvalid())
4747
.setSpanId(SpanId.getInvalid())
4848
.setFlags(TraceFlags.getDefault().asByte())

exporters/otlp/logs/src/testGrpcOkhttp/java/io/opentelemetry/exporter/otlp/logs/ExportTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@
2323
import io.opentelemetry.proto.collector.logs.v1.LogsServiceGrpc;
2424
import io.opentelemetry.sdk.common.InstrumentationLibraryInfo;
2525
import io.opentelemetry.sdk.logs.data.LogData;
26-
import io.opentelemetry.sdk.logs.data.LogRecord;
2726
import io.opentelemetry.sdk.logs.data.Severity;
2827
import io.opentelemetry.sdk.resources.Resource;
2928
import java.nio.charset.StandardCharsets;
3029
import java.nio.file.Files;
30+
import java.time.Instant;
3131
import java.util.Collections;
3232
import java.util.List;
3333
import java.util.concurrent.TimeUnit;
@@ -39,10 +39,10 @@ class ExportTest {
3939

4040
private static final List<LogData> LOGS =
4141
Collections.singletonList(
42-
LogRecord.builder(
42+
LogData.builder(
4343
Resource.create(Attributes.builder().put("testKey", "testValue").build()),
4444
InstrumentationLibraryInfo.create("instrumentation", "1"))
45-
.setEpochMillis(System.currentTimeMillis())
45+
.setEpoch(Instant.now())
4646
.setTraceId(TraceId.getInvalid())
4747
.setSpanId(SpanId.getInvalid())
4848
.setFlags(TraceFlags.getDefault().asByte())

0 commit comments

Comments
 (0)