From 4755be0ba08bd43023e5e4eae09e74c9e6ab26c7 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Wed, 18 Oct 2023 15:27:14 -0700 Subject: [PATCH 1/8] Allow events to be emitted with timestamp --- .../api/events/DefaultEventEmitter.java | 3 +++ .../api/events/EventEmitter.java | 11 +++++++++ .../internal/SdkEventEmitterProvider.java | 7 +++++- .../internal/SdkEventEmitterProviderTest.java | 23 +++++++++++++++++++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java b/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java index 2be4164d010..9bebdc148f3 100644 --- a/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java +++ b/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java @@ -17,6 +17,9 @@ static EventEmitter getInstance() { return INSTANCE; } + @Override + public void emit(long epochNanos, String eventName, Attributes attributes) {} + @Override public void emit(String eventName, Attributes attributes) {} } diff --git a/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java b/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java index 69df8407f43..457b5915740 100644 --- a/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java +++ b/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java @@ -32,6 +32,17 @@ @ThreadSafe public interface EventEmitter { + /** + * Emit an event. + * + * @param epochNanos The time at which the event happened, in epoch nanoseconds. + * @param eventName the event name, which acts as a classifier for events. Within a particular + * event domain, event name defines a particular class or type of event. + * @param attributes attributes associated with the event + */ + @SuppressWarnings("InconsistentOverloads") + void emit(long epochNanos, String eventName, Attributes attributes); + /** * Emit an event. * diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java index 18d1e434824..db1070b9816 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java @@ -113,9 +113,14 @@ private SdkEventEmitter(Clock clock, Logger delegateLogger, String eventDomain) @Override public void emit(String eventName, Attributes attributes) { + emit(clock.now(), eventName, attributes); + } + + @Override + public void emit(long epochNanos, String eventName, Attributes attributes) { delegateLogger .logRecordBuilder() - .setTimestamp(clock.now(), TimeUnit.NANOSECONDS) + .setTimestamp(epochNanos, TimeUnit.NANOSECONDS) .setAllAttributes(attributes) .setAttribute(EVENT_DOMAIN, eventDomain) .setAttribute(EVENT_NAME, eventName) diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java index 964c67e64c1..a086c8d7909 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java @@ -5,16 +5,19 @@ package io.opentelemetry.sdk.logs.internal; +import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.events.EventEmitter; import io.opentelemetry.sdk.common.Clock; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; import io.opentelemetry.sdk.logs.ReadWriteLogRecord; import io.opentelemetry.sdk.logs.SdkLoggerProvider; import io.opentelemetry.sdk.resources.Resource; +import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import org.junit.jupiter.api.Test; @@ -91,4 +94,24 @@ void emit_NoDomain() { .put("event.name", "event-name") .build()); } + + @Test + void emit_withTimestamp() { + long yesterday = System.nanoTime() - TimeUnit.DAYS.toNanos(1); + Attributes attributes = Attributes.of(stringKey("foo"), "bar"); + + EventEmitter emitter = eventEmitterProvider.eventEmitterBuilder("test-scope").build(); + + emitter.emit(yesterday, "testing", attributes); + + assertThat(seenLog.get().toLogRecordData()) + .hasResource(RESOURCE) + .hasInstrumentationScope(InstrumentationScopeInfo.create("test-scope")) + .hasTimestamp(yesterday) + .hasAttributes( + attributes.toBuilder() + .put("event.domain", "unknown") + .put("event.name", "testing") + .build()); + } } From db38619aa7d187d4b0c091c564d7972df9c2873f Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Thu, 19 Oct 2023 08:23:31 -0700 Subject: [PATCH 2/8] add coverage --- .../opentelemetry/api/events/DefaultEventEmitterTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java b/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java index fb6bcabfc91..a94b6bf2ed3 100644 --- a/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java +++ b/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java @@ -22,4 +22,11 @@ void emit() { .emit("event-name", Attributes.builder().put("key1", "value1").build())) .doesNotThrowAnyException(); } + + @Test + void emitWithTimestamp() { + EventEmitter emitter = DefaultEventEmitter.getInstance(); + Attributes attributes = Attributes.builder().put("key1", "value1").build(); + assertThatCode(() -> emitter.emit(System.nanoTime(), "event-name", attributes)); + } } From 4a083d93288059536b916a641d552d4ff7fe17c2 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Thu, 19 Oct 2023 08:29:53 -0700 Subject: [PATCH 3/8] whoops --- .../io/opentelemetry/api/events/DefaultEventEmitterTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java b/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java index a94b6bf2ed3..3497dfd488d 100644 --- a/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java +++ b/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java @@ -27,6 +27,7 @@ void emit() { void emitWithTimestamp() { EventEmitter emitter = DefaultEventEmitter.getInstance(); Attributes attributes = Attributes.builder().put("key1", "value1").build(); - assertThatCode(() -> emitter.emit(System.nanoTime(), "event-name", attributes)); + assertThatCode(() -> emitter.emit(System.nanoTime(), "event-name", attributes)) + .doesNotThrowAnyException(); } } From a93c3b0c512518149da3687481da860e7e6a49a7 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Tue, 24 Oct 2023 15:18:34 -0700 Subject: [PATCH 4/8] add EventBuilder --- .../api/events/DefaultEventEmitter.java | 38 ++++++++++++ .../api/events/EventBuilder.java | 24 +++++++ .../api/events/EventEmitter.java | 6 ++ .../sdk/logs/internal/SdkEventBuilder.java | 62 +++++++++++++++++++ .../internal/SdkEventEmitterProvider.java | 35 +++++++---- .../logs/internal/SdkEventBuilderTest.java | 46 ++++++++++++++ .../internal/SdkEventEmitterProviderTest.java | 19 ++++++ 7 files changed, 219 insertions(+), 11 deletions(-) create mode 100644 api/events/src/main/java/io/opentelemetry/api/events/EventBuilder.java create mode 100644 sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilder.java create mode 100644 sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilderTest.java diff --git a/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java b/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java index 9bebdc148f3..98da9910daf 100644 --- a/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java +++ b/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java @@ -22,4 +22,42 @@ public void emit(long epochNanos, String eventName, Attributes attributes) {} @Override public void emit(String eventName, Attributes attributes) {} + + @Override + public EventBuilder builder() { + return NoOpEventBuilder.INSTANCE; + } + + @Override + public EventBuilder builder(String eventName) { + return NoOpEventBuilder.INSTANCE; + } + + @Override + public EventBuilder builder(String eventName, Attributes attributes) { + return NoOpEventBuilder.INSTANCE; + } + + private static class NoOpEventBuilder implements EventBuilder { + + public static final EventBuilder INSTANCE = new NoOpEventBuilder(); + + @Override + public EventBuilder setEventName(String eventName) { + return this; + } + + @Override + public EventBuilder setAttributes(Attributes attributes) { + return this; + } + + @Override + public EventBuilder setTimestamp(long epochNanos) { + return this; + } + + @Override + public void emit() {} + } } diff --git a/api/events/src/main/java/io/opentelemetry/api/events/EventBuilder.java b/api/events/src/main/java/io/opentelemetry/api/events/EventBuilder.java new file mode 100644 index 00000000000..348c7732d08 --- /dev/null +++ b/api/events/src/main/java/io/opentelemetry/api/events/EventBuilder.java @@ -0,0 +1,24 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.api.events; + +import io.opentelemetry.api.common.Attributes; + +/** The EventBuilder is used to emit() events. */ +public interface EventBuilder { + + /** Set the name of the event. */ + EventBuilder setEventName(String eventName); + + /** Set the attributes to attach to the event. */ + EventBuilder setAttributes(Attributes attributes); + + /** Sets the timestamp for the event. */ + EventBuilder setTimestamp(long epochNanos); + + /** Emit an event. */ + void emit(); +} diff --git a/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java b/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java index 457b5915740..bfcaf064be0 100644 --- a/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java +++ b/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java @@ -51,4 +51,10 @@ public interface EventEmitter { * @param attributes attributes associated with the event */ void emit(String eventName, Attributes attributes); + + EventBuilder builder(); + + EventBuilder builder(String eventName); + + EventBuilder builder(String eventName, Attributes attributes); } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilder.java new file mode 100644 index 00000000000..aede08ccf13 --- /dev/null +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilder.java @@ -0,0 +1,62 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.logs.internal; + +import static io.opentelemetry.sdk.logs.internal.SdkEventEmitterProvider.EVENT_DOMAIN; +import static io.opentelemetry.sdk.logs.internal.SdkEventEmitterProvider.EVENT_NAME; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.events.EventBuilder; +import io.opentelemetry.api.logs.Logger; +import io.opentelemetry.sdk.common.Clock; +import java.util.concurrent.TimeUnit; + +class SdkEventBuilder implements EventBuilder { + private static final String DEFAULT_EVENT_NAME = "unknown-event"; + private final Clock clock; + private final Logger delegateLogger; + private final String eventDomain; + + private String eventName = DEFAULT_EVENT_NAME; + private Attributes attributes = Attributes.empty(); + private long epochNanos = Long.MIN_VALUE; + + SdkEventBuilder(Clock clock, Logger delegateLogger, String eventDomain) { + this.clock = clock; + this.delegateLogger = delegateLogger; + this.eventDomain = eventDomain; + } + + @Override + public EventBuilder setEventName(String eventName) { + this.eventName = eventName; + return this; + } + + @Override + public EventBuilder setAttributes(Attributes attributes) { + this.attributes = attributes; + return this; + } + + @Override + public EventBuilder setTimestamp(long epochNanos) { + this.epochNanos = epochNanos; + return this; + } + + @Override + public void emit() { + long timestamp = epochNanos == Long.MIN_VALUE ? clock.now() : epochNanos; + delegateLogger + .logRecordBuilder() + .setTimestamp(timestamp, TimeUnit.NANOSECONDS) + .setAllAttributes(attributes) + .setAttribute(EVENT_DOMAIN, eventDomain) + .setAttribute(EVENT_NAME, eventName) + .emit(); + } +} diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java index db1070b9816..a7bfb883a9e 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java @@ -7,6 +7,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.events.EventBuilder; import io.opentelemetry.api.events.EventEmitter; import io.opentelemetry.api.events.EventEmitterBuilder; import io.opentelemetry.api.events.EventEmitterProvider; @@ -14,7 +15,6 @@ import io.opentelemetry.api.logs.LoggerBuilder; import io.opentelemetry.api.logs.LoggerProvider; import io.opentelemetry.sdk.common.Clock; -import java.util.concurrent.TimeUnit; /** * SDK implementation for {@link EventEmitterProvider}. @@ -24,7 +24,10 @@ */ public final class SdkEventEmitterProvider implements EventEmitterProvider { - private static final String DEFAULT_EVENT_DOMAIN = "unknown"; + static final AttributeKey EVENT_DOMAIN = AttributeKey.stringKey("event.domain"); + static final AttributeKey EVENT_NAME = AttributeKey.stringKey("event.name"); + + static final String DEFAULT_EVENT_DOMAIN = "unknown"; private final LoggerProvider delegateLoggerProvider; private final Clock clock; @@ -98,9 +101,6 @@ public EventEmitter build() { private static class SdkEventEmitter implements EventEmitter { - private static final AttributeKey EVENT_DOMAIN = AttributeKey.stringKey("event.domain"); - private static final AttributeKey EVENT_NAME = AttributeKey.stringKey("event.name"); - private final Clock clock; private final Logger delegateLogger; private final String eventDomain; @@ -111,6 +111,21 @@ private SdkEventEmitter(Clock clock, Logger delegateLogger, String eventDomain) this.eventDomain = eventDomain; } + @Override + public EventBuilder builder() { + return new SdkEventBuilder(clock, delegateLogger, eventDomain); + } + + @Override + public EventBuilder builder(String eventName) { + return builder().setEventName(eventName); + } + + @Override + public EventBuilder builder(String eventName, Attributes attributes) { + return builder().setEventName(eventName).setAttributes(attributes); + } + @Override public void emit(String eventName, Attributes attributes) { emit(clock.now(), eventName, attributes); @@ -118,12 +133,10 @@ public void emit(String eventName, Attributes attributes) { @Override public void emit(long epochNanos, String eventName, Attributes attributes) { - delegateLogger - .logRecordBuilder() - .setTimestamp(epochNanos, TimeUnit.NANOSECONDS) - .setAllAttributes(attributes) - .setAttribute(EVENT_DOMAIN, eventDomain) - .setAttribute(EVENT_NAME, eventName) + new SdkEventBuilder(clock, delegateLogger, eventDomain) + .setTimestamp(epochNanos) + .setAttributes(attributes) + .setEventName(eventName) .emit(); } } diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilderTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilderTest.java new file mode 100644 index 00000000000..dd0aac43e05 --- /dev/null +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilderTest.java @@ -0,0 +1,46 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.logs.internal; + +import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.logs.LogRecordBuilder; +import io.opentelemetry.api.logs.Logger; +import io.opentelemetry.sdk.common.Clock; +import org.junit.jupiter.api.Test; + +class SdkEventBuilderTest { + + @Test + void emit() { + String eventDomain = "mydomain"; + String eventName = "banana"; + Attributes attributes = Attributes.of(stringKey("foo"), "bar"); + + Logger logger = mock(Logger.class); + LogRecordBuilder logRecordBuilder = mock(LogRecordBuilder.class); + when(logger.logRecordBuilder()).thenReturn(logRecordBuilder); + when(logRecordBuilder.setTimestamp(anyLong(), any())).thenReturn(logRecordBuilder); + when(logRecordBuilder.setAttribute(any(), any())).thenReturn(logRecordBuilder); + when(logRecordBuilder.setAllAttributes(any())).thenReturn(logRecordBuilder); + + new SdkEventBuilder(Clock.getDefault(), logger, eventDomain) + .setEventName(eventName) + .setTimestamp(123456L) + .setAttributes(attributes) + .emit(); + verify(logRecordBuilder).setAllAttributes(attributes); + verify(logRecordBuilder).setAttribute(stringKey("event.domain"), eventDomain); + verify(logRecordBuilder).setAttribute(stringKey("event.name"), eventName); + verify(logRecordBuilder).emit(); + } +} diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java index a086c8d7909..00437196cb2 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java @@ -114,4 +114,23 @@ void emit_withTimestamp() { .put("event.name", "testing") .build()); } + + @Test + void builder() { + long yesterday = System.nanoTime() - TimeUnit.DAYS.toNanos(1); + Attributes attributes = Attributes.of(stringKey("foo"), "bar"); + + EventEmitter emitter = eventEmitterProvider.eventEmitterBuilder("test-scope").build(); + + emitter.builder("testing", attributes).setTimestamp(yesterday).emit(); + assertThat(seenLog.get().toLogRecordData()) + .hasResource(RESOURCE) + .hasInstrumentationScope(InstrumentationScopeInfo.create("test-scope")) + .hasTimestamp(yesterday) + .hasAttributes( + attributes.toBuilder() + .put("event.domain", "unknown") + .put("event.name", "testing") + .build()); + } } From 60db1b44f783f5eb9356023ba55855b24134494f Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Tue, 24 Oct 2023 16:00:26 -0700 Subject: [PATCH 5/8] add coverage --- .../api/events/DefaultEventEmitterTest.java | 32 +++++++++++++ .../internal/SdkEventEmitterProviderTest.java | 45 ++++++++++++++----- 2 files changed, 66 insertions(+), 11 deletions(-) diff --git a/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java b/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java index 3497dfd488d..ce68d8672ff 100644 --- a/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java +++ b/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java @@ -30,4 +30,36 @@ void emitWithTimestamp() { assertThatCode(() -> emitter.emit(System.nanoTime(), "event-name", attributes)) .doesNotThrowAnyException(); } + + @Test + void builder() { + Attributes attributes = Attributes.builder().put("key1", "value1").build(); + EventEmitter emitter = DefaultEventEmitter.getInstance(); + assertThatCode( + () -> + emitter + .builder() + .setEventName("myEvent") + .setAttributes(attributes) + .setTimestamp(123456L) + .emit()) + .doesNotThrowAnyException(); + } + + @Test + void builderWithName() { + Attributes attributes = Attributes.builder().put("key1", "value1").build(); + EventEmitter emitter = DefaultEventEmitter.getInstance(); + assertThatCode( + () -> emitter.builder("myEvent").setAttributes(attributes).setTimestamp(123456L).emit()) + .doesNotThrowAnyException(); + } + + @Test + void builderWithNameAndAttrs() { + Attributes attributes = Attributes.builder().put("key1", "value1").build(); + EventEmitter emitter = DefaultEventEmitter.getInstance(); + assertThatCode(() -> emitter.builder("myEvent", attributes).setTimestamp(123456L).emit()) + .doesNotThrowAnyException(); + } } diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java index 00437196cb2..cafb6e616dc 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java @@ -104,29 +104,52 @@ void emit_withTimestamp() { emitter.emit(yesterday, "testing", attributes); - assertThat(seenLog.get().toLogRecordData()) - .hasResource(RESOURCE) - .hasInstrumentationScope(InstrumentationScopeInfo.create("test-scope")) - .hasTimestamp(yesterday) - .hasAttributes( - attributes.toBuilder() - .put("event.domain", "unknown") - .put("event.name", "testing") - .build()); + verifySeen(yesterday, attributes); } @Test - void builder() { + void builderWithNameAndAttributes() { long yesterday = System.nanoTime() - TimeUnit.DAYS.toNanos(1); Attributes attributes = Attributes.of(stringKey("foo"), "bar"); EventEmitter emitter = eventEmitterProvider.eventEmitterBuilder("test-scope").build(); emitter.builder("testing", attributes).setTimestamp(yesterday).emit(); + verifySeen(yesterday, attributes); + } + + @Test + void builderWithName() { + long yesterday = System.nanoTime() - TimeUnit.DAYS.toNanos(1); + Attributes attributes = Attributes.of(stringKey("foo"), "bar"); + + EventEmitter emitter = eventEmitterProvider.eventEmitterBuilder("test-scope").build(); + + emitter.builder("testing").setAttributes(attributes).setTimestamp(yesterday).emit(); + verifySeen(yesterday, attributes); + } + + @Test + void builder() { + long yesterday = System.nanoTime() - TimeUnit.DAYS.toNanos(1); + Attributes attributes = Attributes.of(stringKey("foo"), "bar"); + + EventEmitter emitter = eventEmitterProvider.eventEmitterBuilder("test-scope").build(); + + emitter + .builder() + .setEventName("testing") + .setAttributes(attributes) + .setTimestamp(yesterday) + .emit(); + verifySeen(yesterday, attributes); + } + + private void verifySeen(long timestamp, Attributes attributes) { assertThat(seenLog.get().toLogRecordData()) .hasResource(RESOURCE) .hasInstrumentationScope(InstrumentationScopeInfo.create("test-scope")) - .hasTimestamp(yesterday) + .hasTimestamp(timestamp) .hasAttributes( attributes.toBuilder() .put("event.domain", "unknown") From d616d6ad2dce22d76f317e72f50c49bf86f73b35 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Thu, 2 Nov 2023 14:47:31 -0700 Subject: [PATCH 6/8] remove builder overloads, remove setters for required fields --- .../api/events/DefaultEventEmitter.java | 20 ---------------- .../api/events/EventBuilder.java | 8 ------- .../api/events/EventEmitter.java | 4 ---- .../sdk/logs/internal/SdkEventBuilder.java | 23 +++++++------------ .../internal/SdkEventEmitterProvider.java | 16 ++----------- .../logs/internal/SdkEventBuilderTest.java | 4 +--- .../internal/SdkEventEmitterProviderTest.java | 9 ++------ 7 files changed, 13 insertions(+), 71 deletions(-) diff --git a/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java b/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java index 98da9910daf..e9fe2d8fc0c 100644 --- a/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java +++ b/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java @@ -23,16 +23,6 @@ public void emit(long epochNanos, String eventName, Attributes attributes) {} @Override public void emit(String eventName, Attributes attributes) {} - @Override - public EventBuilder builder() { - return NoOpEventBuilder.INSTANCE; - } - - @Override - public EventBuilder builder(String eventName) { - return NoOpEventBuilder.INSTANCE; - } - @Override public EventBuilder builder(String eventName, Attributes attributes) { return NoOpEventBuilder.INSTANCE; @@ -42,16 +32,6 @@ private static class NoOpEventBuilder implements EventBuilder { public static final EventBuilder INSTANCE = new NoOpEventBuilder(); - @Override - public EventBuilder setEventName(String eventName) { - return this; - } - - @Override - public EventBuilder setAttributes(Attributes attributes) { - return this; - } - @Override public EventBuilder setTimestamp(long epochNanos) { return this; diff --git a/api/events/src/main/java/io/opentelemetry/api/events/EventBuilder.java b/api/events/src/main/java/io/opentelemetry/api/events/EventBuilder.java index 348c7732d08..fda978a3b83 100644 --- a/api/events/src/main/java/io/opentelemetry/api/events/EventBuilder.java +++ b/api/events/src/main/java/io/opentelemetry/api/events/EventBuilder.java @@ -5,17 +5,9 @@ package io.opentelemetry.api.events; -import io.opentelemetry.api.common.Attributes; - /** The EventBuilder is used to emit() events. */ public interface EventBuilder { - /** Set the name of the event. */ - EventBuilder setEventName(String eventName); - - /** Set the attributes to attach to the event. */ - EventBuilder setAttributes(Attributes attributes); - /** Sets the timestamp for the event. */ EventBuilder setTimestamp(long epochNanos); diff --git a/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java b/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java index bfcaf064be0..ef2dc7794bd 100644 --- a/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java +++ b/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java @@ -52,9 +52,5 @@ public interface EventEmitter { */ void emit(String eventName, Attributes attributes); - EventBuilder builder(); - - EventBuilder builder(String eventName); - EventBuilder builder(String eventName, Attributes attributes); } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilder.java index aede08ccf13..6e261b1a678 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilder.java @@ -15,31 +15,24 @@ import java.util.concurrent.TimeUnit; class SdkEventBuilder implements EventBuilder { - private static final String DEFAULT_EVENT_NAME = "unknown-event"; private final Clock clock; private final Logger delegateLogger; private final String eventDomain; - - private String eventName = DEFAULT_EVENT_NAME; - private Attributes attributes = Attributes.empty(); + private final String eventName; + private final Attributes attributes; private long epochNanos = Long.MIN_VALUE; - SdkEventBuilder(Clock clock, Logger delegateLogger, String eventDomain) { + SdkEventBuilder( + Clock clock, + Logger delegateLogger, + String eventDomain, + String eventName, + Attributes attributes) { this.clock = clock; this.delegateLogger = delegateLogger; this.eventDomain = eventDomain; - } - - @Override - public EventBuilder setEventName(String eventName) { this.eventName = eventName; - return this; - } - - @Override - public EventBuilder setAttributes(Attributes attributes) { this.attributes = attributes; - return this; } @Override diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java index a7bfb883a9e..aeccfc8d9bc 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java @@ -111,19 +111,9 @@ private SdkEventEmitter(Clock clock, Logger delegateLogger, String eventDomain) this.eventDomain = eventDomain; } - @Override - public EventBuilder builder() { - return new SdkEventBuilder(clock, delegateLogger, eventDomain); - } - - @Override - public EventBuilder builder(String eventName) { - return builder().setEventName(eventName); - } - @Override public EventBuilder builder(String eventName, Attributes attributes) { - return builder().setEventName(eventName).setAttributes(attributes); + return new SdkEventBuilder(clock, delegateLogger, eventDomain, eventName, attributes); } @Override @@ -133,10 +123,8 @@ public void emit(String eventName, Attributes attributes) { @Override public void emit(long epochNanos, String eventName, Attributes attributes) { - new SdkEventBuilder(clock, delegateLogger, eventDomain) + new SdkEventBuilder(clock, delegateLogger, eventDomain, eventName, attributes) .setTimestamp(epochNanos) - .setAttributes(attributes) - .setEventName(eventName) .emit(); } } diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilderTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilderTest.java index dd0aac43e05..91991bd82ad 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilderTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilderTest.java @@ -33,10 +33,8 @@ void emit() { when(logRecordBuilder.setAttribute(any(), any())).thenReturn(logRecordBuilder); when(logRecordBuilder.setAllAttributes(any())).thenReturn(logRecordBuilder); - new SdkEventBuilder(Clock.getDefault(), logger, eventDomain) - .setEventName(eventName) + new SdkEventBuilder(Clock.getDefault(), logger, eventDomain, eventName, attributes) .setTimestamp(123456L) - .setAttributes(attributes) .emit(); verify(logRecordBuilder).setAllAttributes(attributes); verify(logRecordBuilder).setAttribute(stringKey("event.domain"), eventDomain); diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java index cafb6e616dc..90fc04aa625 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java @@ -125,7 +125,7 @@ void builderWithName() { EventEmitter emitter = eventEmitterProvider.eventEmitterBuilder("test-scope").build(); - emitter.builder("testing").setAttributes(attributes).setTimestamp(yesterday).emit(); + emitter.builder("testing", attributes).setTimestamp(yesterday).emit(); verifySeen(yesterday, attributes); } @@ -136,12 +136,7 @@ void builder() { EventEmitter emitter = eventEmitterProvider.eventEmitterBuilder("test-scope").build(); - emitter - .builder() - .setEventName("testing") - .setAttributes(attributes) - .setTimestamp(yesterday) - .emit(); + emitter.builder("testing", attributes).setTimestamp(yesterday).emit(); verifySeen(yesterday, attributes); } From 27e94a88bc8da0f4300c5df6b4cccd469475f37f Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Thu, 2 Nov 2023 14:53:17 -0700 Subject: [PATCH 7/8] fix builder --- .../api/events/DefaultEventEmitterTest.java | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java b/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java index ce68d8672ff..1903a6786fe 100644 --- a/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java +++ b/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java @@ -35,14 +35,7 @@ void emitWithTimestamp() { void builder() { Attributes attributes = Attributes.builder().put("key1", "value1").build(); EventEmitter emitter = DefaultEventEmitter.getInstance(); - assertThatCode( - () -> - emitter - .builder() - .setEventName("myEvent") - .setAttributes(attributes) - .setTimestamp(123456L) - .emit()) + assertThatCode(() -> emitter.builder("myEvent", attributes).setTimestamp(123456L).emit()) .doesNotThrowAnyException(); } @@ -50,8 +43,7 @@ void builder() { void builderWithName() { Attributes attributes = Attributes.builder().put("key1", "value1").build(); EventEmitter emitter = DefaultEventEmitter.getInstance(); - assertThatCode( - () -> emitter.builder("myEvent").setAttributes(attributes).setTimestamp(123456L).emit()) + assertThatCode(() -> emitter.builder("myEvent", attributes).setTimestamp(123456L).emit()) .doesNotThrowAnyException(); } From 21585cf1f51c6c331cb0be42fc4a87b3bd077c09 Mon Sep 17 00:00:00 2001 From: Jack Berg Date: Thu, 9 Nov 2023 15:09:37 -0600 Subject: [PATCH 8/8] Remove emit overload, align setTimestamp with existing conventions --- .../api/events/DefaultEventEmitter.java | 12 +++-- .../api/events/EventBuilder.java | 22 ++++++++-- .../api/events/EventEmitter.java | 8 +--- .../api/events/DefaultEventEmitterTest.java | 34 ++++---------- .../sdk/logs/internal/SdkEventBuilder.java | 44 +++++++------------ .../internal/SdkEventEmitterProvider.java | 28 ++++++++---- .../logs/internal/SdkEventBuilderTest.java | 18 ++++---- .../internal/SdkEventEmitterProviderTest.java | 36 +-------------- 8 files changed, 82 insertions(+), 120 deletions(-) diff --git a/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java b/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java index e9fe2d8fc0c..8d9a81f8e7f 100644 --- a/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java +++ b/api/events/src/main/java/io/opentelemetry/api/events/DefaultEventEmitter.java @@ -6,6 +6,8 @@ package io.opentelemetry.api.events; import io.opentelemetry.api.common.Attributes; +import java.time.Instant; +import java.util.concurrent.TimeUnit; class DefaultEventEmitter implements EventEmitter { @@ -17,9 +19,6 @@ static EventEmitter getInstance() { return INSTANCE; } - @Override - public void emit(long epochNanos, String eventName, Attributes attributes) {} - @Override public void emit(String eventName, Attributes attributes) {} @@ -33,7 +32,12 @@ private static class NoOpEventBuilder implements EventBuilder { public static final EventBuilder INSTANCE = new NoOpEventBuilder(); @Override - public EventBuilder setTimestamp(long epochNanos) { + public EventBuilder setTimestamp(long timestamp, TimeUnit unit) { + return this; + } + + @Override + public EventBuilder setTimestamp(Instant instant) { return this; } diff --git a/api/events/src/main/java/io/opentelemetry/api/events/EventBuilder.java b/api/events/src/main/java/io/opentelemetry/api/events/EventBuilder.java index fda978a3b83..a9acabbca6c 100644 --- a/api/events/src/main/java/io/opentelemetry/api/events/EventBuilder.java +++ b/api/events/src/main/java/io/opentelemetry/api/events/EventBuilder.java @@ -5,11 +5,27 @@ package io.opentelemetry.api.events; -/** The EventBuilder is used to emit() events. */ +import java.time.Instant; +import java.util.concurrent.TimeUnit; + +/** The EventBuilder is used to {@link #emit()} events. */ public interface EventBuilder { - /** Sets the timestamp for the event. */ - EventBuilder setTimestamp(long epochNanos); + /** + * Set the epoch {@code timestamp} for the event, using the timestamp and unit. + * + *

The {@code timestamp} is the time at which the event occurred. If unset, it will be set to + * the current time when {@link #emit()} is called. + */ + EventBuilder setTimestamp(long timestamp, TimeUnit unit); + + /** + * Set the epoch {@code timestamp} for the event, using the instant. + * + *

The {@code timestamp} is the time at which the event occurred. If unset, it will be set to + * the current time when {@link #emit()} is called. + */ + EventBuilder setTimestamp(Instant instant); /** Emit an event. */ void emit(); diff --git a/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java b/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java index ef2dc7794bd..a8dc47c83d7 100644 --- a/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java +++ b/api/events/src/main/java/io/opentelemetry/api/events/EventEmitter.java @@ -35,22 +35,18 @@ public interface EventEmitter { /** * Emit an event. * - * @param epochNanos The time at which the event happened, in epoch nanoseconds. * @param eventName the event name, which acts as a classifier for events. Within a particular * event domain, event name defines a particular class or type of event. * @param attributes attributes associated with the event */ - @SuppressWarnings("InconsistentOverloads") - void emit(long epochNanos, String eventName, Attributes attributes); + void emit(String eventName, Attributes attributes); /** - * Emit an event. + * Return a {@link EventBuilder} to emit an event. * * @param eventName the event name, which acts as a classifier for events. Within a particular * event domain, event name defines a particular class or type of event. * @param attributes attributes associated with the event */ - void emit(String eventName, Attributes attributes); - EventBuilder builder(String eventName, Attributes attributes); } diff --git a/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java b/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java index 1903a6786fe..460cb1583ac 100644 --- a/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java +++ b/api/events/src/test/java/io/opentelemetry/api/events/DefaultEventEmitterTest.java @@ -8,6 +8,8 @@ import static org.assertj.core.api.Assertions.assertThatCode; import io.opentelemetry.api.common.Attributes; +import java.time.Instant; +import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Test; class DefaultEventEmitterTest { @@ -23,35 +25,17 @@ void emit() { .doesNotThrowAnyException(); } - @Test - void emitWithTimestamp() { - EventEmitter emitter = DefaultEventEmitter.getInstance(); - Attributes attributes = Attributes.builder().put("key1", "value1").build(); - assertThatCode(() -> emitter.emit(System.nanoTime(), "event-name", attributes)) - .doesNotThrowAnyException(); - } - @Test void builder() { Attributes attributes = Attributes.builder().put("key1", "value1").build(); EventEmitter emitter = DefaultEventEmitter.getInstance(); - assertThatCode(() -> emitter.builder("myEvent", attributes).setTimestamp(123456L).emit()) - .doesNotThrowAnyException(); - } - - @Test - void builderWithName() { - Attributes attributes = Attributes.builder().put("key1", "value1").build(); - EventEmitter emitter = DefaultEventEmitter.getInstance(); - assertThatCode(() -> emitter.builder("myEvent", attributes).setTimestamp(123456L).emit()) - .doesNotThrowAnyException(); - } - - @Test - void builderWithNameAndAttrs() { - Attributes attributes = Attributes.builder().put("key1", "value1").build(); - EventEmitter emitter = DefaultEventEmitter.getInstance(); - assertThatCode(() -> emitter.builder("myEvent", attributes).setTimestamp(123456L).emit()) + assertThatCode( + () -> + emitter + .builder("myEvent", attributes) + .setTimestamp(123456L, TimeUnit.NANOSECONDS) + .setTimestamp(Instant.now()) + .emit()) .doesNotThrowAnyException(); } } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilder.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilder.java index 6e261b1a678..a79b09babc3 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilder.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilder.java @@ -5,51 +5,37 @@ package io.opentelemetry.sdk.logs.internal; -import static io.opentelemetry.sdk.logs.internal.SdkEventEmitterProvider.EVENT_DOMAIN; -import static io.opentelemetry.sdk.logs.internal.SdkEventEmitterProvider.EVENT_NAME; - -import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.events.EventBuilder; -import io.opentelemetry.api.logs.Logger; -import io.opentelemetry.sdk.common.Clock; +import io.opentelemetry.api.logs.LogRecordBuilder; +import java.time.Instant; import java.util.concurrent.TimeUnit; class SdkEventBuilder implements EventBuilder { - private final Clock clock; - private final Logger delegateLogger; + private final LogRecordBuilder logRecordBuilder; private final String eventDomain; private final String eventName; - private final Attributes attributes; - private long epochNanos = Long.MIN_VALUE; - SdkEventBuilder( - Clock clock, - Logger delegateLogger, - String eventDomain, - String eventName, - Attributes attributes) { - this.clock = clock; - this.delegateLogger = delegateLogger; + SdkEventBuilder(LogRecordBuilder logRecordBuilder, String eventDomain, String eventName) { + this.logRecordBuilder = logRecordBuilder; this.eventDomain = eventDomain; this.eventName = eventName; - this.attributes = attributes; } @Override - public EventBuilder setTimestamp(long epochNanos) { - this.epochNanos = epochNanos; + public EventBuilder setTimestamp(long timestamp, TimeUnit unit) { + this.logRecordBuilder.setTimestamp(timestamp, unit); + return this; + } + + @Override + public EventBuilder setTimestamp(Instant instant) { + this.logRecordBuilder.setTimestamp(instant); return this; } @Override public void emit() { - long timestamp = epochNanos == Long.MIN_VALUE ? clock.now() : epochNanos; - delegateLogger - .logRecordBuilder() - .setTimestamp(timestamp, TimeUnit.NANOSECONDS) - .setAllAttributes(attributes) - .setAttribute(EVENT_DOMAIN, eventDomain) - .setAttribute(EVENT_NAME, eventName) - .emit(); + SdkEventEmitterProvider.addEventNameAndDomain(logRecordBuilder, eventDomain, eventName); + logRecordBuilder.emit(); } } diff --git a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java index aeccfc8d9bc..1cc6768667e 100644 --- a/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java +++ b/sdk/logs/src/main/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProvider.java @@ -11,10 +11,12 @@ import io.opentelemetry.api.events.EventEmitter; import io.opentelemetry.api.events.EventEmitterBuilder; import io.opentelemetry.api.events.EventEmitterProvider; +import io.opentelemetry.api.logs.LogRecordBuilder; import io.opentelemetry.api.logs.Logger; import io.opentelemetry.api.logs.LoggerBuilder; import io.opentelemetry.api.logs.LoggerProvider; import io.opentelemetry.sdk.common.Clock; +import java.util.concurrent.TimeUnit; /** * SDK implementation for {@link EventEmitterProvider}. @@ -113,19 +115,29 @@ private SdkEventEmitter(Clock clock, Logger delegateLogger, String eventDomain) @Override public EventBuilder builder(String eventName, Attributes attributes) { - return new SdkEventBuilder(clock, delegateLogger, eventDomain, eventName, attributes); + return new SdkEventBuilder( + delegateLogger + .logRecordBuilder() + .setTimestamp(clock.now(), TimeUnit.NANOSECONDS) + .setAllAttributes(attributes), + eventDomain, + eventName); } @Override public void emit(String eventName, Attributes attributes) { - emit(clock.now(), eventName, attributes); + LogRecordBuilder logRecordBuilder = + delegateLogger + .logRecordBuilder() + .setTimestamp(clock.now(), TimeUnit.NANOSECONDS) + .setAllAttributes(attributes); + addEventNameAndDomain(logRecordBuilder, eventDomain, eventName); + logRecordBuilder.emit(); } + } - @Override - public void emit(long epochNanos, String eventName, Attributes attributes) { - new SdkEventBuilder(clock, delegateLogger, eventDomain, eventName, attributes) - .setTimestamp(epochNanos) - .emit(); - } + static void addEventNameAndDomain( + LogRecordBuilder logRecordBuilder, String eventDomain, String eventName) { + logRecordBuilder.setAttribute(EVENT_DOMAIN, eventDomain).setAttribute(EVENT_NAME, eventName); } } diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilderTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilderTest.java index 91991bd82ad..2115463a771 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilderTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventBuilderTest.java @@ -12,10 +12,9 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.logs.LogRecordBuilder; -import io.opentelemetry.api.logs.Logger; -import io.opentelemetry.sdk.common.Clock; +import java.time.Instant; +import java.util.concurrent.TimeUnit; import org.junit.jupiter.api.Test; class SdkEventBuilderTest { @@ -24,21 +23,20 @@ class SdkEventBuilderTest { void emit() { String eventDomain = "mydomain"; String eventName = "banana"; - Attributes attributes = Attributes.of(stringKey("foo"), "bar"); - Logger logger = mock(Logger.class); LogRecordBuilder logRecordBuilder = mock(LogRecordBuilder.class); - when(logger.logRecordBuilder()).thenReturn(logRecordBuilder); when(logRecordBuilder.setTimestamp(anyLong(), any())).thenReturn(logRecordBuilder); when(logRecordBuilder.setAttribute(any(), any())).thenReturn(logRecordBuilder); - when(logRecordBuilder.setAllAttributes(any())).thenReturn(logRecordBuilder); - new SdkEventBuilder(Clock.getDefault(), logger, eventDomain, eventName, attributes) - .setTimestamp(123456L) + Instant instant = Instant.now(); + new SdkEventBuilder(logRecordBuilder, eventDomain, eventName) + .setTimestamp(123456L, TimeUnit.NANOSECONDS) + .setTimestamp(instant) .emit(); - verify(logRecordBuilder).setAllAttributes(attributes); verify(logRecordBuilder).setAttribute(stringKey("event.domain"), eventDomain); verify(logRecordBuilder).setAttribute(stringKey("event.name"), eventName); + verify(logRecordBuilder).setTimestamp(123456L, TimeUnit.NANOSECONDS); + verify(logRecordBuilder).setTimestamp(instant); verify(logRecordBuilder).emit(); } } diff --git a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java index 90fc04aa625..7f22b1376a8 100644 --- a/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java +++ b/sdk/logs/src/test/java/io/opentelemetry/sdk/logs/internal/SdkEventEmitterProviderTest.java @@ -95,40 +95,6 @@ void emit_NoDomain() { .build()); } - @Test - void emit_withTimestamp() { - long yesterday = System.nanoTime() - TimeUnit.DAYS.toNanos(1); - Attributes attributes = Attributes.of(stringKey("foo"), "bar"); - - EventEmitter emitter = eventEmitterProvider.eventEmitterBuilder("test-scope").build(); - - emitter.emit(yesterday, "testing", attributes); - - verifySeen(yesterday, attributes); - } - - @Test - void builderWithNameAndAttributes() { - long yesterday = System.nanoTime() - TimeUnit.DAYS.toNanos(1); - Attributes attributes = Attributes.of(stringKey("foo"), "bar"); - - EventEmitter emitter = eventEmitterProvider.eventEmitterBuilder("test-scope").build(); - - emitter.builder("testing", attributes).setTimestamp(yesterday).emit(); - verifySeen(yesterday, attributes); - } - - @Test - void builderWithName() { - long yesterday = System.nanoTime() - TimeUnit.DAYS.toNanos(1); - Attributes attributes = Attributes.of(stringKey("foo"), "bar"); - - EventEmitter emitter = eventEmitterProvider.eventEmitterBuilder("test-scope").build(); - - emitter.builder("testing", attributes).setTimestamp(yesterday).emit(); - verifySeen(yesterday, attributes); - } - @Test void builder() { long yesterday = System.nanoTime() - TimeUnit.DAYS.toNanos(1); @@ -136,7 +102,7 @@ void builder() { EventEmitter emitter = eventEmitterProvider.eventEmitterBuilder("test-scope").build(); - emitter.builder("testing", attributes).setTimestamp(yesterday).emit(); + emitter.builder("testing", attributes).setTimestamp(yesterday, TimeUnit.NANOSECONDS).emit(); verifySeen(yesterday, attributes); }