Skip to content

Commit d6110fc

Browse files
committed
TestOpenAiLlmObs::test_embedding[java-test-ml-app-tcp] PASSED
1 parent 1850e79 commit d6110fc

File tree

4 files changed

+58
-12
lines changed

4 files changed

+58
-12
lines changed

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

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import com.openai.models.completions.CompletionCreateParams;
1515
import com.openai.models.completions.CompletionUsage;
1616
import com.openai.models.embeddings.CreateEmbeddingResponse;
17+
import com.openai.models.embeddings.Embedding;
1718
import com.openai.models.embeddings.EmbeddingCreateParams;
1819
import com.openai.models.responses.Response;
1920
import com.openai.models.responses.ResponseCreateParams;
@@ -329,28 +330,39 @@ public void withEmbeddingCreateParams(AgentSpan span, EmbeddingCreateParams para
329330
}
330331
params.model()._value().asString().ifPresent(str -> span.setTag(REQUEST_MODEL, str));
331332

332-
// span.setTag("_ml_obs_tag.input", llmMessages(params.input()));
333+
span.setTag("_ml_obs_tag.input", embeddingDocuments(params.input()));
333334

334-
// "_ml_obs.meta.input.documents"
335+
Map<String, Object> metadata = new HashMap<>();
336+
Optional<String> encodingFormat = params.encodingFormat().flatMap(v -> v._value().asString());
337+
encodingFormat.ifPresent(v -> metadata.put("encoding_format", v));
338+
params.dimensions().ifPresent(v -> metadata.put("dimensions", v));
339+
span.setTag("_ml_obs_tag.metadata", metadata);
335340
}
336341

337-
private List<LLMObs.LLMMessage> llmMessages(EmbeddingCreateParams.Input input) {
342+
private List<LLMObs.Document> embeddingDocuments(EmbeddingCreateParams.Input input) {
338343
List<String> inputs = Collections.emptyList();
339344
if (input.isString()) {
340345
inputs = Collections.singletonList(input.asString());
341346
} else if (input.isArrayOfStrings()) {
342347
inputs = input.asArrayOfStrings();
343348
}
344-
return inputs.stream()
345-
.map(str -> LLMObs.LLMMessage.from(null, str))
346-
.collect(Collectors.toList());
349+
return inputs.stream().map(LLMObs.Document::from).collect(Collectors.toList());
347350
}
348351

349352
public void withCreateEmbeddingResponse(AgentSpan span, CreateEmbeddingResponse response) {
350353
String modelName = response.model();
351354
span.setTag(RESPONSE_MODEL, modelName);
352355
span.setTag("_ml_obs_tag.model_name", modelName);
353356
span.setTag("_ml_obs_tag.model_provider", "openai");
357+
358+
if (!response.data().isEmpty()) {
359+
int embeddingCount = response.data().size();
360+
Embedding firstEmbedding = response.data().get(0);
361+
int embeddingSize = firstEmbedding.embedding().size();
362+
span.setTag(
363+
"_ml_obs_tag.output",
364+
String.format("[%d embedding(s) returned with size %d]", embeddingCount, embeddingSize));
365+
}
354366
}
355367

356368
public void withResponseCreateParams(AgentSpan span, ResponseCreateParams params) {

dd-java-agent/instrumentation/openai-java/openai-java-1.0/src/test/groovy/EmbeddingServiceTest.groovy

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace
33
import com.openai.core.http.HttpResponseFor
44
import com.openai.models.embeddings.CreateEmbeddingResponse
55
import datadog.trace.api.DDSpanTypes
6+
import datadog.trace.api.llmobs.LLMObs
67
import datadog.trace.bootstrap.instrumentation.api.Tags
78
import datadog.trace.instrumentation.openai_java.OpenAiDecorator
89

@@ -50,8 +51,10 @@ class EmbeddingServiceTest extends OpenAiTest {
5051
tags {
5152
"_ml_obs_tag.span.kind" "embedding"
5253
"_ml_obs_tag.model_provider" "openai"
53-
"_ml_obs_tag.model_name" String
54-
54+
"_ml_obs_tag.model_name" "text-embedding-ada-002-v2"
55+
"_ml_obs_tag.input" List<LLMObs.Document>
56+
"_ml_obs_tag.metadata" Map
57+
"_ml_obs_tag.output" "[1 embedding(s) returned with size 1536]"
5558
"_ml_obs_tag.parent_id" "undefined"
5659
"openai.request.method" "POST"
5760
"openai.request.endpoint" "v1/embeddings"

dd-trace-api/src/main/java/datadog/trace/api/llmobs/LLMObs.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,4 +209,20 @@ public List<ToolCall> getToolCalls() {
209209
return toolCalls;
210210
}
211211
}
212+
213+
public static class Document {
214+
private String text;
215+
216+
public static Document from(String text) {
217+
return new Document(text);
218+
}
219+
220+
private Document(String text) {
221+
this.text = text;
222+
}
223+
224+
public String getText() {
225+
return text;
226+
}
227+
}
212228
}

dd-trace-core/src/main/java/datadog/trace/llmobs/writer/ddintake/LLMObsSpanMapper.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -288,10 +288,7 @@ public void accept(Metadata metadata) {
288288
if (key.equals(INPUT) || key.equals(OUTPUT)) {
289289
writable.writeString(key, null);
290290
writable.startMap(1);
291-
if (!spanKind.equals(Tags.LLMOBS_LLM_SPAN_KIND)) {
292-
writable.writeString("value", null);
293-
writable.writeObject(val, null);
294-
} else {
291+
if (spanKind.equals(Tags.LLMOBS_LLM_SPAN_KIND)) {
295292
if (!(val instanceof List)) {
296293
LOGGER.warn(
297294
"unexpectedly found incorrect type for LLM span IO {}, expecting list",
@@ -334,6 +331,24 @@ public void accept(Metadata metadata) {
334331
}
335332
}
336333
}
334+
} else if (spanKind.equals(Tags.LLMOBS_EMBEDDING_SPAN_KIND) && key.equals(INPUT)) {
335+
if (!(val instanceof List)) {
336+
LOGGER.warn(
337+
"unexpectedly found incorrect type for embedding span input {}, expecting list",
338+
val.getClass().getName());
339+
continue;
340+
}
341+
List<LLMObs.Document> documents = (List<LLMObs.Document>) val;
342+
writable.writeString("documents", null);
343+
writable.startArray(documents.size());
344+
for (LLMObs.Document document : documents) {
345+
writable.startMap(1);
346+
writable.writeString("text", null);
347+
writable.writeString(document.getText(), null);
348+
}
349+
} else {
350+
writable.writeString("value", null);
351+
writable.writeObject(val, null);
337352
}
338353
} else if (key.equals(LLMObsTags.METADATA) && val instanceof Map) {
339354
Map<String, Object> metadataMap = (Map) val;

0 commit comments

Comments
 (0)