dd-trace-ot 1.67.x: NoClassDefFoundError `ddtrot/dd/trace/api/llmobs/LLMObs`
Los mantenedores suelen responder en 2 días
Evaluación
Este issue todavía no se ha evaluado.
Descripción
Tracer Version(s)
1.67.0+
Java Version(s)
25
JVM Vendor
Oracle JDK
Bug Report
Since 1.67.0, DDTracer.inject(...) from dd-trace-ot throws NoClassDefFoundError for ddtrot/dd/trace/api/llmobs/LLMObs. 1.66.0 is fine. dd-trace-api is on the classpath at the same version as dd-trace-ot.
java.lang.NoClassDefFoundError: ddtrot/dd/trace/api/llmobs/LLMObs
at ddtrot.dd.trace.core.propagation.DatadogHttpCodec$Injector.inject(DatadogHttpCodec.java:86)
at ddtrot.dd.trace.core.propagation.HttpCodec$CompoundInjector.inject(HttpCodec.java:194)
at ddtrot.dd.trace.core.propagation.TracingPropagator.inject(TracingPropagator.java:58)
at ddtrot.dd.context.propagation.CompositePropagator.inject(CompositePropagator.java:18)
at datadog.opentracing.DDTracer.inject(DDTracer.java:490)
Caused by: java.lang.ClassNotFoundException: ddtrot.dd.trace.api.llmobs.LLMObs
Analysis
This is a regression from #12416 (9a03e95e32), which makes DatadogHttpCodec$Injector.inject call LLMObsInternal.propagationValuesFor(...). LLMObsInternal (internal-api) extends LLMObs (dd-trace-api).
In dd-trace-ot/build.gradle.kts, the shadow jar excludes :dd-trace-api and relocates datadog. to ddtrot.dd.. The exclude %regex[datadog/trace/api/(?!Functions|Endpoint)[^/]*] only covers classes directly under datadog/trace/api/, so datadog.trace.api.llmobs.* is relocated. The resulting dd-trace-ot-1.67.1.jar contains ddtrot/dd/trace/api/llmobs/LLMObsInternal.class (superclass ddtrot.dd.trace.api.llmobs.LLMObs) but no LLMObs.class. dd-trace-api only provides the unrelocated datadog/trace/api/llmobs/LLMObs.
Possible fix (untested): add exclude("datadog.trace.api.llmobs.*") to the relocate("datadog.", "ddtrot.dd.") block.
Environment
dd-trace-otanddd-trace-api1.67.1 (also 1.67.0)- JDK 25 (Temurin), OpenTracing 0.32.0
Expected Behavior
DDTracer.inject(...) injects the Datadog headers into the carrier without error, as it does in 1.66.0:
injected headers: {x-datadog-parent-id=..., x-datadog-sampling-priority=1, tracestate=dd=s:1;..., x-datadog-tags=_dd.p.dm=-1,...}
### Reproduction Code
Only `dd-trace-ot` and `dd-trace-api` are needed. Change `dd.version` to `1.66.0` to see it work.
`pom.xml`:
```xml
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<groupId>repro</groupId>
<artifactId>dd-ot-llmobs-repro</artifactId>
<version>1.0</version>
<properties>
<maven.compiler.release>17</maven.compiler.release>
<dd.version>1.67.1</dd.version>
</properties>
<dependencies>
<dependency>
<groupId>com.datadoghq</groupId>
<artifactId>dd-trace-ot</artifactId>
<version>${dd.version}</version>
</dependency>
<dependency>
<groupId>com.datadoghq</groupId>
<artifactId>dd-trace-api</artifactId>
<version>${dd.version}</version>
</dependency>
</dependencies>
</project>
src/main/java/repro/Main.java:
package repro;
import datadog.opentracing.DDTracer;
import io.opentracing.Span;
import io.opentracing.propagation.Format;
import io.opentracing.propagation.TextMapAdapter;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
System.setProperty("dd.writer.type", "LoggingWriter");
DDTracer tracer = DDTracer.builder().serviceName("repro").build();
Span span = tracer.buildSpan("op").start();
Map<String, String> headers = new HashMap<>();
tracer.inject(span.context(), Format.Builtin.HTTP_HEADERS, new TextMapAdapter(headers));
System.out.println("injected headers: " + headers);
span.finish();
tracer.close();
}
}
Run:
mvn -q -B compile
mvn -q -B dependency:build-classpath -Dmdep.outputFile=cp.txt
java -cp target/classes:$(cat cp.txt) repro.Main
(mvn exec:java also fails, but reports LLMObsInternal as the missing class because it wraps the error.)
- Lenguaje dominante
- Java
- Estrellas
- 736
- Forks
- 364
- Merge medio
- 3 d 9 h
- PR fusionados (30 d)
- 219
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de DataDog/dd-trace-java
-
type: bug report
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
DataDog/dd-trace-java#12818 · 3 reacciones ·
Los mantenedores suelen responder en 2 días
-
Update DEFAULT_HTTP_CLIENT_ERROR_STATUSES to include 5xx status codesQuizá libre de nuevo Un pull request para esta issue se cerró sin fusionarse. Abiertotype: feature request
Dificultad 1/5 1-3 horas Aptitud para principiantes 70/100
DataDog/dd-trace-java#10245 · 1 comentario ·
Los mantenedores suelen responder en 2 días
-
type: feature request
Dificultad 4/5 3-5 días Aptitud para principiantes 48/100
DataDog/dd-trace-java#12838 · 2 comentarios ·
Los mantenedores suelen responder en 2 días
-
Startup ~2x slower with AOT class linking: agent retransforms ~22k preloaded classes (JDK 25, 1.67.0)Posiblemente ocupada @mcculls la tomó hace 6 días. Abiertotype: bug report
DataDog/dd-trace-java#12795 · 2 comentarios · 1 asignado ·
Los mantenedores suelen responder en 2 días
-
gRPC server instrumentations (grpc-1.5, armeria-grpc) don't make extracted W3C baggage current in the handlerPosiblemente ocupada @mcculls la tomó hace 16 días. Abiertocomp: context propagation inst: grpc type: feature request
Dificultad 3/5 1-2 días Aptitud para principiantes 78/100
DataDog/dd-trace-java#12654 · 1 asignado ·
Los mantenedores suelen responder en 2 días
Todos los issues de DataDog/dd-trace-java
Issues similares
-
area/plugin good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
kestra-io/plugin-kestra#200 ·
Los mantenedores suelen responder en 1 día
-
bug untriaged
Dificultad 1/5 Menos de una hora Aptitud para principiantes 92/100
opensearch-project/search-relevance#618 ·
Los mantenedores suelen responder en 3 días
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
apache/rocketmq-dashboard#6716 ·
Los mantenedores suelen responder en 3 días
-
DefaultRedisList.get(int) does not reject an index equal to the list sizePosiblemente ocupada @ryujungkyun la tomó hoy. Abiertostatus: waiting-for-triage
Dificultad 1/5 Menos de una hora Aptitud para principiantes 68/100
spring-projects/spring-data-redis#3471 ·
Los mantenedores suelen responder en 5 días
-
Upgrade to Micrometer 1.17.2Abiertoin: build type: dependency-upgrade
Dificultad 1/5 Menos de una hora Aptitud para principiantes 62/100
spring-projects/spring-ldap#1791 ·
Los mantenedores suelen responder en 1 día