Skip to content

Commit 6c2e844

Browse files
llatinovpujagani
andauthored
[java] Allow custom tracing to integrate with existing OpenTelemetry tracing
Fixes #9943 Co-authored-by: Puja Jagani <[email protected]>
1 parent 87802e8 commit 6c2e844

5 files changed

Lines changed: 46 additions & 2 deletions

File tree

java/src/org/openqa/selenium/remote/tracing/Tracer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,14 @@
1717

1818
package org.openqa.selenium.remote.tracing;
1919

20+
import io.opentelemetry.context.Context;
21+
2022
public interface Tracer {
2123

2224
TraceContext getCurrentContext();
2325

2426
Propagator getPropagator();
2527

28+
void setOpenTelemetryContext(Context context);
29+
2630
}

java/src/org/openqa/selenium/remote/tracing/empty/BUILD.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
load("@rules_jvm_external//:defs.bzl", "artifact")
12
load("//java:defs.bzl", "java_library")
23

34
java_library(
@@ -9,5 +10,6 @@ java_library(
910
deps = [
1011
"//java/src/org/openqa/selenium:core",
1112
"//java/src/org/openqa/selenium/remote/tracing:tracing-lib",
13+
artifact("io.opentelemetry:opentelemetry-context")
1214
],
1315
)

java/src/org/openqa/selenium/remote/tracing/empty/NullTracer.java

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

1818
package org.openqa.selenium.remote.tracing.empty;
1919

20+
import io.opentelemetry.context.Context;
2021
import org.openqa.selenium.remote.tracing.Propagator;
2122
import org.openqa.selenium.remote.tracing.TraceContext;
2223
import org.openqa.selenium.remote.tracing.Tracer;
@@ -31,4 +32,8 @@ public TraceContext getCurrentContext() {
3132
public Propagator getPropagator() {
3233
return new NullPropagator();
3334
}
35+
36+
@Override
37+
public void setOpenTelemetryContext(Context context) {
38+
}
3439
}

java/src/org/openqa/selenium/remote/tracing/opentelemetry/OpenTelemetryTracer.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ private static OpenTelemetryTracer createTracer() {
8383

8484
private final Tracer tracer;
8585
private final OpenTelemetryPropagator telemetryPropagator;
86+
private Context context;
8687

8788
public OpenTelemetryTracer(Tracer tracer, TextMapPropagator propagator) {
8889
this.tracer = Require.nonNull("Tracer", tracer);
@@ -93,11 +94,16 @@ public OpenTelemetryTracer(Tracer tracer, TextMapPropagator propagator) {
9394

9495
@Override
9596
public TraceContext getCurrentContext() {
96-
return new OpenTelemetryContext(tracer, Context.current());
97+
return new OpenTelemetryContext(tracer, context != null ? context : Context.current());
9798
}
9899

99100
@Override
100101
public Propagator getPropagator() {
101102
return telemetryPropagator;
102103
}
104+
105+
@Override
106+
public void setOpenTelemetryContext(Context context) {
107+
this.context = context;
108+
}
103109
}

java/test/org/openqa/selenium/remote/tracing/opentelemetry/TracerTest.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import io.opentelemetry.api.common.AttributesBuilder;
2424
import io.opentelemetry.api.trace.StatusCode;
2525
import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator;
26+
import io.opentelemetry.context.Context;
2627
import io.opentelemetry.context.propagation.ContextPropagators;
2728
import io.opentelemetry.sdk.OpenTelemetrySdk;
2829
import io.opentelemetry.sdk.common.CompletableResultCode;
@@ -102,7 +103,6 @@ public void shouldBeAbleToCreateATracer() {
102103
StatusCode.ERROR);
103104
assertThat(values).element(0)
104105
.extracting(el -> el.getAttributes().get(AttributeKey.stringKey("cheese"))).isEqualTo("gouda");
105-
106106
}
107107

108108
@Test
@@ -587,6 +587,33 @@ public void cleverShenanigansRepresentingWhatWeSeeInTheRouter() {
587587
routable.execute(new HttpRequest(GET, "/"));
588588
}
589589

590+
@Test
591+
public void shouldBeAbleToSetExternalContextAndCreatedSpansAreItsChildren() {
592+
List<SpanData> allSpans = new ArrayList<>();
593+
Tracer tracer = createTracer(allSpans);
594+
595+
OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder().build();
596+
io.opentelemetry.api.trace.Span externalSpan = openTelemetrySdk
597+
.getTracer("externalTracer")
598+
.spanBuilder("externalSpan")
599+
.startSpan();
600+
Context parentContext = Context.current().with(externalSpan);
601+
tracer.setOpenTelemetryContext(parentContext);
602+
603+
Span parent = tracer.getCurrentContext().createSpan("parent");
604+
try (Span child = parent.createSpan("child")) {
605+
}
606+
parent.close();
607+
608+
assertThat(allSpans).hasSize(2);
609+
assertThat(allSpans.get(0).getName()).isEqualTo("child");
610+
assertThat(allSpans.get(0).getParentSpanId())
611+
.isEqualTo(parent.getId());
612+
assertThat(allSpans.get(1).getName()).isEqualTo("parent");
613+
assertThat(allSpans.get(1).getParentSpanId())
614+
.isEqualTo(externalSpan.getSpanContext().getSpanId());
615+
}
616+
590617
private Tracer createTracer(List<SpanData> exportTo) {
591618
ContextPropagators propagators =
592619
ContextPropagators.create((W3CTraceContextPropagator.getInstance()));

0 commit comments

Comments
 (0)