From 9e1e9c6e9fb6c655e43f010b1a9c62b44c67114e Mon Sep 17 00:00:00 2001 From: jack-berg <34418638+jack-berg@users.noreply.github.com> Date: Thu, 17 Apr 2025 12:30:43 -0500 Subject: [PATCH] Stabilize log record event name (#7277) --- .../api/logs/LogRecordBuilder.java | 10 ++++++++++ .../logs/ExtendedLogRecordBuilder.java | 17 ++++++++-------- .../internal/AbstractDefaultLoggerTest.java | 3 +-- .../current_vs_latest/opentelemetry-api.txt | 4 +++- .../opentelemetry-sdk-logs.txt | 9 ++++++++- .../opentelemetry-sdk-testing.txt | 10 ++++++++++ .../internal/otlp/logs/LogMarshaler.java | 6 +----- .../otlp/logs/LogStatelessMarshaler.java | 14 ++++--------- .../sdk/logs/ExtendedSdkLogRecordBuilder.java | 3 +-- .../sdk/logs/ExtendedSdkLogRecordData.java | 8 ++++++-- .../logs/ExtendedSdkReadWriteLogRecord.java | 5 ++--- .../sdk/logs/ReadWriteLogRecord.java | 6 +++++- .../sdk/logs/SdkLogRecordBuilder.java | 10 +++++++++- .../sdk/logs/SdkLogRecordData.java | 10 ++++++++-- .../sdk/logs/SdkReadWriteLogRecord.java | 20 +++++++++++++++---- .../sdk/logs/data/LogRecordData.java | 6 ++++++ .../data/internal/ExtendedLogRecordData.java | 4 ---- .../sdk/logs/ReadWriteLogRecordTest.java | 3 ++- .../sdk/logs/SdkLogRecordBuilderTest.java | 5 +++-- .../sdk/logs/SdkLoggerProviderTest.java | 6 ++---- .../testing/assertj/LogRecordDataAssert.java | 14 ++++++++++++- .../sdk/testing/logs/TestLogRecordData.java | 7 +++++++ .../internal/TestExtendedLogRecordData.java | 6 +++++- .../testing/assertj/LogAssertionsTest.java | 4 ++-- 24 files changed, 133 insertions(+), 57 deletions(-) diff --git a/api/all/src/main/java/io/opentelemetry/api/logs/LogRecordBuilder.java b/api/all/src/main/java/io/opentelemetry/api/logs/LogRecordBuilder.java index 0cc3dcdf31..cadd5b4745 100644 --- a/api/all/src/main/java/io/opentelemetry/api/logs/LogRecordBuilder.java +++ b/api/all/src/main/java/io/opentelemetry/api/logs/LogRecordBuilder.java @@ -198,6 +198,16 @@ public interface LogRecordBuilder { return setAttribute(key, (long) value); } + /** + * Sets the event name, which identifies the class / type of the Event. + * + *

This name should uniquely identify the event structure (both attributes and body). A log + * record with a non-empty event name is an Event. + */ + default LogRecordBuilder setEventName(String eventName) { + return this; + } + /** Emit the log record. */ void emit(); } diff --git a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedLogRecordBuilder.java b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedLogRecordBuilder.java index 6395768f36..de25aabe4d 100644 --- a/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedLogRecordBuilder.java +++ b/api/incubator/src/main/java/io/opentelemetry/api/incubator/logs/ExtendedLogRecordBuilder.java @@ -61,6 +61,15 @@ public interface ExtendedLogRecordBuilder extends LogRecordBuilder { return this; } + /** + * Sets the event name, which identifies the class / type of the Event. + * + *

This name should uniquely identify the event structure (both attributes and body). A log + * record with a non-empty event name is an Event. + */ + @Override + ExtendedLogRecordBuilder setEventName(String eventName); + /** * {@inheritDoc} * @@ -124,14 +133,6 @@ public interface ExtendedLogRecordBuilder extends LogRecordBuilder { */ ExtendedLogRecordBuilder setAttribute(ExtendedAttributeKey key, T value); - /** - * Sets the event name, which identifies the class / type of the Event. - * - *

This name should uniquely identify the event structure (both attributes and body). A log - * record with a non-empty event name is an Event. - */ - ExtendedLogRecordBuilder setEventName(String eventName); - /** Set standard {@code exception.*} attributes based on the {@code throwable}. */ ExtendedLogRecordBuilder setException(Throwable throwable); } diff --git a/api/testing-internal/src/main/java/io/opentelemetry/api/testing/internal/AbstractDefaultLoggerTest.java b/api/testing-internal/src/main/java/io/opentelemetry/api/testing/internal/AbstractDefaultLoggerTest.java index 4b38e6fab1..0b4e9eb98e 100644 --- a/api/testing-internal/src/main/java/io/opentelemetry/api/testing/internal/AbstractDefaultLoggerTest.java +++ b/api/testing-internal/src/main/java/io/opentelemetry/api/testing/internal/AbstractDefaultLoggerTest.java @@ -51,8 +51,7 @@ public abstract class AbstractDefaultLoggerTest { () -> getLogger() .logRecordBuilder() - // TODO (trask) once event name stabilizes - // .setEventName("event name") + .setEventName("event name") .setTimestamp(100, TimeUnit.SECONDS) .setTimestamp(Instant.now()) .setObservedTimestamp(100, TimeUnit.SECONDS) diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-api.txt b/docs/apidiffs/current_vs_latest/opentelemetry-api.txt index 41abbe49ce..d095106aa5 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-api.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-api.txt @@ -1,2 +1,4 @@ Comparing source compatibility of opentelemetry-api-1.50.0-SNAPSHOT.jar against opentelemetry-api-1.49.0.jar -No changes. \ No newline at end of file +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.api.logs.LogRecordBuilder (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) io.opentelemetry.api.logs.LogRecordBuilder setEventName(java.lang.String) diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt index 334c753150..b7524f3f9c 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-logs.txt @@ -1,2 +1,9 @@ Comparing source compatibility of opentelemetry-sdk-logs-1.50.0-SNAPSHOT.jar against opentelemetry-sdk-logs-1.49.0.jar -No changes. \ No newline at end of file +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.sdk.logs.data.LogRecordData (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) java.lang.String getEventName() + +++ NEW ANNOTATION: javax.annotation.Nullable +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.sdk.logs.ReadWriteLogRecord (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) java.lang.String getEventName() + +++ NEW ANNOTATION: javax.annotation.Nullable diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt index cdc87b76ae..b7af8bfe5a 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-testing.txt @@ -1,4 +1,14 @@ Comparing source compatibility of opentelemetry-sdk-testing-1.50.0-SNAPSHOT.jar against opentelemetry-sdk-testing-1.49.0.jar +*** MODIFIED CLASS: PUBLIC FINAL io.opentelemetry.sdk.testing.assertj.LogRecordDataAssert (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) io.opentelemetry.sdk.testing.assertj.LogRecordDataAssert hasEventName(java.lang.String) +**** MODIFIED CLASS: PUBLIC ABSTRACT io.opentelemetry.sdk.testing.logs.TestLogRecordData (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++* NEW METHOD: PUBLIC(+) ABSTRACT(+) java.lang.String getEventName() + +++ NEW ANNOTATION: javax.annotation.Nullable +**** MODIFIED CLASS: PUBLIC ABSTRACT STATIC io.opentelemetry.sdk.testing.logs.TestLogRecordData$Builder (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++* NEW METHOD: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.testing.logs.TestLogRecordData$Builder setEventName(java.lang.String) +++ NEW CLASS: PUBLIC(+) ABSTRACT(+) io.opentelemetry.sdk.testing.metrics.TestMetricData (not serializable) +++ CLASS FILE FORMAT VERSION: 52.0 <- n.a. +++ NEW SUPERCLASS: java.lang.Object diff --git a/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/logs/LogMarshaler.java b/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/logs/LogMarshaler.java index 343d158cf8..713fba7ded 100644 --- a/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/logs/LogMarshaler.java +++ b/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/logs/LogMarshaler.java @@ -20,7 +20,6 @@ import io.opentelemetry.exporter.internal.otlp.KeyValueMarshaler; import io.opentelemetry.proto.logs.v1.internal.LogRecord; import io.opentelemetry.proto.logs.v1.internal.SeverityNumber; import io.opentelemetry.sdk.logs.data.LogRecordData; -import io.opentelemetry.sdk.logs.data.internal.ExtendedLogRecordData; import java.io.IOException; import javax.annotation.Nullable; @@ -40,7 +39,6 @@ final class LogMarshaler extends MarshalerWithSize { private static final String INVALID_TRACE_ID = TraceId.getInvalid(); private static final String INVALID_SPAN_ID = SpanId.getInvalid(); - private static final byte[] EMPTY_BYTES = new byte[0]; private final long timeUnixNano; private final long observedTimeUnixNano; @@ -82,9 +80,7 @@ final class LogMarshaler extends MarshalerWithSize { spanContext.getTraceFlags(), spanContext.getTraceId().equals(INVALID_TRACE_ID) ? null : spanContext.getTraceId(), spanContext.getSpanId().equals(INVALID_SPAN_ID) ? null : spanContext.getSpanId(), - logRecordData instanceof ExtendedLogRecordData - ? MarshalerUtil.toBytes(((ExtendedLogRecordData) logRecordData).getEventName()) - : EMPTY_BYTES); + MarshalerUtil.toBytes(logRecordData.getEventName())); } private LogMarshaler( diff --git a/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/logs/LogStatelessMarshaler.java b/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/logs/LogStatelessMarshaler.java index 331f7440a0..e8b533e170 100644 --- a/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/logs/LogStatelessMarshaler.java +++ b/exporters/otlp/common/src/main/java/io/opentelemetry/exporter/internal/otlp/logs/LogStatelessMarshaler.java @@ -20,7 +20,6 @@ import io.opentelemetry.exporter.internal.otlp.AttributeKeyValueStatelessMarshal import io.opentelemetry.exporter.internal.otlp.IncubatingUtil; import io.opentelemetry.proto.logs.v1.internal.LogRecord; import io.opentelemetry.sdk.logs.data.LogRecordData; -import io.opentelemetry.sdk.logs.data.internal.ExtendedLogRecordData; import java.io.IOException; /** See {@link LogMarshaler}. */ @@ -79,10 +78,7 @@ final class LogStatelessMarshaler implements StatelessMarshaler { if (!spanContext.getSpanId().equals(INVALID_SPAN_ID)) { output.serializeSpanId(LogRecord.SPAN_ID, spanContext.getSpanId(), context); } - if (log instanceof ExtendedLogRecordData) { - output.serializeStringWithContext( - LogRecord.EVENT_NAME, ((ExtendedLogRecordData) log).getEventName(), context); - } + output.serializeStringWithContext(LogRecord.EVENT_NAME, log.getEventName(), context); } @Override @@ -130,11 +126,9 @@ final class LogStatelessMarshaler implements StatelessMarshaler { size += MarshalerUtil.sizeSpanId(LogRecord.SPAN_ID, spanContext.getSpanId()); } - if (log instanceof ExtendedLogRecordData) { - size += - StatelessMarshalerUtil.sizeStringWithContext( - LogRecord.EVENT_NAME, ((ExtendedLogRecordData) log).getEventName(), context); - } + size += + StatelessMarshalerUtil.sizeStringWithContext( + LogRecord.EVENT_NAME, log.getEventName(), context); return size; } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordBuilder.java index b38f4579e9..9fabc98b9e 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordBuilder.java @@ -23,7 +23,6 @@ import javax.annotation.Nullable; final class ExtendedSdkLogRecordBuilder extends SdkLogRecordBuilder implements ExtendedLogRecordBuilder { - @Nullable private String eventName; @Nullable private ExtendedAttributesMap extendedAttributes; ExtendedSdkLogRecordBuilder( @@ -33,7 +32,7 @@ final class ExtendedSdkLogRecordBuilder extends SdkLogRecordBuilder @Override public ExtendedSdkLogRecordBuilder setEventName(String eventName) { - this.eventName = eventName; + super.setEventName(eventName); return this; } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordData.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordData.java index 495f826624..14f1e9a398 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordData.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkLogRecordData.java @@ -44,15 +44,19 @@ abstract class ExtendedSdkLogRecordData implements ExtendedLogRecordData { severity, severityText, totalAttributeCount, - eventName, attributes, - body); + body, + eventName); } @Override @Nullable public abstract Value getBodyValue(); + @Override + @Nullable + public abstract String getEventName(); + @Override @SuppressWarnings("deprecation") // Implementation of deprecated method public io.opentelemetry.sdk.logs.data.Body getBody() { diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkReadWriteLogRecord.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkReadWriteLogRecord.java index ef3789d44d..0cd5c78566 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkReadWriteLogRecord.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ExtendedSdkReadWriteLogRecord.java @@ -25,7 +25,6 @@ import javax.annotation.concurrent.ThreadSafe; class ExtendedSdkReadWriteLogRecord extends SdkReadWriteLogRecord implements ExtendedReadWriteLogRecord { - @Nullable private final String eventName; private final Object lock = new Object(); @GuardedBy("lock") @@ -55,8 +54,8 @@ class ExtendedSdkReadWriteLogRecord extends SdkReadWriteLogRecord severity, severityText, body, - null); - this.eventName = eventName; + null, + eventName); this.extendedAttributes = extendedAttributes; } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ReadWriteLogRecord.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ReadWriteLogRecord.java index 8b69483d2a..511f6cf641 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ReadWriteLogRecord.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/ReadWriteLogRecord.java @@ -52,7 +52,11 @@ public interface ReadWriteLogRecord { /** Return an immutable {@link LogRecordData} instance representing this log record. */ LogRecordData toLogRecordData(); - // TODO (trask) once event name stabilizes, add getEventName() + /** Returns the log record event name, or {@code null} if none is set. */ + @Nullable + default String getEventName() { + return null; + } /** * Returns the value of a given attribute if it exists. This is the equivalent of calling {@code diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java index 038338d657..1fa7892639 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilder.java @@ -30,6 +30,7 @@ class SdkLogRecordBuilder implements LogRecordBuilder { protected Severity severity = Severity.UNDEFINED_SEVERITY_NUMBER; @Nullable protected String severityText; @Nullable protected Value body; + @Nullable protected String eventName; @Nullable private AttributesMap attributes; SdkLogRecordBuilder( @@ -39,6 +40,12 @@ class SdkLogRecordBuilder implements LogRecordBuilder { this.instrumentationScopeInfo = instrumentationScopeInfo; } + @Override + public SdkLogRecordBuilder setEventName(String eventName) { + this.eventName = eventName; + return this; + } + @Override public SdkLogRecordBuilder setTimestamp(long timestamp, TimeUnit unit) { this.timestampEpochNanos = unit.toNanos(timestamp); @@ -132,6 +139,7 @@ class SdkLogRecordBuilder implements LogRecordBuilder { severity, severityText, body, - attributes)); + attributes, + eventName)); } } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordData.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordData.java index 1927a0ec57..5fa5b15605 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordData.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkLogRecordData.java @@ -33,7 +33,8 @@ abstract class SdkLogRecordData implements LogRecordData { @Nullable String severityText, @Nullable Value body, Attributes attributes, - int totalAttributeCount) { + int totalAttributeCount, + @Nullable String eventName) { return new AutoValue_SdkLogRecordData( resource, instrumentationScopeInfo, @@ -44,13 +45,18 @@ abstract class SdkLogRecordData implements LogRecordData { severityText, attributes, totalAttributeCount, - body); + body, + eventName); } @Override @Nullable public abstract Value getBodyValue(); + @Override + @Nullable + public abstract String getEventName(); + @Override @SuppressWarnings("deprecation") // Implementation of deprecated method public io.opentelemetry.sdk.logs.data.Body getBody() { diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkReadWriteLogRecord.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkReadWriteLogRecord.java index 8b73a8eacb..ee3bc5b385 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkReadWriteLogRecord.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/SdkReadWriteLogRecord.java @@ -30,6 +30,7 @@ class SdkReadWriteLogRecord implements ReadWriteLogRecord { protected final Severity severity; @Nullable protected final String severityText; @Nullable protected final Value body; + @Nullable protected String eventName; private final Object lock = new Object(); @GuardedBy("lock") @@ -46,7 +47,8 @@ class SdkReadWriteLogRecord implements ReadWriteLogRecord { Severity severity, @Nullable String severityText, @Nullable Value body, - @Nullable AttributesMap attributes) { + @Nullable AttributesMap attributes, + @Nullable String eventName) { this.logLimits = logLimits; this.resource = resource; this.instrumentationScopeInfo = instrumentationScopeInfo; @@ -56,6 +58,7 @@ class SdkReadWriteLogRecord implements ReadWriteLogRecord { this.severity = severity; this.severityText = severityText; this.body = body; + this.eventName = eventName; this.attributes = attributes; } @@ -70,7 +73,8 @@ class SdkReadWriteLogRecord implements ReadWriteLogRecord { Severity severity, @Nullable String severityText, @Nullable Value body, - @Nullable AttributesMap attributes) { + @Nullable AttributesMap attributes, + @Nullable String eventName) { return new SdkReadWriteLogRecord( logLimits, resource, @@ -81,7 +85,8 @@ class SdkReadWriteLogRecord implements ReadWriteLogRecord { severity, severityText, body, - attributes); + attributes, + eventName); } @Override @@ -122,7 +127,8 @@ class SdkReadWriteLogRecord implements ReadWriteLogRecord { severityText, body, getImmutableAttributes(), - attributes == null ? 0 : attributes.getTotalAddedValues()); + attributes == null ? 0 : attributes.getTotalAddedValues(), + eventName); } } @@ -168,6 +174,12 @@ class SdkReadWriteLogRecord implements ReadWriteLogRecord { return getImmutableAttributes(); } + @Override + @Nullable + public String getEventName() { + return eventName; + } + @Nullable @Override public T getAttribute(AttributeKey key) { diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogRecordData.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogRecordData.java index f21b175f52..1fa3725103 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogRecordData.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/LogRecordData.java @@ -82,4 +82,10 @@ public interface LogRecordData { * LogLimits#getMaxNumberOfAttributes()}. */ int getTotalAttributeCount(); + + /** Returns the event name, or {@code null} if none is set. */ + @Nullable + default String getEventName() { + return null; + } } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/internal/ExtendedLogRecordData.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/internal/ExtendedLogRecordData.java index 9cfc40b423..6571080732 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/internal/ExtendedLogRecordData.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/data/internal/ExtendedLogRecordData.java @@ -8,7 +8,6 @@ package io.opentelemetry.sdk.logs.data.internal; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.incubator.common.ExtendedAttributes; import io.opentelemetry.sdk.logs.data.LogRecordData; -import javax.annotation.Nullable; /** * This class is internal and experimental. Its APIs are unstable and can change at any time. Its @@ -17,9 +16,6 @@ import javax.annotation.Nullable; */ public interface ExtendedLogRecordData extends LogRecordData { - @Nullable - String getEventName(); - /** Returns the attributes for this log, or {@link ExtendedAttributes#empty()} if unset. */ ExtendedAttributes getExtendedAttributes(); diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/ReadWriteLogRecordTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/ReadWriteLogRecordTest.java index 7a444817d4..3dfca08f04 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/ReadWriteLogRecordTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/ReadWriteLogRecordTest.java @@ -68,6 +68,7 @@ class ReadWriteLogRecordTest { Severity.DEBUG, "buggin", body, - initialAttributes); + initialAttributes, + "my.event.name"); } } diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilderTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilderTest.java index c6f947bc06..7d067cef49 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilderTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLogRecordBuilderTest.java @@ -65,6 +65,7 @@ class SdkLogRecordBuilderTest { Instant timestamp = Instant.now(); Instant observedTimestamp = Instant.now().plusNanos(100); + String eventName = "my.event.name"; String bodyStr = "body"; String sevText = "sevText"; Severity severity = Severity.DEBUG3; @@ -75,6 +76,7 @@ class SdkLogRecordBuilderTest { TraceFlags.getSampled(), TraceState.getDefault()); + builder.setEventName(eventName); builder.setBody(bodyStr); builder.setTimestamp(123, TimeUnit.SECONDS); builder.setTimestamp(timestamp); @@ -90,8 +92,7 @@ class SdkLogRecordBuilderTest { assertThat(emittedLog.get().toLogRecordData()) .hasResource(RESOURCE) .hasInstrumentationScope(SCOPE_INFO) - // TODO (trask) once event name stabilizes - // .hasEventName(eventName) + .hasEventName(eventName) .hasBody(bodyStr) .hasTimestamp(TimeUnit.SECONDS.toNanos(timestamp.getEpochSecond()) + timestamp.getNano()) .hasObservedTimestamp( diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLoggerProviderTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLoggerProviderTest.java index 63063731ac..31e1e23551 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLoggerProviderTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/SdkLoggerProviderTest.java @@ -246,8 +246,7 @@ class SdkLoggerProviderTest { sdkLoggerProvider .get("test") .logRecordBuilder() - // TODO (trask) once event name stabilizes - // .setEventName("event name") + .setEventName("my.event.name") .setTimestamp(100, TimeUnit.NANOSECONDS) .setContext(Span.wrap(spanContext).storeInContext(Context.root())) .setSeverity(Severity.DEBUG) @@ -260,8 +259,7 @@ class SdkLoggerProviderTest { assertThat(logRecordData.get()) .hasResource(resource) .hasInstrumentationScope(InstrumentationScopeInfo.create("test")) - // TODO (trask) once event name stabilizes - // .hasEventName("event name") + .hasEventName("my.event.name") .hasTimestamp(100) .hasSpanContext(spanContext) .hasSeverity(Severity.DEBUG) diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/assertj/LogRecordDataAssert.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/assertj/LogRecordDataAssert.java index 323e5b7813..1a3daf3cbd 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/assertj/LogRecordDataAssert.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/assertj/LogRecordDataAssert.java @@ -84,7 +84,19 @@ public final class LogRecordDataAssert extends AbstractAssert but was <%s>", + eventName, + actual.getEventName()); + } + return this; + } /** Asserts the log has the given epoch {@code timestamp}. */ public LogRecordDataAssert hasTimestamp(long timestampEpochNanos) { diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/logs/TestLogRecordData.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/logs/TestLogRecordData.java index ec2e37294f..82ef26f9ef 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/logs/TestLogRecordData.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/logs/TestLogRecordData.java @@ -60,6 +60,10 @@ public abstract class TestLogRecordData implements LogRecordData { @Nullable public abstract Value getBodyValue(); + @Override + @Nullable + public abstract String getEventName(); + TestLogRecordData() {} /** A {@code Builder} class for {@link TestLogRecordData}. */ @@ -173,5 +177,8 @@ public abstract class TestLogRecordData implements LogRecordData { /** Set the total attribute count. */ public abstract Builder setTotalAttributeCount(int totalAttributeCount); + + /** Set the event name. */ + public abstract Builder setEventName(String eventName); } } diff --git a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/logs/internal/TestExtendedLogRecordData.java b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/logs/internal/TestExtendedLogRecordData.java index 10c69da9cd..914927c28b 100644 --- a/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/logs/internal/TestExtendedLogRecordData.java +++ b/sdk/testing/src/main/java/io/opentelemetry/sdk/testing/logs/internal/TestExtendedLogRecordData.java @@ -29,7 +29,6 @@ import javax.annotation.concurrent.Immutable; * * @since 1.27.0 */ -// TODO (trask) delete this class once event name stabilizes @Immutable @AutoValue @AutoValue.CopyAnnotations @@ -67,6 +66,10 @@ public abstract class TestExtendedLogRecordData implements ExtendedLogRecordData @Nullable public abstract Value getBodyValue(); + @Override + @Nullable + public abstract String getEventName(); + TestExtendedLogRecordData() {} /** @@ -93,6 +96,7 @@ public abstract class TestExtendedLogRecordData implements ExtendedLogRecordData public abstract Builder setInstrumentationScopeInfo( InstrumentationScopeInfo instrumentationScopeInfo); + /** Sets the event name. */ public abstract Builder setEventName(String eventName); /** diff --git a/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/assertj/LogAssertionsTest.java b/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/assertj/LogAssertionsTest.java index 165848c7f7..d15e3878cb 100644 --- a/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/assertj/LogAssertionsTest.java +++ b/sdk/testing/src/test/java/io/opentelemetry/sdk/testing/assertj/LogAssertionsTest.java @@ -107,8 +107,7 @@ public class LogAssertionsTest { satisfies(DOG, val -> val.startsWith("bar")), satisfies(AttributeKey.booleanKey("dog is cute"), val -> val.isTrue()))) .hasInstrumentationScope(INSTRUMENTATION_SCOPE_INFO) - // TODO (trask) once event name stabilizes - // .hasEventName("event name") + .hasEventName("event name") .hasTimestamp(100) .hasObservedTimestamp(200) .hasSpanContext( @@ -207,6 +206,7 @@ public class LogAssertionsTest { .isInstanceOf(AssertionError.class); assertThatThrownBy( () -> assertThat(LOG_DATA).hasInstrumentationScope(InstrumentationScopeInfo.empty())); + assertThatThrownBy(() -> assertThat(LOG_DATA).hasEventName("foo")); assertThatThrownBy(() -> assertThat(LOG_DATA).hasTimestamp(200)); assertThatThrownBy(() -> assertThat(LOG_DATA).hasObservedTimestamp(100)); assertThatThrownBy(