Skip to content

Instantly share code, notes, and snippets.

@luhenry
Created June 8, 2021 13:31
Show Gist options
  • Save luhenry/3aa72a060265ed69a9f89af968096a4e to your computer and use it in GitHub Desktop.
Save luhenry/3aa72a060265ed69a9f89af968096a4e to your computer and use it in GitHub Desktop.
diff --git a/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java b/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java
index 631425973..fb75d53dc 100644
--- a/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java
+++ b/dd-trace-core/src/main/java/datadog/trace/core/DDSpan.java
@@ -16,6 +16,8 @@ import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import javax.annotation.Nonnull;
+import jdk.jfr.RecordingContext;
+import jdk.jfr.RecordingContextEntry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -28,6 +30,13 @@ import org.slf4j.LoggerFactory;
public class DDSpan implements AgentSpan, CoreSpan<DDSpan> {
private static final Logger log = LoggerFactory.getLogger(DDSpan.class);
+ private static final RecordingContextEntry recordingContextTraceId =
+ RecordingContextEntry.forName("dd.trace.id");
+ private static final RecordingContextEntry recordingContextSpanId =
+ RecordingContextEntry.forName("dd.span.id");
+
+ private final RecordingContext recordingContext;
+
static DDSpan create(final long timestampMicro, @Nonnull DDSpanContext context) {
final DDSpan span = new DDSpan(timestampMicro, context);
log.debug("Started span: {}", span);
@@ -68,6 +77,12 @@ public class DDSpan implements AgentSpan, CoreSpan<DDSpan> {
private DDSpan(final long timestampMicro, @Nonnull DDSpanContext context) {
this.context = context;
+ this.recordingContext =
+ RecordingContext.builder()
+ .where(recordingContextTraceId, context.getTraceId().toString())
+ .where(recordingContextSpanId, context.getSpanId().toString())
+ .build();
+
if (timestampMicro <= 0L) {
// record the start time
startTimeMicro = Clock.currentMicroTime();
@@ -89,6 +104,7 @@ public class DDSpan implements AgentSpan, CoreSpan<DDSpan> {
if (this.durationNano.compareAndSet(0, Math.max(1, durationNano))) {
log.debug("Finished span: {}", this);
context.getTrace().addFinishedSpan(this);
+ recordingContext.close();
} else {
log.debug("Already finished: {}", this);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment