diff --git a/core/src/main/java/io/opentelemetry/android/NoopOpenTelemetryRum.java b/core/src/main/java/io/opentelemetry/android/NoopOpenTelemetryRum.java index 78e4a804..60eef516 100644 --- a/core/src/main/java/io/opentelemetry/android/NoopOpenTelemetryRum.java +++ b/core/src/main/java/io/opentelemetry/android/NoopOpenTelemetryRum.java @@ -6,6 +6,7 @@ package io.opentelemetry.android; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.TraceId; enum NoopOpenTelemetryRum implements OpenTelemetryRum { @@ -21,4 +22,7 @@ public String getRumSessionId() { // RUM session.id has the same format as traceId return TraceId.getInvalid(); } + + @Override + public void emitEvent(String eventName, String body, Attributes attributes) {} } diff --git a/core/src/main/java/io/opentelemetry/android/OpenTelemetryRum.java b/core/src/main/java/io/opentelemetry/android/OpenTelemetryRum.java index 3187220d..c8a54dda 100644 --- a/core/src/main/java/io/opentelemetry/android/OpenTelemetryRum.java +++ b/core/src/main/java/io/opentelemetry/android/OpenTelemetryRum.java @@ -9,6 +9,7 @@ import io.opentelemetry.android.config.OtelRumConfig; import io.opentelemetry.android.internal.services.Services; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.common.Attributes; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.logs.SdkLoggerProvider; import io.opentelemetry.sdk.metrics.SdkMeterProvider; @@ -88,4 +89,52 @@ static OpenTelemetryRum noop() { * recommended that you do not cache this value, but always retrieve it from here when needed. */ String getRumSessionId(); + + /** + * Emits an event with the specified name. + * + *

This method serves as a convenience overload that emits an event with an empty set of + * attributes. + * + * @param eventName The name of the event to emit. + */ + default void emitEvent(String eventName) { + emitEvent(eventName, Attributes.empty()); + } + + /** + * Emits an event with the specified name and body. + * + *

This method serves as a convenience overload that emits an event with an empty set of + * attributes. + * + * @param eventName The name of the event to emit. + * @param body The body of the event, typically containing additional data. + */ + default void emitEvent(String eventName, String body) { + emitEvent(eventName, body, Attributes.empty()); + } + + /** + * Emits an event with the specified name and attributes. + * + *

This method serves as a convenience overload that emits an event with an empty body. + * + * @param eventName The name of the event to emit. + * @param attributes The attributes associated with the event. + */ + default void emitEvent(String eventName, Attributes attributes) { + emitEvent(eventName, "", attributes); + } + + /** + * Emits an event with the specified name, body, and attributes. + * + *

Implementations of this method should define how the event is handled and recorded. + * + * @param eventName The name of the event to emit. + * @param body The body of the event, typically containing additional data. + * @param attributes The attributes associated with the event, providing metadata. + */ + void emitEvent(String eventName, String body, Attributes attributes); } diff --git a/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumImpl.java b/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumImpl.java index e45afa1f..1524914d 100644 --- a/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumImpl.java +++ b/core/src/main/java/io/opentelemetry/android/OpenTelemetryRumImpl.java @@ -7,6 +7,9 @@ import io.opentelemetry.android.session.SessionManager; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder; +import io.opentelemetry.api.incubator.logs.ExtendedLogger; import io.opentelemetry.sdk.OpenTelemetrySdk; final class OpenTelemetryRumImpl implements OpenTelemetryRum { @@ -14,9 +17,17 @@ final class OpenTelemetryRumImpl implements OpenTelemetryRum { private final OpenTelemetrySdk openTelemetrySdk; private final SessionManager sessionManager; + private final ExtendedLogger logger; + OpenTelemetryRumImpl(OpenTelemetrySdk openTelemetrySdk, SessionManager sessionManager) { this.openTelemetrySdk = openTelemetrySdk; this.sessionManager = sessionManager; + this.logger = + (ExtendedLogger) + openTelemetrySdk + .getLogsBridge() + .loggerBuilder("io.opentelemetry.rum.events") + .build(); } @Override @@ -28,4 +39,10 @@ public OpenTelemetry getOpenTelemetry() { public String getRumSessionId() { return sessionManager.getSessionId(); } + + @Override + public void emitEvent(String eventName, String body, Attributes attributes) { + ExtendedLogRecordBuilder logRecordBuilder = logger.logRecordBuilder(); + logRecordBuilder.setEventName(eventName).setBody(body).setAllAttributes(attributes).emit(); + } } diff --git a/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java b/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java index 54f907fc..d63f0ac5 100644 --- a/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java +++ b/core/src/test/java/io/opentelemetry/android/OpenTelemetryRumBuilderTest.java @@ -45,7 +45,6 @@ import io.opentelemetry.android.internal.session.SessionIdTimeoutHandler; import io.opentelemetry.android.session.SessionManager; import io.opentelemetry.api.common.Attributes; -import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder; import io.opentelemetry.api.logs.Logger; import io.opentelemetry.api.logs.Severity; import io.opentelemetry.api.metrics.LongCounter; @@ -182,19 +181,8 @@ public void shouldBuildLogRecordProvider() { SimpleLogRecordProcessor.create(logsExporter))) .build(); - Logger logger = - openTelemetryRum - .getOpenTelemetry() - .getLogsBridge() - .loggerBuilder("otel.initialization.events") - .build(); - ExtendedLogRecordBuilder eventLogger = (ExtendedLogRecordBuilder) logger.logRecordBuilder(); - Attributes attrs = Attributes.of(stringKey("mega"), "hit"); - eventLogger - .setEventName("test.event") - .setAllAttributes(attrs) - .setAttribute(stringKey("body.field"), "foo") - .emit(); + Attributes attrs = Attributes.of(stringKey("mega"), "hit", stringKey("body.field"), "foo"); + openTelemetryRum.emitEvent("test.event", attrs); List logs = logsExporter.getFinishedLogRecordItems(); assertThat(logs).hasSize(1);