java-agent-based instrumentation plus manual instrumentation creates 2 different trace contexts #4485
-
I met an issue that when I combined java-agent-based instrumentation to manual instrumentation, then got 2 different traces, I don't know how this happens. I have a play app which has dependency like this: val tracingDependencies = Seq(
// https://mvnrepository.com/artifact/io.opentelemetry/opentelemetry-bom
// libraryDependencies += "io.opentelemetry" % "opentelemetry-bom" % "1.14.0" pomOnly(),
// https://mvnrepository.com/artifact/io.opentelemetry/opentelemetry-sdk
libraryDependencies += "io.opentelemetry" % "opentelemetry-sdk" % "1.14.0",
libraryDependencies += "io.opentelemetry" % "opentelemetry-sdk-trace" % "1.14.0",
libraryDependencies += "io.opentelemetry" % "opentelemetry-api" % "1.14.0",
// https://mvnrepository.com/artifact/io.opentelemetry/opentelemetry-exporter-otlp
libraryDependencies += "io.opentelemetry" % "opentelemetry-exporter-otlp" % "1.14.0",
// https://mvnrepository.com/artifact/io.opentelemetry/opentelemetry-exporter-logging-otlp
libraryDependencies += "io.opentelemetry" % "opentelemetry-exporter-logging-otlp" % "1.14.0",
// https://mvnrepository.com/artifact/io.opentelemetry.instrumentation/opentelemetry-logback-1.0
libraryDependencies += "io.opentelemetry.instrumentation" % "opentelemetry-logback-1.0" % "1.9.2-alpha" % "runtime",
libraryDependencies += "io.opentelemetry" % "opentelemetry-extension-annotations" % "0.17.1",
// https://mvnrepository.com/artifact/io.opentelemetry/opentelemetry-sdk-extension-autoconfigure
libraryDependencies += "io.opentelemetry" % "opentelemetry-sdk-extension-autoconfigure" % "1.14.0-alpha",
// https://mvnrepository.com/artifact/io.grpc/grpc-stub
libraryDependencies += "io.grpc" % "grpc-stub" % "1.46.0"
) then I bootstrap my application like this: /Users/magicliang/Desktop/Programming/sdk/jdk1.8.0_322.jdk/Contents/Home/bin/java -agentlib:jdwp=transport=dt_socket,address=localhost:53813,suspend=n,server=y -Xdebug -server -Dsbt.supershell=false -Xmx2048M -javaagent:/Users/magicliang/Desktop/Programming/sdk/opentelemetry-javaagent.jar -Dotel.exporter.otlp.endpoint=http://localhost:4317 -Dotel.resource.attributes=service.name=app-name-local -Dotel.metrics.exporter=none -Dotel.logs.exporter=none -Didea.managed=true -Dfile.encoding=UTF-8 "-Didea.installation.dir=/Applications/IntelliJ IDEA.app/Contents" -jar /Users/magicliang/.sdkman/candidates/sbt/1.2.8/bin/sbt-launch.jar early(addPluginSbtFile=\"\"\"/private/var/folders/f1/s8ncc6ts4j552dblgplg1h000000gn/T/idea270.sbt\"\"\") "; set ideaPort in Global := 49817 ; idea-shell" then I have a structure like this: @WithSpan
public void foo() {
bar1();
bar2();
bar3();
}
public void bar3() {
final Tracer tracer = GlobalOpenTelemetry.get().getTracer("app-name", "1.0.0");
final Span span = tracer.spanBuilder(String.format("%s.%s", "test", "bar3"))
.setParent(Context.current().with(Span.current()))
.startSpan();
try (Scope ignored = span.makeCurrent()) {
// do something
} catch (Throwable throwable) {
span.setStatus(StatusCode.ERROR, "Something bad happened!");
span.recordException(throwable);
throw throwable;
} finally {
span.end();
}
} according to my understanding of Opentelemetry, bar3 and foo should share same context(with 1 trace id i can search all operation in Jaeger), but it turns out I got 2 traces, one is foo trace, another is bar3 trace. any one can explain how this can happen? |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 7 replies
-
I think I figure out the answer: if javaagent-sdk's version is different with Opentelemetry-sdk's version, that will create 2 traces at same thread, same invocation. |
Beta Was this translation helpful? Give feedback.
I think I figure out the answer: if javaagent-sdk's version is different with Opentelemetry-sdk's version, that will create 2 traces at same thread, same invocation.