From e12f50c7d11f569d329590b9589048889c96a383 Mon Sep 17 00:00:00 2001 From: Jason Plumb Date: Wed, 18 Oct 2023 15:25:18 -0700 Subject: [PATCH] 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()); + } }