From badf39cccacb689ba9e02ac0ac548e93926e8df8 Mon Sep 17 00:00:00 2001 From: jack-berg <34418638+jack-berg@users.noreply.github.com> Date: Wed, 17 Apr 2024 13:24:52 -0500 Subject: [PATCH] Add ReadableSpan#getAttributes (#6382) --- .../opentelemetry-sdk-trace.txt | 4 ++- .../opentelemetry/sdk/trace/ReadableSpan.java | 17 ++++++++++++ .../io/opentelemetry/sdk/trace/SdkSpan.java | 7 +++++ .../opentelemetry/sdk/trace/SdkSpanTest.java | 26 +++++++++++++++++++ 4 files changed, 53 insertions(+), 1 deletion(-) diff --git a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt index df26146497b..722ee3a950f 100644 --- a/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt +++ b/docs/apidiffs/current_vs_latest/opentelemetry-sdk-trace.txt @@ -1,2 +1,4 @@ Comparing source compatibility of against -No changes. \ No newline at end of file +*** MODIFIED INTERFACE: PUBLIC ABSTRACT io.opentelemetry.sdk.trace.ReadableSpan (not serializable) + === CLASS FILE FORMAT VERSION: 52.0 <- 52.0 + +++ NEW METHOD: PUBLIC(+) io.opentelemetry.api.common.Attributes getAttributes() diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/ReadableSpan.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/ReadableSpan.java index f367aa67b28..f59b87599c1 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/ReadableSpan.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/ReadableSpan.java @@ -6,6 +6,7 @@ package io.opentelemetry.sdk.trace; import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.SpanContext; import io.opentelemetry.api.trace.SpanKind; @@ -111,4 +112,20 @@ default InstrumentationScopeInfo getInstrumentationScopeInfo() { */ @Nullable T getAttribute(AttributeKey key); + + /** + * Returns the Span attributes. + * + *

Attributes can be changed during the lifetime of the Span by using {@link + * Span#setAttribute}} so this value cannot be cached. + * + *

Note: the implementation of this method performs locking and returns an immutable copy to + * ensure thread-safe behavior. If you only need a single attribute it is better to call {@link + * #getAttribute(AttributeKey)}. + * + * @return the Span attributes, or {@link Attributes#empty()} if the span has no attributes. + */ + default Attributes getAttributes() { + return Attributes.empty(); + } } diff --git a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java index dfa8e9689a0..e70359aa46d 100644 --- a/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java +++ b/sdk/trace/src/main/java/io/opentelemetry/sdk/trace/SdkSpan.java @@ -232,6 +232,13 @@ public T getAttribute(AttributeKey key) { } } + @Override + public Attributes getAttributes() { + synchronized (lock) { + return attributes == null ? Attributes.empty() : attributes.immutableCopy(); + } + } + @Override public boolean hasEnded() { synchronized (lock) { diff --git a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanTest.java b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanTest.java index 42302f54b82..13defbdca82 100644 --- a/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanTest.java +++ b/sdk/trace/src/test/java/io/opentelemetry/sdk/trace/SdkSpanTest.java @@ -339,6 +339,32 @@ void getAttribute() { } } + @Test + void getAttributes() { + SdkSpan span = createTestSpanWithAttributes(attributes); + try { + assertThat(span.getAttributes()) + .isEqualTo( + Attributes.builder() + .put("MyBooleanAttributeKey", false) + .put("MyStringAttributeKey", "MyStringAttributeValue") + .put("MyLongAttributeKey", 123L) + .build()); + } finally { + span.end(); + } + } + + @Test + void getAttributes_Empty() { + SdkSpan span = createTestSpan(SpanKind.INTERNAL); + try { + assertThat(span.getAttributes()).isEqualTo(Attributes.empty()); + } finally { + span.end(); + } + } + @Test @SuppressWarnings("deprecation") // Testing deprecated code void getInstrumentationLibraryInfo() {