Skip to content

Commit 97410cb

Browse files
traskjack-berg
andauthored
Add event name as an incubating feature (#7012)
Co-authored-by: jack-berg <[email protected]>
1 parent 2fb3eba commit 97410cb

File tree

25 files changed

+336
-22
lines changed

25 files changed

+336
-22
lines changed

api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedDefaultLogger.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
class ExtendedDefaultLogger implements ExtendedLogger {
1818

1919
private static final Logger INSTANCE = new ExtendedDefaultLogger();
20-
private static final LogRecordBuilder NOOP_LOG_RECORD_BUILDER = new NoopLogRecordBuilder();
20+
private static final ExtendedLogRecordBuilder NOOP_LOG_RECORD_BUILDER =
21+
new NoopExtendedLogRecordBuilder();
2122

2223
private ExtendedDefaultLogger() {}
2324

@@ -26,13 +27,18 @@ static Logger getNoop() {
2627
}
2728

2829
@Override
29-
public LogRecordBuilder logRecordBuilder() {
30+
public ExtendedLogRecordBuilder logRecordBuilder() {
3031
return NOOP_LOG_RECORD_BUILDER;
3132
}
3233

33-
private static final class NoopLogRecordBuilder implements ExtendedLogRecordBuilder {
34+
private static final class NoopExtendedLogRecordBuilder implements ExtendedLogRecordBuilder {
3435

35-
private NoopLogRecordBuilder() {}
36+
private NoopExtendedLogRecordBuilder() {}
37+
38+
@Override
39+
public ExtendedLogRecordBuilder setEventName(String eventName) {
40+
return this;
41+
}
3642

3743
@Override
3844
public LogRecordBuilder setTimestamp(long timestamp, TimeUnit unit) {

api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedLogRecordBuilder.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,13 @@
1010
/** Extended {@link LogRecordBuilder} with experimental APIs. */
1111
public interface ExtendedLogRecordBuilder extends LogRecordBuilder {
1212

13-
// Nothing at the moment, but experimental methods may be added in the future.
13+
// keep this class even if it is empty, since experimental methods may be added in the future.
1414

15+
/**
16+
* Sets the event name, which identifies the class / type of the Event.
17+
*
18+
* <p>This name should uniquely identify the event structure (both attributes and body). A log
19+
* record with a non-empty event name is an Event.
20+
*/
21+
ExtendedLogRecordBuilder setEventName(String eventName);
1522
}

api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedLogger.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,7 @@ public interface ExtendedLogger extends Logger {
2020
default boolean isEnabled() {
2121
return true;
2222
}
23+
24+
@Override
25+
ExtendedLogRecordBuilder logRecordBuilder();
2326
}

api/testing-internal/src/main/java/io/opentelemetry/api/testing/internal/AbstractDefaultLoggerTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ void buildAndEmit() {
5151
() ->
5252
getLogger()
5353
.logRecordBuilder()
54+
// TODO (trask) once event name stabilizes
55+
// .setEventName("event name")
5456
.setTimestamp(100, TimeUnit.SECONDS)
5557
.setTimestamp(Instant.now())
5658
.setObservedTimestamp(100, TimeUnit.SECONDS)

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import io.opentelemetry.sdk.metrics.internal.data.ImmutableSumData;
2929
import io.opentelemetry.sdk.resources.Resource;
3030
import io.opentelemetry.sdk.testing.logs.TestLogRecordData;
31+
import io.opentelemetry.sdk.testing.logs.internal.TestExtendedLogRecordData;
3132
import io.opentelemetry.sdk.testing.trace.TestSpanData;
3233
import io.opentelemetry.sdk.trace.data.EventData;
3334
import io.opentelemetry.sdk.trace.data.SpanData;
@@ -47,13 +48,14 @@ abstract class TestDataExporter<T> {
4748
Resource.create(Attributes.builder().put("key", "value").build());
4849

4950
private static final LogRecordData LOG1 =
50-
TestLogRecordData.builder()
51+
TestExtendedLogRecordData.builder()
5152
.setResource(RESOURCE)
5253
.setInstrumentationScopeInfo(
5354
InstrumentationScopeInfo.builder("instrumentation")
5455
.setVersion("1")
5556
.setAttributes(Attributes.builder().put("key", "value").build())
5657
.build())
58+
.setEventName("event name")
5759
.setBody("body1")
5860
.setSeverity(Severity.INFO)
5961
.setSeverityText("INFO")

exporters/logging-otlp/src/test/resources/expected-logs-wrapper.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
},
2828
"logRecords": [
2929
{
30+
"eventName": "event name",
3031
"timeUnixNano": "100",
3132
"observedTimeUnixNano": "200",
3233
"severityNumber": 9,

exporters/logging-otlp/src/test/resources/expected-logs.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
},
2626
"logRecords": [
2727
{
28+
"eventName": "event name",
2829
"timeUnixNano": "100",
2930
"observedTimeUnixNano": "200",
3031
"severityNumber": 9,

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

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919
import io.opentelemetry.proto.logs.v1.internal.LogRecord;
2020
import io.opentelemetry.proto.logs.v1.internal.SeverityNumber;
2121
import io.opentelemetry.sdk.logs.data.LogRecordData;
22+
import io.opentelemetry.sdk.logs.data.internal.ExtendedLogRecordData;
2223
import java.io.IOException;
2324
import javax.annotation.Nullable;
2425

2526
final class LogMarshaler extends MarshalerWithSize {
2627
private static final String INVALID_TRACE_ID = TraceId.getInvalid();
2728
private static final String INVALID_SPAN_ID = SpanId.getInvalid();
29+
private static final byte[] EMPTY_BYTES = new byte[0];
2830

2931
private final long timeUnixNano;
3032
private final long observedTimeUnixNano;
@@ -36,6 +38,7 @@ final class LogMarshaler extends MarshalerWithSize {
3638
private final TraceFlags traceFlags;
3739
@Nullable private final String traceId;
3840
@Nullable private final String spanId;
41+
private final byte[] eventName;
3942

4043
static LogMarshaler create(LogRecordData logRecordData) {
4144
KeyValueMarshaler[] attributeMarshalers =
@@ -57,7 +60,10 @@ static LogMarshaler create(LogRecordData logRecordData) {
5760
logRecordData.getTotalAttributeCount() - logRecordData.getAttributes().size(),
5861
spanContext.getTraceFlags(),
5962
spanContext.getTraceId().equals(INVALID_TRACE_ID) ? null : spanContext.getTraceId(),
60-
spanContext.getSpanId().equals(INVALID_SPAN_ID) ? null : spanContext.getSpanId());
63+
spanContext.getSpanId().equals(INVALID_SPAN_ID) ? null : spanContext.getSpanId(),
64+
logRecordData instanceof ExtendedLogRecordData
65+
? MarshalerUtil.toBytes(((ExtendedLogRecordData) logRecordData).getEventName())
66+
: EMPTY_BYTES);
6167
}
6268

6369
private LogMarshaler(
@@ -70,7 +76,8 @@ private LogMarshaler(
7076
int droppedAttributesCount,
7177
TraceFlags traceFlags,
7278
@Nullable String traceId,
73-
@Nullable String spanId) {
79+
@Nullable String spanId,
80+
byte[] eventName) {
7481
super(
7582
calculateSize(
7683
timeUnixNano,
@@ -82,7 +89,8 @@ private LogMarshaler(
8289
droppedAttributesCount,
8390
traceFlags,
8491
traceId,
85-
spanId));
92+
spanId,
93+
eventName));
8694
this.timeUnixNano = timeUnixNano;
8795
this.observedTimeUnixNano = observedTimeUnixNano;
8896
this.traceId = traceId;
@@ -93,6 +101,7 @@ private LogMarshaler(
93101
this.anyValueMarshaler = anyValueMarshaler;
94102
this.attributeMarshalers = attributeMarshalers;
95103
this.droppedAttributesCount = droppedAttributesCount;
104+
this.eventName = eventName;
96105
}
97106

98107
@Override
@@ -115,6 +124,8 @@ protected void writeTo(Serializer output) throws IOException {
115124
output.serializeByteAsFixed32(LogRecord.FLAGS, traceFlags.asByte());
116125
output.serializeTraceId(LogRecord.TRACE_ID, traceId);
117126
output.serializeSpanId(LogRecord.SPAN_ID, spanId);
127+
128+
output.serializeString(LogRecord.EVENT_NAME, eventName);
118129
}
119130

120131
private static int calculateSize(
@@ -127,7 +138,8 @@ private static int calculateSize(
127138
int droppedAttributesCount,
128139
TraceFlags traceFlags,
129140
@Nullable String traceId,
130-
@Nullable String spanId) {
141+
@Nullable String spanId,
142+
byte[] eventName) {
131143
int size = 0;
132144
size += MarshalerUtil.sizeFixed64(LogRecord.TIME_UNIX_NANO, timeUnixNano);
133145

@@ -147,6 +159,8 @@ private static int calculateSize(
147159
size += MarshalerUtil.sizeByteAsFixed32(LogRecord.FLAGS, traceFlags.asByte());
148160
size += MarshalerUtil.sizeTraceId(LogRecord.TRACE_ID, traceId);
149161
size += MarshalerUtil.sizeSpanId(LogRecord.SPAN_ID, spanId);
162+
163+
size += MarshalerUtil.sizeBytes(LogRecord.EVENT_NAME, eventName);
150164
return size;
151165
}
152166

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import io.opentelemetry.exporter.internal.otlp.AttributeKeyValueStatelessMarshaler;
2020
import io.opentelemetry.proto.logs.v1.internal.LogRecord;
2121
import io.opentelemetry.sdk.logs.data.LogRecordData;
22+
import io.opentelemetry.sdk.logs.data.internal.ExtendedLogRecordData;
2223
import java.io.IOException;
2324

2425
/** See {@link LogMarshaler}. */
@@ -55,6 +56,10 @@ public void writeTo(Serializer output, LogRecordData log, MarshalerContext conte
5556
if (!spanContext.getSpanId().equals(INVALID_SPAN_ID)) {
5657
output.serializeSpanId(LogRecord.SPAN_ID, spanContext.getSpanId(), context);
5758
}
59+
if (log instanceof ExtendedLogRecordData) {
60+
output.serializeStringWithContext(
61+
LogRecord.EVENT_NAME, ((ExtendedLogRecordData) log).getEventName(), context);
62+
}
5863
}
5964

6065
@Override
@@ -93,6 +98,12 @@ public int getBinarySerializedSize(LogRecordData log, MarshalerContext context)
9398
size += MarshalerUtil.sizeSpanId(LogRecord.SPAN_ID, spanContext.getSpanId());
9499
}
95100

101+
if (log instanceof ExtendedLogRecordData) {
102+
size +=
103+
StatelessMarshalerUtil.sizeStringWithContext(
104+
LogRecord.EVENT_NAME, ((ExtendedLogRecordData) log).getEventName(), context);
105+
}
106+
96107
return size;
97108
}
98109
}

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
3434
import io.opentelemetry.sdk.logs.data.LogRecordData;
3535
import io.opentelemetry.sdk.resources.Resource;
36-
import io.opentelemetry.sdk.testing.logs.TestLogRecordData;
36+
import io.opentelemetry.sdk.testing.logs.internal.TestExtendedLogRecordData;
3737
import java.io.ByteArrayOutputStream;
3838
import java.io.IOException;
3939
import java.io.UncheckedIOException;
@@ -52,14 +52,15 @@ class LogsRequestMarshalerTest {
5252
private static final String TRACE_ID = TraceId.fromBytes(TRACE_ID_BYTES);
5353
private static final byte[] SPAN_ID_BYTES = new byte[] {0, 0, 0, 0, 4, 3, 2, 1};
5454
private static final String SPAN_ID = SpanId.fromBytes(SPAN_ID_BYTES);
55+
private static final String EVENT_NAME = "hello";
5556
private static final String BODY = "Hello world from this log...";
5657

5758
@Test
5859
void toProtoResourceLogs() {
5960
ResourceLogsMarshaler[] resourceLogsMarshalers =
6061
ResourceLogsMarshaler.create(
6162
Collections.singleton(
62-
TestLogRecordData.builder()
63+
TestExtendedLogRecordData.builder()
6364
.setResource(
6465
Resource.builder().put("one", 1).setSchemaUrl("http://url").build())
6566
.setInstrumentationScopeInfo(
@@ -68,6 +69,7 @@ void toProtoResourceLogs() {
6869
.setSchemaUrl("http://url")
6970
.setAttributes(Attributes.builder().put("key", "value").build())
7071
.build())
72+
.setEventName(EVENT_NAME)
7173
.setBody(BODY)
7274
.setSeverity(Severity.INFO)
7375
.setSeverityText("INFO")
@@ -108,11 +110,12 @@ void toProtoLogRecord(MarshalerSource marshalerSource) {
108110
parse(
109111
LogRecord.getDefaultInstance(),
110112
marshalerSource.create(
111-
TestLogRecordData.builder()
113+
TestExtendedLogRecordData.builder()
112114
.setResource(
113115
Resource.create(Attributes.builder().put("testKey", "testValue").build()))
114116
.setInstrumentationScopeInfo(
115117
InstrumentationScopeInfo.builder("instrumentation").setVersion("1").build())
118+
.setEventName(EVENT_NAME)
116119
.setBody(BODY)
117120
.setSeverity(Severity.INFO)
118121
.setSeverityText("INFO")
@@ -128,6 +131,7 @@ void toProtoLogRecord(MarshalerSource marshalerSource) {
128131
assertThat(logRecord.getTraceId().toByteArray()).isEqualTo(TRACE_ID_BYTES);
129132
assertThat(logRecord.getSpanId().toByteArray()).isEqualTo(SPAN_ID_BYTES);
130133
assertThat(logRecord.getSeverityText()).isEqualTo("INFO");
134+
assertThat(logRecord.getEventName()).isEqualTo(EVENT_NAME);
131135
assertThat(logRecord.getBody()).isEqualTo(AnyValue.newBuilder().setStringValue(BODY).build());
132136
assertThat(logRecord.getAttributesList())
133137
.containsExactly(
@@ -147,7 +151,7 @@ void toProtoLogRecord_MinimalFields(MarshalerSource marshalerSource) {
147151
parse(
148152
LogRecord.getDefaultInstance(),
149153
marshalerSource.create(
150-
TestLogRecordData.builder()
154+
TestExtendedLogRecordData.builder()
151155
.setResource(
152156
Resource.create(Attributes.builder().put("testKey", "testValue").build()))
153157
.setInstrumentationScopeInfo(

0 commit comments

Comments
 (0)