From c3d3d72bb8d26eb1e4e39ef7cca58dda2db4ba6c Mon Sep 17 00:00:00 2001 From: Tony Zhang Date: Thu, 19 Oct 2023 16:35:38 -0700 Subject: [PATCH 1/6] added implementation, unit test, gradle dependencies --- gradle/libs.versions.toml | 1 + instrumentation/build.gradle.kts | 3 ++ .../android/emitter/EventEmitterWithData.java | 51 +++++++++++++++++++ .../emitter/EventEmitterWithDataTest.java | 32 ++++++++++++ 4 files changed, 87 insertions(+) create mode 100644 instrumentation/src/main/java/io/opentelemetry/android/emitter/EventEmitterWithData.java create mode 100644 instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 062cd0bf2..ea794a5c2 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -25,6 +25,7 @@ opentelemetry-api = { module = "io.opentelemetry:opentelemetry-api" } opentelemetry-sdk = { module = "io.opentelemetry:opentelemetry-sdk" } opentelemetry-exporter-zipkin = { module = "io.opentelemetry:opentelemetry-exporter-zipkin" } opentelemetry-exporter-logging = { module = "io.opentelemetry:opentelemetry-exporter-logging" } +opentelemetry-apievents = { module = "io.opentelemetry:opentelemetry-api-events" } zipkin-sender-okhttp3 = { module = "io.zipkin.reporter2:zipkin-sender-okhttp3", version.ref = "zipkin-reporter"} #Test tools diff --git a/instrumentation/build.gradle.kts b/instrumentation/build.gradle.kts index bbbaee619..a73211289 100644 --- a/instrumentation/build.gradle.kts +++ b/instrumentation/build.gradle.kts @@ -70,6 +70,9 @@ dependencies { implementation(libs.opentelemetry.exporter.logging) implementation(libs.opentelemetry.instrumentation.api) implementation(libs.opentelemetry.semconv) + implementation(libs.opentelemetry.apievents) + + implementation("io.opentelemetry:opentelemetry-api-events") testImplementation(libs.bundles.mockito) testImplementation(libs.bundles.junit) diff --git a/instrumentation/src/main/java/io/opentelemetry/android/emitter/EventEmitterWithData.java b/instrumentation/src/main/java/io/opentelemetry/android/emitter/EventEmitterWithData.java new file mode 100644 index 000000000..f3d4ea90a --- /dev/null +++ b/instrumentation/src/main/java/io/opentelemetry/android/emitter/EventEmitterWithData.java @@ -0,0 +1,51 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.android.emitter; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import io.opentelemetry.api.common.AttributesBuilder; +import io.opentelemetry.api.events.EventEmitter; +import java.util.Map; + +class EventEmitterWithData { + + private static final String EVENT_DATA = "event.data"; + + private final EventEmitter delegate; + + EventEmitterWithData(EventEmitter delegate) { + this.delegate = delegate; + } + + public void emit(String eventName, Attributes attributes, Map data) { + Attributes dataAsAttribute = convertRichDataObjectIntoAttributes(data); + Attributes eventAttrs = + attributes.toBuilder().put(EVENT_DATA, dataAsAttribute.toString()).build(); + delegate.emit(eventName, eventAttrs); + } + + public Attributes convertRichDataObjectIntoAttributes(Map data) { + AttributesBuilder builder = Attributes.builder(); + for (String key : data.keySet()) { + Object val = data.get(key); + if (val != null) { + if (val instanceof String) { + builder.put(AttributeKey.stringKey(key), (String) val); + } else if (val instanceof Long) { + builder.put(AttributeKey.longKey(key), (Long) val); + } else if (val instanceof Double) { + builder.put(AttributeKey.doubleKey(key), (Double) val); + } else if (val instanceof Boolean) { + builder.put(AttributeKey.booleanKey(key), (Boolean) val); + } else { + builder.put(AttributeKey.stringKey(key), val.toString()); + } + } + } + return builder.build(); + } +} \ No newline at end of file diff --git a/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java b/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java new file mode 100644 index 000000000..c6fbcf18e --- /dev/null +++ b/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java @@ -0,0 +1,32 @@ +package io.opentelemetry.android.emitter; + +import org.junit.Test; + +import java.util.HashMap; +import java.util.Map; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class EventEmitterWithDataTest { + + @Test + public void testConvertRichDataObjectIntoAttributes() { + Map data = new HashMap<>(); + data.put("stringKey", "key"); + data.put("longKey", 123L); + data.put("doubleKey", 12.3); + data.put("booleanKey", true); + + EventEmitterWithData emitter = new EventEmitterWithData(null); + + Attributes attributes = emitter.convertRichDataObjectIntoAttributes(data); + + assertEquals(attributes.size(), data.size()); + assertEquals(data.get("stringKey"), attributes.get(AttributeKey.stringKey("stringKey"))); + assertEquals(data.get("longKey"), attributes.get(AttributeKey.longKey("longKey"))); + assertEquals(data.get("doubleKey"), attributes.get(AttributeKey.doubleKey("doubleKey"))); + assertEquals(data.get("booleanKey"), attributes.get(AttributeKey.booleanKey("booleanKey"))); + } +} \ No newline at end of file From 3be7bc5fb5aefa167f6d84116c38c3fe253e7d02 Mon Sep 17 00:00:00 2001 From: Tony Zhang Date: Thu, 19 Oct 2023 23:55:50 -0700 Subject: [PATCH 2/6] spotless apply --- .../android/emitter/EventEmitterWithData.java | 2 +- .../emitter/EventEmitterWithDataTest.java | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/instrumentation/src/main/java/io/opentelemetry/android/emitter/EventEmitterWithData.java b/instrumentation/src/main/java/io/opentelemetry/android/emitter/EventEmitterWithData.java index f3d4ea90a..be5dd5a0f 100644 --- a/instrumentation/src/main/java/io/opentelemetry/android/emitter/EventEmitterWithData.java +++ b/instrumentation/src/main/java/io/opentelemetry/android/emitter/EventEmitterWithData.java @@ -48,4 +48,4 @@ public Attributes convertRichDataObjectIntoAttributes(Map data) } return builder.build(); } -} \ No newline at end of file +} diff --git a/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java b/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java index c6fbcf18e..4c189ebe4 100644 --- a/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java +++ b/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java @@ -1,13 +1,17 @@ -package io.opentelemetry.android.emitter; +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ -import org.junit.Test; +package io.opentelemetry.android.emitter; -import java.util.HashMap; -import java.util.Map; +import static org.junit.jupiter.api.Assertions.assertEquals; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; -import static org.junit.jupiter.api.Assertions.assertEquals; +import java.util.HashMap; +import java.util.Map; +import org.junit.Test; public class EventEmitterWithDataTest { @@ -29,4 +33,4 @@ public void testConvertRichDataObjectIntoAttributes() { assertEquals(data.get("doubleKey"), attributes.get(AttributeKey.doubleKey("doubleKey"))); assertEquals(data.get("booleanKey"), attributes.get(AttributeKey.booleanKey("booleanKey"))); } -} \ No newline at end of file +} From 53c64224e795b0a5b7c133afaa8b24b62941bec9 Mon Sep 17 00:00:00 2001 From: Tony Zhang Date: Wed, 25 Oct 2023 12:17:32 -0700 Subject: [PATCH 3/6] added actual data from exception and thread into test cases --- .../emitter/EventEmitterWithDataTest.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java b/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java index 4c189ebe4..080b61683 100644 --- a/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java +++ b/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java @@ -9,6 +9,9 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; + +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.HashMap; import java.util.Map; import org.junit.Test; @@ -17,17 +20,33 @@ public class EventEmitterWithDataTest { @Test public void testConvertRichDataObjectIntoAttributes() { + Exception crashData = null; + try { + throw new RuntimeException("Crash!"); + } catch (Exception e) { + crashData = e; + } + + StringWriter stacktrace = new StringWriter(); + crashData.printStackTrace(new PrintWriter(stacktrace)); + Map data = new HashMap<>(); data.put("stringKey", "key"); data.put("longKey", 123L); data.put("doubleKey", 12.3); data.put("booleanKey", true); - EventEmitterWithData emitter = new EventEmitterWithData(null); + data.put("stacktrace", stacktrace.toString()); + data.put("thread", Thread.currentThread().toString()); + data.put("throwableMessage", crashData.getMessage()); + EventEmitterWithData emitter = new EventEmitterWithData(null); Attributes attributes = emitter.convertRichDataObjectIntoAttributes(data); assertEquals(attributes.size(), data.size()); + assertEquals(data.get("stacktrace"), stacktrace.toString()); + assertEquals(data.get("thread"), Thread.currentThread().toString()); + assertEquals(data.get("throwableMessage"), "Crash!"); assertEquals(data.get("stringKey"), attributes.get(AttributeKey.stringKey("stringKey"))); assertEquals(data.get("longKey"), attributes.get(AttributeKey.longKey("longKey"))); assertEquals(data.get("doubleKey"), attributes.get(AttributeKey.doubleKey("doubleKey"))); From 4228a7a4d018690f13e31a3dfbdfe580fd1ff0f7 Mon Sep 17 00:00:00 2001 From: Tony Zhang Date: Wed, 25 Oct 2023 15:38:44 -0700 Subject: [PATCH 4/6] run git spotlessapply --- .../opentelemetry/android/emitter/EventEmitterWithDataTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java b/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java index 080b61683..4ec4ca5fd 100644 --- a/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java +++ b/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java @@ -9,7 +9,6 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; - import java.io.PrintWriter; import java.io.StringWriter; import java.util.HashMap; From cea3b1f14065408edb01c961567470ccfd8ed620 Mon Sep 17 00:00:00 2001 From: Tony Zhang Date: Fri, 27 Oct 2023 15:15:41 -0700 Subject: [PATCH 5/6] change test cases to check for attributes in dictionary --- .../android/emitter/EventEmitterWithDataTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java b/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java index 4ec4ca5fd..c4cfb9afc 100644 --- a/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java +++ b/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java @@ -43,9 +43,9 @@ public void testConvertRichDataObjectIntoAttributes() { Attributes attributes = emitter.convertRichDataObjectIntoAttributes(data); assertEquals(attributes.size(), data.size()); - assertEquals(data.get("stacktrace"), stacktrace.toString()); - assertEquals(data.get("thread"), Thread.currentThread().toString()); - assertEquals(data.get("throwableMessage"), "Crash!"); + assertEquals(data.get("stacktrace"), attributes.get(AttributeKey.stringKey("stacktrace"))); + assertEquals(data.get("thread"), attributes.get(AttributeKey.stringKey("thread"))); + assertEquals(data.get("throwableMessage"), attributes.get(AttributeKey.stringKey("throwableMessage"))); assertEquals(data.get("stringKey"), attributes.get(AttributeKey.stringKey("stringKey"))); assertEquals(data.get("longKey"), attributes.get(AttributeKey.longKey("longKey"))); assertEquals(data.get("doubleKey"), attributes.get(AttributeKey.doubleKey("doubleKey"))); From 784f79f548a1200eff476ea2c9b5dadb2de180d8 Mon Sep 17 00:00:00 2001 From: Tony Zhang Date: Fri, 27 Oct 2023 16:45:17 -0700 Subject: [PATCH 6/6] spotless apply --- .../android/emitter/EventEmitterWithDataTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java b/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java index c4cfb9afc..4840c900a 100644 --- a/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java +++ b/instrumentation/src/test/java/io/opentelemetry/android/emitter/EventEmitterWithDataTest.java @@ -45,7 +45,9 @@ public void testConvertRichDataObjectIntoAttributes() { assertEquals(attributes.size(), data.size()); assertEquals(data.get("stacktrace"), attributes.get(AttributeKey.stringKey("stacktrace"))); assertEquals(data.get("thread"), attributes.get(AttributeKey.stringKey("thread"))); - assertEquals(data.get("throwableMessage"), attributes.get(AttributeKey.stringKey("throwableMessage"))); + assertEquals( + data.get("throwableMessage"), + attributes.get(AttributeKey.stringKey("throwableMessage"))); assertEquals(data.get("stringKey"), attributes.get(AttributeKey.stringKey("stringKey"))); assertEquals(data.get("longKey"), attributes.get(AttributeKey.longKey("longKey"))); assertEquals(data.get("doubleKey"), attributes.get(AttributeKey.doubleKey("doubleKey")));