Skip to content

Commit 43b6682

Browse files
committed
Spans
1 parent e2bf72d commit 43b6682

4 files changed

Lines changed: 110 additions & 0 deletions

File tree

api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedDefaultTracer.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import io.opentelemetry.api.common.AttributeKey;
99
import io.opentelemetry.api.common.Attributes;
10+
import io.opentelemetry.api.incubator.common.ExtendedAttributeKey;
1011
import io.opentelemetry.api.incubator.propagation.ExtendedContextPropagators;
1112
import io.opentelemetry.api.internal.ApiUsageLogger;
1213
import io.opentelemetry.api.trace.Span;
@@ -118,6 +119,11 @@ public <T> NoopSpanBuilder setAttribute(AttributeKey<T> key, T value) {
118119
return this;
119120
}
120121

122+
@Override
123+
public <T> NoopSpanBuilder setAttribute(ExtendedAttributeKey<T> key, T value) {
124+
return this;
125+
}
126+
121127
@Override
122128
public NoopSpanBuilder setAllAttributes(Attributes attributes) {
123129
return this;

api/incubator/src/main/java/io/opentelemetry/api/incubator/trace/ExtendedSpanBuilder.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import io.opentelemetry.api.OpenTelemetry;
99
import io.opentelemetry.api.common.AttributeKey;
1010
import io.opentelemetry.api.common.Attributes;
11+
import io.opentelemetry.api.incubator.common.ExtendedAttributeKey;
1112
import io.opentelemetry.api.trace.Span;
1213
import io.opentelemetry.api.trace.SpanBuilder;
1314
import io.opentelemetry.api.trace.SpanContext;
@@ -127,6 +128,17 @@ <E extends Throwable> void startAndRun(
127128
@Override
128129
<T> ExtendedSpanBuilder setAttribute(AttributeKey<T> key, T value);
129130

131+
/**
132+
* Set an attribute.
133+
*
134+
* <p>NOTE: all standard {@link AttributeKey}-value pairs can also be represented as {@link
135+
* ExtendedAttributeKey}-value pairs, but not all {@link ExtendedAttributeKey}-value pairs can be
136+
* represented as standard {@link AttributeKey}-value pairs. From the standpoint of the emitted
137+
* span, there is no difference between adding attributes using the standard or extended
138+
* attribute APIs.
139+
*/
140+
<T> ExtendedSpanBuilder setAttribute(ExtendedAttributeKey<T> key, T value);
141+
130142
/** {@inheritDoc} */
131143
@Override
132144
default ExtendedSpanBuilder setAllAttributes(Attributes attributes) {

sdk/trace/src/main/java/io/opentelemetry/sdk/trace/ExtendedSdkSpanBuilder.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import io.opentelemetry.api.common.AttributeKey;
99
import io.opentelemetry.api.common.Attributes;
10+
import io.opentelemetry.api.incubator.common.ExtendedAttributeKey;
1011
import io.opentelemetry.api.incubator.propagation.ExtendedContextPropagators;
1112
import io.opentelemetry.api.incubator.trace.ExtendedSpanBuilder;
1213
import io.opentelemetry.api.incubator.trace.SpanCallable;
@@ -94,6 +95,19 @@ public <T> ExtendedSpanBuilder setAttribute(AttributeKey<T> key, T value) {
9495
return this;
9596
}
9697

98+
@Override
99+
public <T> ExtendedSpanBuilder setAttribute(ExtendedAttributeKey<T> key, T value) {
100+
if (key == null || value == null) {
101+
return this;
102+
}
103+
AttributeKey<T> attributeKey = key.asAttributeKey();
104+
if (attributeKey == null || attributeKey.getKey().isEmpty()) {
105+
return this;
106+
}
107+
super.setAttribute(attributeKey, value);
108+
return this;
109+
}
110+
97111
@Override
98112
public ExtendedSpanBuilder setStartTimestamp(long startTimestamp, TimeUnit unit) {
99113
super.setStartTimestamp(startTimestamp, unit);
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.sdk.trace;
7+
8+
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
9+
10+
import io.opentelemetry.api.common.AttributeKey;
11+
import io.opentelemetry.api.incubator.common.ExtendedAttributeKey;
12+
import io.opentelemetry.api.incubator.common.ExtendedAttributes;
13+
import io.opentelemetry.api.incubator.trace.ExtendedSpanBuilder;
14+
import io.opentelemetry.api.incubator.trace.ExtendedTracer;
15+
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter;
16+
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
17+
import io.opentelemetry.sdk.trace.data.SpanData;
18+
import java.util.List;
19+
import org.junit.jupiter.api.AfterEach;
20+
import org.junit.jupiter.api.BeforeEach;
21+
import org.junit.jupiter.api.Test;
22+
23+
class ExtendedSpanBuilderTest {
24+
25+
private InMemorySpanExporter spanExporter;
26+
private SdkTracerProvider tracerProvider;
27+
private ExtendedTracer tracer;
28+
29+
@BeforeEach
30+
void setUp() {
31+
spanExporter = InMemorySpanExporter.create();
32+
tracerProvider =
33+
SdkTracerProvider.builder()
34+
.addSpanProcessor(SimpleSpanProcessor.create(spanExporter))
35+
.build();
36+
tracer = (ExtendedTracer) tracerProvider.get("test");
37+
}
38+
39+
@AfterEach
40+
void tearDown() throws Exception {
41+
tracerProvider.close();
42+
}
43+
44+
@Test
45+
void setAttribute_withExtendedAttributeKeyDelegatesToSdk() {
46+
ExtendedSpanBuilder spanBuilder = tracer.spanBuilder("span");
47+
48+
spanBuilder.setAttribute(ExtendedAttributeKey.stringKey("extended.string"), "value");
49+
spanBuilder.startSpan().end();
50+
51+
List<SpanData> spans = spanExporter.getFinishedSpanItems();
52+
assertThat(spans)
53+
.hasSize(1)
54+
.first()
55+
.satisfies(
56+
spanData ->
57+
assertThat(spanData.getAttributes())
58+
.containsEntry(AttributeKey.stringKey("extended.string"), "value"));
59+
}
60+
61+
@Test
62+
void setAttribute_withUnsupportedExtendedAttributeKeyIsNoop() {
63+
ExtendedSpanBuilder spanBuilder = tracer.spanBuilder("span");
64+
65+
spanBuilder.setAttribute(
66+
ExtendedAttributeKey.extendedAttributesKey("extended.map"), ExtendedAttributes.empty());
67+
spanBuilder.startSpan().end();
68+
69+
List<SpanData> spans = spanExporter.getFinishedSpanItems();
70+
assertThat(spans)
71+
.hasSize(1)
72+
.first()
73+
.satisfies(
74+
spanData ->
75+
assertThat(spanData.getAttributes().asMap())
76+
.doesNotContainKey(AttributeKey.stringKey("extended.map")));
77+
}
78+
}

0 commit comments

Comments
 (0)