Skip to content

Commit 4b3cedd

Browse files
make extended tracer easier to use (#6943)
Co-authored-by: Jack Berg <[email protected]>
1 parent d71db3a commit 4b3cedd

File tree

7 files changed

+100
-13
lines changed

7 files changed

+100
-13
lines changed

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

+1-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import io.opentelemetry.api.incubator.propagation.ExtendedContextPropagators;
1111
import io.opentelemetry.api.internal.ApiUsageLogger;
1212
import io.opentelemetry.api.trace.Span;
13-
import io.opentelemetry.api.trace.SpanBuilder;
1413
import io.opentelemetry.api.trace.SpanContext;
1514
import io.opentelemetry.api.trace.SpanKind;
1615
import io.opentelemetry.api.trace.Tracer;
@@ -33,7 +32,7 @@ static Tracer getNoop() {
3332
}
3433

3534
@Override
36-
public SpanBuilder spanBuilder(String spanName) {
35+
public ExtendedSpanBuilder spanBuilder(String spanName) {
3736
return NoopSpanBuilder.create();
3837
}
3938

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

+3
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,7 @@ public interface ExtendedTracer extends Tracer {
2020
default boolean isEnabled() {
2121
return true;
2222
}
23+
24+
@Override
25+
ExtendedSpanBuilder spanBuilder(String spanName);
2326
}

api/incubator/src/test/java/io/opentelemetry/api/incubator/trace/ExtendedTraceApiUsageTest.java

+12-5
Original file line numberDiff line numberDiff line change
@@ -166,27 +166,32 @@ void startAndCallOrRun() {
166166

167167
// Get a Tracer for a scope
168168
Tracer tracer = tracerProvider.get("org.foo.my-scope");
169+
ExtendedTracer extendedTracer = (ExtendedTracer) tracer;
169170

170171
// Wrap the resetCheckout method in a span
171172
String cartId =
172173
((ExtendedSpanBuilder) tracer.spanBuilder("reset_checkout_and_return"))
173174
.setAttribute("key123", "val456")
174175
.startAndCall(() -> resetCheckoutAndReturn("abc123", /* throwException= */ false));
175176
assertThat(cartId).isEqualTo("abc123");
177+
// ...or use ExtendedTracer instance
176178
// ...or runnable variation
177-
((ExtendedSpanBuilder) tracer.spanBuilder("reset_checkout"))
179+
extendedTracer
180+
.spanBuilder("reset_checkout")
178181
.startAndRun(() -> resetCheckout("abc123", /* throwException= */ false));
179182

180183
// Wrap the resetCheckout method in a span; resetCheckout throws an exception
181184
try {
182-
((ExtendedSpanBuilder) tracer.spanBuilder("reset_checkout_and_return"))
185+
extendedTracer
186+
.spanBuilder("reset_checkout_and_return")
183187
.startAndCall(() -> resetCheckoutAndReturn("def456", /* throwException= */ true));
184188
} catch (Throwable e) {
185189
// Ignore expected exception
186190
}
187191
// ...or runnable variation
188192
try {
189-
((ExtendedSpanBuilder) tracer.spanBuilder("reset_checkout"))
193+
extendedTracer
194+
.spanBuilder("reset_checkout")
190195
.startAndRun(() -> resetCheckout("def456", /* throwException= */ true));
191196
} catch (Throwable e) {
192197
// Ignore expected exception
@@ -195,7 +200,8 @@ void startAndCallOrRun() {
195200
// Wrap the resetCheckout method in a span; resetCheckout throws an exception; use custom error
196201
// handler
197202
try {
198-
((ExtendedSpanBuilder) tracer.spanBuilder("reset_checkout_and_return"))
203+
extendedTracer
204+
.spanBuilder("reset_checkout_and_return")
199205
.startAndCall(
200206
() -> resetCheckoutAndReturn("ghi789", /* throwException= */ true),
201207
(span, throwable) -> span.setAttribute("my-attribute", "error"));
@@ -204,7 +210,8 @@ void startAndCallOrRun() {
204210
}
205211
// ...or runnable variation
206212
try {
207-
((ExtendedSpanBuilder) tracer.spanBuilder("reset_checkout"))
213+
extendedTracer
214+
.spanBuilder("reset_checkout")
208215
.startAndRun(
209216
() -> resetCheckout("ghi789", /* throwException= */ true),
210217
(span, throwable) -> span.setAttribute("my-attribute", "error"));

integration-tests/graal-incubating/src/test/java/io/opentelemetry/integrationtests/graal/IncubatingApiTests.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import static org.assertj.core.api.Assertions.assertThat;
99

10-
import io.opentelemetry.api.incubator.logs.ExtendedLogRecordBuilder;
1110
import io.opentelemetry.api.incubator.logs.ExtendedLogger;
1211
import io.opentelemetry.api.incubator.metrics.ExtendedDoubleCounter;
1312
import io.opentelemetry.api.incubator.metrics.ExtendedDoubleGauge;
@@ -18,7 +17,6 @@
1817
import io.opentelemetry.api.incubator.metrics.ExtendedLongGauge;
1918
import io.opentelemetry.api.incubator.metrics.ExtendedLongHistogram;
2019
import io.opentelemetry.api.incubator.metrics.ExtendedLongUpDownCounter;
21-
import io.opentelemetry.api.incubator.trace.ExtendedSpanBuilder;
2220
import io.opentelemetry.api.incubator.trace.ExtendedTracer;
2321
import io.opentelemetry.api.logs.LoggerProvider;
2422
import io.opentelemetry.api.metrics.Meter;
@@ -53,7 +51,7 @@ void incubatingLogSdk() {
5351

5452
ExtendedLogger logger = (ExtendedLogger) loggerProvider.get("logger");
5553
logger.isEnabled();
56-
((ExtendedLogRecordBuilder) logger.logRecordBuilder()).setBody("message").emit();
54+
logger.logRecordBuilder().setBody("message").emit();
5755
}
5856

5957
@Test
@@ -64,7 +62,7 @@ void incubatingTraceSdk() {
6462

6563
ExtendedTracer tracer = (ExtendedTracer) tracerProvider.get("tracer");
6664
tracer.isEnabled();
67-
((ExtendedSpanBuilder) tracer.spanBuilder("span")).startAndRun(() -> {});
65+
tracer.spanBuilder("span").startAndRun(() -> {});
6866
}
6967

7068
@Test

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

+6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.sdk.trace;
77

8+
import io.opentelemetry.api.incubator.trace.ExtendedSpanBuilder;
89
import io.opentelemetry.api.incubator.trace.ExtendedTracer;
910
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
1011
import io.opentelemetry.sdk.trace.internal.TracerConfig;
@@ -27,4 +28,9 @@ final class ExtendedSdkTracer extends SdkTracer implements ExtendedTracer {
2728
public boolean isEnabled() {
2829
return tracerEnabled;
2930
}
31+
32+
@Override
33+
public ExtendedSpanBuilder spanBuilder(String spanName) {
34+
return (ExtendedSpanBuilder) super.spanBuilder(spanName);
35+
}
3036
}

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

+5-2
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ static SdkTracer create(
5353
: new SdkTracer(sharedState, instrumentationScopeInfo, tracerConfig);
5454
}
5555

56+
/**
57+
* Note that {@link ExtendedSdkTracer#spanBuilder(String)} calls this and depends on it returning
58+
* {@link ExtendedSdkTracer} in all cases when the incubator is present.
59+
*/
5660
@Override
5761
public SpanBuilder spanBuilder(String spanName) {
5862
if (!tracerEnabled) {
@@ -62,8 +66,7 @@ public SpanBuilder spanBuilder(String spanName) {
6266
spanName = FALLBACK_SPAN_NAME;
6367
}
6468
if (sharedState.hasBeenShutdown()) {
65-
Tracer tracer = TracerProvider.noop().get(instrumentationScopeInfo.getName());
66-
return tracer.spanBuilder(spanName);
69+
return NOOP_TRACER.spanBuilder(spanName);
6770
}
6871
return INCUBATOR_AVAILABLE
6972
? IncubatingUtil.createExtendedSpanBuilder(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
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.internal.ScopeConfiguratorBuilder.nameEquals;
9+
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
10+
import static io.opentelemetry.sdk.trace.internal.TracerConfig.disabled;
11+
12+
import io.opentelemetry.api.incubator.trace.ExtendedSpanBuilder;
13+
import io.opentelemetry.api.incubator.trace.ExtendedTracer;
14+
import io.opentelemetry.sdk.testing.exporter.InMemorySpanExporter;
15+
import io.opentelemetry.sdk.trace.export.SimpleSpanProcessor;
16+
import java.util.function.Supplier;
17+
import java.util.stream.Stream;
18+
import org.junit.jupiter.params.ParameterizedTest;
19+
import org.junit.jupiter.params.provider.Arguments;
20+
import org.junit.jupiter.params.provider.MethodSource;
21+
22+
class ExtendedTracerTest {
23+
24+
/**
25+
* {@link ExtendedTracer#spanBuilder(String)} delegates to {@link SdkTracer#spanBuilder(String)}
26+
* and casts the result to {@link ExtendedSpanBuilder}. Therefore, we need to confirm that {@link
27+
* SdkTracer#spanBuilder(String)} correctly returns {@link ExtendedSpanBuilder} and not {@link
28+
* io.opentelemetry.api.trace.SpanBuilder} in all cases, else the user will get {@link
29+
* ClassCastException}.
30+
*/
31+
@ParameterizedTest
32+
@MethodSource("spanBuilderArgs")
33+
void spanBuilder(Supplier<ExtendedSpanBuilder> spanBuilderSupplier) {
34+
ExtendedSpanBuilder spanBuilder = spanBuilderSupplier.get();
35+
assertThat(spanBuilder).isInstanceOf(ExtendedSpanBuilder.class);
36+
}
37+
38+
private static Stream<Arguments> spanBuilderArgs() {
39+
SdkTracerProvider tracerProvider =
40+
SdkTracerProvider.builder()
41+
.addSpanProcessor(SimpleSpanProcessor.create(InMemorySpanExporter.create()))
42+
.addTracerConfiguratorCondition(nameEquals("tracerB"), disabled())
43+
.build();
44+
45+
ExtendedTracer tracerA = (ExtendedTracer) tracerProvider.get("tracerA");
46+
ExtendedTracer tracerB = (ExtendedTracer) tracerProvider.get("tracerB");
47+
48+
SdkTracerProvider tracerProvider2 =
49+
SdkTracerProvider.builder()
50+
.addSpanProcessor(SimpleSpanProcessor.create(InMemorySpanExporter.create()))
51+
.build();
52+
ExtendedTracer tracerC = (ExtendedTracer) tracerProvider.get("tracerC");
53+
tracerProvider2.shutdown();
54+
55+
return Stream.of(
56+
// Simple case
57+
Arguments.of(spanBuilderSupplier(() -> tracerA.spanBuilder("span"))),
58+
// Disabled tracer
59+
Arguments.of(spanBuilderSupplier(() -> tracerB.spanBuilder("span"))),
60+
// Invalid span name
61+
Arguments.of(spanBuilderSupplier(() -> tracerB.spanBuilder(null))),
62+
Arguments.of(spanBuilderSupplier(() -> tracerB.spanBuilder(" "))),
63+
// Shutdown tracer provider
64+
Arguments.of(spanBuilderSupplier(() -> tracerC.spanBuilder("span"))));
65+
}
66+
67+
private static Supplier<ExtendedSpanBuilder> spanBuilderSupplier(
68+
Supplier<ExtendedSpanBuilder> spanBuilderSupplier) {
69+
return spanBuilderSupplier;
70+
}
71+
}

0 commit comments

Comments
 (0)