Skip to content

Commit 10d8159

Browse files
committed
Be more defensive in setting metadata for observability events
Without this change it was possible in some of the ITs, depending on the mock response from the server, to have NPEs being thrown. These NPEs didn't affect the response, but they did clutter up the logs
1 parent d56aa6b commit 10d8159

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/listeners/MetricsChatModelListener.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import io.micrometer.core.instrument.Counter;
1717
import io.micrometer.core.instrument.Meter;
1818
import io.micrometer.core.instrument.Metrics;
19-
import io.micrometer.core.instrument.Tag;
2019
import io.micrometer.core.instrument.Tags;
2120
import io.micrometer.core.instrument.Timer;
2221
import io.quarkiverse.langchain4j.cost.Cost;
@@ -78,9 +77,10 @@ public void onResponse(ChatModelResponseContext responseContext) {
7877

7978
ChatModelRequest request = responseContext.request();
8079
ChatModelResponse response = responseContext.response();
81-
Tags tags = Tags.of(
82-
Tag.of("gen_ai.request.model", request.model()),
83-
Tag.of("gen_ai.response.model", response.model()));
80+
Tags tags = Tags.of("gen_ai.request.model", request.model());
81+
if (response.model() != null) {
82+
tags = tags.and("gen_ai.response.model", response.model());
83+
}
8484
if (ContextLocals.duplicatedContextActive()) {
8585
String aiServiceClassName = ContextLocals.get(AiServiceConstants.AI_SERVICE_CLASS_NAME);
8686
if (aiServiceClassName != null) {
@@ -112,10 +112,13 @@ public void onError(ChatModelErrorContext errorContext) {
112112
return;
113113
}
114114

115-
Tags tags = Tags.of(
116-
Tag.of("gen_ai.request.model", errorContext.request().model()),
117-
Tag.of("gen_ai.response.model", errorContext.partialResponse().model()),
118-
Tag.of("error.type", aiMessage.text()));
115+
Tags tags = Tags.of("gen_ai.request.model", errorContext.request().model());
116+
if (errorContext.partialResponse().model() != null) {
117+
tags = tags.and("gen_ai.response.model", errorContext.partialResponse().model());
118+
}
119+
if (aiMessage.text() != null) {
120+
tags = tags.and("error.type", aiMessage.text());
121+
}
119122
duration.withTags(tags).record(endTime - startTime, TimeUnit.NANOSECONDS);
120123
}
121124

core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/listeners/SpanChatModelListener.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,10 @@ public void onResponse(ChatModelResponseContext responseContext) {
6161
Span span = (Span) attributes.get(OTEL_SPAN_KEY_NAME);
6262
if (span != null) {
6363
ChatModelResponse response = responseContext.response();
64-
span.setAttribute("gen_ai.response.id", response.id()).setAttribute("gen_ai.response.model", response.model());
64+
span.setAttribute("gen_ai.response.id", response.id());
65+
if (response.model() != null) {
66+
span.setAttribute("gen_ai.response.model", response.model());
67+
}
6568
if (response.finishReason() != null) {
6669
span.setAttribute("gen_ai.response.finish_reasons", response.finishReason().toString());
6770
}

0 commit comments

Comments
 (0)