Skip to content

NoClassDefFoundError in dd-trace-ot #8910

@yoyama

Description

@yoyama

Tracer Version(s)

1.48.0

Java Version(s)

17.0.9

JVM Vendor

Azul Zing / Zulu

Bug Report

I faced the following runtime error with dd-trace-ot in Span.log()

Exception in thread "main" java.lang.NoClassDefFoundError: ddtrot/dd/trace/bootstrap/debugger/DebuggerContext
        at ddtrot.dd.trace.core.DDSpan.isExceptionReplayEnabled(DDSpan.java:368)
        at ddtrot.dd.trace.core.DDSpan.addThrowable(DDSpan.java:360)
        at ddtrot.dd.trace.core.DDSpan.addThrowable(DDSpan.java:338)
        at ddtrot.dd.trace.core.DDSpan.addThrowable(DDSpan.java:49)
        at datadog.opentracing.DefaultLogHandler.extractError(DefaultLogHandler.java:47)
        at datadog.opentracing.DefaultLogHandler.log(DefaultLogHandler.java:20)
        at datadog.opentracing.OTSpan.log(OTSpan.java:98)
        at datadog.opentracing.OTSpan.log(OTSpan.java:17)
        at yoyama.App.getGreeting(App.java:26)
        at yoyama.App.main(App.java:36)
Caused by: java.lang.ClassNotFoundException: ddtrot.dd.trace.bootstrap.debugger.DebuggerContext
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
        at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)

The failure happen with dd-trace-ot:1.48.0 or later version.
dd-trace-ot:1.47.3 works.

ddtrot.dd.trace.core.DDSpan.isExceptionReplayEnabled(DDSpan.java:368) callsDebuggerContext.isExceptionReplayEnabled(). But DebuggerContext is defined in dd-java-agent. Then DDSpan can't load it.

Expected Behavior

I would like to stop NoClassDefFoundError

Reproduction Code

App.java:

package yoyama;

import datadog.opentracing.DDTracer;
import io.opentracing.Scope;
import io.opentracing.Span;
import io.opentracing.Tracer;
import io.opentracing.util.GlobalTracer;

import java.util.Map;

public class App {
    private final Tracer tracer;

    public App(Tracer tracer) {
        this.tracer = tracer;
    }

    public String getGreeting(String name) {
        Span span = tracer.buildSpan("getGreeting").start();
        try (final Scope scope = tracer.activateSpan(span)) {
            if (true) { // Simulate an error condition for testing
                throw new RuntimeException("Simulated exception for testing");
            }
            return "Hello, " + name + "!";
        } catch (Exception e) {
            span.log(Map.of("event", "error", "error.object", e));
            return "Unexpected error";
        } finally {
            span.finish();
        }
    }

    public static void main(String[] args) {
        var tracer = DDTracer.builder().build();
        GlobalTracer.registerIfAbsent(tracer);
        System.out.println(new App(tracer).getGreeting("World"));
    }
}

build.gradle.kts:

plugins {
    application
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("com.datadoghq:dd-trace-ot:1.48.0")
    implementation("io.opentracing:opentracing-api:0.33.0")
}

application {
    mainClass.set("yoyama.App")
}

Metadata

Metadata

Assignees

Labels

type: bugBug report and fix

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions