Skip to content

Commit 1ca2ae0

Browse files
committed
Refactor LLMObs getting current LLMObs parentSpanID
1 parent a4d0421 commit 1ca2ae0

File tree

3 files changed

+26
-24
lines changed

3 files changed

+26
-24
lines changed

dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/CompletionServiceInstrumentation.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.openai.core.http.StreamResponse;
1313
import com.openai.models.completions.Completion;
1414
import com.openai.models.completions.CompletionCreateParams;
15+
import datadog.context.ContextScope;
1516
import datadog.trace.agent.tooling.Instrumenter;
1617
import datadog.trace.bootstrap.instrumentation.api.AgentScope;
1718
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
@@ -45,15 +46,20 @@ public static class CreateAdvice {
4546
@Advice.OnMethodEnter(suppress = Throwable.class)
4647
public static AgentScope enter(
4748
@Advice.Argument(0) final CompletionCreateParams params,
48-
@Advice.FieldValue("clientOptions") ClientOptions clientOptions) {
49+
@Advice.FieldValue("clientOptions") ClientOptions clientOptions,
50+
@Advice.Local("llmScope") ContextScope llmScope) {
4951
AgentSpan span = DECORATE.startSpan(clientOptions);
52+
// llmScope = LLMObsContext.attach(span.context());
53+
// TODO why would we ever need to activate llmScope in this instrumentation if we never expect
54+
// inner llmobs spans
5055
CompletionDecorator.DECORATE.withCompletionCreateParams(span, params);
5156
return activateSpan(span);
5257
}
5358

5459
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
5560
public static void exit(
5661
@Advice.Enter final AgentScope scope,
62+
@Advice.Local("llmScope") ContextScope llmScope,
5763
@Advice.Return(readOnly = false) HttpResponseFor<Completion> response,
5864
@Advice.Thrown final Throwable err) {
5965
AgentSpan span = scope.span();
@@ -64,6 +70,7 @@ public static void exit(
6470
HttpResponseWrapper.wrap(response, span, CompletionDecorator.DECORATE::withCompletion);
6571
}
6672
scope.close();
73+
// llmScope.close();
6774
}
6875
}
6976

dd-java-agent/instrumentation/openai-java/openai-java-3.0/src/main/java/datadog/trace/instrumentation/openai_java/OpenAiDecorator.java

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22

33
import com.openai.core.ClientOptions;
44
import com.openai.core.http.Headers;
5-
import datadog.trace.api.DDSpanId;
65
import datadog.trace.api.llmobs.LLMObsContext;
76
import datadog.trace.bootstrap.instrumentation.api.AgentSpan;
8-
import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext;
97
import datadog.trace.bootstrap.instrumentation.api.AgentTracer;
108
import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes;
119
import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString;
@@ -27,7 +25,9 @@ public class OpenAiDecorator extends ClientDecorator {
2725
public AgentSpan startSpan(ClientOptions clientOptions) {
2826
AgentSpan span = AgentTracer.startSpan(INSTRUMENTATION_NAME, SPAN_NAME);
2927
afterStart(span);
30-
withClientOptions(span, clientOptions);
28+
span.setTag("openai.api_base", clientOptions.baseUrl());
29+
// TODO api_version (either last part of the URL, or api-version param if Azure)
30+
// clientOptions.queryParams().values("api-version")
3131
return span;
3232
}
3333

@@ -61,22 +61,11 @@ protected CharSequence component() {
6161

6262
@Override
6363
public AgentSpan afterStart(AgentSpan span) {
64-
span.setTag("_ml_obs_tag.parent_id", currentLlmParentSpanId());
64+
// TODO only if llmobs enabled
65+
span.setTag("_ml_obs_tag.parent_id", LLMObsContext.parentSpanId());
6566
return super.afterStart(span);
6667
}
6768

68-
private String currentLlmParentSpanId() {
69-
AgentSpanContext parentLlmContext = LLMObsContext.current();
70-
if (parentLlmContext == null) {
71-
return LLMObsContext.ROOT_SPAN_ID;
72-
}
73-
long parentLlmSpanId = parentLlmContext.getSpanId();
74-
if (parentLlmSpanId == DDSpanId.ZERO) {
75-
return LLMObsContext.ROOT_SPAN_ID;
76-
}
77-
return Long.toString(parentLlmSpanId);
78-
}
79-
8069
public void withHttpResponse(AgentSpan span, Headers headers) {
8170
List<String> values = headers.values("openai-organization");
8271
if (!values.isEmpty()) {
@@ -116,11 +105,4 @@ private static void setMetricFromHeader(
116105
// ~
117106
}
118107
}
119-
120-
public void withClientOptions(AgentSpan span, ClientOptions clientOptions) {
121-
span.setTag("openai.api_base", clientOptions.baseUrl());
122-
123-
// TODO api_version (either last part of the URL, or api-version param if Azure)
124-
// clientOptions.queryParams().values("api-version")
125-
}
126108
}

internal-api/src/main/java/datadog/trace/api/llmobs/LLMObsContext.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import datadog.context.Context;
44
import datadog.context.ContextKey;
55
import datadog.context.ContextScope;
6+
import datadog.trace.api.DDSpanId;
67
import datadog.trace.bootstrap.instrumentation.api.AgentSpanContext;
78

89
public final class LLMObsContext {
@@ -21,4 +22,16 @@ public static ContextScope attach(AgentSpanContext ctx) {
2122
public static AgentSpanContext current() {
2223
return Context.current().get(CONTEXT_KEY);
2324
}
25+
26+
public static String parentSpanId() {
27+
AgentSpanContext parentLlmContext = current();
28+
if (parentLlmContext == null) {
29+
return ROOT_SPAN_ID;
30+
}
31+
long parentLlmSpanId = parentLlmContext.getSpanId();
32+
if (parentLlmSpanId == DDSpanId.ZERO) {
33+
return ROOT_SPAN_ID;
34+
}
35+
return Long.toString(parentLlmSpanId);
36+
}
2437
}

0 commit comments

Comments
 (0)