From 5250b55dc7d91821e5cdb8ce0e711f43438496cc Mon Sep 17 00:00:00 2001 From: guzemin Date: Mon, 21 Sep 2026 09:12:05 +0800 Subject: [PATCH 1/2] Fix spring-ai-1.x-plugin dropping the trace when stream() fails synchronously --- .../apm/plugin/spring/ai/v1/ChatModelStreamInterceptor.java | 5 +++++ 1 file changed, 5 insertions(+) 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(); From 6257ea2f007bf4996d7d597c8c25e4882d8f74c6 Mon Sep 17 00:00:00 2001 From: eye-gu Date: Mon, 21 Sep 2026 10:21:29 +0800 Subject: [PATCH 2/2] add changes --- CHANGES.md | 3 +++ 1 file changed, 3 insertions(+) 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).