diff --git a/CHANGES.md b/CHANGES.md index 2dd610a5cd..a175738df6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,9 @@ Release Notes. 9.8.0 ------------------ +* Fix the `spring-ai-1.x-plugin` `ChatModelStreamInterceptor` leaking its async span when + `ChatModel#stream(Prompt)` fails synchronously, which silently dropped the whole `TraceSegment` + of the request (apache/skywalking#14098). * Fix `jedis-4.x-plugin`'s `AbstractConnectionInterceptor` double-stopping the span stack on any Redis-level exception (or a null dynamic field on a pooled/recycled `Connection`), which corrupted the parent trace for the rest of the request (apache/skywalking#14085). diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/ChatModelStreamInterceptor.java b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/ChatModelStreamInterceptor.java index 7231a99aa1..981c90f74b 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/ChatModelStreamInterceptor.java +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/ChatModelStreamInterceptor.java @@ -83,6 +83,11 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA return ret; } + if (!(ret instanceof Flux)) { + ContextManager.stopSpan(); + return ret; + } + final AbstractSpan span = ContextManager.activeSpan(); final ContextSnapshot snapshot = ContextManager.capture();