From 1261eda6385c75c60d5f6df93d9b3e20002ce6ea Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Thu, 8 Jan 2026 01:33:31 +0800 Subject: [PATCH 01/48] Fix --- .../trace/component/ComponentsDefine.java | 2 + .../apm/agent/core/context/tag/Tags.java | 4 + .../apm-sdk-plugin/spring-plugins/pom.xml | 1 + .../spring-ai-1.x-plugin/pom.xml | 40 ++++++++++ .../ai/v1/ChatClientResponseInterceptor.java | 67 ++++++++++++++++ .../ai/v1/DocumentRetrieverInterceptor.java | 60 +++++++++++++++ .../ai/v1/ToolCallbackCallInterceptor.java | 64 ++++++++++++++++ .../DefaultChatClientInstrumentation.java | 76 +++++++++++++++++++ .../DocumentRetrieverInstrumentation.java | 59 ++++++++++++++ .../define/ToolCallbackInstrumentation.java | 57 ++++++++++++++ .../src/main/resources/skywalking-plugin.def | 17 +++++ 11 files changed, 447 insertions(+) create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/ChatClientResponseInterceptor.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/DocumentRetrieverInterceptor.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/ToolCallbackCallInterceptor.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/DefaultChatClientInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/DocumentRetrieverInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/ToolCallbackInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def diff --git a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java index fa62c91239..dc5d878859 100755 --- a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java +++ b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java @@ -263,6 +263,8 @@ public class ComponentsDefine { public static final OfficialComponent THREAD_PER_TASK_EXECUTOR = new OfficialComponent(161, "ThreadPerTask-executor"); + public static final OfficialComponent SPRING_AI = new OfficialComponent(162, "Spring-AI"); + public static final OfficialComponent DMDB_JDBC_DRIVER = new OfficialComponent(163, "Dmdb-jdbc-driver"); } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java index 18093a453e..d8eca87d17 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java @@ -160,6 +160,10 @@ public static final class HTTP { */ public static final StringTag THREAD_CARRIER = new StringTag(24, "thread.carrier"); + public static final StringTag MODEL_NAME = new StringTag(25, "model.name"); + + public static final StringTag TEMPERATURE = new StringTag(26, "temperature"); + /** * Creates a {@code StringTag} with the given key and cache it, if it's created before, simply return it without * creating a new one. diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml index 10b0268892..8aeb72256e 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml @@ -45,6 +45,7 @@ spring-webflux-5.x-webclient-plugin spring-webflux-6.x-webclient-plugin resttemplate-commons + spring-ai-1.x-plugin pom diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml new file mode 100644 index 0000000000..5af5e776af --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml @@ -0,0 +1,40 @@ + + + + + + spring-plugins + org.apache.skywalking + 9.6.0-SNAPSHOT + + 4.0.0 + + spring-ai-1.x-plugin + + http://maven.apache.org + + + + org.springframework.ai + spring-ai-client-chat + 1.1.0 + provided + + + \ No newline at end of file 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/ChatClientResponseInterceptor.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/ChatClientResponseInterceptor.java new file mode 100644 index 0000000000..125451d676 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/ChatClientResponseInterceptor.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1; + +import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.tag.Tags; +import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; +import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; +import org.springframework.ai.chat.client.ChatClientRequest; +import org.springframework.ai.chat.prompt.ChatOptions; +import org.springframework.ai.chat.prompt.Prompt; + +import java.lang.reflect.Method; + +public class ChatClientResponseInterceptor implements InstanceMethodsAroundInterceptor { + + @Override + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + AbstractSpan span = ContextManager.createLocalSpan("spring-ai-chat-call"); + + ChatClientRequest request = (ChatClientRequest) allArguments[0]; + Prompt prompt = request.prompt(); + ChatOptions chatOptions = prompt.getOptions(); + + + span.setComponent(ComponentsDefine.SPRING_AI); + Tags.MODEL_NAME.set(span, chatOptions.getModel()); + Tags.TEMPERATURE.set(span, String.valueOf(chatOptions.getTemperature())); + SpanLayer.asHttp(span); + } + + @Override + public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { + if (ContextManager.isActive()) { + ContextManager.stopSpan(); + } + return ret; + } + + @Override + public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { + if (ContextManager.isActive()) { + ContextManager.activeSpan().log(t); + ContextManager.activeSpan().errorOccurred(); + } + } +} 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/DocumentRetrieverInterceptor.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/DocumentRetrieverInterceptor.java new file mode 100644 index 0000000000..9598463934 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/DocumentRetrieverInterceptor.java @@ -0,0 +1,60 @@ +package org.apache.skywalking.apm.plugin.spring.ai.v1; + +import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.tag.Tags; +import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; +import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; + +import javax.management.Query; +import java.lang.reflect.Method; + +public class DocumentRetrieverInterceptor implements InstanceMethodsAroundInterceptor { + @Override + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, + MethodInterceptResult result) throws Throwable { + Query query = (Query) allArguments[0]; + + // 创建 LocalSpan 记录检索过程 + AbstractSpan span = ContextManager.createLocalSpan("SpringAI/DocumentRetriever/retrieve"); + + // 设置组件 ID (建议在 ComponentsDefine 中定义专用的 SPRING_AI ID) + span.setComponent(ComponentsDefine.SPRING_MVC_ANNOTATION); + + if (query != null) { + // 记录原始查询文本 + Tags.ofKey("ai.retrieve.query").set(span, query.getText()); + } + } + + @Override + public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, + Object ret) throws Throwable { + if (ContextManager.isActive()) { + AbstractSpan span = ContextManager.activeSpan(); + if (ret instanceof List) { + List documents = (List) ret; + // 记录检索到的文档数量 + Tags.ofKey("ai.retrieve.document_count").set(span, String.valueOf(documents.size())); + + // 可选:记录前几个文档的 ID 或部分内容以便追踪 + if (!documents.isEmpty() && documents.get(0) instanceof Document) { + Document firstDoc = (Document) documents.get(0); + Tags.ofKey("ai.retrieve.first_doc_id").set(span, firstDoc.getId()); + } + } + ContextManager.stopSpan(); + } + return ret; + } + + @Override + public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, + Class[] argumentsTypes, Throwable t) { + if (ContextManager.isActive()) { + ContextManager.activeSpan().log(t).errorOccurred(); + } + } +} 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/ToolCallbackCallInterceptor.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/ToolCallbackCallInterceptor.java new file mode 100644 index 0000000000..f3cdb32bde --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/ToolCallbackCallInterceptor.java @@ -0,0 +1,64 @@ +package org.apache.skywalking.apm.plugin.spring.ai.v1; + +import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.tag.Tags; +import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; +import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; +import org.springframework.ai.tool.ToolCallback; +import org.springframework.ai.tool.definition.ToolDefinition; + +import java.lang.reflect.Method; + +/** + * @description: + * @author: sym + * @create: 2026-01-03 09:37 + **/ + +public class ToolCallbackCallInterceptor implements InstanceMethodsAroundInterceptor { + + @Override + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, + MethodInterceptResult result) throws Throwable { + ToolCallback toolCallback = (ToolCallback) objInst; + ToolDefinition definition = toolCallback.getToolDefinition(); + + String toolName = definition != null ? definition.getName() : "unknown-tool"; + String toolInput = (String) allArguments[0]; + + // 创建 LocalSpan 记录工具调用 + AbstractSpan span = ContextManager.createLocalSpan("SpringAI/Tool/" + toolName); + span.setComponent(ComponentsDefine.SPRING_MVC_ANNOTATION); // 建议自定义组件 ID + + // 记录输入参数 + Tags.ofKey("ai.tool.name").set(span, toolName); + if (toolInput != null) { + Tags.ofKey("ai.tool.input").set(span, toolInput); + } + } + + @Override + public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, + Object ret) throws Throwable { + if (ContextManager.isActive()) { + AbstractSpan span = ContextManager.activeSpan(); + if (ret instanceof String) { + // 记录工具输出结果 + Tags.ofKey("ai.tool.output").set(span, (String) ret); + } + ContextManager.stopSpan(); + } + return ret; + } + + @Override + public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, + Class[] argumentsTypes, Throwable t) { + if (ContextManager.isActive()) { + ContextManager.activeSpan().log(t).errorOccurred(); + } + } +} 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/define/DefaultChatClientInstrumentation.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/define/DefaultChatClientInstrumentation.java new file mode 100644 index 0000000000..3aae21bb12 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/DefaultChatClientInstrumentation.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.define; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import net.bytebuddy.matcher.ElementMatchers; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; +import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +public class DefaultChatClientInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_CLASS = "org.springframework.ai.chat.client.DefaultChatClient$DefaultCallResponseSpec"; + + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.DoGetObservableChatClientResponseInterceptor"; + + private static final String INTERCEPT_METHOD = "doGetObservableChatClientResponse"; + + private static final String ARGUMENT_TYPE = "org.springframework.ai.chat.client.ChatClientRequest"; + + @Override + protected ClassMatch enhanceClass() { + return NameMatch.byName(ENHANCE_CLASS); + } + + @Override + public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[0]; + } + + @Override + public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[]{ + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named(INTERCEPT_METHOD) + .and(takesArgument(0, named(ARGUMENT_TYPE))) + .and(ElementMatchers.takesArguments(2)); + } + + @Override + public String getMethodsInterceptor() { + return INTERCEPTOR_CLASS; + } + + @Override + public boolean isOverrideArgs() { + return false; + } + } + }; + } +} 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/define/DocumentRetrieverInstrumentation.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/define/DocumentRetrieverInstrumentation.java new file mode 100644 index 0000000000..2384899ab9 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/DocumentRetrieverInstrumentation.java @@ -0,0 +1,59 @@ +package org.apache.skywalking.apm.plugin.spring.ai.v1.define; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; +import org.apache.skywalking.apm.agent.core.plugin.match.HierarchyMatch; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +/** + * @description: + * @author: sym + * @create: 2026-01-03 09:38 + **/ + +public class DocumentRetrieverInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_INTERFACE = "org.springframework.ai.document.DocumentRetriever"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.DocumentRetrieverInterceptor"; + + @Override + protected ClassMatch enhanceClass() { + return HierarchyMatch.byHierarchyMatch(ENHANCE_INTERFACE); + } + + @Override + public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[0]; + } + + @Override + public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[]{ + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named("retrieve") + .and(takesArguments(1)) + .and(takesArgument(0, named("org.springframework.ai.document.Query"))); + } + + @Override + public String getMethodsInterceptor() { + return INTERCEPTOR_CLASS; + } + + @Override + public boolean isOverrideArgs() { + return false; + } + } + }; + } +} 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/define/ToolCallbackInstrumentation.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/define/ToolCallbackInstrumentation.java new file mode 100644 index 0000000000..b4955978eb --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/ToolCallbackInstrumentation.java @@ -0,0 +1,57 @@ +package org.apache.skywalking.apm.plugin.spring.ai.v1.define; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; +import org.apache.skywalking.apm.agent.core.plugin.match.HierarchyMatch; + +/** + * @description: + * @author: sym + * @create: 2026-01-03 09:36 + **/ + +public class ToolCallbackInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + private static final String ENHANCE_INTERFACE = "org.springframework.ai.tool.ToolCallback"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.ToolCallbackCallInterceptor"; + + @Override + protected ClassMatch enhanceClass() { + // 对应 implementsInterface(named(...)) + return HierarchyMatch.byHierarchyMatch(ENHANCE_INTERFACE); + } + + @Override + public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[0]; + } + + @Override + public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[] { + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named("call") + .and(takesArguments(2)) + .and(takesArgument(0, named("java.lang.String"))) + // 这里 OTel 代码里还匹配了返回值为 String + .and(returns(named("java.lang.String"))); + } + + @Override + public String getMethodsInterceptor() { + return INTERCEPTOR_CLASS; + } + + @Override + public boolean isOverrideArgs() { + return false; + } + } + }; + } +} diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def new file mode 100644 index 0000000000..bd9fe567df --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.DefaultChatClientInstrumentation From 75c22d13cd21c5ff1702a2a7fe0b12473c0a87ee Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Wed, 28 Jan 2026 22:54:45 +0800 Subject: [PATCH 02/48] Add spring ai 1.x plugin for LLM monitoring --- .../trace/component/ComponentsDefine.java | 4 +- .../apm/agent/core/context/tag/Tags.java | 36 ++- .../spring-ai-1.x-plugin/pom.xml | 13 + .../v1/DefaultChatClientCallInterceptor.java | 173 +++++++++++++ .../DefaultChatClientStreamInterceptor.java | 228 ++++++++++++++++++ .../ai/v1/DocumentRetrieverInterceptor.java | 60 ----- .../ai/v1/ToolCallbackCallInterceptor.java | 45 ++-- ...a => VectorStoreRetrieverInterceptor.java} | 56 +++-- .../ai/v1/config/SpringAiPluginConfig.java | 64 +++++ .../spring/ai/v1/contant/Constants.java | 23 ++ ...DefaultChatClientCallInstrumentation.java} | 13 +- ...efaultChatClientStreamInstrumentation.java | 73 ++++++ .../define/ToolCallbackInstrumentation.java | 34 ++- ... VectorStoreRetrieverInstrumentation.java} | 35 ++- .../src/main/resources/skywalking-plugin.def | 5 +- pom.xml | 2 +- .../spring-ai-1.x-scenario/bin/startup.sh | 21 ++ .../config/expectedData.yaml | 111 +++++++++ .../spring-ai-1.x-scenario/configuration.yml | 23 ++ .../scenarios/spring-ai-1.x-scenario/pom.xml | 155 ++++++++++++ .../src/main/assembly/assembly.xml | 41 ++++ .../testcase/jdk/httpclient/Application.java | 30 +++ .../httpclient/config/ChatClientConfig.java | 32 +++ .../config/RagScenarioConfiguration.java | 62 +++++ .../httpclient/controller/CaseController.java | 86 +++++++ .../controller/LLMMockController.java | 185 ++++++++++++++ .../jdk/httpclient/tool/WeatherTool.java | 33 +++ .../src/main/resources/application.yaml | 38 +++ .../support-version.list | 17 ++ 29 files changed, 1565 insertions(+), 133 deletions(-) create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/DefaultChatClientCallInterceptor.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/DefaultChatClientStreamInterceptor.java delete mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/DocumentRetrieverInterceptor.java rename apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/{ChatClientResponseInterceptor.java => VectorStoreRetrieverInterceptor.java} (52%) create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/config/SpringAiPluginConfig.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/contant/Constants.java rename apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/{DefaultChatClientInstrumentation.java => DefaultChatClientCallInstrumentation.java} (83%) create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/DefaultChatClientStreamInstrumentation.java rename apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/{DocumentRetrieverInstrumentation.java => VectorStoreRetrieverInstrumentation.java} (60%) create mode 100644 test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh create mode 100644 test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml create mode 100644 test/plugin/scenarios/spring-ai-1.x-scenario/configuration.yml create mode 100644 test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml create mode 100644 test/plugin/scenarios/spring-ai-1.x-scenario/src/main/assembly/assembly.xml create mode 100644 test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/Application.java create mode 100644 test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java create mode 100644 test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/RagScenarioConfiguration.java create mode 100644 test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java create mode 100644 test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java create mode 100644 test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/tool/WeatherTool.java create mode 100644 test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml create mode 100644 test/plugin/scenarios/spring-ai-1.x-scenario/support-version.list diff --git a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java index dc5d878859..4135aab449 100755 --- a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java +++ b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java @@ -263,8 +263,8 @@ public class ComponentsDefine { public static final OfficialComponent THREAD_PER_TASK_EXECUTOR = new OfficialComponent(161, "ThreadPerTask-executor"); - public static final OfficialComponent SPRING_AI = new OfficialComponent(162, "Spring-AI"); - public static final OfficialComponent DMDB_JDBC_DRIVER = new OfficialComponent(163, "Dmdb-jdbc-driver"); + public static final OfficialComponent SPRING_AI = new OfficialComponent(164, "Spring-ai"); + } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java index d8eca87d17..92e5dbf9f0 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java @@ -160,9 +160,41 @@ public static final class HTTP { */ public static final StringTag THREAD_CARRIER = new StringTag(24, "thread.carrier"); - public static final StringTag MODEL_NAME = new StringTag(25, "model.name"); + public static final StringTag GEN_AI_REQUEST_MODEL = new StringTag(25, "gen_ai.request.model"); - public static final StringTag TEMPERATURE = new StringTag(26, "temperature"); + public static final StringTag GEN_AI_TOP_K = new StringTag(26, "gen_ai.top.k"); + + public static final StringTag GEN_AI_TOP_P = new StringTag(27, "gen_ai.top.p"); + + public static final StringTag GEN_AI_TEMPERATURE = new StringTag(28, "gen_ai.temperature"); + + public static final StringTag GEN_AI_TOOL_NAME = new StringTag(29, "gen_ai.tool.name"); + + public static final StringTag GEN_AI_TOOL_INPUT = new StringTag(30, "gen_ai.tool.input"); + + public static final StringTag GEN_AI_RESPONSE_MODEL = new StringTag(31, "gen_ai.response.model"); + + public static final StringTag GEN_AI_RESPONSE_ID = new StringTag(32, "gen_ai.response.id"); + + public static final StringTag GEN_AI_USAGE_INPUT_TOKENS = new StringTag(33, "gen_ai.usage.input_tokens"); + + public static final StringTag GEN_AI_USAGE_OUTPUT_TOKENS = new StringTag(34, "gen_ai.usage.output_tokens"); + + public static final StringTag GEN_AI_USAGE_TOTAL_TOKENS = new StringTag(35, "gen_ai.usage.total_tokens"); + + public static final StringTag GEN_AI_RESPONSE_FINISH_REASONS = new StringTag(36, "gen_ai.response.finish_reasons"); + + public static final StringTag GEN_AI_PROMPT = new StringTag(37, "gen_ai.prompt"); + + public static final StringTag GEN_AI_COMPLETION = new StringTag(38, "gen_ai.completion"); + + public static final StringTag GEN_AI_STREAM_TTFR = new StringTag(39, "gen_ai.stream.ttfr"); + + public static final StringTag GEN_AI_VECTOR_STORE_TOP_K = new StringTag(40, "gen_ai.vector_store.top_k"); + + public static final StringTag GEN_AI_VECTOR_STORE_FILTER_EXPRESSION = new StringTag(41, "gen_ai.vector_store.filter_expression"); + + public static final StringTag GEN_AI_VECTOR_STORE_RECORD_IDS = new StringTag(42, "gen_ai.vector_store.record_ids"); /** * Creates a {@code StringTag} with the given key and cache it, if it's created before, simply return it without diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml index 5af5e776af..b15ec1c429 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml @@ -26,9 +26,15 @@ 4.0.0 spring-ai-1.x-plugin + jar + spring-ai-1.x-plugin http://maven.apache.org + + 17 + + org.springframework.ai @@ -36,5 +42,12 @@ 1.1.0 provided + + + org.springframework.ai + spring-ai-advisors-vector-store + 1.1.0 + provided + \ No newline at end of file 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/DefaultChatClientCallInterceptor.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/DefaultChatClientCallInterceptor.java new file mode 100644 index 0000000000..7c6ea9fc9f --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/DefaultChatClientCallInterceptor.java @@ -0,0 +1,173 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1; + +import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.tag.Tags; +import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; +import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; +import org.apache.skywalking.apm.plugin.spring.ai.v1.config.SpringAiPluginConfig; +import org.springframework.ai.chat.client.ChatClientRequest; +import org.springframework.ai.chat.client.ChatClientResponse; +import org.springframework.ai.chat.metadata.ChatResponseMetadata; +import org.springframework.ai.chat.metadata.Usage; +import org.springframework.ai.chat.model.ChatResponse; +import org.springframework.ai.chat.model.Generation; +import org.springframework.ai.chat.prompt.ChatOptions; +import org.springframework.ai.chat.prompt.Prompt; + +import java.lang.reflect.Method; + +public class DefaultChatClientCallInterceptor implements InstanceMethodsAroundInterceptor { + + @Override + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/chat-client/call"); + + ChatClientRequest request = (ChatClientRequest) allArguments[0]; + Prompt prompt = request.prompt(); + ChatOptions chatOptions = prompt.getOptions(); + if (chatOptions == null) { + return; + } + + span.setComponent(ComponentsDefine.SPRING_AI); + Tags.GEN_AI_REQUEST_MODEL.set(span, chatOptions.getModel()); + Tags.GEN_AI_TEMPERATURE.set(span, String.valueOf(chatOptions.getTemperature())); + Tags.GEN_AI_TOP_K.set(span, String.valueOf(chatOptions.getTopK())); + Tags.GEN_AI_TOP_P.set(span, String.valueOf(chatOptions.getTopP())); + } + + @Override + public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { + if (!ContextManager.isActive()) { + return ret; + } + + try { + AbstractSpan span = ContextManager.activeSpan(); + ChatClientResponse response = (ChatClientResponse) ret; + if (response == null || response.chatResponse() == null) { + return ret; + } + + ChatResponse chatResponse = response.chatResponse(); + ChatResponseMetadata metadata = chatResponse.getMetadata(); + + long totalTokens = 0; + + if (metadata != null) { + if (metadata.getId() != null) { + Tags.GEN_AI_RESPONSE_ID.set(span, metadata.getId()); + } + if (metadata.getModel() != null) { + Tags.GEN_AI_RESPONSE_MODEL.set(span, metadata.getModel()); + } + + Usage usage = metadata.getUsage(); + if (usage != null) { + if (usage.getPromptTokens() != null) { + Tags.GEN_AI_USAGE_INPUT_TOKENS.set(span, String.valueOf(usage.getPromptTokens())); + } + if (usage.getCompletionTokens() != null) { + Tags.GEN_AI_USAGE_OUTPUT_TOKENS.set(span, String.valueOf(usage.getCompletionTokens())); + } + if (usage.getTotalTokens() != null) { + totalTokens = usage.getTotalTokens(); + Tags.GEN_AI_USAGE_TOTAL_TOKENS.set(span, String.valueOf(totalTokens)); + } + } + } + + Generation generation = chatResponse.getResult(); + if (generation != null && generation.getMetadata() != null) { + String finishReason = generation.getMetadata().getFinishReason(); + if (finishReason != null) { + Tags.GEN_AI_RESPONSE_FINISH_REASONS.set(span, finishReason); + } + } + + collectContent(span, allArguments, generation, totalTokens); + } finally { + ContextManager.stopSpan(); + } + return ret; + } + + @Override + public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { + if (ContextManager.isActive()) { + ContextManager.activeSpan().log(t); + } + } + + private void collectContent(AbstractSpan span, Object[] allArguments, Generation generation, long totalTokens) { + int tokenThreshold = SpringAiPluginConfig.Plugin.SpringAi.CONTENT_COLLECT_THRESHOLD_TOKENS; + + if (tokenThreshold >= 0 && totalTokens < tokenThreshold) { + return; + } + + if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_PROMPT) { + collectPrompt(span, allArguments); + } + + if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_COMPLETION) { + collectCompletion(span, generation); + } + } + + private void collectPrompt(AbstractSpan span, Object[] allArguments) { + ChatClientRequest request = (ChatClientRequest) allArguments[0]; + if (request == null || request.prompt() == null) { + return; + } + + String promptText = request.prompt().getContents(); + if (promptText == null) { + return; + } + + int limit = SpringAiPluginConfig.Plugin.SpringAi.PROMPT_LENGTH_LIMIT; + if (limit > 0 && promptText.length() > limit) { + promptText = promptText.substring(0, limit); + } + Tags.GEN_AI_PROMPT.set(span, promptText); + } + + private void collectCompletion(AbstractSpan span, Generation generation) { + if (generation == null || generation.getOutput() == null) { + return; + } + + String completionText = generation.getOutput().getText(); + if (completionText == null) { + return; + } + + int limit = SpringAiPluginConfig.Plugin.SpringAi.COMPLETION_LENGTH_LIMIT; + if (limit > 0 && completionText.length() > limit) { + completionText = completionText.substring(0, limit); + } + Tags.GEN_AI_COMPLETION.set(span, completionText); + } +} 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/DefaultChatClientStreamInterceptor.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/DefaultChatClientStreamInterceptor.java new file mode 100644 index 0000000000..7761e1f273 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/DefaultChatClientStreamInterceptor.java @@ -0,0 +1,228 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1; + +import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.tag.Tags; +import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; +import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; +import org.apache.skywalking.apm.plugin.spring.ai.v1.config.SpringAiPluginConfig; +import org.apache.skywalking.apm.plugin.spring.ai.v1.contant.Constants; +import org.springframework.ai.chat.client.ChatClientRequest; +import org.springframework.ai.chat.client.ChatClientResponse; +import org.springframework.ai.chat.metadata.ChatResponseMetadata; +import org.springframework.ai.chat.metadata.Usage; +import org.springframework.ai.chat.model.ChatResponse; +import org.springframework.ai.chat.model.Generation; +import org.springframework.ai.chat.prompt.ChatOptions; +import org.springframework.ai.chat.prompt.Prompt; +import org.springframework.util.StringUtils; +import reactor.core.publisher.Flux; + +import java.lang.reflect.Method; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicReference; + +public class DefaultChatClientStreamInterceptor implements InstanceMethodsAroundInterceptor { + + @Override + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/stream"); + + ChatClientRequest request = (ChatClientRequest) allArguments[0]; + if (request == null || request.prompt() == null) { + return; + } + + Prompt prompt = request.prompt(); + ChatOptions chatOptions = prompt.getOptions(); + if (chatOptions == null) { + return; + } + + span.setComponent(ComponentsDefine.SPRING_AI); + Tags.GEN_AI_REQUEST_MODEL.set(span, chatOptions.getModel()); + Tags.GEN_AI_TEMPERATURE.set(span, String.valueOf(chatOptions.getTemperature())); + + ContextManager.getRuntimeContext().put(Constants.SPRING_AI_STREAM_START_TIME, System.currentTimeMillis()); + } + + @Override + public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { + if (!ContextManager.isActive()) { + return ret; + } + AbstractSpan span = ContextManager.activeSpan(); + span.prepareForAsync(); + + ContextManager.stopSpan(); + + Flux flux = (Flux) ret; + + AtomicReference lastResponseRef = new AtomicReference<>(); + + StringBuilder completionBuilder = new StringBuilder(); + + AtomicReference finishReason = new AtomicReference<>(""); + + AtomicBoolean firstResponseReceived = new AtomicBoolean(false); + + long startTime = (long) ContextManager.getRuntimeContext().get(Constants.SPRING_AI_STREAM_START_TIME); + + return flux.doOnNext(response -> { + if (response.chatResponse() != null) { + + ChatResponse chatResponse = response.chatResponse(); + lastResponseRef.set(chatResponse); + + Generation generation = chatResponse.getResult(); + if (generation == null) { + return; + } + + if (generation.getOutput() != null && StringUtils.hasText(generation.getOutput().getText())) { + if (firstResponseReceived.compareAndSet(false, true)) { + Tags.GEN_AI_STREAM_TTFR.set(span, String.valueOf(System.currentTimeMillis() - startTime)); + } + } + + String reason = generation.getMetadata().getFinishReason(); + if (reason != null) { + finishReason.set(reason); + } + + if (generation.getOutput() != null && generation.getOutput().getText() != null) { + completionBuilder.append(generation.getOutput().getText()); + } + } + }) + .doOnError(span::log) + .doFinally(signalType -> { + try { + ChatResponse finalResponse = lastResponseRef.get(); + + if (finalResponse != null) { + ChatResponseMetadata metadata = finalResponse.getMetadata(); + if (metadata != null) { + if (metadata.getId() != null) { + Tags.GEN_AI_RESPONSE_ID.set(span, metadata.getId()); + } + if (metadata.getModel() != null) { + Tags.GEN_AI_RESPONSE_MODEL.set(span, metadata.getModel()); + } + + Usage usage = metadata.getUsage(); + long totalTokens = 0; + if (usage != null) { + Tags.GEN_AI_USAGE_INPUT_TOKENS.set(span, String.valueOf(usage.getPromptTokens())); + Tags.GEN_AI_USAGE_OUTPUT_TOKENS.set(span, String.valueOf(usage.getCompletionTokens())); + totalTokens = usage.getTotalTokens() != null ? usage.getTotalTokens() : 0; + Tags.GEN_AI_USAGE_TOTAL_TOKENS.set(span, String.valueOf(usage.getTotalTokens().longValue())); + } + + Tags.GEN_AI_RESPONSE_FINISH_REASONS.set(span, finishReason.get()); + + int tokenThreshold = SpringAiPluginConfig.Plugin.SpringAi.CONTENT_COLLECT_THRESHOLD_TOKENS; + if (tokenThreshold < 0 || totalTokens >= tokenThreshold) { + + if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_PROMPT) { + ChatClientRequest request = (ChatClientRequest) allArguments[0]; + Prompt prompt = request.prompt(); + String promptText = prompt.getContents(); + if (promptText != null) { + int limit = SpringAiPluginConfig.Plugin.SpringAi.PROMPT_LENGTH_LIMIT; + if (limit > 0 && promptText.length() > limit) { + promptText = promptText.substring(0, limit); + } + Tags.GEN_AI_PROMPT.set(span, promptText); + } + } + + if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_COMPLETION) { + Tags.GEN_AI_COMPLETION.set(span, completionBuilder.toString()); + } + } + } + } + } catch (Throwable t) { + span.log(t); + } finally { + span.asyncFinish(); + ContextManager.getRuntimeContext().remove(Constants.SPRING_AI_STREAM_START_TIME); + } + }); + } + + @Override + public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { + if (ContextManager.isActive()) { + ContextManager.activeSpan().log(t); + } + } + + private void collectContent(AbstractSpan span, StringBuilder completionBuilder, Object[] allArguments, long totalTokens) { + int tokenThreshold = SpringAiPluginConfig.Plugin.SpringAi.CONTENT_COLLECT_THRESHOLD_TOKENS; + + if (tokenThreshold >= 0 && totalTokens < tokenThreshold) { + return; + } + + if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_PROMPT) { + collectPrompt(span, allArguments); + } + + if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_COMPLETION) { + collectCompletion(span, completionBuilder); + } + } + + private void collectPrompt(AbstractSpan span, Object[] allArguments) { + ChatClientRequest request = (ChatClientRequest) allArguments[0]; + if (request == null || request.prompt() == null) { + return; + } + + String promptText = request.prompt().getContents(); + if (promptText == null) { + return; + } + + int limit = SpringAiPluginConfig.Plugin.SpringAi.PROMPT_LENGTH_LIMIT; + if (limit > 0 && promptText.length() > limit) { + promptText = promptText.substring(0, limit); + } + Tags.GEN_AI_PROMPT.set(span, promptText); + } + + private void collectCompletion(AbstractSpan span, StringBuilder completionBuilder) { + String completionText = completionBuilder.toString(); + if (completionText.isEmpty()) { + return; + } + + int limit = SpringAiPluginConfig.Plugin.SpringAi.COMPLETION_LENGTH_LIMIT; + if (limit > 0 && completionText.length() > limit) { + completionText = completionText.substring(0, limit); + } + Tags.GEN_AI_COMPLETION.set(span, completionText); + } +} 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/DocumentRetrieverInterceptor.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/DocumentRetrieverInterceptor.java deleted file mode 100644 index 9598463934..0000000000 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/DocumentRetrieverInterceptor.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.apache.skywalking.apm.plugin.spring.ai.v1; - -import org.apache.skywalking.apm.agent.core.context.ContextManager; -import org.apache.skywalking.apm.agent.core.context.tag.Tags; -import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; - -import javax.management.Query; -import java.lang.reflect.Method; - -public class DocumentRetrieverInterceptor implements InstanceMethodsAroundInterceptor { - @Override - public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - MethodInterceptResult result) throws Throwable { - Query query = (Query) allArguments[0]; - - // 创建 LocalSpan 记录检索过程 - AbstractSpan span = ContextManager.createLocalSpan("SpringAI/DocumentRetriever/retrieve"); - - // 设置组件 ID (建议在 ComponentsDefine 中定义专用的 SPRING_AI ID) - span.setComponent(ComponentsDefine.SPRING_MVC_ANNOTATION); - - if (query != null) { - // 记录原始查询文本 - Tags.ofKey("ai.retrieve.query").set(span, query.getText()); - } - } - - @Override - public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - Object ret) throws Throwable { - if (ContextManager.isActive()) { - AbstractSpan span = ContextManager.activeSpan(); - if (ret instanceof List) { - List documents = (List) ret; - // 记录检索到的文档数量 - Tags.ofKey("ai.retrieve.document_count").set(span, String.valueOf(documents.size())); - - // 可选:记录前几个文档的 ID 或部分内容以便追踪 - if (!documents.isEmpty() && documents.get(0) instanceof Document) { - Document firstDoc = (Document) documents.get(0); - Tags.ofKey("ai.retrieve.first_doc_id").set(span, firstDoc.getId()); - } - } - ContextManager.stopSpan(); - } - return ret; - } - - @Override - public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, - Class[] argumentsTypes, Throwable t) { - if (ContextManager.isActive()) { - ContextManager.activeSpan().log(t).errorOccurred(); - } - } -} 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/ToolCallbackCallInterceptor.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/ToolCallbackCallInterceptor.java index f3cdb32bde..3b6ae10fbc 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/ToolCallbackCallInterceptor.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/ToolCallbackCallInterceptor.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.skywalking.apm.plugin.spring.ai.v1; import org.apache.skywalking.apm.agent.core.context.ContextManager; @@ -12,12 +30,6 @@ import java.lang.reflect.Method; -/** - * @description: - * @author: sym - * @create: 2026-01-03 09:37 - **/ - public class ToolCallbackCallInterceptor implements InstanceMethodsAroundInterceptor { @Override @@ -26,29 +38,20 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr ToolCallback toolCallback = (ToolCallback) objInst; ToolDefinition definition = toolCallback.getToolDefinition(); - String toolName = definition != null ? definition.getName() : "unknown-tool"; + String toolName = definition.name(); String toolInput = (String) allArguments[0]; - // 创建 LocalSpan 记录工具调用 - AbstractSpan span = ContextManager.createLocalSpan("SpringAI/Tool/" + toolName); - span.setComponent(ComponentsDefine.SPRING_MVC_ANNOTATION); // 建议自定义组件 ID + AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/tool/" + toolName); + span.setComponent(ComponentsDefine.SPRING_AI); - // 记录输入参数 - Tags.ofKey("ai.tool.name").set(span, toolName); - if (toolInput != null) { - Tags.ofKey("ai.tool.input").set(span, toolInput); - } + Tags.GEN_AI_TOOL_NAME.set(span, toolName); + Tags.GEN_AI_TOOL_INPUT.set(span, toolInput); } @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { if (ContextManager.isActive()) { - AbstractSpan span = ContextManager.activeSpan(); - if (ret instanceof String) { - // 记录工具输出结果 - Tags.ofKey("ai.tool.output").set(span, (String) ret); - } ContextManager.stopSpan(); } return ret; @@ -58,7 +61,7 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { if (ContextManager.isActive()) { - ContextManager.activeSpan().log(t).errorOccurred(); + ContextManager.activeSpan().log(t); } } } 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/ChatClientResponseInterceptor.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/VectorStoreRetrieverInterceptor.java similarity index 52% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/ChatClientResponseInterceptor.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/VectorStoreRetrieverInterceptor.java index 125451d676..da443dc797 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/ChatClientResponseInterceptor.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/VectorStoreRetrieverInterceptor.java @@ -21,47 +21,65 @@ import org.apache.skywalking.apm.agent.core.context.ContextManager; import org.apache.skywalking.apm.agent.core.context.tag.Tags; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; -import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; -import org.springframework.ai.chat.client.ChatClientRequest; -import org.springframework.ai.chat.prompt.ChatOptions; -import org.springframework.ai.chat.prompt.Prompt; +import org.springframework.ai.document.Document; +import org.springframework.ai.vectorstore.SearchRequest; import java.lang.reflect.Method; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; -public class ChatClientResponseInterceptor implements InstanceMethodsAroundInterceptor { +public class VectorStoreRetrieverInterceptor implements InstanceMethodsAroundInterceptor { @Override - public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - AbstractSpan span = ContextManager.createLocalSpan("spring-ai-chat-call"); + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, + MethodInterceptResult result) throws Throwable { - ChatClientRequest request = (ChatClientRequest) allArguments[0]; - Prompt prompt = request.prompt(); - ChatOptions chatOptions = prompt.getOptions(); + AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/vectorStore/retrieve"); + span.setComponent(ComponentsDefine.SPRING_AI); + SearchRequest searchRequest = (SearchRequest) allArguments[0]; + Tags.GEN_AI_VECTOR_STORE_TOP_K.set(span, String.valueOf(searchRequest.getTopK())); - span.setComponent(ComponentsDefine.SPRING_AI); - Tags.MODEL_NAME.set(span, chatOptions.getModel()); - Tags.TEMPERATURE.set(span, String.valueOf(chatOptions.getTemperature())); - SpanLayer.asHttp(span); + if (searchRequest.getFilterExpression() != null) { + Tags.GEN_AI_VECTOR_STORE_FILTER_EXPRESSION.set(span, searchRequest.getFilterExpression().toString()); + } } @Override - public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { - if (ContextManager.isActive()) { - ContextManager.stopSpan(); + public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, + Object ret) throws Throwable { + if (!ContextManager.isActive()) { + return ret; + } + + if (ret != null) { + List documents = (List) ret; + AbstractSpan span = ContextManager.activeSpan(); + if (!documents.isEmpty()) { + String recordIds = documents.stream() + .map(Document::getId) + .filter(Objects::nonNull) + .collect(Collectors.joining(",")); + + if (!recordIds.isEmpty()) { + Tags.GEN_AI_VECTOR_STORE_RECORD_IDS.set(span, recordIds); + } + } } + ContextManager.stopSpan(); return ret; } @Override - public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { + public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, + Class[] argumentsTypes, Throwable t) { if (ContextManager.isActive()) { ContextManager.activeSpan().log(t); - ContextManager.activeSpan().errorOccurred(); } } } 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/config/SpringAiPluginConfig.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/config/SpringAiPluginConfig.java new file mode 100644 index 0000000000..54e046d2f2 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/config/SpringAiPluginConfig.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.config; + +import org.apache.skywalking.apm.agent.core.boot.PluginConfig; + +public class SpringAiPluginConfig { + + public static class Plugin { + + @PluginConfig(root = SpringAiPluginConfig.class) + public static class SpringAi { + + /** + * Whether to collect the prompt content (input text) of the GenAI request. + */ + public static boolean COLLECT_PROMPT = true; + + /** + * Whether to collect the completion content (output text) of the GenAI response. + */ + public static boolean COLLECT_COMPLETION = true; + + /** + * The maximum characters of the collected prompt content. + * If the content exceeds this limit, it will be truncated. + * Use a negative value to represent no limit, but be aware this could cause OOM. + */ + public static int PROMPT_LENGTH_LIMIT = 1024; + + /** + * The maximum characters of the collected completion content. + * If the content exceeds this limit, it will be truncated. + * Use a negative value to represent no limit, but be aware this could cause OOM. + */ + public static int COMPLETION_LENGTH_LIMIT = 1024; + + /** + * The threshold for token usage to trigger content collection. + * When set to a positive value, prompt and completion will only be collected + * if the total token usage of the request exceeds this threshold. + * * This requires {@link #COLLECT_PROMPT} or {@link #COLLECT_COMPLETION} to be enabled first. + * Use a negative value to disable this threshold-based filtering (collect all). + */ + public static int CONTENT_COLLECT_THRESHOLD_TOKENS = -1; + } + } +} 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/contant/Constants.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/contant/Constants.java new file mode 100644 index 0000000000..ca23ff6eb2 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/contant/Constants.java @@ -0,0 +1,23 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.contant; + +public class Constants { + public static final String SPRING_AI_STREAM_START_TIME = "Spring-ai.stream.startTime"; +} 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/define/DefaultChatClientInstrumentation.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/define/DefaultChatClientCallInstrumentation.java similarity index 83% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/DefaultChatClientInstrumentation.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/DefaultChatClientCallInstrumentation.java index 3aae21bb12..308efc04e6 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/define/DefaultChatClientInstrumentation.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/define/DefaultChatClientCallInstrumentation.java @@ -20,26 +20,25 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.matcher.ElementMatcher; -import net.bytebuddy.matcher.ElementMatchers; import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; +import org.springframework.ai.chat.client.ChatClientRequest; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -public class DefaultChatClientInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { +public class DefaultChatClientCallInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { private static final String ENHANCE_CLASS = "org.springframework.ai.chat.client.DefaultChatClient$DefaultCallResponseSpec"; - private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.DoGetObservableChatClientResponseInterceptor"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.DefaultChatClientCallInterceptor"; private static final String INTERCEPT_METHOD = "doGetObservableChatClientResponse"; - private static final String ARGUMENT_TYPE = "org.springframework.ai.chat.client.ChatClientRequest"; - @Override protected ClassMatch enhanceClass() { return NameMatch.byName(ENHANCE_CLASS); @@ -56,9 +55,7 @@ public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { new InstanceMethodsInterceptPoint() { @Override public ElementMatcher getMethodsMatcher() { - return named(INTERCEPT_METHOD) - .and(takesArgument(0, named(ARGUMENT_TYPE))) - .and(ElementMatchers.takesArguments(2)); + return named(INTERCEPT_METHOD).and(takesArguments(2)).and(takesArgument(0, ChatClientRequest.class)); } @Override 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/define/DefaultChatClientStreamInstrumentation.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/define/DefaultChatClientStreamInstrumentation.java new file mode 100644 index 0000000000..2e76fb5654 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/DefaultChatClientStreamInstrumentation.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.define; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; +import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; +import org.springframework.ai.chat.client.ChatClientRequest; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +public class DefaultChatClientStreamInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_CLASS = "org.springframework.ai.chat.client.DefaultChatClient$DefaultStreamResponseSpec"; + + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.DefaultChatClientStreamInterceptor"; + + private static final String INTERCEPT_METHOD = "doGetObservableFluxChatResponse"; + + @Override + protected ClassMatch enhanceClass() { + return NameMatch.byName(ENHANCE_CLASS); + } + + @Override + public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[0]; + } + + @Override + public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[]{ + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named(INTERCEPT_METHOD).and(takesArguments(1)).and(takesArgument(0, ChatClientRequest.class)); + } + + @Override + public String getMethodsInterceptor() { + return INTERCEPTOR_CLASS; + } + + @Override + public boolean isOverrideArgs() { + return false; + } + } + }; + } +} 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/define/ToolCallbackInstrumentation.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/define/ToolCallbackInstrumentation.java index b4955978eb..88f424dc2a 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/define/ToolCallbackInstrumentation.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/define/ToolCallbackInstrumentation.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.skywalking.apm.plugin.spring.ai.v1.define; import net.bytebuddy.description.method.MethodDescription; @@ -8,19 +26,18 @@ import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; import org.apache.skywalking.apm.agent.core.plugin.match.HierarchyMatch; -/** - * @description: - * @author: sym - * @create: 2026-01-03 09:36 - **/ +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.returns; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; public class ToolCallbackInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + private static final String ENHANCE_INTERFACE = "org.springframework.ai.tool.ToolCallback"; - private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.ToolCallbackCallInterceptor"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.ToolCallbackCallInterceptor"; @Override protected ClassMatch enhanceClass() { - // 对应 implementsInterface(named(...)) return HierarchyMatch.byHierarchyMatch(ENHANCE_INTERFACE); } @@ -31,14 +48,13 @@ public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { @Override public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[] { + return new InstanceMethodsInterceptPoint[]{ new InstanceMethodsInterceptPoint() { @Override public ElementMatcher getMethodsMatcher() { return named("call") .and(takesArguments(2)) .and(takesArgument(0, named("java.lang.String"))) - // 这里 OTel 代码里还匹配了返回值为 String .and(returns(named("java.lang.String"))); } 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/define/DocumentRetrieverInstrumentation.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/define/VectorStoreRetrieverInstrumentation.java similarity index 60% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/DocumentRetrieverInstrumentation.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/VectorStoreRetrieverInstrumentation.java index 2384899ab9..426f42c27b 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/define/DocumentRetrieverInstrumentation.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/define/VectorStoreRetrieverInstrumentation.java @@ -1,3 +1,21 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + package org.apache.skywalking.apm.plugin.spring.ai.v1.define; import net.bytebuddy.description.method.MethodDescription; @@ -7,21 +25,18 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; import org.apache.skywalking.apm.agent.core.plugin.match.HierarchyMatch; +import org.springframework.ai.vectorstore.SearchRequest; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -/** - * @description: - * @author: sym - * @create: 2026-01-03 09:38 - **/ +public class VectorStoreRetrieverInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { -public class DocumentRetrieverInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + private static final String ENHANCE_INTERFACE = "org.springframework.ai.vectorstore.VectorStoreRetriever"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.VectorStoreRetrieverInterceptor"; - private static final String ENHANCE_INTERFACE = "org.springframework.ai.document.DocumentRetriever"; - private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.DocumentRetrieverInterceptor"; + private static final String INTERCEPT_METHOD = "doSimilaritySearch"; @Override protected ClassMatch enhanceClass() { @@ -39,9 +54,9 @@ public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { new InstanceMethodsInterceptPoint() { @Override public ElementMatcher getMethodsMatcher() { - return named("retrieve") + return named(INTERCEPT_METHOD) .and(takesArguments(1)) - .and(takesArgument(0, named("org.springframework.ai.document.Query"))); + .and(takesArgument(0, SearchRequest.class)); } @Override diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def index bd9fe567df..960e977592 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -14,4 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.DefaultChatClientInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.DefaultChatClientCallInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.DefaultChatClientStreamInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.ToolCallbackInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.VectorStoreRetrieverInstrumentation diff --git a/pom.xml b/pom.xml index 8e85a9cee4..6077be71f5 100755 --- a/pom.xml +++ b/pom.xml @@ -119,7 +119,7 @@ 2.22.0 3.2.0 3.1.0 - 3.2.4 + 3.3.0 3.0.0-M2 3.10.1 3.1.0 diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh b/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh new file mode 100644 index 0000000000..6c3e9e8b21 --- /dev/null +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh @@ -0,0 +1,21 @@ +#!/bin/bash +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +home="$(cd "$(dirname $0)"; pwd)" + +java -jar ${agent_opts} ${home}/../libs/jdk-httpclient-scenario.jar & \ No newline at end of file diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml new file mode 100644 index 0000000000..f009e03a46 --- /dev/null +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -0,0 +1,111 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +segmentItems: + - serviceName: jdk-httpclient-scenario + segmentSize: gt 0 + segments: + - segmentId: not null + spans: + - operationName: POST:/user/login + parentSpanId: -1 + spanId: 0 + spanLayer: Http + startTime: not null + endTime: not null + componentId: 14 + isError: false + spanType: Entry + peer: '' + skipAnalysis: 'false' + tags: + - { key: url, value: not null } + - { key: http.method, value: POST } + - { key: http.status_code, value: '200' } + refs: + - { parentEndpoint: GET:/case/jdk-httpclient-scenario-case, networkAddress: 'localhost:8080', + refType: CrossProcess, parentSpanId: 1, parentTraceSegmentId: not null, parentServiceInstance: not + null, parentService: jdk-httpclient-scenario, traceId: not null } + - segmentId: not null + spans: + - operationName: POST:/user/asyncLogin + parentSpanId: -1 + spanId: 0 + spanLayer: Http + startTime: not null + endTime: not null + componentId: 14 + isError: false + spanType: Entry + peer: '' + skipAnalysis: 'false' + tags: + - { key: url, value: not null } + - { key: http.method, value: POST } + - { key: http.status_code, value: '200' } + refs: + - { parentEndpoint: GET:/case/jdk-httpclient-scenario-case, networkAddress: 'localhost:8080', + refType: CrossProcess, parentSpanId: 2, parentTraceSegmentId: not null, parentServiceInstance: not + null, parentService: jdk-httpclient-scenario, traceId: not null } + + - segmentId: not null + spans: + - operationName: POST:/jdk-httpclient-scenario/user/login + parentSpanId: 0 + spanId: 1 + spanLayer: Http + startTime: not null + endTime: not null + componentId: 66 + isError: false + spanType: Exit + peer: not null + skipAnalysis: 'false' + tags: + - { key: http.method, value: POST } + - { key: url, value: http://localhost:8080/jdk-httpclient-scenario/user/login } + - { key: http.status_code, value: '200' } + + - operationName: POST:/jdk-httpclient-scenario/user/asyncLogin + parentSpanId: 0 + spanId: 2 + spanLayer: Http + startTime: not null + endTime: not null + componentId: 66 + isError: false + spanType: Exit + peer: not null + skipAnalysis: 'false' + tags: + - { key: http.method, value: POST } + - { key: url, value: http://localhost:8080/jdk-httpclient-scenario/user/asyncLogin } + - { key: http.status_code, value: '200' } + + - operationName: GET:/case/jdk-httpclient-scenario-case + parentSpanId: -1 + spanId: 0 + spanLayer: Http + startTime: not null + endTime: not null + componentId: 14 + isError: false + spanType: Entry + peer: '' + tags: + - { key: url, value: http://localhost:8080/jdk-httpclient-scenario/case/jdk-httpclient-scenario-case } + - { key: http.method, value: GET } + - { key: http.status_code, value: '200' } + skipAnalysis: 'false' diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/configuration.yml b/test/plugin/scenarios/spring-ai-1.x-scenario/configuration.yml new file mode 100644 index 0000000000..acec927aa9 --- /dev/null +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/configuration.yml @@ -0,0 +1,23 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +type: jvm +entryService: http://localhost:8080/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case +healthCheck: http://localhost:8080/spring-ai-1.x-scenario/case/healthCheck +runningMode: with_bootstrap +withPlugins: apm-jdk-httpclient-plugin-*.jar +startScript: ./bin/startup.sh + diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml new file mode 100644 index 0000000000..bfadced625 --- /dev/null +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml @@ -0,0 +1,155 @@ + + + + 4.0.0 + + org.apache.skywalking + x-scenario + 5.0.0 + + + UTF-8 + 17 + 3.8.1 + + + spring-ai-scenario + + + + org.springframework.boot + spring-boot-starter-web + 3.5.7 + + + + com.alibaba + fastjson + 1.2.83 + + + + org.springframework.ai + spring-ai-client-chat + + + + org.springframework.ai + spring-ai-starter-model-openai + + + + org.springframework.ai + spring-ai-advisors-vector-store + + + + + + + + org.springframework.ai + spring-ai-bom + 1.1.0 + pom + import + + + + + + jdk-httpclient-scenario + + + org.springframework.boot + spring-boot-maven-plugin + 3.5.7 + + + + repackage + + + + + + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${compiler.version} + ${compiler.version} + ${project.build.sourceEncoding} + + + + org.apache.maven.plugins + maven-assembly-plugin + + + assemble + package + + single + + + + src/main/assembly/assembly.xml + + ./target/ + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-javadocs + + jar + + + + + false + + + + + org.apache.maven.plugins + maven-jar-plugin + + + empty-javadoc-jar + package + + jar + + + javadoc + ${basedir}/javadoc + + + + + + + \ No newline at end of file diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/assembly/assembly.xml b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/assembly/assembly.xml new file mode 100644 index 0000000000..3ab23573ab --- /dev/null +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/assembly/assembly.xml @@ -0,0 +1,41 @@ + + + + + zip + + + + + ./bin + 0775 + + + + + + ./target/jdk-httpclient-scenario.jar + ./libs + 0775 + + + \ No newline at end of file diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/Application.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/Application.java new file mode 100644 index 0000000000..5147a224ee --- /dev/null +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/Application.java @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package test.apache.skywalking.apm.testcase.jdk.httpclient; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java new file mode 100644 index 0000000000..79fde137ab --- /dev/null +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package test.apache.skywalking.apm.testcase.jdk.httpclient.config; + +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.openai.OpenAiChatModel; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class ChatClientConfig { + + @Bean + public ChatClient openAIChatClient(OpenAiChatModel model) { + return ChatClient.create(model); + } +} diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/RagScenarioConfiguration.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/RagScenarioConfiguration.java new file mode 100644 index 0000000000..650583740e --- /dev/null +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/RagScenarioConfiguration.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package test.apache.skywalking.apm.testcase.jdk.httpclient.config; + +import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; +import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; +import org.springframework.ai.document.Document; +import org.springframework.ai.embedding.EmbeddingModel; +import org.springframework.ai.vectorstore.SimpleVectorStore; +import org.springframework.ai.vectorstore.VectorStore; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.List; + +@Configuration +public class RagScenarioConfiguration { + + @Bean + public VectorStore vectorStore(EmbeddingModel embeddingModel) { + SimpleVectorStore vectorStore = SimpleVectorStore.builder(embeddingModel).build(); + + List documentList = new ArrayList<>(); + + documentList.add(new Document("The 2025 AI Summit is scheduled for October 10-12 in San Francisco. " + + "The event will focus on Generative AI and Autonomous Agents.")); + + documentList.add(new Document("Apache SkyWalking is an open-source Application Performance Management system " + + "designed for microservices, cloud native, and container-based architectures.")); + + documentList.add(new Document("Spring AI provides a unified interface for interacting with different " + + "AI Models, allowing developers to switch between providers with minimal code changes.")); + + documentList.add(new Document("A new distributed tracing protocol, TraceContext v2, was proposed " + + "on August 25, 2025, to improve cross-cloud observability.")); + + vectorStore.add(documentList); + + return vectorStore; + } + + @Bean + public QuestionAnswerAdvisor questionAnswerAdvisor(VectorStore vectorStore) { + return QuestionAnswerAdvisor.builder(vectorStore).build(); + } +} \ No newline at end of file diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java new file mode 100644 index 0000000000..a073dda732 --- /dev/null +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package test.apache.skywalking.apm.testcase.jdk.httpclient.controller; + +import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import test.apache.skywalking.apm.testcase.jdk.httpclient.tool.WeatherTool; + +@RestController +@RequestMapping("/case") +public class CaseController { + + private final WeatherTool weatherTool; + + private final ChatClient chatClient; + + private final QuestionAnswerAdvisor questionAnswerAdvisor; + + public CaseController(WeatherTool weatherTool, @Qualifier("openAIChatClient") ChatClient chatClient, QuestionAnswerAdvisor questionAnswerAdvisor) { + this.weatherTool = weatherTool; + this.chatClient = chatClient; + this.questionAnswerAdvisor = questionAnswerAdvisor; + } + + @GetMapping("/healthCheck") + public String healthCheck() { + return "Success"; + } + + @GetMapping("/spring-ai-1.x-scenario-case") + public String testCase() throws Exception { + String content1 = chatClient + .prompt("What's the weather in New York?") + .tools(weatherTool) + .call() + .content(); + + System.out.println(content1); + +// chatClient +// .prompt("What is Spring AI?") +// .system("you are a smart AI") +// .stream() +// .content() +// .doOnNext(System.out::println) +// .blockLast(); + + String systemPrompt = """ + You are a professional technical assistant. + Strictly use the provided context to answer questions. + If the information is not in the context, say: "I'm sorry, I don't have that information in my knowledge base." + Do not use outside knowledge. Be concise. + """; + + String content2 = chatClient + .prompt("When is the AI Summit?") + .advisors(questionAnswerAdvisor) + .system(systemPrompt) + .stream() + .content() + .doOnNext(System.out::println) + .blockLast(); + System.out.println(content2); + + return "success"; + } +} diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java new file mode 100644 index 0000000000..495713d916 --- /dev/null +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java @@ -0,0 +1,185 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package test.apache.skywalking.apm.testcase.jdk.httpclient.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/llm") +public class LLMMockController { + + @RequestMapping("/v1/chat/completions") + public JSONObject completions(@RequestBody JSONObject request) { + System.out.println(request.toString()); + + JSONArray messages = request.getJSONArray("messages"); + + JSONObject lastMessage = messages.getJSONObject(messages.size() - 1); + String lastRole = lastMessage.getString("role"); + + String toolCallResponse = """ + { + "choices": [ + { + "content_filter_results": {}, + "finish_reason": "tool_calls", + "index": 0, + "logprobs": null, + "message": { + "annotations": [], + "content": null, + "refusal": null, + "role": "assistant", + "tool_calls": [ + { + "function": { + "arguments": "{\\"arg0\\":\\"beijing\\"}", + "name": "get_weather" + }, + "id": "call_iV4bvFIZujbbVZwWbvsUKiiK", + "type": "function" + } + ] + } + } + ], + "created": 1768490813, + "id": "chatcmpl-CyJXJt7gxwDgz7UjYml95gc54784J", + "model": "gpt-4.1-2025-04-14", + "object": "chat.completion", + "prompt_filter_results": [ + { + "prompt_index": 0, + "content_filter_results": { + "hate": { "filtered": false, "severity": "safe" }, + "self_harm": { "filtered": false, "severity": "safe" }, + "sexual": { "filtered": false, "severity": "safe" }, + "violence": { "filtered": false, "severity": "safe" } + } + } + ], + "system_fingerprint": "fp_b9041e10b4", + "usage": { + "completion_tokens": 17, + "completion_tokens_details": { + "accepted_prediction_tokens": 0, + "audio_tokens": 0, + "reasoning_tokens": 0, + "rejected_prediction_tokens": 0 + }, + "prompt_tokens": 52, + "prompt_tokens_details": { + "audio_tokens": 0, + "cached_tokens": 0 + }, + "total_tokens": 69 + } + } + """; + + String finalResponse = """ + { + "choices": [ + { + "content_filter_results": { + "hate": { + "filtered": false, + "severity": "safe" + }, + "self_harm": { + "filtered": false, + "severity": "safe" + }, + "sexual": { + "filtered": false, + "severity": "safe" + }, + "violence": { + "filtered": false, + "severity": "safe" + } + }, + "finish_reason": "stop", + "index": 0, + "logprobs": null, + "message": { + "annotations": [], + "content": "The weather in Beijing is currently sunny with a temperature of 10°C.", + "refusal": null, + "role": "assistant" + } + } + ], + "created": 1768491057, + "id": "chatcmpl-CyJbFkZsyhOyHW2Otycoh2s4vrAZE", + "model": "gpt-4.1-2025-04-14", + "object": "chat.completion", + "prompt_filter_results": [ + { + "prompt_index": 0, + "content_filter_results": { + "hate": { + "filtered": false, + "severity": "safe" + }, + "self_harm": { + "filtered": false, + "severity": "safe" + }, + "sexual": { + "filtered": false, + "severity": "safe" + }, + "violence": { + "filtered": false, + "severity": "safe" + } + } + } + ], + "system_fingerprint": "fp_b9041e10b4", + "usage": { + "completion_tokens": 17, + "completion_tokens_details": { + "accepted_prediction_tokens": 0, + "audio_tokens": 0, + "reasoning_tokens": 0, + "rejected_prediction_tokens": 0 + }, + "prompt_tokens": 83, + "prompt_tokens_details": { + "audio_tokens": 0, + "cached_tokens": 0 + }, + "total_tokens": 100 + } + } + """; + + if ("tool".equals(lastRole)) { + return JSON.parseObject(finalResponse); + } + + return JSON.parseObject(toolCallResponse); + } +} diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/tool/WeatherTool.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/tool/WeatherTool.java new file mode 100644 index 0000000000..1606b67436 --- /dev/null +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/tool/WeatherTool.java @@ -0,0 +1,33 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package test.apache.skywalking.apm.testcase.jdk.httpclient.tool; + +import org.springframework.ai.tool.annotation.Tool; +import org.springframework.stereotype.Component; + +@Component +public class WeatherTool { + @Tool(name = "get_weather", description = "Get weather by city name") + public String getWeather(String city) { + return switch (city.toLowerCase()) { + case "new york" -> "Sunny, 10°C"; + case "london" -> "Cloudy, 12°C"; + default -> "Unknown city"; + }; + } +} diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml new file mode 100644 index 0000000000..1142bddf51 --- /dev/null +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml @@ -0,0 +1,38 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +server: + port: 8080 + servlet: + context-path: /spring-ai-1.x-scenario + +spring: + ai: + openai: + api-key: sk-zuxrezdvwLLU9sGRUEW8mdFKkXuFugK7H9uf2b7iS3qCRU9M +# base-url: http://localhost:8080/spring-ai-1.x-scenario/llm + base-url: https://globalai.vip + embedding: + options: + model: text-embedding-ada-002 + chat: + options: + model: gpt-4.1-2025-04-14 + temperature: 0.7 + max-tokens: 1000 + top-p: 0.9 + + diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/support-version.list b/test/plugin/scenarios/spring-ai-1.x-scenario/support-version.list new file mode 100644 index 0000000000..d2f82818c0 --- /dev/null +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/support-version.list @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +1.1.1 \ No newline at end of file From ab8837fea0517aacf25bb0372c89949516aab09f Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Tue, 3 Feb 2026 23:24:09 +0800 Subject: [PATCH 03/48] fix --- .github/workflows/plugins-jdk17-test.0.yaml | 1 + .../apm/agent/core/context/tag/Tags.java | 2 + .../DefaultChatClientStreamInterceptor.java | 69 +++----------- .../ai/v1/ToolCallbackCallInterceptor.java | 14 ++- .../ai/v1/config/SpringAiPluginConfig.java | 14 ++- apm-sniffer/config/agent.config | 22 +++++ .../spring-ai-1.x-scenario/bin/startup.sh | 2 +- .../config/expectedData.yaml | 95 ------------------- .../scenarios/spring-ai-1.x-scenario/pom.xml | 5 + .../config/RagScenarioConfiguration.java | 10 -- .../httpclient/controller/CaseController.java | 43 ++++----- .../controller/LLMMockController.java | 10 +- .../src/main/resources/application.yaml | 5 +- 13 files changed, 97 insertions(+), 195 deletions(-) diff --git a/.github/workflows/plugins-jdk17-test.0.yaml b/.github/workflows/plugins-jdk17-test.0.yaml index 6d2ad4c2b6..542d98411a 100644 --- a/.github/workflows/plugins-jdk17-test.0.yaml +++ b/.github/workflows/plugins-jdk17-test.0.yaml @@ -64,6 +64,7 @@ jobs: - grizzly-2.3.x-4.x-workthreadpool-scenario - jetty-11.x-scenario - jetty-10.x-scenario + - spring-ai-1.x-scenario steps: - uses: actions/checkout@v2 with: diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java index 92e5dbf9f0..0b0f9781d0 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java @@ -172,6 +172,8 @@ public static final class HTTP { public static final StringTag GEN_AI_TOOL_INPUT = new StringTag(30, "gen_ai.tool.input"); + public static final StringTag GEN_AI_TOOL_OUTPUT = new StringTag(43, "gen_ai.tool.output"); + public static final StringTag GEN_AI_RESPONSE_MODEL = new StringTag(31, "gen_ai.response.model"); public static final StringTag GEN_AI_RESPONSE_ID = new StringTag(32, "gen_ai.response.id"); 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/DefaultChatClientStreamInterceptor.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/DefaultChatClientStreamInterceptor.java index 7761e1f273..053e55c213 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/DefaultChatClientStreamInterceptor.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/DefaultChatClientStreamInterceptor.java @@ -47,9 +47,9 @@ public class DefaultChatClientStreamInterceptor implements InstanceMethodsAround @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/stream"); - + span.setComponent(ComponentsDefine.SPRING_AI); ChatClientRequest request = (ChatClientRequest) allArguments[0]; - if (request == null || request.prompt() == null) { + if (request == null) { return; } @@ -59,9 +59,10 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr return; } - span.setComponent(ComponentsDefine.SPRING_AI); Tags.GEN_AI_REQUEST_MODEL.set(span, chatOptions.getModel()); Tags.GEN_AI_TEMPERATURE.set(span, String.valueOf(chatOptions.getTemperature())); + Tags.GEN_AI_TOP_K.set(span, String.valueOf(chatOptions.getTopK())); + Tags.GEN_AI_TOP_P.set(span, String.valueOf(chatOptions.getTopP())); ContextManager.getRuntimeContext().put(Constants.SPRING_AI_STREAM_START_TIME, System.currentTimeMillis()); } @@ -80,13 +81,14 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA AtomicReference lastResponseRef = new AtomicReference<>(); - StringBuilder completionBuilder = new StringBuilder(); + final StringBuilder completionBuilder = new StringBuilder(); AtomicReference finishReason = new AtomicReference<>(""); AtomicBoolean firstResponseReceived = new AtomicBoolean(false); - long startTime = (long) ContextManager.getRuntimeContext().get(Constants.SPRING_AI_STREAM_START_TIME); + Long startTime = (Long) ContextManager.getRuntimeContext().get(Constants.SPRING_AI_STREAM_START_TIME); + ContextManager.getRuntimeContext().remove(Constants.SPRING_AI_STREAM_START_TIME); return flux.doOnNext(response -> { if (response.chatResponse() != null) { @@ -100,7 +102,7 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA } if (generation.getOutput() != null && StringUtils.hasText(generation.getOutput().getText())) { - if (firstResponseReceived.compareAndSet(false, true)) { + if (firstResponseReceived.compareAndSet(false, true) && startTime != null) { Tags.GEN_AI_STREAM_TTFR.set(span, String.valueOf(System.currentTimeMillis() - startTime)); } } @@ -158,7 +160,12 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA } if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_COMPLETION) { - Tags.GEN_AI_COMPLETION.set(span, completionBuilder.toString()); + int limit = SpringAiPluginConfig.Plugin.SpringAi.COMPLETION_LENGTH_LIMIT; + String output = completionBuilder.toString(); + if (limit > 0 && output.length() > limit) { + output = output.substring(0, limit); + } + Tags.GEN_AI_COMPLETION.set(span, output); } } } @@ -167,7 +174,6 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA span.log(t); } finally { span.asyncFinish(); - ContextManager.getRuntimeContext().remove(Constants.SPRING_AI_STREAM_START_TIME); } }); } @@ -178,51 +184,4 @@ public void handleMethodException(EnhancedInstance objInst, Method method, Objec ContextManager.activeSpan().log(t); } } - - private void collectContent(AbstractSpan span, StringBuilder completionBuilder, Object[] allArguments, long totalTokens) { - int tokenThreshold = SpringAiPluginConfig.Plugin.SpringAi.CONTENT_COLLECT_THRESHOLD_TOKENS; - - if (tokenThreshold >= 0 && totalTokens < tokenThreshold) { - return; - } - - if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_PROMPT) { - collectPrompt(span, allArguments); - } - - if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_COMPLETION) { - collectCompletion(span, completionBuilder); - } - } - - private void collectPrompt(AbstractSpan span, Object[] allArguments) { - ChatClientRequest request = (ChatClientRequest) allArguments[0]; - if (request == null || request.prompt() == null) { - return; - } - - String promptText = request.prompt().getContents(); - if (promptText == null) { - return; - } - - int limit = SpringAiPluginConfig.Plugin.SpringAi.PROMPT_LENGTH_LIMIT; - if (limit > 0 && promptText.length() > limit) { - promptText = promptText.substring(0, limit); - } - Tags.GEN_AI_PROMPT.set(span, promptText); - } - - private void collectCompletion(AbstractSpan span, StringBuilder completionBuilder) { - String completionText = completionBuilder.toString(); - if (completionText.isEmpty()) { - return; - } - - int limit = SpringAiPluginConfig.Plugin.SpringAi.COMPLETION_LENGTH_LIMIT; - if (limit > 0 && completionText.length() > limit) { - completionText = completionText.substring(0, limit); - } - Tags.GEN_AI_COMPLETION.set(span, completionText); - } } 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/ToolCallbackCallInterceptor.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/ToolCallbackCallInterceptor.java index 3b6ae10fbc..0b2afe8014 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/ToolCallbackCallInterceptor.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/ToolCallbackCallInterceptor.java @@ -25,6 +25,7 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; +import org.apache.skywalking.apm.plugin.spring.ai.v1.config.SpringAiPluginConfig; import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.definition.ToolDefinition; @@ -39,21 +40,30 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr ToolDefinition definition = toolCallback.getToolDefinition(); String toolName = definition.name(); - String toolInput = (String) allArguments[0]; AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/tool/" + toolName); span.setComponent(ComponentsDefine.SPRING_AI); Tags.GEN_AI_TOOL_NAME.set(span, toolName); - Tags.GEN_AI_TOOL_INPUT.set(span, toolInput); + + if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_TOOL_INPUT) { + String toolInput = (String) allArguments[0]; + Tags.GEN_AI_TOOL_INPUT.set(span, toolInput); + } } @Override public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { if (ContextManager.isActive()) { + AbstractSpan span = ContextManager.activeSpan(); + if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_TOOL_OUTPUT && ret != null) { + Tags.GEN_AI_TOOL_OUTPUT.set(span, (String) ret); + } + ContextManager.stopSpan(); } + return ret; } 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/config/SpringAiPluginConfig.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/config/SpringAiPluginConfig.java index 54e046d2f2..9869ea3ea6 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/config/SpringAiPluginConfig.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/config/SpringAiPluginConfig.java @@ -30,12 +30,12 @@ public static class SpringAi { /** * Whether to collect the prompt content (input text) of the GenAI request. */ - public static boolean COLLECT_PROMPT = true; + public static boolean COLLECT_PROMPT = false; /** * Whether to collect the completion content (output text) of the GenAI response. */ - public static boolean COLLECT_COMPLETION = true; + public static boolean COLLECT_COMPLETION = false; /** * The maximum characters of the collected prompt content. @@ -59,6 +59,16 @@ public static class SpringAi { * Use a negative value to disable this threshold-based filtering (collect all). */ public static int CONTENT_COLLECT_THRESHOLD_TOKENS = -1; + + /** + * Whether to collect the arguments (input parameters) of the tool/function call. + */ + public static boolean COLLECT_TOOL_INPUT = false; + + /** + * Whether to collect the execution result (output) of the tool/function call. + */ + public static boolean COLLECT_TOOL_OUTPUT = false; } } } diff --git a/apm-sniffer/config/agent.config b/apm-sniffer/config/agent.config index 9056993626..4e54651a58 100755 --- a/apm-sniffer/config/agent.config +++ b/apm-sniffer/config/agent.config @@ -339,3 +339,25 @@ plugin.solon.http_body_length_threshold=${SW_PLUGIN_SOLON_HTTP_BODY_LENGTH_THRES plugin.caffeine.operation_mapping_write=${SW_PLUGIN_CAFFEINE_OPERATION_MAPPING_WRITE:put,putAll,remove,clear} # Specify which command should be converted to read operation plugin.caffeine.operation_mapping_read=${SW_PLUGIN_CAFFEINE_OPERATION_MAPPING_READ:getIfPresent,getAllPresent,computeIfAbsent} +# Whether to collect the prompt content (input text) of the GenAI request. +plugin.springai.collect_prompt=${SW_PLUGIN_SPRINGAI_COLLECT_PROMPT:false} +# Whether to collect the completion content (output text) of the GenAI response. +plugin.springai.collect_completion=${SW_PLUGIN_SPRINGAI_COLLECT_COMPLETION:false} +# The maximum characters of the collected prompt content. +# If the content exceeds this limit, it will be truncated. +# Use a negative value to represent no limit, but be aware this could cause OOM. +plugin.springai.prompt_length_limit=${SW_PLUGIN_SPRINGAI_PROMPT_LENGTH_LIMIT:1024} +# The maximum characters of the collected completion content. +# If the content exceeds this limit, it will be truncated. +# Use a negative value to represent no limit, but be aware this could cause OOM. +plugin.springai.completion_length_limit=${SW_PLUGIN_SPRINGAI_COMPLETION_LENGTH_LIMIT:1024} +# The threshold for token usage to trigger content collection. +# When set to a positive value, prompt and completion will only be collected +# if the total token usage of the request exceeds this threshold. +# This requires collect_prompt or collect_completion to be enabled first. +# Use a negative value to disable this threshold-based filtering (collect all). +plugin.springai.content_collect_threshold_tokens=${SW_PLUGIN_SPRINGAI_CONTENT_COLLECT_THRESHOLD_TOKENS:-1} +# Whether to collect the arguments (input parameters) of the tool/function call. +plugin.springai.collect_tool_input=${SW_PLUGIN_SPRINGAI_COLLECT_TOOL_INPUT:false} +# Whether to collect the execution result (output) of the tool/function call. +plugin.springai.collect_tool_output=${SW_PLUGIN_SPRINGAI_COLLECT_TOOL_OUTPUT:false} \ No newline at end of file diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh b/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh index 6c3e9e8b21..912d655aeb 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh @@ -18,4 +18,4 @@ home="$(cd "$(dirname $0)"; pwd)" -java -jar ${agent_opts} ${home}/../libs/jdk-httpclient-scenario.jar & \ No newline at end of file +java -Dskywalking.plugin.springai.collect_prompt=true -Dskywalking.plugin.springai.collect_completion=true -Dskywalking.plugin.springai.collect_tool_input=true -Dskywalking.plugin.springai.collect_tool_output=true -jar ${agent_opts} ${home}/../libs/jdk-httpclient-scenario.jar & \ No newline at end of file diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index f009e03a46..588a655d98 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -13,99 +13,4 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -segmentItems: - - serviceName: jdk-httpclient-scenario - segmentSize: gt 0 - segments: - - segmentId: not null - spans: - - operationName: POST:/user/login - parentSpanId: -1 - spanId: 0 - spanLayer: Http - startTime: not null - endTime: not null - componentId: 14 - isError: false - spanType: Entry - peer: '' - skipAnalysis: 'false' - tags: - - { key: url, value: not null } - - { key: http.method, value: POST } - - { key: http.status_code, value: '200' } - refs: - - { parentEndpoint: GET:/case/jdk-httpclient-scenario-case, networkAddress: 'localhost:8080', - refType: CrossProcess, parentSpanId: 1, parentTraceSegmentId: not null, parentServiceInstance: not - null, parentService: jdk-httpclient-scenario, traceId: not null } - - segmentId: not null - spans: - - operationName: POST:/user/asyncLogin - parentSpanId: -1 - spanId: 0 - spanLayer: Http - startTime: not null - endTime: not null - componentId: 14 - isError: false - spanType: Entry - peer: '' - skipAnalysis: 'false' - tags: - - { key: url, value: not null } - - { key: http.method, value: POST } - - { key: http.status_code, value: '200' } - refs: - - { parentEndpoint: GET:/case/jdk-httpclient-scenario-case, networkAddress: 'localhost:8080', - refType: CrossProcess, parentSpanId: 2, parentTraceSegmentId: not null, parentServiceInstance: not - null, parentService: jdk-httpclient-scenario, traceId: not null } - - segmentId: not null - spans: - - operationName: POST:/jdk-httpclient-scenario/user/login - parentSpanId: 0 - spanId: 1 - spanLayer: Http - startTime: not null - endTime: not null - componentId: 66 - isError: false - spanType: Exit - peer: not null - skipAnalysis: 'false' - tags: - - { key: http.method, value: POST } - - { key: url, value: http://localhost:8080/jdk-httpclient-scenario/user/login } - - { key: http.status_code, value: '200' } - - - operationName: POST:/jdk-httpclient-scenario/user/asyncLogin - parentSpanId: 0 - spanId: 2 - spanLayer: Http - startTime: not null - endTime: not null - componentId: 66 - isError: false - spanType: Exit - peer: not null - skipAnalysis: 'false' - tags: - - { key: http.method, value: POST } - - { key: url, value: http://localhost:8080/jdk-httpclient-scenario/user/asyncLogin } - - { key: http.status_code, value: '200' } - - - operationName: GET:/case/jdk-httpclient-scenario-case - parentSpanId: -1 - spanId: 0 - spanLayer: Http - startTime: not null - endTime: not null - componentId: 14 - isError: false - spanType: Entry - peer: '' - tags: - - { key: url, value: http://localhost:8080/jdk-httpclient-scenario/case/jdk-httpclient-scenario-case } - - { key: http.method, value: GET } - - { key: http.status_code, value: '200' } - skipAnalysis: 'false' diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml index bfadced625..05b32a346c 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml @@ -59,6 +59,11 @@ org.springframework.ai spring-ai-advisors-vector-store + + org.projectlombok + lombok + 1.18.42 + diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/RagScenarioConfiguration.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/RagScenarioConfiguration.java index 650583740e..e69c4807b4 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/RagScenarioConfiguration.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/RagScenarioConfiguration.java @@ -17,7 +17,6 @@ package test.apache.skywalking.apm.testcase.jdk.httpclient.config; -import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingModel; @@ -41,15 +40,6 @@ public VectorStore vectorStore(EmbeddingModel embeddingModel) { documentList.add(new Document("The 2025 AI Summit is scheduled for October 10-12 in San Francisco. " + "The event will focus on Generative AI and Autonomous Agents.")); - documentList.add(new Document("Apache SkyWalking is an open-source Application Performance Management system " + - "designed for microservices, cloud native, and container-based architectures.")); - - documentList.add(new Document("Spring AI provides a unified interface for interacting with different " + - "AI Models, allowing developers to switch between providers with minimal code changes.")); - - documentList.add(new Document("A new distributed tracing protocol, TraceContext v2, was proposed " + - "on August 25, 2025, to improve cross-cloud observability.")); - vectorStore.add(documentList); return vectorStore; diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java index a073dda732..c9fe1e3846 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java @@ -17,6 +17,7 @@ package test.apache.skywalking.apm.testcase.jdk.httpclient.controller; +import lombok.RequiredArgsConstructor; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; import org.springframework.beans.factory.annotation.Qualifier; @@ -27,20 +28,13 @@ @RestController @RequestMapping("/case") +@RequiredArgsConstructor public class CaseController { private final WeatherTool weatherTool; - private final ChatClient chatClient; - private final QuestionAnswerAdvisor questionAnswerAdvisor; - public CaseController(WeatherTool weatherTool, @Qualifier("openAIChatClient") ChatClient chatClient, QuestionAnswerAdvisor questionAnswerAdvisor) { - this.weatherTool = weatherTool; - this.chatClient = chatClient; - this.questionAnswerAdvisor = questionAnswerAdvisor; - } - @GetMapping("/healthCheck") public String healthCheck() { return "Success"; @@ -56,14 +50,6 @@ public String testCase() throws Exception { System.out.println(content1); -// chatClient -// .prompt("What is Spring AI?") -// .system("you are a smart AI") -// .stream() -// .content() -// .doOnNext(System.out::println) -// .blockLast(); - String systemPrompt = """ You are a professional technical assistant. Strictly use the provided context to answer questions. @@ -71,15 +57,22 @@ public String testCase() throws Exception { Do not use outside knowledge. Be concise. """; - String content2 = chatClient - .prompt("When is the AI Summit?") - .advisors(questionAnswerAdvisor) - .system(systemPrompt) - .stream() - .content() - .doOnNext(System.out::println) - .blockLast(); - System.out.println(content2); +// String content = chatClient +// .prompt("When is the AI Summit?") +// .system(systemPrompt) +// .advisors(questionAnswerAdvisor) +// .call() +// .content(); +// System.out.println(content); + +// chatClient +// .prompt("When is the AI Summit?") +// .system(systemPrompt) +// .advisors(questionAnswerAdvisor) +// .stream() +// .content() +// .doOnNext(System.out::println) +// .blockLast(); return "success"; } diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java index 495713d916..e535df924f 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java @@ -53,7 +53,7 @@ public JSONObject completions(@RequestBody JSONObject request) { "tool_calls": [ { "function": { - "arguments": "{\\"arg0\\":\\"beijing\\"}", + "arguments": "{\\"arg0\\":\\"new york\\"}", "name": "get_weather" }, "id": "call_iV4bvFIZujbbVZwWbvsUKiiK", @@ -124,7 +124,7 @@ public JSONObject completions(@RequestBody JSONObject request) { "logprobs": null, "message": { "annotations": [], - "content": "The weather in Beijing is currently sunny with a temperature of 10°C.", + "content": "The weather in New York is currently sunny with a temperature of 10°C.", "refusal": null, "role": "assistant" } @@ -182,4 +182,10 @@ public JSONObject completions(@RequestBody JSONObject request) { return JSON.parseObject(toolCallResponse); } + + @RequestMapping("/v1/embeddings") + public JSONObject embeddings(@RequestBody JSONObject request) { + System.out.println(request); + return new JSONObject(); + } } diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml index 1142bddf51..d1a7e24df5 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml @@ -22,9 +22,8 @@ server: spring: ai: openai: - api-key: sk-zuxrezdvwLLU9sGRUEW8mdFKkXuFugK7H9uf2b7iS3qCRU9M -# base-url: http://localhost:8080/spring-ai-1.x-scenario/llm - base-url: https://globalai.vip + api-key: noaichaPCNAC09DHBWQCOACNacoi + base-url: http://localhost:8080/spring-ai-1.x-scenario/llm embedding: options: model: text-embedding-ada-002 From 869e6bb56ea0c68842664e190aaa022483559f6b Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Tue, 3 Feb 2026 23:28:38 +0800 Subject: [PATCH 04/48] fix --- .../config/expectedData.yaml | 60 +++++++++++++++++++ .../config/RagScenarioConfiguration.java | 52 ---------------- .../httpclient/controller/CaseController.java | 31 +--------- .../controller/LLMMockController.java | 7 --- .../src/main/resources/application.yaml | 3 - 5 files changed, 61 insertions(+), 92 deletions(-) delete mode 100644 test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/RagScenarioConfiguration.java diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index 588a655d98..8e22bdc715 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -13,4 +13,64 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +segmentItems: + - serviceName: spring-ai-1.x-scenario + segmentSize: gt 0 + segments: + - segmentId: not null + spans: + - operationName: Spring-ai/tool/get_weather + parentSpanId: 1 + spanId: 2 + spanLayer: Unknown + startTime: not null + endTime: not null + componentId: not null # Spring-ai component + isError: false + spanType: Local + peer: '' + skipAnalysis: 'false' + tags: + - { key: gen_ai.tool.name, value: get_weather } + - { key: gen_ai.tool.input, value: '{"arg0":"New York"}' } + - { key: gen_ai.tool.output, value: '"Sunny, 10°C"' } + - operationName: Spring-ai/chat-client/call + parentSpanId: 0 + spanId: 1 + spanLayer: Unknown + startTime: not null + endTime: not null + componentId: not null # Spring-ai component + isError: false + spanType: Local + peer: '' + skipAnalysis: 'false' + tags: + - { key: gen_ai.request.model, value: gpt-4.1-2025-04-14 } + - { key: gen_ai.temperature, value: '0.7' } + - { key: gen_ai.top.p, value: '0.9' } + - { key: gen_ai.response.id, value: not null } + - { key: gen_ai.response.model, value: gpt-4.1-2025-04-14 } + - { key: gen_ai.usage.input_tokens, value: not null } + - { key: gen_ai.usage.output_tokens, value: not null } + - { key: gen_ai.usage.total_tokens, value: not null } + - { key: gen_ai.response.finish_reasons, value: STOP } + - { key: gen_ai.prompt, value: "What's the weather in New York?" } + - { key: gen_ai.completion, value: "The weather in New York is currently sunny with a temperature of 10°C." } + + - operationName: GET:/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case + parentSpanId: -1 + spanId: 0 + spanLayer: Http + startTime: not null + endTime: not null + componentId: 14 + isError: false + spanType: Entry + peer: '' + skipAnalysis: 'false' + tags: + - { key: url, value: http://localhost:8080/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case } + - { key: http.method, value: GET } + - { key: http.status_code, value: '200' } diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/RagScenarioConfiguration.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/RagScenarioConfiguration.java deleted file mode 100644 index e69c4807b4..0000000000 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/RagScenarioConfiguration.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package test.apache.skywalking.apm.testcase.jdk.httpclient.config; - -import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; -import org.springframework.ai.document.Document; -import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.vectorstore.SimpleVectorStore; -import org.springframework.ai.vectorstore.VectorStore; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import java.util.ArrayList; -import java.util.List; - -@Configuration -public class RagScenarioConfiguration { - - @Bean - public VectorStore vectorStore(EmbeddingModel embeddingModel) { - SimpleVectorStore vectorStore = SimpleVectorStore.builder(embeddingModel).build(); - - List documentList = new ArrayList<>(); - - documentList.add(new Document("The 2025 AI Summit is scheduled for October 10-12 in San Francisco. " + - "The event will focus on Generative AI and Autonomous Agents.")); - - vectorStore.add(documentList); - - return vectorStore; - } - - @Bean - public QuestionAnswerAdvisor questionAnswerAdvisor(VectorStore vectorStore) { - return QuestionAnswerAdvisor.builder(vectorStore).build(); - } -} \ No newline at end of file diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java index c9fe1e3846..e8a69d0ded 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java @@ -19,8 +19,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.ai.chat.client.ChatClient; -import org.springframework.ai.chat.client.advisor.vectorstore.QuestionAnswerAdvisor; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -33,7 +31,6 @@ public class CaseController { private final WeatherTool weatherTool; private final ChatClient chatClient; - private final QuestionAnswerAdvisor questionAnswerAdvisor; @GetMapping("/healthCheck") public String healthCheck() { @@ -42,38 +39,12 @@ public String healthCheck() { @GetMapping("/spring-ai-1.x-scenario-case") public String testCase() throws Exception { - String content1 = chatClient + chatClient .prompt("What's the weather in New York?") .tools(weatherTool) .call() .content(); - System.out.println(content1); - - String systemPrompt = """ - You are a professional technical assistant. - Strictly use the provided context to answer questions. - If the information is not in the context, say: "I'm sorry, I don't have that information in my knowledge base." - Do not use outside knowledge. Be concise. - """; - -// String content = chatClient -// .prompt("When is the AI Summit?") -// .system(systemPrompt) -// .advisors(questionAnswerAdvisor) -// .call() -// .content(); -// System.out.println(content); - -// chatClient -// .prompt("When is the AI Summit?") -// .system(systemPrompt) -// .advisors(questionAnswerAdvisor) -// .stream() -// .content() -// .doOnNext(System.out::println) -// .blockLast(); - return "success"; } } diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java index e535df924f..573b3f0c48 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java @@ -30,7 +30,6 @@ public class LLMMockController { @RequestMapping("/v1/chat/completions") public JSONObject completions(@RequestBody JSONObject request) { - System.out.println(request.toString()); JSONArray messages = request.getJSONArray("messages"); @@ -182,10 +181,4 @@ public JSONObject completions(@RequestBody JSONObject request) { return JSON.parseObject(toolCallResponse); } - - @RequestMapping("/v1/embeddings") - public JSONObject embeddings(@RequestBody JSONObject request) { - System.out.println(request); - return new JSONObject(); - } } diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml index d1a7e24df5..75a26b2bc9 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml @@ -24,9 +24,6 @@ spring: openai: api-key: noaichaPCNAC09DHBWQCOACNacoi base-url: http://localhost:8080/spring-ai-1.x-scenario/llm - embedding: - options: - model: text-embedding-ada-002 chat: options: model: gpt-4.1-2025-04-14 From 4a2992d9d4f25a5215fedabc082c0a0f220e5aaf Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Tue, 3 Feb 2026 23:36:03 +0800 Subject: [PATCH 05/48] fix --- .../jdk/httpclient/controller/LLMMockController.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java index 573b3f0c48..70591908d9 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java @@ -55,7 +55,7 @@ public JSONObject completions(@RequestBody JSONObject request) { "arguments": "{\\"arg0\\":\\"new york\\"}", "name": "get_weather" }, - "id": "call_iV4bvFIZujbbVZwWbvsUKiiK", + "id": "call_iV4bvFIZujbb", "type": "function" } ] @@ -63,7 +63,7 @@ public JSONObject completions(@RequestBody JSONObject request) { } ], "created": 1768490813, - "id": "chatcmpl-CyJXJt7gxwDgz7UjYml95gc54784J", + "id": "chatcmpl-CyJXJt7gxwDgz7Uj", "model": "gpt-4.1-2025-04-14", "object": "chat.completion", "prompt_filter_results": [ @@ -77,7 +77,7 @@ public JSONObject completions(@RequestBody JSONObject request) { } } ], - "system_fingerprint": "fp_b9041e10b4", + "system_fingerprint": "fp_b9041e1", "usage": { "completion_tokens": 17, "completion_tokens_details": { @@ -130,7 +130,7 @@ public JSONObject completions(@RequestBody JSONObject request) { } ], "created": 1768491057, - "id": "chatcmpl-CyJbFkZsyhOyHW2Otycoh2s4vrAZE", + "id": "chatcmpl-CyJbFkZsyhOyHW2Otyc", "model": "gpt-4.1-2025-04-14", "object": "chat.completion", "prompt_filter_results": [ @@ -156,7 +156,7 @@ public JSONObject completions(@RequestBody JSONObject request) { } } ], - "system_fingerprint": "fp_b9041e10b4", + "system_fingerprint": "fp_b9041e1", "usage": { "completion_tokens": 17, "completion_tokens_details": { From ff421201fdccd93ec1601af45a70cb7c78f20f50 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Wed, 4 Feb 2026 00:43:35 +0800 Subject: [PATCH 06/48] fix --- .../ai/v1/define/DefaultChatClientCallInstrumentation.java | 5 ++--- .../ai/v1/define/DefaultChatClientStreamInstrumentation.java | 5 ++--- .../spring/ai/v1/define/ToolCallbackInstrumentation.java | 4 ++-- .../ai/v1/define/VectorStoreRetrieverInstrumentation.java | 5 ++--- docs/en/setup/service-agent/java-agent/Plugin-list.md | 1 + 5 files changed, 9 insertions(+), 11 deletions(-) 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/define/DefaultChatClientCallInstrumentation.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/define/DefaultChatClientCallInstrumentation.java index 308efc04e6..450fb4ed0d 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/define/DefaultChatClientCallInstrumentation.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/define/DefaultChatClientCallInstrumentation.java @@ -25,11 +25,10 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; -import org.springframework.ai.chat.client.ChatClientRequest; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; +import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; public class DefaultChatClientCallInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { @@ -55,7 +54,7 @@ public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { new InstanceMethodsInterceptPoint() { @Override public ElementMatcher getMethodsMatcher() { - return named(INTERCEPT_METHOD).and(takesArguments(2)).and(takesArgument(0, ChatClientRequest.class)); + return named(INTERCEPT_METHOD).and(takesArguments(2)).and(takesArgumentWithType(0, "org.springframework.ai.chat.client.ChatClientRequest")); } @Override 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/define/DefaultChatClientStreamInstrumentation.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/define/DefaultChatClientStreamInstrumentation.java index 2e76fb5654..b5fb5d3564 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/define/DefaultChatClientStreamInstrumentation.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/define/DefaultChatClientStreamInstrumentation.java @@ -25,11 +25,10 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; -import org.springframework.ai.chat.client.ChatClientRequest; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; +import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; public class DefaultChatClientStreamInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { @@ -55,7 +54,7 @@ public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { new InstanceMethodsInterceptPoint() { @Override public ElementMatcher getMethodsMatcher() { - return named(INTERCEPT_METHOD).and(takesArguments(1)).and(takesArgument(0, ChatClientRequest.class)); + return named(INTERCEPT_METHOD).and(takesArguments(1)).and(takesArgumentWithType(0, "org.springframework.ai.chat.client.ChatClientRequest")); } @Override 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/define/ToolCallbackInstrumentation.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/define/ToolCallbackInstrumentation.java index 88f424dc2a..99a4029b00 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/define/ToolCallbackInstrumentation.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/define/ToolCallbackInstrumentation.java @@ -28,8 +28,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.returns; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; +import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; public class ToolCallbackInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { @@ -54,7 +54,7 @@ public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { public ElementMatcher getMethodsMatcher() { return named("call") .and(takesArguments(2)) - .and(takesArgument(0, named("java.lang.String"))) + .and(takesArgumentWithType(0, "java.lang.String")) .and(returns(named("java.lang.String"))); } 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/define/VectorStoreRetrieverInstrumentation.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/define/VectorStoreRetrieverInstrumentation.java index 426f42c27b..6c09e083fd 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/define/VectorStoreRetrieverInstrumentation.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/define/VectorStoreRetrieverInstrumentation.java @@ -25,11 +25,10 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; import org.apache.skywalking.apm.agent.core.plugin.match.HierarchyMatch; -import org.springframework.ai.vectorstore.SearchRequest; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; +import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; public class VectorStoreRetrieverInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { @@ -56,7 +55,7 @@ public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { public ElementMatcher getMethodsMatcher() { return named(INTERCEPT_METHOD) .and(takesArguments(1)) - .and(takesArgument(0, SearchRequest.class)); + .and(takesArgumentWithType(0, "org.springframework.ai.vectorstore.SearchRequest")); } @Override diff --git a/docs/en/setup/service-agent/java-agent/Plugin-list.md b/docs/en/setup/service-agent/java-agent/Plugin-list.md index c5a5bfd48f..49d1cb9c8e 100644 --- a/docs/en/setup/service-agent/java-agent/Plugin-list.md +++ b/docs/en/setup/service-agent/java-agent/Plugin-list.md @@ -103,6 +103,7 @@ - sharding-sphere-5.0.0 - sofarpc - solrj-7.x +- spring-ai-1.x - spring-annotation - spring-async-annotation-5.x - spring-cloud-feign-1.x From 6c9ce2acfe9d159ae3fe297453a91692d1c69aa6 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Wed, 4 Feb 2026 12:01:42 +0800 Subject: [PATCH 07/48] fix --- test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml index 05b32a346c..d504d1ea01 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml @@ -30,7 +30,7 @@ 3.8.1 - spring-ai-scenario + spring-ai-1.x-scenario From 142a456e2805e26a691c31cc82e34d91e63eb044 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Wed, 4 Feb 2026 12:41:58 +0800 Subject: [PATCH 08/48] fix --- test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh b/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh index 912d655aeb..8a1c2e0480 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh @@ -18,4 +18,4 @@ home="$(cd "$(dirname $0)"; pwd)" -java -Dskywalking.plugin.springai.collect_prompt=true -Dskywalking.plugin.springai.collect_completion=true -Dskywalking.plugin.springai.collect_tool_input=true -Dskywalking.plugin.springai.collect_tool_output=true -jar ${agent_opts} ${home}/../libs/jdk-httpclient-scenario.jar & \ No newline at end of file +java -Dskywalking.plugin.springai.collect_prompt=true -Dskywalking.plugin.springai.collect_completion=true -Dskywalking.plugin.springai.collect_tool_input=true -Dskywalking.plugin.springai.collect_tool_output=true -jar ${agent_opts} ${home}/../libs/spring-ai-1.x-scenario.jar & \ No newline at end of file From 44e4589c116d293c4e4312cd526061243c6d04e6 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Wed, 4 Feb 2026 21:47:49 +0800 Subject: [PATCH 09/48] fix --- test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml index d504d1ea01..1afb12d1b9 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml @@ -21,7 +21,7 @@ 4.0.0 org.apache.skywalking - x-scenario + spring-ai-1.x-scenario 5.0.0 From 4b25e8fde4f1d13b70ac0dc2f10bb9c5fc99869c Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Wed, 4 Feb 2026 22:56:39 +0800 Subject: [PATCH 10/48] fix --- test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml index 1afb12d1b9..540bb0a541 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml @@ -80,7 +80,7 @@ - jdk-httpclient-scenario + spring-ai-1.x-scenario org.springframework.boot From 175792a086edc8c3be1c3c6a33f792b86edd61f7 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Thu, 5 Feb 2026 12:42:28 +0800 Subject: [PATCH 11/48] fix --- test/plugin/scenarios/spring-ai-1.x-scenario/configuration.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/configuration.yml b/test/plugin/scenarios/spring-ai-1.x-scenario/configuration.yml index acec927aa9..073d9271d5 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/configuration.yml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/configuration.yml @@ -17,7 +17,5 @@ type: jvm entryService: http://localhost:8080/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case healthCheck: http://localhost:8080/spring-ai-1.x-scenario/case/healthCheck -runningMode: with_bootstrap -withPlugins: apm-jdk-httpclient-plugin-*.jar startScript: ./bin/startup.sh From 0a5704646262199b2602a32852223f4e2975314a Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Thu, 5 Feb 2026 21:13:18 +0800 Subject: [PATCH 12/48] fix --- .../spring-ai-1.x-scenario/src/main/assembly/assembly.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/assembly/assembly.xml b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/assembly/assembly.xml index 3ab23573ab..deed40fcfe 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/assembly/assembly.xml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/assembly/assembly.xml @@ -33,7 +33,7 @@ - ./target/jdk-httpclient-scenario.jar + ./target/spring-ai-1.x-scenario.jar ./libs 0775 From 346a1897145324cea2f9d9732eb9203694006a46 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Thu, 5 Feb 2026 21:37:33 +0800 Subject: [PATCH 13/48] fix --- .../spring-ai-1.x-scenario/config/expectedData.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index 8e22bdc715..116fd775c9 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -25,14 +25,14 @@ segmentItems: spanLayer: Unknown startTime: not null endTime: not null - componentId: not null # Spring-ai component + componentId: 164 isError: false spanType: Local peer: '' skipAnalysis: 'false' tags: - { key: gen_ai.tool.name, value: get_weather } - - { key: gen_ai.tool.input, value: '{"arg0":"New York"}' } + - { key: gen_ai.tool.input, value: '{"arg0":"new york"}' } - { key: gen_ai.tool.output, value: '"Sunny, 10°C"' } - operationName: Spring-ai/chat-client/call @@ -41,7 +41,7 @@ segmentItems: spanLayer: Unknown startTime: not null endTime: not null - componentId: not null # Spring-ai component + componentId: 164 isError: false spanType: Local peer: '' From f20a8c6c8444a715525e129446beb4a955621a65 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Thu, 5 Feb 2026 23:13:45 +0800 Subject: [PATCH 14/48] fix --- .../scenarios/spring-ai-1.x-scenario/config/expectedData.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index 116fd775c9..2e939b4c46 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -49,6 +49,7 @@ segmentItems: tags: - { key: gen_ai.request.model, value: gpt-4.1-2025-04-14 } - { key: gen_ai.temperature, value: '0.7' } + - { key: gen_ai.top.k, value: null } - { key: gen_ai.top.p, value: '0.9' } - { key: gen_ai.response.id, value: not null } - { key: gen_ai.response.model, value: gpt-4.1-2025-04-14 } From d1a69089d55a012b9bdb62ebf05233bc2e5cfd86 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Fri, 6 Feb 2026 09:18:02 +0800 Subject: [PATCH 15/48] fix --- .../scenarios/spring-ai-1.x-scenario/config/expectedData.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index 2e939b4c46..7abee75316 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -66,7 +66,7 @@ segmentItems: spanLayer: Http startTime: not null endTime: not null - componentId: 14 + componentId: 1 isError: false spanType: Entry peer: '' From 58b1ca35aeab8df2d39c7a3ddc09c9d6b2990176 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Thu, 12 Feb 2026 22:32:46 +0800 Subject: [PATCH 16/48] fix --- .../apm/agent/core/context/tag/Tags.java | 94 ++++++++++- .../agent/core/context/trace/SpanLayer.java | 7 +- ...tor.java => ChatModelCallInterceptor.java} | 24 ++- ...r.java => ChatModelStreamInterceptor.java} | 42 +++-- .../DefaultToolCallingManagerInterceptor.java | 63 ++++++++ .../ai/v1/ToolCallbackCallInterceptor.java | 6 +- .../v1/common/ChatModelMetadataResolver.java | 146 ++++++++++++++++++ .../spring/ai/v1/contant/Constants.java | 6 + ...ultToolCallingManagerInstrumentation.java} | 10 +- .../AnthropicApiInstrumentation.java} | 38 ++--- .../provider/OpenAIApiInstrumentation.java | 63 ++++++++ .../spring/ai/v1/enums/AiProviderEnum.java | 68 ++++++++ .../v1/provider/AnthropicApiInterceptor.java | 41 +++++ .../ai/v1/provider/OpenAiApiInterceptor.java | 41 +++++ .../src/main/resources/skywalking-plugin.def | 5 +- .../spring-ai-1.x-scenario/bin/startup.sh | 2 +- .../scenarios/spring-ai-1.x-scenario/pom.xml | 6 +- .../httpclient/config/ChatClientConfig.java | 4 +- .../httpclient/controller/CaseController.java | 26 ++++ 19 files changed, 626 insertions(+), 66 deletions(-) rename apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/{DefaultChatClientCallInterceptor.java => ChatModelCallInterceptor.java} (86%) rename apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/{DefaultChatClientStreamInterceptor.java => ChatModelStreamInterceptor.java} (85%) create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/DefaultToolCallingManagerInterceptor.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/common/ChatModelMetadataResolver.java rename apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/{DefaultChatClientCallInstrumentation.java => DefaultToolCallingManagerInstrumentation.java} (86%) rename apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/{DefaultChatClientStreamInstrumentation.java => provider/AnthropicApiInstrumentation.java} (67%) create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/OpenAIApiInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/enums/AiProviderEnum.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/AnthropicApiInterceptor.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/OpenAiApiInterceptor.java diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java index 0b0f9781d0..c170d0218a 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java @@ -160,44 +160,126 @@ public static final class HTTP { */ public static final StringTag THREAD_CARRIER = new StringTag(24, "thread.carrier"); + /** + * GEN_AI_OPERATION_NAME represents the name of the operation being performed + */ + public static final StringTag GEN_AI_OPERATION_NAME = new StringTag(44, "gen_ai.operation.name"); + + /** + * GEN_AI_PROVIDER_NAME represents the Generative AI provider as identified by the client or server instrumentation. + */ + public static final StringTag GEN_AI_PROVIDER_NAME = new StringTag(46, "gen_ai.provider.name"); + + /** + * GEN_AI_REQUEST_MODEL represents the name of the GenAI model a request is being made to. + */ public static final StringTag GEN_AI_REQUEST_MODEL = new StringTag(25, "gen_ai.request.model"); - public static final StringTag GEN_AI_TOP_K = new StringTag(26, "gen_ai.top.k"); + /** + * GEN_AI_TOP_K represents the top_k sampling setting for the GenAI request. + */ + public static final StringTag GEN_AI_TOP_K = new StringTag(26, "gen_ai.request.top_k"); - public static final StringTag GEN_AI_TOP_P = new StringTag(27, "gen_ai.top.p"); + /** + * GEN_AI_TOP_P represents the top_p sampling setting for the GenAI request. + */ + public static final StringTag GEN_AI_TOP_P = new StringTag(27, "gen_ai.request.top_p"); - public static final StringTag GEN_AI_TEMPERATURE = new StringTag(28, "gen_ai.temperature"); + /** + * GEN_AI_TEMPERATURE represents the temperature setting for the GenAI request. + */ + public static final StringTag GEN_AI_TEMPERATURE = new StringTag(28, "gen_ai.request.temperature"); + /** + * GEN_AI_TOOL_NAME represents the name of the tool utilized by the agent. + */ public static final StringTag GEN_AI_TOOL_NAME = new StringTag(29, "gen_ai.tool.name"); - public static final StringTag GEN_AI_TOOL_INPUT = new StringTag(30, "gen_ai.tool.input"); + /** + * GEN_AI_TOOL_CALL_ARGUMENTS represents the parameters passed to the tool call. + */ + public static final StringTag GEN_AI_TOOL_CALL_ARGUMENTS = new StringTag(30, "gen_ai.tool.call.arguments"); - public static final StringTag GEN_AI_TOOL_OUTPUT = new StringTag(43, "gen_ai.tool.output"); + /** + * GEN_AI_TOOL_CALL_RESULT represents the result returned by the tool call (if any and if execution was successful). + */ + public static final StringTag GEN_AI_TOOL_CALL_RESULT = new StringTag(43, "gen_ai.tool.call.result"); + /** + * GEN_AI_RESPONSE_MODEL represents the name of the model that generated the response. + */ public static final StringTag GEN_AI_RESPONSE_MODEL = new StringTag(31, "gen_ai.response.model"); + /** + * GEN_AI_RESPONSE_ID represents the unique identifier for the completion. + */ public static final StringTag GEN_AI_RESPONSE_ID = new StringTag(32, "gen_ai.response.id"); + /** + * GEN_AI_USAGE_INPUT_TOKENS represents the number of tokens used in the GenAI input (prompt). + */ public static final StringTag GEN_AI_USAGE_INPUT_TOKENS = new StringTag(33, "gen_ai.usage.input_tokens"); + /** + * GEN_AI_USAGE_OUTPUT_TOKENS represents the number of tokens used in the GenAI response (completion). + */ public static final StringTag GEN_AI_USAGE_OUTPUT_TOKENS = new StringTag(34, "gen_ai.usage.output_tokens"); - public static final StringTag GEN_AI_USAGE_TOTAL_TOKENS = new StringTag(35, "gen_ai.usage.total_tokens"); + /** + * GEN_AI_USAGE_TOTAL_TOKENS represents the total number of tokens used in the GenAI exchange. + */ + public static final StringTag GEN_AI_CLIENT_TOKEN_USAGE = new StringTag(35, "gen_ai.client.token.usage"); + /** + * GEN_AI_RESPONSE_FINISH_REASONS represents the array of reasons the model stopped generating tokens. + */ public static final StringTag GEN_AI_RESPONSE_FINISH_REASONS = new StringTag(36, "gen_ai.response.finish_reasons"); + /** + * GEN_AI_PROMPT represents the full prompt text or messages provided to the model. + */ public static final StringTag GEN_AI_PROMPT = new StringTag(37, "gen_ai.prompt"); + /** + * GEN_AI_COMPLETION represents the full completion text or messages returned by the model. + */ public static final StringTag GEN_AI_COMPLETION = new StringTag(38, "gen_ai.completion"); + /** + * GEN_AI_STREAM_TTFR represents the time to first response (TTFR) for streaming operations. + */ public static final StringTag GEN_AI_STREAM_TTFR = new StringTag(39, "gen_ai.stream.ttfr"); + /** + * GEN_AI_VECTOR_STORE_TOP_K represents the target number of top results to return from the vector store. + */ public static final StringTag GEN_AI_VECTOR_STORE_TOP_K = new StringTag(40, "gen_ai.vector_store.top_k"); + /** + * GEN_AI_VECTOR_STORE_FILTER_EXPRESSION represents the filter expression used in the vector store search. + */ public static final StringTag GEN_AI_VECTOR_STORE_FILTER_EXPRESSION = new StringTag(41, "gen_ai.vector_store.filter_expression"); + /** + * GEN_AI_VECTOR_STORE_RECORD_IDS represents the unique identifiers of the records retrieved from the vector store. + */ public static final StringTag GEN_AI_VECTOR_STORE_RECORD_IDS = new StringTag(42, "gen_ai.vector_store.record_ids"); + /** + * GEN_AI_SYSTEM_INSTRUCTIONS represents the system message or instructions provided to the GenAI model separately from the chat history. + */ + public static final StringTag GEN_AI_SYSTEM_INSTRUCTIONS = new StringTag(43, "gen_ai.system_instructions"); + + /** + * GEN_AI_INPUT_MESSAGES represents the chat history provided to the model as an input. + */ + public static final StringTag GEN_AI_INPUT_MESSAGES = new StringTag(44, "gen_ai.input.messages"); + + /** + * GEN_AI_OUTPUT_MESSAGES represents the messages returned by the model where each message represents a specific model response (choice, candidate). + */ + public static final StringTag GEN_AI_OUTPUT_MESSAGES = new StringTag(45, "gen_ai.output.messages"); + /** * Creates a {@code StringTag} with the given key and cache it, if it's created before, simply return it without * creating a new one. diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/SpanLayer.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/SpanLayer.java index 4ee9395ac9..c31fdc4cc1 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/SpanLayer.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/trace/SpanLayer.java @@ -19,7 +19,8 @@ package org.apache.skywalking.apm.agent.core.context.trace; public enum SpanLayer { - DB(1), RPC_FRAMEWORK(2), HTTP(3), MQ(4), CACHE(5); + DB(1), RPC_FRAMEWORK(2), HTTP(3), MQ(4), CACHE(5), + GEN_AI(7); private int code; @@ -50,4 +51,8 @@ public static void asHttp(AbstractSpan span) { public static void asMQ(AbstractSpan span) { span.setLayer(SpanLayer.MQ); } + + public static void asGenAI(AbstractSpan span) { + span.setLayer(SpanLayer.GEN_AI); + } } 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/DefaultChatClientCallInterceptor.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/ChatModelCallInterceptor.java similarity index 86% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/DefaultChatClientCallInterceptor.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/ChatModelCallInterceptor.java index 7c6ea9fc9f..a5dd00f604 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/DefaultChatClientCallInterceptor.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/ChatModelCallInterceptor.java @@ -21,11 +21,15 @@ import org.apache.skywalking.apm.agent.core.context.ContextManager; import org.apache.skywalking.apm.agent.core.context.tag.Tags; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; +import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; import org.apache.skywalking.apm.plugin.spring.ai.v1.config.SpringAiPluginConfig; +import org.apache.skywalking.apm.plugin.spring.ai.v1.contant.Constants; +import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; import org.springframework.ai.chat.client.ChatClientRequest; import org.springframework.ai.chat.client.ChatClientResponse; import org.springframework.ai.chat.metadata.ChatResponseMetadata; @@ -37,20 +41,28 @@ import java.lang.reflect.Method; -public class DefaultChatClientCallInterceptor implements InstanceMethodsAroundInterceptor { +public class ChatModelCallInterceptor implements InstanceMethodsAroundInterceptor { @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/chat-client/call"); + AbstractSpan span = ContextManager.createExitSpan("Spring-ai/client/call", null); + ChatModelMetadataResolver.ApiMetadata apiMetadata = ChatModelMetadataResolver.getMetadata(objInst); + if (apiMetadata != null) { + span.setPeer(apiMetadata.getPeer()); + Tags.GEN_AI_PROVIDER_NAME.set(span, apiMetadata.getProviderName()); + } else { + Tags.GEN_AI_PROVIDER_NAME.set(span, AiProviderEnum.UNKNOW.getValue()); + } - ChatClientRequest request = (ChatClientRequest) allArguments[0]; - Prompt prompt = request.prompt(); + Prompt prompt = (Prompt) allArguments[0]; ChatOptions chatOptions = prompt.getOptions(); if (chatOptions == null) { return; } span.setComponent(ComponentsDefine.SPRING_AI); + SpanLayer.asGenAI(span); + Tags.GEN_AI_OPERATION_NAME.set(span, Constants.CHAT); Tags.GEN_AI_REQUEST_MODEL.set(span, chatOptions.getModel()); Tags.GEN_AI_TEMPERATURE.set(span, String.valueOf(chatOptions.getTemperature())); Tags.GEN_AI_TOP_K.set(span, String.valueOf(chatOptions.getTopK())); @@ -93,7 +105,7 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA } if (usage.getTotalTokens() != null) { totalTokens = usage.getTotalTokens(); - Tags.GEN_AI_USAGE_TOTAL_TOKENS.set(span, String.valueOf(totalTokens)); + Tags.GEN_AI_CLIENT_TOKEN_USAGE.set(span, String.valueOf(totalTokens)); } } } @@ -138,7 +150,7 @@ private void collectContent(AbstractSpan span, Object[] allArguments, Generation private void collectPrompt(AbstractSpan span, Object[] allArguments) { ChatClientRequest request = (ChatClientRequest) allArguments[0]; - if (request == null || request.prompt() == null) { + if (request == null) { return; } 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/DefaultChatClientStreamInterceptor.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 similarity index 85% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/DefaultChatClientStreamInterceptor.java rename to 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 053e55c213..2858f75fa1 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/DefaultChatClientStreamInterceptor.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 @@ -19,16 +19,17 @@ package org.apache.skywalking.apm.plugin.spring.ai.v1; import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.ContextSnapshot; import org.apache.skywalking.apm.agent.core.context.tag.Tags; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; +import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; import org.apache.skywalking.apm.plugin.spring.ai.v1.config.SpringAiPluginConfig; import org.apache.skywalking.apm.plugin.spring.ai.v1.contant.Constants; -import org.springframework.ai.chat.client.ChatClientRequest; -import org.springframework.ai.chat.client.ChatClientResponse; import org.springframework.ai.chat.metadata.ChatResponseMetadata; import org.springframework.ai.chat.metadata.Usage; import org.springframework.ai.chat.model.ChatResponse; @@ -42,23 +43,31 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; -public class DefaultChatClientStreamInterceptor implements InstanceMethodsAroundInterceptor { +public class ChatModelStreamInterceptor implements InstanceMethodsAroundInterceptor { @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/stream"); + AbstractSpan span = ContextManager.createExitSpan("Spring-ai/client/stream", null); + ChatModelMetadataResolver.ApiMetadata apiMetadata = ChatModelMetadataResolver.getMetadata(objInst); + if (apiMetadata != null) { + span.setPeer(apiMetadata.getPeer()); + Tags.GEN_AI_PROVIDER_NAME.set(span, apiMetadata.getProviderName()); + } + span.setComponent(ComponentsDefine.SPRING_AI); - ChatClientRequest request = (ChatClientRequest) allArguments[0]; - if (request == null) { + SpanLayer.asGenAI(span); + + Prompt prompt = (Prompt) allArguments[0]; + if (prompt == null) { return; } - Prompt prompt = request.prompt(); ChatOptions chatOptions = prompt.getOptions(); if (chatOptions == null) { return; } + Tags.GEN_AI_OPERATION_NAME.set(span, Constants.CHAT); Tags.GEN_AI_REQUEST_MODEL.set(span, chatOptions.getModel()); Tags.GEN_AI_TEMPERATURE.set(span, String.valueOf(chatOptions.getTemperature())); Tags.GEN_AI_TOP_K.set(span, String.valueOf(chatOptions.getTopK())); @@ -73,11 +82,12 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA return ret; } AbstractSpan span = ContextManager.activeSpan(); - span.prepareForAsync(); + ContextSnapshot contextSnapshot = ContextManager.capture(); + span.prepareForAsync(); ContextManager.stopSpan(); - Flux flux = (Flux) ret; + Flux flux = (Flux) ret; AtomicReference lastResponseRef = new AtomicReference<>(); @@ -91,12 +101,11 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA ContextManager.getRuntimeContext().remove(Constants.SPRING_AI_STREAM_START_TIME); return flux.doOnNext(response -> { - if (response.chatResponse() != null) { + if (response != null) { - ChatResponse chatResponse = response.chatResponse(); - lastResponseRef.set(chatResponse); + lastResponseRef.set(response); - Generation generation = chatResponse.getResult(); + Generation generation = response.getResult(); if (generation == null) { return; } @@ -138,7 +147,7 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA Tags.GEN_AI_USAGE_INPUT_TOKENS.set(span, String.valueOf(usage.getPromptTokens())); Tags.GEN_AI_USAGE_OUTPUT_TOKENS.set(span, String.valueOf(usage.getCompletionTokens())); totalTokens = usage.getTotalTokens() != null ? usage.getTotalTokens() : 0; - Tags.GEN_AI_USAGE_TOTAL_TOKENS.set(span, String.valueOf(usage.getTotalTokens().longValue())); + Tags.GEN_AI_CLIENT_TOKEN_USAGE.set(span, String.valueOf(usage.getTotalTokens().longValue())); } Tags.GEN_AI_RESPONSE_FINISH_REASONS.set(span, finishReason.get()); @@ -147,8 +156,7 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA if (tokenThreshold < 0 || totalTokens >= tokenThreshold) { if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_PROMPT) { - ChatClientRequest request = (ChatClientRequest) allArguments[0]; - Prompt prompt = request.prompt(); + Prompt prompt = (Prompt) allArguments[0]; String promptText = prompt.getContents(); if (promptText != null) { int limit = SpringAiPluginConfig.Plugin.SpringAi.PROMPT_LENGTH_LIMIT; @@ -175,7 +183,7 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA } finally { span.asyncFinish(); } - }); + }).contextWrite(c -> c.put(Constants.SKYWALKING_CONTEXT_SNAPSHOT, contextSnapshot)); } @Override 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/DefaultToolCallingManagerInterceptor.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/DefaultToolCallingManagerInterceptor.java new file mode 100644 index 0000000000..fdf411e9ef --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/DefaultToolCallingManagerInterceptor.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1; + +import org.apache.skywalking.apm.agent.core.context.ContextManager; +import org.apache.skywalking.apm.agent.core.context.ContextSnapshot; +import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; +import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; +import org.apache.skywalking.apm.plugin.spring.ai.v1.contant.Constants; +import org.springframework.ai.model.tool.internal.ToolCallReactiveContextHolder; +import reactor.util.context.ContextView; + +import java.lang.reflect.Method; + +public class DefaultToolCallingManagerInterceptor implements InstanceMethodsAroundInterceptor { + + @Override + public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { + AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/client/executeTool"); + span.setComponent(ComponentsDefine.SPRING_AI); + + ContextView reactorCtx = ToolCallReactiveContextHolder.getContext(); + + if (reactorCtx != null && reactorCtx.hasKey(Constants.SKYWALKING_CONTEXT_SNAPSHOT)) { + ContextSnapshot snapshot = reactorCtx.get(Constants.SKYWALKING_CONTEXT_SNAPSHOT); + ContextManager.continued(snapshot); + } + } + + @Override + public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Object ret) throws Throwable { + if (ContextManager.isActive()) { + ContextManager.stopSpan(); + } + return ret; + } + + @Override + public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, Throwable t) { + if (ContextManager.isActive()) { + ContextManager.activeSpan().log(t); + } + } +} 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/ToolCallbackCallInterceptor.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/ToolCallbackCallInterceptor.java index 0b2afe8014..30835c1148 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/ToolCallbackCallInterceptor.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/ToolCallbackCallInterceptor.java @@ -21,6 +21,7 @@ import org.apache.skywalking.apm.agent.core.context.ContextManager; import org.apache.skywalking.apm.agent.core.context.tag.Tags; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; +import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; @@ -43,12 +44,13 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/tool/" + toolName); span.setComponent(ComponentsDefine.SPRING_AI); + SpanLayer.asGenAI(span); Tags.GEN_AI_TOOL_NAME.set(span, toolName); if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_TOOL_INPUT) { String toolInput = (String) allArguments[0]; - Tags.GEN_AI_TOOL_INPUT.set(span, toolInput); + Tags.GEN_AI_TOOL_CALL_ARGUMENTS.set(span, toolInput); } } @@ -58,7 +60,7 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA if (ContextManager.isActive()) { AbstractSpan span = ContextManager.activeSpan(); if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_TOOL_OUTPUT && ret != null) { - Tags.GEN_AI_TOOL_OUTPUT.set(span, (String) ret); + Tags.GEN_AI_TOOL_CALL_RESULT.set(span, (String) ret); } ContextManager.stopSpan(); 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/common/ChatModelMetadataResolver.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/common/ChatModelMetadataResolver.java new file mode 100644 index 0000000000..e7ca118387 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/common/ChatModelMetadataResolver.java @@ -0,0 +1,146 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.common; + +import org.apache.skywalking.apm.agent.core.logging.api.ILog; +import org.apache.skywalking.apm.agent.core.logging.api.LogManager; +import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; + +import java.util.HashMap; +import java.util.Map; + +public class ChatModelMetadataResolver { + + private static final ILog LOGGER = LogManager.getLogger(ChatModelMetadataResolver.class); + + private static final Map MODEL_METADATA_MAP = new HashMap<>(); + + static { + MODEL_METADATA_MAP.put( + AiProviderEnum.ANTHROPIC_CLAUDE.getModelClassName(), + new ApiMetadata(AiProviderEnum.ANTHROPIC_CLAUDE.getValue())); + + MODEL_METADATA_MAP.put( + AiProviderEnum.OPENAI.getModelClassName(), + new ApiMetadata(AiProviderEnum.OPENAI.getValue())); + + MODEL_METADATA_MAP.put( + AiProviderEnum.AZURE_OPENAI.getModelClassName(), + new ApiMetadata(AiProviderEnum.AZURE_OPENAI.getValue())); + + MODEL_METADATA_MAP.put( + AiProviderEnum.OPENAI_SDK_OFFICIAL.getModelClassName(), + new ApiMetadata(AiProviderEnum.OPENAI_SDK_OFFICIAL.getValue())); + + MODEL_METADATA_MAP.put( + AiProviderEnum.AMAZON_BEDROCK_CONVERSE.getModelClassName(), + new ApiMetadata(AiProviderEnum.AMAZON_BEDROCK_CONVERSE.getValue())); + + MODEL_METADATA_MAP.put( + AiProviderEnum.GOOGLE_VERTEXAI_GEMINI.getModelClassName(), + new ApiMetadata(AiProviderEnum.GOOGLE_VERTEXAI_GEMINI.getValue())); + + MODEL_METADATA_MAP.put( + AiProviderEnum.GOOGLE_GENAI.getModelClassName(), + new ApiMetadata(AiProviderEnum.GOOGLE_GENAI.getValue())); + + MODEL_METADATA_MAP.put( + AiProviderEnum.DEEPSEEK_OPENAI_PROXY.getModelClassName(), + new ApiMetadata(AiProviderEnum.DEEPSEEK_OPENAI_PROXY.getValue())); + + MODEL_METADATA_MAP.put( + AiProviderEnum.HUGGINGFACE.getModelClassName(), + new ApiMetadata(AiProviderEnum.HUGGINGFACE.getValue())); + + MODEL_METADATA_MAP.put( + AiProviderEnum.MINIMAX.getModelClassName(), + new ApiMetadata(AiProviderEnum.MINIMAX.getValue())); + + MODEL_METADATA_MAP.put( + AiProviderEnum.MISTRAL_AI.getModelClassName(), + new ApiMetadata(AiProviderEnum.MISTRAL_AI.getValue())); + + MODEL_METADATA_MAP.put( + AiProviderEnum.OCI_GENAI_COHERE.getModelClassName(), + new ApiMetadata(AiProviderEnum.OCI_GENAI_COHERE.getValue())); + + MODEL_METADATA_MAP.put( + AiProviderEnum.OLLAMA.getModelClassName(), + new ApiMetadata(AiProviderEnum.OLLAMA.getValue())); + + MODEL_METADATA_MAP.put( + AiProviderEnum.ZHIPU_AI.getModelClassName(), + new ApiMetadata(AiProviderEnum.ZHIPU_AI.getValue())); + + } + + public static ApiMetadata getMetadata(Object chatModelInstance) { + try { + ApiMetadata metadata = MODEL_METADATA_MAP.get(chatModelInstance.getClass().getName()); + if (metadata == null) { + return null; + } + + return metadata; + } catch (Exception e) { + LOGGER.error("spring-ai plugin get modelMetadata error: ", e); + return null; + } + } + + public static class ApiMetadata { + + private final String providerName; + private volatile String baseUrl; + private volatile String completionsPath; + + ApiMetadata(String providerName) { + this.providerName = providerName; + } + + public String getProviderName() { + return providerName; + } + + public String getBaseUrl() { + return baseUrl; + } + + public void setBaseUrl(String baseUrl) { + this.baseUrl = baseUrl; + } + + public String getCompletionsPath() { + return completionsPath; + } + + public void setCompletionsPath(String completionsPath) { + this.completionsPath = completionsPath; + } + + public String getPeer() { + if (baseUrl != null && !baseUrl.isEmpty()) { + return completionsPath != null && !completionsPath.isEmpty() + ? baseUrl + completionsPath + : baseUrl; + } + return providerName; + } + } +} 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/contant/Constants.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/contant/Constants.java index ca23ff6eb2..7191e79dec 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/contant/Constants.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/contant/Constants.java @@ -20,4 +20,10 @@ public class Constants { public static final String SPRING_AI_STREAM_START_TIME = "Spring-ai.stream.startTime"; + + public static final String SKYWALKING_CONTEXT_SNAPSHOT = "SKYWALKING_CONTEXT_SNAPSHOT"; + + public static final String CHAT = "chat"; + + public static final String EXECUTE_TOOL = "execute_tool"; } 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/define/DefaultChatClientCallInstrumentation.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/define/DefaultToolCallingManagerInstrumentation.java similarity index 86% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/DefaultChatClientCallInstrumentation.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/DefaultToolCallingManagerInstrumentation.java index 450fb4ed0d..595472834f 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/define/DefaultChatClientCallInstrumentation.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/define/DefaultToolCallingManagerInstrumentation.java @@ -30,13 +30,13 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; -public class DefaultChatClientCallInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { +public class DefaultToolCallingManagerInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - private static final String ENHANCE_CLASS = "org.springframework.ai.chat.client.DefaultChatClient$DefaultCallResponseSpec"; + private static final String ENHANCE_CLASS = "org.springframework.ai.model.tool.DefaultToolCallingManager"; - private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.DefaultChatClientCallInterceptor"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.DefaultToolCallingManagerInterceptor"; - private static final String INTERCEPT_METHOD = "doGetObservableChatClientResponse"; + private static final String INTERCEPT_METHOD = "executeToolCall"; @Override protected ClassMatch enhanceClass() { @@ -54,7 +54,7 @@ public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { new InstanceMethodsInterceptPoint() { @Override public ElementMatcher getMethodsMatcher() { - return named(INTERCEPT_METHOD).and(takesArguments(2)).and(takesArgumentWithType(0, "org.springframework.ai.chat.client.ChatClientRequest")); + return named(INTERCEPT_METHOD).and(takesArguments(3)).and(takesArgumentWithType(0, "org.springframework.ai.chat.prompt.Prompt")); } @Override 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/define/DefaultChatClientStreamInstrumentation.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/define/provider/AnthropicApiInstrumentation.java similarity index 67% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/DefaultChatClientStreamInstrumentation.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/AnthropicApiInstrumentation.java index b5fb5d3564..0ae41f18f4 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/define/DefaultChatClientStreamInstrumentation.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/define/provider/AnthropicApiInstrumentation.java @@ -16,7 +16,7 @@ * */ -package org.apache.skywalking.apm.plugin.spring.ai.v1.define; +package org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -27,16 +27,13 @@ import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; -public class DefaultChatClientStreamInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { +public class AnthropicApiInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - private static final String ENHANCE_CLASS = "org.springframework.ai.chat.client.DefaultChatClient$DefaultStreamResponseSpec"; - - private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.DefaultChatClientStreamInterceptor"; - - private static final String INTERCEPT_METHOD = "doGetObservableFluxChatResponse"; + private static final String ENHANCE_CLASS = "org.springframework.ai.anthropic.api.AnthropicApi"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.AnthropicApiConstructorInterceptor"; @Override protected ClassMatch enhanceClass() { @@ -45,28 +42,23 @@ protected ClassMatch enhanceClass() { @Override public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[0]; - } - - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[]{ - new InstanceMethodsInterceptPoint() { + return new ConstructorInterceptPoint[]{ + new ConstructorInterceptPoint() { @Override - public ElementMatcher getMethodsMatcher() { - return named(INTERCEPT_METHOD).and(takesArguments(1)).and(takesArgumentWithType(0, "org.springframework.ai.chat.client.ChatClientRequest")); + public ElementMatcher getConstructorMatcher() { + return takesArguments(8).and(takesArgument(0, named("java.lang.String"))).and(takesArgument(1, named("java.lang.String"))); } @Override - public String getMethodsInterceptor() { + public String getConstructorInterceptor() { return INTERCEPTOR_CLASS; } - - @Override - public boolean isOverrideArgs() { - return false; - } } }; } + + @Override + public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[0]; + } } 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/define/provider/OpenAIApiInstrumentation.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/define/provider/OpenAIApiInstrumentation.java new file mode 100644 index 0000000000..84c71b82b9 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/OpenAIApiInstrumentation.java @@ -0,0 +1,63 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; +import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +public class OpenAIApiInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_CLASS = "org.springframework.ai.openai.api.OpenAiApi"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.OpenAIApiConstructorInterceptor"; + + @Override + protected ClassMatch enhanceClass() { + return NameMatch.byName(ENHANCE_CLASS); + } + + @Override + public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[]{ + new ConstructorInterceptPoint() { + @Override + public ElementMatcher getConstructorMatcher() { + return takesArgument(0, named("java.lang.String")).and(takesArgument(3, named("java.lang.String"))); + } + + @Override + public String getConstructorInterceptor() { + return INTERCEPTOR_CLASS; + } + } + }; + } + + @Override + public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[0]; + } +} 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/enums/AiProviderEnum.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/enums/AiProviderEnum.java new file mode 100644 index 0000000000..4e139486c8 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/enums/AiProviderEnum.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.enums; + +public enum AiProviderEnum { + + UNKNOW("unknow", null), + + ANTHROPIC_CLAUDE("anthropic", "org.springframework.ai.anthropic.AnthropicChatModel"), + + AMAZON_BEDROCK_CONVERSE("aws.bedrock", "org.springframework.ai.bedrock.converse.BedrockProxyChatModel"), + + AZURE_OPENAI("azure.openai", "org.springframework.ai.azure.openai.AzureOpenAiChatModel"), + + OCI_GENAI_COHERE("cohere", "org.springframework.ai.oci.cohere.OCICohereChatModel"), + + DEEPSEEK_OPENAI_PROXY("deepseek", "org.springframework.ai.deepseek.DeepSeekChatModel"), + + GOOGLE_GENAI("gcp.gen_ai", "org.springframework.ai.google.genai.GoogleGenAiChatModel"), + + GOOGLE_VERTEXAI_GEMINI("gcp.vertex_ai", "org.springframework.ai.vertexai.gemini.VertexAiGeminiChatModel"), + + MISTRAL_AI("mistral_ai", "org.springframework.ai.mistralai.MistralAiChatModel"), + + OPENAI("openai", "org.springframework.ai.openai.OpenAiChatModel"), + + HUGGINGFACE("huggingface", "org.springframework.ai.huggingface.HuggingfaceChatModel"), + + MINIMAX("minimax", "org.springframework.ai.minimax.MiniMaxChatModel"), + + OLLAMA("ollama", "org.springframework.ai.ollama.OllamaChatModel"), + + OPENAI_SDK_OFFICIAL("openai", "org.springframework.ai.openaisdk.OpenAiSdkChatModel"), + + ZHIPU_AI("zhipu_ai", "org.springframework.ai.zhipuai.ZhiPuAiChatModel"); + + private final String value; + private final String modelClassName; + + AiProviderEnum(String value, String modelClassName) { + this.value = value; + this.modelClassName = modelClassName; + } + + public String getValue() { + return value; + } + + public String getModelClassName() { + return modelClassName; + } +} 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/provider/AnthropicApiInterceptor.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/provider/AnthropicApiInterceptor.java new file mode 100644 index 0000000000..49d9e2b708 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/AnthropicApiInterceptor.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.provider; + +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; +import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; +import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; + +public class AnthropicApiInterceptor implements InstanceConstructorInterceptor { + + @Override + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { + ChatModelMetadataResolver.ApiMetadata metadata = ChatModelMetadataResolver.getMetadata(AiProviderEnum.ANTHROPIC_CLAUDE.getModelClassName()); + if (metadata == null) { + return; + } + + String baseUrl = (String) allArguments[0]; + String completionsPath = (String) allArguments[1]; + + metadata.setBaseUrl(baseUrl); + metadata.setCompletionsPath(completionsPath); + } +} 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/provider/OpenAiApiInterceptor.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/provider/OpenAiApiInterceptor.java new file mode 100644 index 0000000000..42e7932055 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/OpenAiApiInterceptor.java @@ -0,0 +1,41 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.provider; + +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; +import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; +import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; + +public class OpenAiApiInterceptor implements InstanceConstructorInterceptor { + + @Override + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { + ChatModelMetadataResolver.ApiMetadata metadata = ChatModelMetadataResolver.getMetadata(AiProviderEnum.OPENAI.getModelClassName()); + if (metadata == null) { + return; + } + + String baseUrl = (String) allArguments[0]; + String completionsPath = (String) allArguments[3]; + + metadata.setBaseUrl(baseUrl); + metadata.setCompletionsPath(completionsPath); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def index 960e977592..462c07ad68 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -14,7 +14,8 @@ # See the License for the specific language governing permissions and # limitations under the License. -spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.DefaultChatClientCallInstrumentation -spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.DefaultChatClientStreamInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.ChatModelInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.ToolCallbackInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.VectorStoreRetrieverInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.DefaultToolCallingManagerInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.OpenAIApiInstrumentation diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh b/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh index 8a1c2e0480..c4075db94b 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh @@ -18,4 +18,4 @@ home="$(cd "$(dirname $0)"; pwd)" -java -Dskywalking.plugin.springai.collect_prompt=true -Dskywalking.plugin.springai.collect_completion=true -Dskywalking.plugin.springai.collect_tool_input=true -Dskywalking.plugin.springai.collect_tool_output=true -jar ${agent_opts} ${home}/../libs/spring-ai-1.x-scenario.jar & \ No newline at end of file +java -jar ${agent_opts} ${home}/../libs/spring-ai-1.x-scenario.jar & \ No newline at end of file diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml index 540bb0a541..94052d033c 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml @@ -50,9 +50,13 @@ spring-ai-client-chat + + + + org.springframework.ai - spring-ai-starter-model-openai + spring-ai-starter-model-anthropic diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java index 79fde137ab..30bb61c8bb 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java @@ -17,8 +17,8 @@ package test.apache.skywalking.apm.testcase.jdk.httpclient.config; +import org.springframework.ai.anthropic.AnthropicChatModel; import org.springframework.ai.chat.client.ChatClient; -import org.springframework.ai.openai.OpenAiChatModel; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -26,7 +26,7 @@ public class ChatClientConfig { @Bean - public ChatClient openAIChatClient(OpenAiChatModel model) { + public ChatClient openAIChatClient(AnthropicChatModel model) { return ChatClient.create(model); } } diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java index e8a69d0ded..441b07d075 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java @@ -39,12 +39,38 @@ public String healthCheck() { @GetMapping("/spring-ai-1.x-scenario-case") public String testCase() throws Exception { + + String systemPrompt = """ + You are a professional technical assistant. + Strictly use the provided context to answer questions. + If the information is not in the context, say: "I'm sorry, I don't have that information in my knowledge base." + Do not use outside knowledge. Be concise. + """; + chatClient .prompt("What's the weather in New York?") + .system(systemPrompt) .tools(weatherTool) .call() .content(); + chatClient + .prompt("What's the weather in New York?") + .system(systemPrompt) + .tools(weatherTool) + .stream() + .content() + .doOnNext(System.out::println) + .blockLast(); + +// chatClient +// .prompt("What is Spring AI?") +// .system(systemPrompt) +// .stream() +// .content() +// .doOnNext(System.out::println) +// .blockLast(); + return "success"; } } From 31d92b345c7bd82e22c58d44b77527362b6177d2 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Thu, 12 Feb 2026 22:32:51 +0800 Subject: [PATCH 17/48] fix --- .../v1/define/ChatModelInstrumentation.java | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/ChatModelInstrumentation.java 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/define/ChatModelInstrumentation.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/define/ChatModelInstrumentation.java new file mode 100644 index 0000000000..6d5a3a1c33 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/ChatModelInstrumentation.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.define; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; +import org.apache.skywalking.apm.agent.core.plugin.match.HierarchyMatch; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; +import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; + +public class ChatModelInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_CLASS = "org.springframework.ai.chat.model.ChatModel"; + + private static final String INTERCEPT_CALL_METHOD = "call"; + + private static final String INTERCEPT_STREAM_METHOD = "stream"; + + private static final String INTERCEPTOR_CALL_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.ChatModelCallInterceptor"; + + private static final String INTERCEPTOR_STREAM_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.ChatModelStreamInterceptor"; + + @Override + protected ClassMatch enhanceClass() { + return HierarchyMatch.byHierarchyMatch(ENHANCE_CLASS); + } + + @Override + public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[0]; + } + + @Override + public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[]{ + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named(INTERCEPT_CALL_METHOD).and(takesArguments(1)).and(takesArgumentWithType(0, "org.springframework.ai.chat.prompt.Prompt")); + } + + @Override + public String getMethodsInterceptor() { + return INTERCEPTOR_CALL_CLASS; + } + + @Override + public boolean isOverrideArgs() { + return false; + } + }, + new InstanceMethodsInterceptPoint() { + @Override + public ElementMatcher getMethodsMatcher() { + return named(INTERCEPT_STREAM_METHOD).and(takesArguments(1)).and(takesArgumentWithType(0, "org.springframework.ai.chat.prompt.Prompt")); + } + + @Override + public String getMethodsInterceptor() { + return INTERCEPTOR_STREAM_CLASS; + } + + @Override + public boolean isOverrideArgs() { + return false; + } + } + }; + } +} From ac028a8f309101d679a0ccb6cd55b3becd8af5ea Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Sat, 14 Feb 2026 15:13:38 +0800 Subject: [PATCH 18/48] fix --- .../ai/v1/ChatModelCallInterceptor.java | 3 +- .../v1/common/ChatModelMetadataResolver.java | 73 +++++-------------- .../spring/ai/v1/contant/Constants.java | 2 + .../v1/define/ChatModelInstrumentation.java | 2 +- .../provider/DeepSeekApiInstrumentation.java | 64 ++++++++++++++++ .../HuggingfaceChatModelInstrumentation.java | 64 ++++++++++++++++ .../provider/MiniMaxApiInstrumentation.java | 64 ++++++++++++++++ .../provider/MistralAiApiInstrumentation.java | 64 ++++++++++++++++ ...ion.java => OpenAiApiInstrumentation.java} | 7 +- .../spring/ai/v1/enums/AiProviderEnum.java | 2 +- .../v1/provider/AnthropicApiInterceptor.java | 7 +- .../v1/provider/DeepSeekApiInterceptor.java | 38 ++++++++++ .../HuggingfaceChatModelInterceptor.java | 37 ++++++++++ .../ai/v1/provider/MiniMaxApiInterceptor.java | 37 ++++++++++ .../v1/provider/MistralAiApiInterceptor.java | 40 ++++++++++ .../ai/v1/provider/OpenAiApiInterceptor.java | 7 +- .../src/main/resources/skywalking-plugin.def | 8 +- .../scenarios/spring-ai-1.x-scenario/pom.xml | 10 +-- .../httpclient/config/ChatClientConfig.java | 9 ++- .../httpclient/controller/CaseController.java | 20 ++--- 20 files changed, 468 insertions(+), 90 deletions(-) create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/DeepSeekApiInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/HuggingfaceChatModelInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/MiniMaxApiInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/MistralAiApiInstrumentation.java rename apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/{OpenAIApiInstrumentation.java => OpenAiApiInstrumentation.java} (87%) create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/DeepSeekApiInterceptor.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/HuggingfaceChatModelInterceptor.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/MiniMaxApiInterceptor.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/MistralAiApiInterceptor.java 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/ChatModelCallInterceptor.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/ChatModelCallInterceptor.java index a5dd00f604..1c853d6c5e 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/ChatModelCallInterceptor.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/ChatModelCallInterceptor.java @@ -46,6 +46,7 @@ public class ChatModelCallInterceptor implements InstanceMethodsAroundIntercepto @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { AbstractSpan span = ContextManager.createExitSpan("Spring-ai/client/call", null); + SpanLayer.asGenAI(span); ChatModelMetadataResolver.ApiMetadata apiMetadata = ChatModelMetadataResolver.getMetadata(objInst); if (apiMetadata != null) { span.setPeer(apiMetadata.getPeer()); @@ -61,7 +62,6 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr } span.setComponent(ComponentsDefine.SPRING_AI); - SpanLayer.asGenAI(span); Tags.GEN_AI_OPERATION_NAME.set(span, Constants.CHAT); Tags.GEN_AI_REQUEST_MODEL.set(span, chatOptions.getModel()); Tags.GEN_AI_TEMPERATURE.set(span, String.valueOf(chatOptions.getTemperature())); @@ -163,6 +163,7 @@ private void collectPrompt(AbstractSpan span, Object[] allArguments) { if (limit > 0 && promptText.length() > limit) { promptText = promptText.substring(0, limit); } + Tags.GEN_AI_PROMPT.set(span, promptText); } 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/common/ChatModelMetadataResolver.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/common/ChatModelMetadataResolver.java index e7ca118387..0eac0a6157 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/common/ChatModelMetadataResolver.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/common/ChatModelMetadataResolver.java @@ -32,67 +32,28 @@ public class ChatModelMetadataResolver { private static final Map MODEL_METADATA_MAP = new HashMap<>(); static { - MODEL_METADATA_MAP.put( - AiProviderEnum.ANTHROPIC_CLAUDE.getModelClassName(), - new ApiMetadata(AiProviderEnum.ANTHROPIC_CLAUDE.getValue())); - - MODEL_METADATA_MAP.put( - AiProviderEnum.OPENAI.getModelClassName(), - new ApiMetadata(AiProviderEnum.OPENAI.getValue())); - - MODEL_METADATA_MAP.put( - AiProviderEnum.AZURE_OPENAI.getModelClassName(), - new ApiMetadata(AiProviderEnum.AZURE_OPENAI.getValue())); - - MODEL_METADATA_MAP.put( - AiProviderEnum.OPENAI_SDK_OFFICIAL.getModelClassName(), - new ApiMetadata(AiProviderEnum.OPENAI_SDK_OFFICIAL.getValue())); - - MODEL_METADATA_MAP.put( - AiProviderEnum.AMAZON_BEDROCK_CONVERSE.getModelClassName(), - new ApiMetadata(AiProviderEnum.AMAZON_BEDROCK_CONVERSE.getValue())); - - MODEL_METADATA_MAP.put( - AiProviderEnum.GOOGLE_VERTEXAI_GEMINI.getModelClassName(), - new ApiMetadata(AiProviderEnum.GOOGLE_VERTEXAI_GEMINI.getValue())); - - MODEL_METADATA_MAP.put( - AiProviderEnum.GOOGLE_GENAI.getModelClassName(), - new ApiMetadata(AiProviderEnum.GOOGLE_GENAI.getValue())); - - MODEL_METADATA_MAP.put( - AiProviderEnum.DEEPSEEK_OPENAI_PROXY.getModelClassName(), - new ApiMetadata(AiProviderEnum.DEEPSEEK_OPENAI_PROXY.getValue())); - - MODEL_METADATA_MAP.put( - AiProviderEnum.HUGGINGFACE.getModelClassName(), - new ApiMetadata(AiProviderEnum.HUGGINGFACE.getValue())); - - MODEL_METADATA_MAP.put( - AiProviderEnum.MINIMAX.getModelClassName(), - new ApiMetadata(AiProviderEnum.MINIMAX.getValue())); - - MODEL_METADATA_MAP.put( - AiProviderEnum.MISTRAL_AI.getModelClassName(), - new ApiMetadata(AiProviderEnum.MISTRAL_AI.getValue())); - - MODEL_METADATA_MAP.put( - AiProviderEnum.OCI_GENAI_COHERE.getModelClassName(), - new ApiMetadata(AiProviderEnum.OCI_GENAI_COHERE.getValue())); - - MODEL_METADATA_MAP.put( - AiProviderEnum.OLLAMA.getModelClassName(), - new ApiMetadata(AiProviderEnum.OLLAMA.getValue())); + for (AiProviderEnum provider : AiProviderEnum.values()) { + if (provider.getModelClassName() != null && provider.getValue() != null) { + MODEL_METADATA_MAP.put( + provider.getModelClassName(), + new ApiMetadata(provider.getValue()) + ); + } + } + } - MODEL_METADATA_MAP.put( - AiProviderEnum.ZHIPU_AI.getModelClassName(), - new ApiMetadata(AiProviderEnum.ZHIPU_AI.getValue())); + public static ApiMetadata getMetadata(Object chatModelInstance) { + ApiMetadata metadata = MODEL_METADATA_MAP.get(chatModelInstance.getClass().getName()); + if (metadata == null) { + return null; + } + return metadata; } - public static ApiMetadata getMetadata(Object chatModelInstance) { + public static ApiMetadata getMetadata(String modelClassName) { try { - ApiMetadata metadata = MODEL_METADATA_MAP.get(chatModelInstance.getClass().getName()); + ApiMetadata metadata = MODEL_METADATA_MAP.get(modelClassName); if (metadata == null) { return null; } 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/contant/Constants.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/contant/Constants.java index 7191e79dec..7348a0c11f 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/contant/Constants.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/contant/Constants.java @@ -26,4 +26,6 @@ public class Constants { public static final String CHAT = "chat"; public static final String EXECUTE_TOOL = "execute_tool"; + + public static final String DEFAULT_COMPLETIONS_PATH = "/v1/chat/completions"; } 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/define/ChatModelInstrumentation.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/define/ChatModelInstrumentation.java index 6d5a3a1c33..d084f6a814 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/define/ChatModelInstrumentation.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/define/ChatModelInstrumentation.java @@ -58,7 +58,7 @@ public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { new InstanceMethodsInterceptPoint() { @Override public ElementMatcher getMethodsMatcher() { - return named(INTERCEPT_CALL_METHOD).and(takesArguments(1)).and(takesArgumentWithType(0, "org.springframework.ai.chat.prompt.Prompt")); + return named(INTERCEPT_CALL_METHOD); } @Override 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/define/provider/DeepSeekApiInstrumentation.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/define/provider/DeepSeekApiInstrumentation.java new file mode 100644 index 0000000000..07bb11e348 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/DeepSeekApiInstrumentation.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; +import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +public class DeepSeekApiInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_CLASS = "org.springframework.ai.deepseek.api.DeepSeekApi"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.DeepSeekApiInterceptor"; + + @Override + protected ClassMatch enhanceClass() { + return NameMatch.byName(ENHANCE_CLASS); + } + + @Override + public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[]{ + new ConstructorInterceptPoint() { + @Override + public ElementMatcher getConstructorMatcher() { + return takesArguments(8).and(takesArgument(0, named("java.lang.String"))).and(takesArgument(3, named("java.lang.String"))); + } + + @Override + public String getConstructorInterceptor() { + return INTERCEPTOR_CLASS; + } + } + }; + } + + @Override + public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[0]; + } +} 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/define/provider/HuggingfaceChatModelInstrumentation.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/define/provider/HuggingfaceChatModelInstrumentation.java new file mode 100644 index 0000000000..0ae105473f --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/HuggingfaceChatModelInstrumentation.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; +import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +public class HuggingfaceChatModelInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_CLASS = "org.springframework.ai.huggingface.HuggingfaceChatModel"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.HuggingfaceChatModelInterceptor"; + + @Override + protected ClassMatch enhanceClass() { + return NameMatch.byName(ENHANCE_CLASS); + } + + @Override + public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[]{ + new ConstructorInterceptPoint() { + @Override + public ElementMatcher getConstructorMatcher() { + return takesArguments(2).and(takesArgument(1, named("java.lang.String"))); + } + + @Override + public String getConstructorInterceptor() { + return INTERCEPTOR_CLASS; + } + } + }; + } + + @Override + public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[0]; + } +} 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/define/provider/MiniMaxApiInstrumentation.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/define/provider/MiniMaxApiInstrumentation.java new file mode 100644 index 0000000000..108588aee9 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/MiniMaxApiInstrumentation.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; +import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +public class MiniMaxApiInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_CLASS = "org.springframework.ai.minimax.api.MiniMaxApi"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.provider.MiniMaxApiInterceptor"; + + @Override + protected ClassMatch enhanceClass() { + return NameMatch.byName(ENHANCE_CLASS); + } + + @Override + public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[]{ + new ConstructorInterceptPoint() { + @Override + public ElementMatcher getConstructorMatcher() { + return takesArguments(2).and(takesArgument(0, named("java.lang.String"))); + } + + @Override + public String getConstructorInterceptor() { + return INTERCEPTOR_CLASS; + } + } + }; + } + + @Override + public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[0]; + } +} 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/define/provider/MistralAiApiInstrumentation.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/define/provider/MistralAiApiInstrumentation.java new file mode 100644 index 0000000000..13ebe59826 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/MistralAiApiInstrumentation.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; +import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +public class MistralAiApiInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_CLASS = "org.springframework.ai.mistralai.api.MistralAiApi"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.provider.MistralAiApiInterceptor"; + + @Override + protected ClassMatch enhanceClass() { + return NameMatch.byName(ENHANCE_CLASS); + } + + @Override + public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[]{ + new ConstructorInterceptPoint() { + @Override + public ElementMatcher getConstructorMatcher() { + return takesArguments(5).and(takesArgument(0, named("java.lang.String"))); + } + + @Override + public String getConstructorInterceptor() { + return INTERCEPTOR_CLASS; + } + } + }; + } + + @Override + public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[0]; + } +} 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/define/provider/OpenAIApiInstrumentation.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/define/provider/OpenAiApiInstrumentation.java similarity index 87% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/OpenAIApiInstrumentation.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/OpenAiApiInstrumentation.java index 84c71b82b9..d96f5f805a 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/define/provider/OpenAIApiInstrumentation.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/define/provider/OpenAiApiInstrumentation.java @@ -28,11 +28,12 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -public class OpenAIApiInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { +public class OpenAiApiInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { private static final String ENHANCE_CLASS = "org.springframework.ai.openai.api.OpenAiApi"; - private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.OpenAIApiConstructorInterceptor"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.provider.OpenAiApiInterceptor"; @Override protected ClassMatch enhanceClass() { @@ -45,7 +46,7 @@ public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { new ConstructorInterceptPoint() { @Override public ElementMatcher getConstructorMatcher() { - return takesArgument(0, named("java.lang.String")).and(takesArgument(3, named("java.lang.String"))); + return takesArguments(8).and(takesArgument(0, named("java.lang.String"))).and(takesArgument(3, named("java.lang.String"))); } @Override 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/enums/AiProviderEnum.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/enums/AiProviderEnum.java index 4e139486c8..25a330d31a 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/enums/AiProviderEnum.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/enums/AiProviderEnum.java @@ -30,7 +30,7 @@ public enum AiProviderEnum { OCI_GENAI_COHERE("cohere", "org.springframework.ai.oci.cohere.OCICohereChatModel"), - DEEPSEEK_OPENAI_PROXY("deepseek", "org.springframework.ai.deepseek.DeepSeekChatModel"), + DEEPSEEK("deepseek", "org.springframework.ai.deepseek.DeepSeekChatModel"), GOOGLE_GENAI("gcp.gen_ai", "org.springframework.ai.google.genai.GoogleGenAiChatModel"), 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/provider/AnthropicApiInterceptor.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/provider/AnthropicApiInterceptor.java index 49d9e2b708..8bd9995fbd 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/provider/AnthropicApiInterceptor.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/provider/AnthropicApiInterceptor.java @@ -32,10 +32,7 @@ public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws return; } - String baseUrl = (String) allArguments[0]; - String completionsPath = (String) allArguments[1]; - - metadata.setBaseUrl(baseUrl); - metadata.setCompletionsPath(completionsPath); + metadata.setBaseUrl((String) allArguments[0]); + metadata.setCompletionsPath((String) allArguments[1]); } } 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/provider/DeepSeekApiInterceptor.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/provider/DeepSeekApiInterceptor.java new file mode 100644 index 0000000000..e2f9c1abfb --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/DeepSeekApiInterceptor.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.provider; + +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; +import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; +import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; + +public class DeepSeekApiInterceptor implements InstanceConstructorInterceptor { + + @Override + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { + ChatModelMetadataResolver.ApiMetadata metadata = ChatModelMetadataResolver.getMetadata(AiProviderEnum.DEEPSEEK.getModelClassName()); + if (metadata == null) { + return; + } + + metadata.setBaseUrl((String) allArguments[0]); + metadata.setCompletionsPath((String) allArguments[3]); + } +} 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/provider/HuggingfaceChatModelInterceptor.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/provider/HuggingfaceChatModelInterceptor.java new file mode 100644 index 0000000000..b2e8add4b4 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/HuggingfaceChatModelInterceptor.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.provider; + +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; +import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; +import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; + +public class HuggingfaceChatModelInterceptor implements InstanceConstructorInterceptor { + + @Override + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { + ChatModelMetadataResolver.ApiMetadata metadata = ChatModelMetadataResolver.getMetadata(AiProviderEnum.ANTHROPIC_CLAUDE.getModelClassName()); + if (metadata == null) { + return; + } + + metadata.setBaseUrl((String) allArguments[1]); + } +} 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/provider/MiniMaxApiInterceptor.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/provider/MiniMaxApiInterceptor.java new file mode 100644 index 0000000000..d2d722aa44 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/MiniMaxApiInterceptor.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.provider; + +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; +import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; +import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; + +public class MiniMaxApiInterceptor implements InstanceConstructorInterceptor { + + @Override + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { + ChatModelMetadataResolver.ApiMetadata metadata = ChatModelMetadataResolver.getMetadata(AiProviderEnum.ANTHROPIC_CLAUDE.getModelClassName()); + if (metadata == null) { + return; + } + + metadata.setBaseUrl((String) allArguments[0]); + } +} 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/provider/MistralAiApiInterceptor.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/provider/MistralAiApiInterceptor.java new file mode 100644 index 0000000000..d951060ff6 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/MistralAiApiInterceptor.java @@ -0,0 +1,40 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.provider; + +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; +import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; +import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; + +import static org.apache.skywalking.apm.plugin.spring.ai.v1.contant.Constants.DEFAULT_COMPLETIONS_PATH; + +public class MistralAiApiInterceptor implements InstanceConstructorInterceptor { + + @Override + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { + ChatModelMetadataResolver.ApiMetadata metadata = ChatModelMetadataResolver.getMetadata(AiProviderEnum.ANTHROPIC_CLAUDE.getModelClassName()); + if (metadata == null) { + return; + } + + metadata.setBaseUrl((String) allArguments[0]); + metadata.setCompletionsPath(DEFAULT_COMPLETIONS_PATH); + } +} 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/provider/OpenAiApiInterceptor.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/provider/OpenAiApiInterceptor.java index 42e7932055..9801f8aa0b 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/provider/OpenAiApiInterceptor.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/provider/OpenAiApiInterceptor.java @@ -32,10 +32,7 @@ public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws return; } - String baseUrl = (String) allArguments[0]; - String completionsPath = (String) allArguments[3]; - - metadata.setBaseUrl(baseUrl); - metadata.setCompletionsPath(completionsPath); + metadata.setBaseUrl((String) allArguments[0]); + metadata.setCompletionsPath((String) allArguments[3]); } } diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def index 462c07ad68..033ef952d3 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -18,4 +18,10 @@ spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.ChatModelInst spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.ToolCallbackInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.VectorStoreRetrieverInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.DefaultToolCallingManagerInstrumentation -spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.OpenAIApiInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.DefaultToolCallingManagerInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.AnthropicApiInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.DeepSeekApiInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.HuggingfaceChatModelInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.MiniMaxApiInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.MistralAiApiInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.OpenAiApiInstrumentation diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml index 94052d033c..6210a6adb1 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml @@ -50,14 +50,14 @@ spring-ai-client-chat - - - - org.springframework.ai - spring-ai-starter-model-anthropic + spring-ai-starter-model-openai + + + + org.springframework.ai diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java index 30bb61c8bb..bff8f01f9c 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java @@ -17,8 +17,8 @@ package test.apache.skywalking.apm.testcase.jdk.httpclient.config; -import org.springframework.ai.anthropic.AnthropicChatModel; import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.openai.OpenAiChatModel; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -26,7 +26,12 @@ public class ChatClientConfig { @Bean - public ChatClient openAIChatClient(AnthropicChatModel model) { + public ChatClient openAIChatClient(OpenAiChatModel model) { return ChatClient.create(model); } + +// @Bean +// public ChatClient anthropicChatClient(AnthropicChatModel model) { +// return ChatClient.create(model); +// } } diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java index 441b07d075..21f4cde3bb 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java @@ -47,21 +47,21 @@ public String testCase() throws Exception { Do not use outside knowledge. Be concise. """; - chatClient + System.out.println(chatClient .prompt("What's the weather in New York?") .system(systemPrompt) .tools(weatherTool) .call() - .content(); + .content()); - chatClient - .prompt("What's the weather in New York?") - .system(systemPrompt) - .tools(weatherTool) - .stream() - .content() - .doOnNext(System.out::println) - .blockLast(); +// chatClient +// .prompt("What's the weather in New York?") +// .system(systemPrompt) +// .tools(weatherTool) +// .stream() +// .content() +// .doOnNext(System.out::println) +// .blockLast(); // chatClient // .prompt("What is Spring AI?") From 332be222516270b32578758a8a4577b790b6979f Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Tue, 17 Feb 2026 16:35:53 +0800 Subject: [PATCH 19/48] fix --- .../ai/v1/ChatModelCallInterceptor.java | 21 +- .../ai/v1/ChatModelStreamInterceptor.java | 13 +- .../DefaultToolCallingManagerInterceptor.java | 2 +- .../ai/v1/ToolCallbackCallInterceptor.java | 4 +- .../provider/AnthropicApiInstrumentation.java | 2 +- .../provider/DeepSeekApiInstrumentation.java | 2 +- .../HuggingfaceChatModelInstrumentation.java | 2 +- .../provider/MiniMaxApiInstrumentation.java | 4 +- .../provider/MistralAiApiInstrumentation.java | 2 +- .../provider/OllamaApiInstrumentation.java | 64 +++++ .../provider/OpenAiApiInstrumentation.java | 2 +- ...> AnthropicApiConstructorInterceptor.java} | 2 +- ...=> DeepSeekApiConstructorInterceptor.java} | 2 +- ...gfaceChatModelConstructorInterceptor.java} | 4 +- .../MiniMaxApiConstructorInterceptor.java | 38 +++ ...> MistralAiApiConstructorInterceptor.java} | 4 +- ...a => OllamaApiConstructorInterceptor.java} | 5 +- ...a => OpenAiApiConstructorInterceptor.java} | 2 +- .../src/main/resources/skywalking-plugin.def | 1 + .../scenarios/spring-ai-1.x-scenario/pom.xml | 23 +- .../httpclient/config/ChatClientConfig.java | 15 +- .../httpclient/controller/CaseController.java | 24 +- .../controller/LLMMockController.java | 242 ++++++++++-------- 23 files changed, 319 insertions(+), 161 deletions(-) create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/OllamaApiInstrumentation.java rename apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/{AnthropicApiInterceptor.java => AnthropicApiConstructorInterceptor.java} (94%) rename apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/{DeepSeekApiInterceptor.java => DeepSeekApiConstructorInterceptor.java} (94%) rename apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/{HuggingfaceChatModelInterceptor.java => HuggingfaceChatModelConstructorInterceptor.java} (89%) create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/MiniMaxApiConstructorInterceptor.java rename apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/{MistralAiApiInterceptor.java => MistralAiApiConstructorInterceptor.java} (90%) rename apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/{MiniMaxApiInterceptor.java => OllamaApiConstructorInterceptor.java} (87%) rename apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/{OpenAiApiInterceptor.java => OpenAiApiConstructorInterceptor.java} (94%) 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/ChatModelCallInterceptor.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/ChatModelCallInterceptor.java index 1c853d6c5e..4702effeef 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/ChatModelCallInterceptor.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/ChatModelCallInterceptor.java @@ -45,15 +45,18 @@ public class ChatModelCallInterceptor implements InstanceMethodsAroundIntercepto @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - AbstractSpan span = ContextManager.createExitSpan("Spring-ai/client/call", null); - SpanLayer.asGenAI(span); ChatModelMetadataResolver.ApiMetadata apiMetadata = ChatModelMetadataResolver.getMetadata(objInst); + String providerName = AiProviderEnum.UNKNOW.getValue(); + String peer = null; + if (apiMetadata != null) { - span.setPeer(apiMetadata.getPeer()); - Tags.GEN_AI_PROVIDER_NAME.set(span, apiMetadata.getProviderName()); - } else { - Tags.GEN_AI_PROVIDER_NAME.set(span, AiProviderEnum.UNKNOW.getValue()); + if (apiMetadata.getProviderName() != null) { + providerName = apiMetadata.getProviderName(); + } + peer = apiMetadata.getPeer(); } + AbstractSpan span = ContextManager.createExitSpan("Spring-ai/" + providerName + "/call", peer); + SpanLayer.asGenAI(span); Prompt prompt = (Prompt) allArguments[0]; ChatOptions chatOptions = prompt.getOptions(); @@ -164,7 +167,9 @@ private void collectPrompt(AbstractSpan span, Object[] allArguments) { promptText = promptText.substring(0, limit); } - Tags.GEN_AI_PROMPT.set(span, promptText); + + + Tags.GEN_AI_INPUT_MESSAGES.set(span, promptText); } private void collectCompletion(AbstractSpan span, Generation generation) { @@ -181,6 +186,6 @@ private void collectCompletion(AbstractSpan span, Generation generation) { if (limit > 0 && completionText.length() > limit) { completionText = completionText.substring(0, limit); } - Tags.GEN_AI_COMPLETION.set(span, completionText); + Tags.GEN_AI_OUTPUT_MESSAGES.set(span, completionText); } } 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 2858f75fa1..dd8e748bba 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 @@ -30,6 +30,7 @@ import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; import org.apache.skywalking.apm.plugin.spring.ai.v1.config.SpringAiPluginConfig; import org.apache.skywalking.apm.plugin.spring.ai.v1.contant.Constants; +import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; import org.springframework.ai.chat.metadata.ChatResponseMetadata; import org.springframework.ai.chat.metadata.Usage; import org.springframework.ai.chat.model.ChatResponse; @@ -47,12 +48,18 @@ public class ChatModelStreamInterceptor implements InstanceMethodsAroundIntercep @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - AbstractSpan span = ContextManager.createExitSpan("Spring-ai/client/stream", null); ChatModelMetadataResolver.ApiMetadata apiMetadata = ChatModelMetadataResolver.getMetadata(objInst); + String providerName = AiProviderEnum.UNKNOW.getValue(); + String peer = null; + if (apiMetadata != null) { - span.setPeer(apiMetadata.getPeer()); - Tags.GEN_AI_PROVIDER_NAME.set(span, apiMetadata.getProviderName()); + if (apiMetadata.getProviderName() != null) { + providerName = apiMetadata.getProviderName(); + } + peer = apiMetadata.getPeer(); } + AbstractSpan span = ContextManager.createExitSpan("Spring-ai/" + providerName + "/stream", peer); + SpanLayer.asGenAI(span); span.setComponent(ComponentsDefine.SPRING_AI); SpanLayer.asGenAI(span); 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/DefaultToolCallingManagerInterceptor.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/DefaultToolCallingManagerInterceptor.java index fdf411e9ef..929fd9bbd8 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/DefaultToolCallingManagerInterceptor.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/DefaultToolCallingManagerInterceptor.java @@ -35,7 +35,7 @@ public class DefaultToolCallingManagerInterceptor implements InstanceMethodsArou @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { - AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/client/executeTool"); + AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/tool/call"); span.setComponent(ComponentsDefine.SPRING_AI); ContextView reactorCtx = ToolCallReactiveContextHolder.getContext(); 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/ToolCallbackCallInterceptor.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/ToolCallbackCallInterceptor.java index 30835c1148..abcafa4b55 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/ToolCallbackCallInterceptor.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/ToolCallbackCallInterceptor.java @@ -27,6 +27,7 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; import org.apache.skywalking.apm.plugin.spring.ai.v1.config.SpringAiPluginConfig; +import org.apache.skywalking.apm.plugin.spring.ai.v1.contant.Constants; import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.definition.ToolDefinition; @@ -42,11 +43,12 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr String toolName = definition.name(); - AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/tool/" + toolName); + AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/tool/execute/" + toolName); span.setComponent(ComponentsDefine.SPRING_AI); SpanLayer.asGenAI(span); Tags.GEN_AI_TOOL_NAME.set(span, toolName); + Tags.GEN_AI_OPERATION_NAME.set(span, Constants.EXECUTE_TOOL); if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_TOOL_INPUT) { String toolInput = (String) allArguments[0]; 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/define/provider/AnthropicApiInstrumentation.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/define/provider/AnthropicApiInstrumentation.java index 0ae41f18f4..e226864906 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/define/provider/AnthropicApiInstrumentation.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/define/provider/AnthropicApiInstrumentation.java @@ -33,7 +33,7 @@ public class AnthropicApiInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { private static final String ENHANCE_CLASS = "org.springframework.ai.anthropic.api.AnthropicApi"; - private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.AnthropicApiConstructorInterceptor"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.provider.AnthropicApiConstructorInterceptor"; @Override protected ClassMatch enhanceClass() { 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/define/provider/DeepSeekApiInstrumentation.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/define/provider/DeepSeekApiInstrumentation.java index 07bb11e348..17382e75eb 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/define/provider/DeepSeekApiInstrumentation.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/define/provider/DeepSeekApiInstrumentation.java @@ -33,7 +33,7 @@ public class DeepSeekApiInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { private static final String ENHANCE_CLASS = "org.springframework.ai.deepseek.api.DeepSeekApi"; - private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.DeepSeekApiInterceptor"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.provider.DeepSeekApiConstructorInterceptor"; @Override protected ClassMatch enhanceClass() { 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/define/provider/HuggingfaceChatModelInstrumentation.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/define/provider/HuggingfaceChatModelInstrumentation.java index 0ae105473f..93f7b57af4 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/define/provider/HuggingfaceChatModelInstrumentation.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/define/provider/HuggingfaceChatModelInstrumentation.java @@ -33,7 +33,7 @@ public class HuggingfaceChatModelInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { private static final String ENHANCE_CLASS = "org.springframework.ai.huggingface.HuggingfaceChatModel"; - private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.HuggingfaceChatModelInterceptor"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.provider.HuggingfaceChatModelConstructorInterceptor"; @Override protected ClassMatch enhanceClass() { 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/define/provider/MiniMaxApiInstrumentation.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/define/provider/MiniMaxApiInstrumentation.java index 108588aee9..c8a5ca3ad1 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/define/provider/MiniMaxApiInstrumentation.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/define/provider/MiniMaxApiInstrumentation.java @@ -33,7 +33,7 @@ public class MiniMaxApiInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { private static final String ENHANCE_CLASS = "org.springframework.ai.minimax.api.MiniMaxApi"; - private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.provider.MiniMaxApiInterceptor"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.provider.MiniMaxApiConstructorInterceptor"; @Override protected ClassMatch enhanceClass() { @@ -46,7 +46,7 @@ public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { new ConstructorInterceptPoint() { @Override public ElementMatcher getConstructorMatcher() { - return takesArguments(2).and(takesArgument(0, named("java.lang.String"))); + return takesArguments(4).and(takesArgument(0, named("java.lang.String"))); } @Override 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/define/provider/MistralAiApiInstrumentation.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/define/provider/MistralAiApiInstrumentation.java index 13ebe59826..ffcaee9198 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/define/provider/MistralAiApiInstrumentation.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/define/provider/MistralAiApiInstrumentation.java @@ -33,7 +33,7 @@ public class MistralAiApiInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { private static final String ENHANCE_CLASS = "org.springframework.ai.mistralai.api.MistralAiApi"; - private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.provider.MistralAiApiInterceptor"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.provider.MistralAiApiConstructorInterceptor"; @Override protected ClassMatch enhanceClass() { 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/define/provider/OllamaApiInstrumentation.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/define/provider/OllamaApiInstrumentation.java new file mode 100644 index 0000000000..7e8fd5ebd8 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/OllamaApiInstrumentation.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; +import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +public class OllamaApiInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_CLASS = "org.springframework.ai.ollama.api.OllamaApi"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.provider.OllamaApiConstructorInterceptor"; + + @Override + protected ClassMatch enhanceClass() { + return NameMatch.byName(ENHANCE_CLASS); + } + + @Override + public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[]{ + new ConstructorInterceptPoint() { + @Override + public ElementMatcher getConstructorMatcher() { + return takesArguments(4).and(takesArgument(0, named("java.lang.String"))); + } + + @Override + public String getConstructorInterceptor() { + return INTERCEPTOR_CLASS; + } + } + }; + } + + @Override + public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[0]; + } +} 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/define/provider/OpenAiApiInstrumentation.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/define/provider/OpenAiApiInstrumentation.java index d96f5f805a..624262322e 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/define/provider/OpenAiApiInstrumentation.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/define/provider/OpenAiApiInstrumentation.java @@ -33,7 +33,7 @@ public class OpenAiApiInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { private static final String ENHANCE_CLASS = "org.springframework.ai.openai.api.OpenAiApi"; - private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.provider.OpenAiApiInterceptor"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.provider.OpenAiApiConstructorInterceptor"; @Override protected ClassMatch enhanceClass() { 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/provider/AnthropicApiInterceptor.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/provider/AnthropicApiConstructorInterceptor.java similarity index 94% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/AnthropicApiInterceptor.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/AnthropicApiConstructorInterceptor.java index 8bd9995fbd..4f9e73ca7e 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/provider/AnthropicApiInterceptor.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/provider/AnthropicApiConstructorInterceptor.java @@ -23,7 +23,7 @@ import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; -public class AnthropicApiInterceptor implements InstanceConstructorInterceptor { +public class AnthropicApiConstructorInterceptor implements InstanceConstructorInterceptor { @Override public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { 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/provider/DeepSeekApiInterceptor.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/provider/DeepSeekApiConstructorInterceptor.java similarity index 94% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/DeepSeekApiInterceptor.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/DeepSeekApiConstructorInterceptor.java index e2f9c1abfb..e1f26e5e8b 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/provider/DeepSeekApiInterceptor.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/provider/DeepSeekApiConstructorInterceptor.java @@ -23,7 +23,7 @@ import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; -public class DeepSeekApiInterceptor implements InstanceConstructorInterceptor { +public class DeepSeekApiConstructorInterceptor implements InstanceConstructorInterceptor { @Override public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { 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/provider/HuggingfaceChatModelInterceptor.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/provider/HuggingfaceChatModelConstructorInterceptor.java similarity index 89% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/HuggingfaceChatModelInterceptor.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/HuggingfaceChatModelConstructorInterceptor.java index b2e8add4b4..234b876434 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/provider/HuggingfaceChatModelInterceptor.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/provider/HuggingfaceChatModelConstructorInterceptor.java @@ -23,11 +23,11 @@ import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; -public class HuggingfaceChatModelInterceptor implements InstanceConstructorInterceptor { +public class HuggingfaceChatModelConstructorInterceptor implements InstanceConstructorInterceptor { @Override public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { - ChatModelMetadataResolver.ApiMetadata metadata = ChatModelMetadataResolver.getMetadata(AiProviderEnum.ANTHROPIC_CLAUDE.getModelClassName()); + ChatModelMetadataResolver.ApiMetadata metadata = ChatModelMetadataResolver.getMetadata(AiProviderEnum.HUGGINGFACE.getModelClassName()); if (metadata == null) { return; } 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/provider/MiniMaxApiConstructorInterceptor.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/provider/MiniMaxApiConstructorInterceptor.java new file mode 100644 index 0000000000..939e440ae1 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/MiniMaxApiConstructorInterceptor.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.provider; + +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; +import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; +import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; + +public class MiniMaxApiConstructorInterceptor implements InstanceConstructorInterceptor { + + @Override + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { + ChatModelMetadataResolver.ApiMetadata metadata = ChatModelMetadataResolver.getMetadata(AiProviderEnum.MINIMAX.getModelClassName()); + if (metadata == null) { + return; + } + + metadata.setBaseUrl((String) allArguments[0]); + metadata.setCompletionsPath("/v1/text/chatcompletion_v2"); + } +} 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/provider/MistralAiApiInterceptor.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/provider/MistralAiApiConstructorInterceptor.java similarity index 90% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/MistralAiApiInterceptor.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/MistralAiApiConstructorInterceptor.java index d951060ff6..07eac44d5b 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/provider/MistralAiApiInterceptor.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/provider/MistralAiApiConstructorInterceptor.java @@ -25,11 +25,11 @@ import static org.apache.skywalking.apm.plugin.spring.ai.v1.contant.Constants.DEFAULT_COMPLETIONS_PATH; -public class MistralAiApiInterceptor implements InstanceConstructorInterceptor { +public class MistralAiApiConstructorInterceptor implements InstanceConstructorInterceptor { @Override public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { - ChatModelMetadataResolver.ApiMetadata metadata = ChatModelMetadataResolver.getMetadata(AiProviderEnum.ANTHROPIC_CLAUDE.getModelClassName()); + ChatModelMetadataResolver.ApiMetadata metadata = ChatModelMetadataResolver.getMetadata(AiProviderEnum.MISTRAL_AI.getModelClassName()); if (metadata == null) { return; } 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/provider/MiniMaxApiInterceptor.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/provider/OllamaApiConstructorInterceptor.java similarity index 87% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/MiniMaxApiInterceptor.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/OllamaApiConstructorInterceptor.java index d2d722aa44..abdc2d9f5a 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/provider/MiniMaxApiInterceptor.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/provider/OllamaApiConstructorInterceptor.java @@ -23,15 +23,16 @@ import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; -public class MiniMaxApiInterceptor implements InstanceConstructorInterceptor { +public class OllamaApiConstructorInterceptor implements InstanceConstructorInterceptor { @Override public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { - ChatModelMetadataResolver.ApiMetadata metadata = ChatModelMetadataResolver.getMetadata(AiProviderEnum.ANTHROPIC_CLAUDE.getModelClassName()); + ChatModelMetadataResolver.ApiMetadata metadata = ChatModelMetadataResolver.getMetadata(AiProviderEnum.OLLAMA.getModelClassName()); if (metadata == null) { return; } metadata.setBaseUrl((String) allArguments[0]); + metadata.setCompletionsPath("/api/chat"); } } 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/provider/OpenAiApiInterceptor.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/provider/OpenAiApiConstructorInterceptor.java similarity index 94% rename from apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/OpenAiApiInterceptor.java rename to apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/OpenAiApiConstructorInterceptor.java index 9801f8aa0b..da0f3bbf2f 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/provider/OpenAiApiInterceptor.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/provider/OpenAiApiConstructorInterceptor.java @@ -23,7 +23,7 @@ import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; -public class OpenAiApiInterceptor implements InstanceConstructorInterceptor { +public class OpenAiApiConstructorInterceptor implements InstanceConstructorInterceptor { @Override public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def index 033ef952d3..43a015aedb 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -24,4 +24,5 @@ spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.Deep spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.HuggingfaceChatModelInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.MiniMaxApiInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.MistralAiApiInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.OllamaApiInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.OpenAiApiInstrumentation diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml index 6210a6adb1..9e6ec15daa 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml @@ -54,10 +54,25 @@ org.springframework.ai spring-ai-starter-model-openai - - - - + + + + + + + org.springframework.ai + spring-ai-starter-model-minimax + + + + org.springframework.ai + spring-ai-starter-model-mistral-ai + + + + org.springframework.ai + spring-ai-starter-model-ollama + org.springframework.ai diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java index bff8f01f9c..16e6b7f5a1 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java @@ -18,6 +18,9 @@ package test.apache.skywalking.apm.testcase.jdk.httpclient.config; import org.springframework.ai.chat.client.ChatClient; +import org.springframework.ai.minimax.MiniMaxChatModel; +import org.springframework.ai.mistralai.MistralAiChatModel; +import org.springframework.ai.ollama.OllamaChatModel; import org.springframework.ai.openai.OpenAiChatModel; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -31,7 +34,17 @@ public ChatClient openAIChatClient(OpenAiChatModel model) { } // @Bean -// public ChatClient anthropicChatClient(AnthropicChatModel model) { +// public ChatClient anthropicChatClient(MiniMaxChatModel model) { +// return ChatClient.create(model); +// } + +// @Bean +// public ChatClient anthropicChatClient(MistralAiChatModel model) { +// return ChatClient.create(model); +// } + +// @Bean +// public ChatClient anthropicChatClient(OllamaChatModel model) { // return ChatClient.create(model); // } } diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java index 21f4cde3bb..d939c16844 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java @@ -54,22 +54,14 @@ public String testCase() throws Exception { .call() .content()); -// chatClient -// .prompt("What's the weather in New York?") -// .system(systemPrompt) -// .tools(weatherTool) -// .stream() -// .content() -// .doOnNext(System.out::println) -// .blockLast(); - -// chatClient -// .prompt("What is Spring AI?") -// .system(systemPrompt) -// .stream() -// .content() -// .doOnNext(System.out::println) -// .blockLast(); + chatClient + .prompt("What's the weather in New York?") + .system(systemPrompt) + .tools(weatherTool) + .stream() + .content() + .doOnNext(System.out::println) + .blockLast(); return "success"; } diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java index 70591908d9..864d5b2ea4 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java @@ -20,35 +20,114 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.io.IOException; +import java.io.PrintWriter; +import java.time.Instant; +import java.util.UUID; + @RestController @RequestMapping("/llm") public class LLMMockController { - @RequestMapping("/v1/chat/completions") - public JSONObject completions(@RequestBody JSONObject request) { + public Object completions(@RequestBody JSONObject request, HttpServletResponse response) throws IOException { + Boolean isStream = request.getBoolean("stream"); + if (isStream == null) isStream = false; JSONArray messages = request.getJSONArray("messages"); - JSONObject lastMessage = messages.getJSONObject(messages.size() - 1); String lastRole = lastMessage.getString("role"); + if (isStream) { + response.setContentType("text/event-stream"); + response.setCharacterEncoding("UTF-8"); + response.setHeader("Cache-Control", "no-cache"); + response.setHeader("Connection", "keep-alive"); + + PrintWriter writer = response.getWriter(); + String id = "chatcmpl-" + UUID.randomUUID(); + long created = Instant.now().getEpochSecond(); + String model = "gpt-4.1-2025-04-14"; + + try { + if ("tool".equals(lastRole)) { + String fullContent = "The weather in New York is currently sunny with a temperature of 10°C."; + writeStreamChunk(writer, id, created, model, "{\"role\":\"assistant\"}", "null"); + + int len = fullContent.length(); + String[] parts = { + fullContent.substring(0, len / 3), + fullContent.substring(len / 3, len * 2 / 3), + fullContent.substring(len * 2 / 3) + }; + + for (String part : parts) { + Thread.sleep(50); + writeStreamChunk(writer, id, created, model, "{\"content\":\"" + escapeJson(part) + "\"}", "null"); + } + + writeStreamChunk(writer, id, created, model, "{}", "\"stop\""); + } else { + writeStreamChunk(writer, id, created, model, "{\"role\":\"assistant\"}", "null"); + + String toolCallDelta = """ + { + "tool_calls": [ + { + "index": 0, + "id": "call_iV4bvFIZujbb", + "type": "function", + "function": { + "name": "get_weather", + "arguments": "" + } + } + ] + } + """; + writeStreamChunk(writer, id, created, model, toolCallDelta, "null"); + + String args = "{\\\"arg0\\\":\\\"new york\\\"}"; + String argsDelta = """ + { + "tool_calls": [ + { + "index": 0, + "function": { + "arguments": "%s" + } + } + ] + } + """.formatted(args); + Thread.sleep(50); + writeStreamChunk(writer, id, created, model, argsDelta, "null"); + + writeStreamChunk(writer, id, created, model, "{}", "\"tool_calls\""); + } + + writer.write("data: [DONE]\n\n"); + writer.flush(); + + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + return null; + } + String toolCallResponse = """ { "choices": [ { - "content_filter_results": {}, "finish_reason": "tool_calls", "index": 0, - "logprobs": null, "message": { - "annotations": [], - "content": null, - "refusal": null, "role": "assistant", + "content": null, "tool_calls": [ { "function": { @@ -63,116 +142,27 @@ public JSONObject completions(@RequestBody JSONObject request) { } ], "created": 1768490813, - "id": "chatcmpl-CyJXJt7gxwDgz7Uj", "model": "gpt-4.1-2025-04-14", - "object": "chat.completion", - "prompt_filter_results": [ - { - "prompt_index": 0, - "content_filter_results": { - "hate": { "filtered": false, "severity": "safe" }, - "self_harm": { "filtered": false, "severity": "safe" }, - "sexual": { "filtered": false, "severity": "safe" }, - "violence": { "filtered": false, "severity": "safe" } - } - } - ], - "system_fingerprint": "fp_b9041e1", - "usage": { - "completion_tokens": 17, - "completion_tokens_details": { - "accepted_prediction_tokens": 0, - "audio_tokens": 0, - "reasoning_tokens": 0, - "rejected_prediction_tokens": 0 - }, - "prompt_tokens": 52, - "prompt_tokens_details": { - "audio_tokens": 0, - "cached_tokens": 0 - }, - "total_tokens": 69 - } + "object": "chat.completion" } """; String finalResponse = """ + { + "choices": [ { - "choices": [ - { - "content_filter_results": { - "hate": { - "filtered": false, - "severity": "safe" - }, - "self_harm": { - "filtered": false, - "severity": "safe" - }, - "sexual": { - "filtered": false, - "severity": "safe" - }, - "violence": { - "filtered": false, - "severity": "safe" - } - }, - "finish_reason": "stop", - "index": 0, - "logprobs": null, - "message": { - "annotations": [], - "content": "The weather in New York is currently sunny with a temperature of 10°C.", - "refusal": null, - "role": "assistant" - } - } - ], - "created": 1768491057, - "id": "chatcmpl-CyJbFkZsyhOyHW2Otyc", - "model": "gpt-4.1-2025-04-14", - "object": "chat.completion", - "prompt_filter_results": [ - { - "prompt_index": 0, - "content_filter_results": { - "hate": { - "filtered": false, - "severity": "safe" - }, - "self_harm": { - "filtered": false, - "severity": "safe" - }, - "sexual": { - "filtered": false, - "severity": "safe" - }, - "violence": { - "filtered": false, - "severity": "safe" - } - } - } - ], - "system_fingerprint": "fp_b9041e1", - "usage": { - "completion_tokens": 17, - "completion_tokens_details": { - "accepted_prediction_tokens": 0, - "audio_tokens": 0, - "reasoning_tokens": 0, - "rejected_prediction_tokens": 0 - }, - "prompt_tokens": 83, - "prompt_tokens_details": { - "audio_tokens": 0, - "cached_tokens": 0 - }, - "total_tokens": 100 + "finish_reason": "stop", + "index": 0, + "message": { + "content": "The weather in New York is currently sunny with a temperature of 10°C.", + "role": "assistant" } - } + } + ], + "created": 1768491057, + "model": "gpt-4.1-2025-04-14", + "object": "chat.completion" + } """; if ("tool".equals(lastRole)) { @@ -181,4 +171,34 @@ public JSONObject completions(@RequestBody JSONObject request) { return JSON.parseObject(toolCallResponse); } + + private void writeStreamChunk(PrintWriter writer, String id, long created, String model, String delta, String finishReason) { + String json = """ + { + "choices": [ + { + "delta": %s, + "finish_reason": %s, + "index": 0, + "logprobs": null + } + ], + "object": "chat.completion.chunk", + "usage": null, + "created": %d, + "system_fingerprint": null, + "model": "%s", + "id": "%s" + } + """.formatted(delta, finishReason, created, model, id); + + String cleanJson = json.replace("\n", "").replace("\r", ""); + writer.write("data: " + cleanJson + "\n\n"); + writer.flush(); + } + + private String escapeJson(String input) { + if (input == null) return ""; + return input.replace("\"", "\\\"").replace("\n", "\\n").replace("\r", "\\r"); + } } From 5f9a95082ada56b8c47483839ebf251dc21dddc5 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Wed, 18 Feb 2026 16:45:32 +0800 Subject: [PATCH 20/48] fix --- .../apm/agent/core/context/tag/Tags.java | 53 ++-- .../ai/v1/ChatModelCallInterceptor.java | 28 ++- .../ai/v1/ChatModelStreamInterceptor.java | 236 +++++++++++------- .../provider/ZhiPuAiApiInstrumentation.java | 64 +++++ .../ZhiPuAiApiConstructorInterceptor.java | 38 +++ .../src/main/resources/skywalking-plugin.def | 1 + .../spring-ai-1.x-scenario/bin/startup.sh | 2 +- .../scenarios/spring-ai-1.x-scenario/pom.xml | 23 -- .../httpclient/config/ChatClientConfig.java | 18 -- .../src/main/resources/application.yaml | 3 +- 10 files changed, 288 insertions(+), 178 deletions(-) create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/ZhiPuAiApiInstrumentation.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/ZhiPuAiApiConstructorInterceptor.java diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java index c170d0218a..074dffdb57 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java @@ -163,112 +163,97 @@ public static final class HTTP { /** * GEN_AI_OPERATION_NAME represents the name of the operation being performed */ - public static final StringTag GEN_AI_OPERATION_NAME = new StringTag(44, "gen_ai.operation.name"); + public static final StringTag GEN_AI_OPERATION_NAME = new StringTag(25, "gen_ai.operation.name"); /** * GEN_AI_PROVIDER_NAME represents the Generative AI provider as identified by the client or server instrumentation. */ - public static final StringTag GEN_AI_PROVIDER_NAME = new StringTag(46, "gen_ai.provider.name"); + public static final StringTag GEN_AI_PROVIDER_NAME = new StringTag(26, "gen_ai.provider.name"); /** * GEN_AI_REQUEST_MODEL represents the name of the GenAI model a request is being made to. */ - public static final StringTag GEN_AI_REQUEST_MODEL = new StringTag(25, "gen_ai.request.model"); + public static final StringTag GEN_AI_REQUEST_MODEL = new StringTag(27, "gen_ai.request.model"); /** * GEN_AI_TOP_K represents the top_k sampling setting for the GenAI request. */ - public static final StringTag GEN_AI_TOP_K = new StringTag(26, "gen_ai.request.top_k"); + public static final StringTag GEN_AI_TOP_K = new StringTag(28, "gen_ai.request.top_k"); /** * GEN_AI_TOP_P represents the top_p sampling setting for the GenAI request. */ - public static final StringTag GEN_AI_TOP_P = new StringTag(27, "gen_ai.request.top_p"); + public static final StringTag GEN_AI_TOP_P = new StringTag(29, "gen_ai.request.top_p"); /** * GEN_AI_TEMPERATURE represents the temperature setting for the GenAI request. */ - public static final StringTag GEN_AI_TEMPERATURE = new StringTag(28, "gen_ai.request.temperature"); + public static final StringTag GEN_AI_TEMPERATURE = new StringTag(30, "gen_ai.request.temperature"); /** * GEN_AI_TOOL_NAME represents the name of the tool utilized by the agent. */ - public static final StringTag GEN_AI_TOOL_NAME = new StringTag(29, "gen_ai.tool.name"); + public static final StringTag GEN_AI_TOOL_NAME = new StringTag(31, "gen_ai.tool.name"); /** * GEN_AI_TOOL_CALL_ARGUMENTS represents the parameters passed to the tool call. */ - public static final StringTag GEN_AI_TOOL_CALL_ARGUMENTS = new StringTag(30, "gen_ai.tool.call.arguments"); + public static final StringTag GEN_AI_TOOL_CALL_ARGUMENTS = new StringTag(32, "gen_ai.tool.call.arguments"); /** * GEN_AI_TOOL_CALL_RESULT represents the result returned by the tool call (if any and if execution was successful). */ - public static final StringTag GEN_AI_TOOL_CALL_RESULT = new StringTag(43, "gen_ai.tool.call.result"); + public static final StringTag GEN_AI_TOOL_CALL_RESULT = new StringTag(33, "gen_ai.tool.call.result"); /** * GEN_AI_RESPONSE_MODEL represents the name of the model that generated the response. */ - public static final StringTag GEN_AI_RESPONSE_MODEL = new StringTag(31, "gen_ai.response.model"); + public static final StringTag GEN_AI_RESPONSE_MODEL = new StringTag(34, "gen_ai.response.model"); /** * GEN_AI_RESPONSE_ID represents the unique identifier for the completion. */ - public static final StringTag GEN_AI_RESPONSE_ID = new StringTag(32, "gen_ai.response.id"); + public static final StringTag GEN_AI_RESPONSE_ID = new StringTag(35, "gen_ai.response.id"); /** * GEN_AI_USAGE_INPUT_TOKENS represents the number of tokens used in the GenAI input (prompt). */ - public static final StringTag GEN_AI_USAGE_INPUT_TOKENS = new StringTag(33, "gen_ai.usage.input_tokens"); + public static final StringTag GEN_AI_USAGE_INPUT_TOKENS = new StringTag(36, "gen_ai.usage.input_tokens"); /** * GEN_AI_USAGE_OUTPUT_TOKENS represents the number of tokens used in the GenAI response (completion). */ - public static final StringTag GEN_AI_USAGE_OUTPUT_TOKENS = new StringTag(34, "gen_ai.usage.output_tokens"); + public static final StringTag GEN_AI_USAGE_OUTPUT_TOKENS = new StringTag(37, "gen_ai.usage.output_tokens"); /** * GEN_AI_USAGE_TOTAL_TOKENS represents the total number of tokens used in the GenAI exchange. */ - public static final StringTag GEN_AI_CLIENT_TOKEN_USAGE = new StringTag(35, "gen_ai.client.token.usage"); + public static final StringTag GEN_AI_CLIENT_TOKEN_USAGE = new StringTag(38, "gen_ai.client.token.usage"); /** * GEN_AI_RESPONSE_FINISH_REASONS represents the array of reasons the model stopped generating tokens. */ - public static final StringTag GEN_AI_RESPONSE_FINISH_REASONS = new StringTag(36, "gen_ai.response.finish_reasons"); - - /** - * GEN_AI_PROMPT represents the full prompt text or messages provided to the model. - */ - public static final StringTag GEN_AI_PROMPT = new StringTag(37, "gen_ai.prompt"); - - /** - * GEN_AI_COMPLETION represents the full completion text or messages returned by the model. - */ - public static final StringTag GEN_AI_COMPLETION = new StringTag(38, "gen_ai.completion"); + public static final StringTag GEN_AI_RESPONSE_FINISH_REASONS = new StringTag(39, "gen_ai.response.finish_reasons"); /** * GEN_AI_STREAM_TTFR represents the time to first response (TTFR) for streaming operations. */ - public static final StringTag GEN_AI_STREAM_TTFR = new StringTag(39, "gen_ai.stream.ttfr"); + public static final StringTag GEN_AI_STREAM_TTFR = new StringTag(40, "gen_ai.stream.ttfr"); /** * GEN_AI_VECTOR_STORE_TOP_K represents the target number of top results to return from the vector store. */ - public static final StringTag GEN_AI_VECTOR_STORE_TOP_K = new StringTag(40, "gen_ai.vector_store.top_k"); + public static final StringTag GEN_AI_VECTOR_STORE_TOP_K = new StringTag(41, "gen_ai.vector_store.top_k"); /** * GEN_AI_VECTOR_STORE_FILTER_EXPRESSION represents the filter expression used in the vector store search. */ - public static final StringTag GEN_AI_VECTOR_STORE_FILTER_EXPRESSION = new StringTag(41, "gen_ai.vector_store.filter_expression"); + public static final StringTag GEN_AI_VECTOR_STORE_FILTER_EXPRESSION = new StringTag(42, "gen_ai.vector_store.filter_expression"); /** * GEN_AI_VECTOR_STORE_RECORD_IDS represents the unique identifiers of the records retrieved from the vector store. */ - public static final StringTag GEN_AI_VECTOR_STORE_RECORD_IDS = new StringTag(42, "gen_ai.vector_store.record_ids"); - - /** - * GEN_AI_SYSTEM_INSTRUCTIONS represents the system message or instructions provided to the GenAI model separately from the chat history. - */ - public static final StringTag GEN_AI_SYSTEM_INSTRUCTIONS = new StringTag(43, "gen_ai.system_instructions"); + public static final StringTag GEN_AI_VECTOR_STORE_RECORD_IDS = new StringTag(43, "gen_ai.vector_store.record_ids"); /** * GEN_AI_INPUT_MESSAGES represents the chat history provided to the model as an input. 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/ChatModelCallInterceptor.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/ChatModelCallInterceptor.java index 4702effeef..64c6cfac02 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/ChatModelCallInterceptor.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/ChatModelCallInterceptor.java @@ -30,8 +30,7 @@ import org.apache.skywalking.apm.plugin.spring.ai.v1.config.SpringAiPluginConfig; import org.apache.skywalking.apm.plugin.spring.ai.v1.contant.Constants; import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; -import org.springframework.ai.chat.client.ChatClientRequest; -import org.springframework.ai.chat.client.ChatClientResponse; +import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.metadata.ChatResponseMetadata; import org.springframework.ai.chat.metadata.Usage; import org.springframework.ai.chat.model.ChatResponse; @@ -66,6 +65,7 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr span.setComponent(ComponentsDefine.SPRING_AI); Tags.GEN_AI_OPERATION_NAME.set(span, Constants.CHAT); + Tags.GEN_AI_PROVIDER_NAME.set(span, apiMetadata.getProviderName()); Tags.GEN_AI_REQUEST_MODEL.set(span, chatOptions.getModel()); Tags.GEN_AI_TEMPERATURE.set(span, String.valueOf(chatOptions.getTemperature())); Tags.GEN_AI_TOP_K.set(span, String.valueOf(chatOptions.getTopK())); @@ -79,14 +79,13 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA } try { - AbstractSpan span = ContextManager.activeSpan(); - ChatClientResponse response = (ChatClientResponse) ret; - if (response == null || response.chatResponse() == null) { - return ret; + ChatResponse response = (ChatResponse) ret; + if (response == null) { + return null; } - ChatResponse chatResponse = response.chatResponse(); - ChatResponseMetadata metadata = chatResponse.getMetadata(); + AbstractSpan span = ContextManager.activeSpan(); + ChatResponseMetadata metadata = response.getMetadata(); long totalTokens = 0; @@ -113,7 +112,7 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA } } - Generation generation = chatResponse.getResult(); + Generation generation = response.getResult(); if (generation != null && generation.getMetadata() != null) { String finishReason = generation.getMetadata().getFinishReason(); if (finishReason != null) { @@ -152,12 +151,12 @@ private void collectContent(AbstractSpan span, Object[] allArguments, Generation } private void collectPrompt(AbstractSpan span, Object[] allArguments) { - ChatClientRequest request = (ChatClientRequest) allArguments[0]; - if (request == null) { + Prompt prompt = (Prompt) allArguments[0]; + if (prompt == null) { return; } - String promptText = request.prompt().getContents(); + String promptText = prompt.getContents(); if (promptText == null) { return; } @@ -167,7 +166,10 @@ private void collectPrompt(AbstractSpan span, Object[] allArguments) { promptText = promptText.substring(0, limit); } - + StringBuilder stringBuilder = new StringBuilder(); + for (Message instruction : prompt.getInstructions()) { + stringBuilder.append(instruction.getText()); + } Tags.GEN_AI_INPUT_MESSAGES.set(span, promptText); } 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 dd8e748bba..abaf0ee93b 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 @@ -75,6 +75,7 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr } Tags.GEN_AI_OPERATION_NAME.set(span, Constants.CHAT); + Tags.GEN_AI_PROVIDER_NAME.set(span, apiMetadata.getProviderName()); Tags.GEN_AI_REQUEST_MODEL.set(span, chatOptions.getModel()); Tags.GEN_AI_TEMPERATURE.set(span, String.valueOf(chatOptions.getTemperature())); Tags.GEN_AI_TOP_K.set(span, String.valueOf(chatOptions.getTopK())); @@ -88,109 +89,156 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA if (!ContextManager.isActive()) { return ret; } - AbstractSpan span = ContextManager.activeSpan(); - ContextSnapshot contextSnapshot = ContextManager.capture(); + final AbstractSpan span = ContextManager.activeSpan(); + final ContextSnapshot snapshot = ContextManager.capture(); span.prepareForAsync(); ContextManager.stopSpan(); - Flux flux = (Flux) ret; + @SuppressWarnings("unchecked") final Flux flux = (Flux) ret; - AtomicReference lastResponseRef = new AtomicReference<>(); + final StreamState state = new StreamState(readAndClearStartTime()); - final StringBuilder completionBuilder = new StringBuilder(); + return flux + .doOnNext(response -> onStreamNext(span, response, state)) + .doOnError(span::log) + .doFinally(signalType -> onStreamFinally(span, allArguments, state)) + .contextWrite(c -> c.put(Constants.SKYWALKING_CONTEXT_SNAPSHOT, snapshot)); + } - AtomicReference finishReason = new AtomicReference<>(""); + private void onStreamNext(AbstractSpan span, ChatResponse response, StreamState state) { + state.lastResponseRef.set(response); - AtomicBoolean firstResponseReceived = new AtomicBoolean(false); + final Generation generation = response.getResult(); + if (generation == null) { + return; + } - Long startTime = (Long) ContextManager.getRuntimeContext().get(Constants.SPRING_AI_STREAM_START_TIME); - ContextManager.getRuntimeContext().remove(Constants.SPRING_AI_STREAM_START_TIME); + recordTtfrIfFirstToken(span, generation, state); + recordFinishReason(generation, state); + appendCompletionChunk(generation, state); + } - return flux.doOnNext(response -> { - if (response != null) { + private void onStreamFinally(AbstractSpan span, Object[] allArguments, StreamState state) { + try { + ChatResponse finalResponse = state.lastResponseRef.get(); + if (finalResponse == null) { + return; + } - lastResponseRef.set(response); + ChatResponseMetadata metadata = finalResponse.getMetadata(); + if (metadata == null) { + return; + } - Generation generation = response.getResult(); - if (generation == null) { - return; - } + collectResponseTags(span, metadata, state); - if (generation.getOutput() != null && StringUtils.hasText(generation.getOutput().getText())) { - if (firstResponseReceived.compareAndSet(false, true) && startTime != null) { - Tags.GEN_AI_STREAM_TTFR.set(span, String.valueOf(System.currentTimeMillis() - startTime)); - } - } + long totalTokens = collectUsageTags(span, metadata.getUsage()); - String reason = generation.getMetadata().getFinishReason(); - if (reason != null) { - finishReason.set(reason); - } + int tokenThreshold = SpringAiPluginConfig.Plugin.SpringAi.CONTENT_COLLECT_THRESHOLD_TOKENS; + if (tokenThreshold >= 0 && totalTokens < tokenThreshold) { + return; + } - if (generation.getOutput() != null && generation.getOutput().getText() != null) { - completionBuilder.append(generation.getOutput().getText()); - } - } - }) - .doOnError(span::log) - .doFinally(signalType -> { - try { - ChatResponse finalResponse = lastResponseRef.get(); - - if (finalResponse != null) { - ChatResponseMetadata metadata = finalResponse.getMetadata(); - if (metadata != null) { - if (metadata.getId() != null) { - Tags.GEN_AI_RESPONSE_ID.set(span, metadata.getId()); - } - if (metadata.getModel() != null) { - Tags.GEN_AI_RESPONSE_MODEL.set(span, metadata.getModel()); - } - - Usage usage = metadata.getUsage(); - long totalTokens = 0; - if (usage != null) { - Tags.GEN_AI_USAGE_INPUT_TOKENS.set(span, String.valueOf(usage.getPromptTokens())); - Tags.GEN_AI_USAGE_OUTPUT_TOKENS.set(span, String.valueOf(usage.getCompletionTokens())); - totalTokens = usage.getTotalTokens() != null ? usage.getTotalTokens() : 0; - Tags.GEN_AI_CLIENT_TOKEN_USAGE.set(span, String.valueOf(usage.getTotalTokens().longValue())); - } - - Tags.GEN_AI_RESPONSE_FINISH_REASONS.set(span, finishReason.get()); - - int tokenThreshold = SpringAiPluginConfig.Plugin.SpringAi.CONTENT_COLLECT_THRESHOLD_TOKENS; - if (tokenThreshold < 0 || totalTokens >= tokenThreshold) { - - if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_PROMPT) { - Prompt prompt = (Prompt) allArguments[0]; - String promptText = prompt.getContents(); - if (promptText != null) { - int limit = SpringAiPluginConfig.Plugin.SpringAi.PROMPT_LENGTH_LIMIT; - if (limit > 0 && promptText.length() > limit) { - promptText = promptText.substring(0, limit); - } - Tags.GEN_AI_PROMPT.set(span, promptText); - } - } - - if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_COMPLETION) { - int limit = SpringAiPluginConfig.Plugin.SpringAi.COMPLETION_LENGTH_LIMIT; - String output = completionBuilder.toString(); - if (limit > 0 && output.length() > limit) { - output = output.substring(0, limit); - } - Tags.GEN_AI_COMPLETION.set(span, output); - } - } - } - } - } catch (Throwable t) { - span.log(t); - } finally { - span.asyncFinish(); - } - }).contextWrite(c -> c.put(Constants.SKYWALKING_CONTEXT_SNAPSHOT, contextSnapshot)); + if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_PROMPT) { + collectPrompt(span, allArguments); + } + if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_COMPLETION) { + collectCompletion(span, state); + } + } catch (Throwable t) { + span.log(t); + } finally { + span.asyncFinish(); + } + } + + private void recordTtfrIfFirstToken(AbstractSpan span, Generation generation, StreamState state) { + if (state.startTime == null) { + return; + } + if (generation.getOutput() == null || !StringUtils.hasText(generation.getOutput().getText())) { + return; + } + if (state.firstResponseReceived.compareAndSet(false, true)) { + Tags.GEN_AI_STREAM_TTFR.set(span, String.valueOf(System.currentTimeMillis() - state.startTime)); + } + } + + private void recordFinishReason(Generation generation, StreamState state) { + if (generation.getMetadata() == null) { + return; + } + String reason = generation.getMetadata().getFinishReason(); + if (reason != null) { + state.finishReason.set(reason); + } + } + + private void appendCompletionChunk(Generation generation, StreamState state) { + if (generation.getOutput() == null) { + return; + } + String text = generation.getOutput().getText(); + if (text != null) { + state.completionBuilder.append(text); + } + } + + private void collectResponseTags(AbstractSpan span, ChatResponseMetadata metadata, StreamState state) { + if (metadata.getId() != null) { + Tags.GEN_AI_RESPONSE_ID.set(span, metadata.getId()); + } + if (metadata.getModel() != null) { + Tags.GEN_AI_RESPONSE_MODEL.set(span, metadata.getModel()); + } + Tags.GEN_AI_RESPONSE_FINISH_REASONS.set(span, state.finishReason.get()); + } + + private long collectUsageTags(AbstractSpan span, Usage usage) { + if (usage == null) { + return 0; + } + Tags.GEN_AI_USAGE_INPUT_TOKENS.set(span, String.valueOf(usage.getPromptTokens())); + Tags.GEN_AI_USAGE_OUTPUT_TOKENS.set(span, String.valueOf(usage.getCompletionTokens())); + + long total = usage.getTotalTokens() != null ? usage.getTotalTokens() : 0; + Tags.GEN_AI_CLIENT_TOKEN_USAGE.set(span, String.valueOf(total)); + return total; + } + + private void collectPrompt(AbstractSpan span, Object[] allArguments) { + Prompt prompt = (Prompt) allArguments[0]; + if (prompt == null) { + return; + } + String promptText = prompt.getContents(); + if (promptText == null) { + return; + } + int limit = SpringAiPluginConfig.Plugin.SpringAi.PROMPT_LENGTH_LIMIT; + Tags.GEN_AI_INPUT_MESSAGES.set(span, truncate(promptText, limit)); + } + + private void collectCompletion(AbstractSpan span, StreamState state) { + int limit = SpringAiPluginConfig.Plugin.SpringAi.COMPLETION_LENGTH_LIMIT; + Tags.GEN_AI_OUTPUT_MESSAGES.set(span, truncate(state.completionBuilder.toString(), limit)); + } + + private String truncate(String s, int limit) { + if (s == null) { + return null; + } + if (limit > 0 && s.length() > limit) { + return s.substring(0, limit); + } + return s; + } + + private Long readAndClearStartTime() { + Long startTime = (Long) ContextManager.getRuntimeContext().get(Constants.SPRING_AI_STREAM_START_TIME); + ContextManager.getRuntimeContext().remove(Constants.SPRING_AI_STREAM_START_TIME); + return startTime; } @Override @@ -199,4 +247,16 @@ public void handleMethodException(EnhancedInstance objInst, Method method, Objec ContextManager.activeSpan().log(t); } } + + private static final class StreamState { + final AtomicReference lastResponseRef = new AtomicReference<>(); + final StringBuilder completionBuilder = new StringBuilder(); + final AtomicReference finishReason = new AtomicReference<>(""); + final AtomicBoolean firstResponseReceived = new AtomicBoolean(false); + final Long startTime; + + StreamState(Long startTime) { + this.startTime = startTime; + } + } } 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/define/provider/ZhiPuAiApiInstrumentation.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/define/provider/ZhiPuAiApiInstrumentation.java new file mode 100644 index 0000000000..583f045f6b --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/provider/ZhiPuAiApiInstrumentation.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider; + +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; +import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; +import org.apache.skywalking.apm.agent.core.plugin.match.NameMatch; + +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +public class ZhiPuAiApiInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { + + private static final String ENHANCE_CLASS = "org.springframework.ai.zhipuai.api.ZhiPuAiApi"; + private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.provider.ZhiPuAiApiConstructorInterceptor"; + + @Override + protected ClassMatch enhanceClass() { + return NameMatch.byName(ENHANCE_CLASS); + } + + @Override + public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { + return new ConstructorInterceptPoint[]{ + new ConstructorInterceptPoint() { + @Override + public ElementMatcher getConstructorMatcher() { + return takesArguments(8).and(takesArgument(0, named("java.lang.String"))).and(takesArgument(3, named("java.lang.String"))); + } + + @Override + public String getConstructorInterceptor() { + return INTERCEPTOR_CLASS; + } + } + }; + } + + @Override + public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { + return new InstanceMethodsInterceptPoint[0]; + } +} 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/provider/ZhiPuAiApiConstructorInterceptor.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/provider/ZhiPuAiApiConstructorInterceptor.java new file mode 100644 index 0000000000..734c807a6a --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/provider/ZhiPuAiApiConstructorInterceptor.java @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.provider; + +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; +import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceConstructorInterceptor; +import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; +import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; + +public class ZhiPuAiApiConstructorInterceptor implements InstanceConstructorInterceptor { + + @Override + public void onConstruct(EnhancedInstance objInst, Object[] allArguments) throws Throwable { + ChatModelMetadataResolver.ApiMetadata metadata = ChatModelMetadataResolver.getMetadata(AiProviderEnum.ZHIPU_AI.getModelClassName()); + if (metadata == null) { + return; + } + + metadata.setBaseUrl((String) allArguments[0]); + metadata.setCompletionsPath((String) allArguments[3]); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def index 43a015aedb..47f85834f3 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -26,3 +26,4 @@ spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.Mini spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.MistralAiApiInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.OllamaApiInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.OpenAiApiInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.ZhiPuAiApiInstrumentation diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh b/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh index c4075db94b..8a1c2e0480 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh @@ -18,4 +18,4 @@ home="$(cd "$(dirname $0)"; pwd)" -java -jar ${agent_opts} ${home}/../libs/spring-ai-1.x-scenario.jar & \ No newline at end of file +java -Dskywalking.plugin.springai.collect_prompt=true -Dskywalking.plugin.springai.collect_completion=true -Dskywalking.plugin.springai.collect_tool_input=true -Dskywalking.plugin.springai.collect_tool_output=true -jar ${agent_opts} ${home}/../libs/spring-ai-1.x-scenario.jar & \ No newline at end of file diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml index 9e6ec15daa..b9d39f538a 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/pom.xml @@ -54,30 +54,7 @@ org.springframework.ai spring-ai-starter-model-openai - - - - - - org.springframework.ai - spring-ai-starter-model-minimax - - - - org.springframework.ai - spring-ai-starter-model-mistral-ai - - - - org.springframework.ai - spring-ai-starter-model-ollama - - - - org.springframework.ai - spring-ai-advisors-vector-store - org.projectlombok lombok diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java index 16e6b7f5a1..79fde137ab 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/config/ChatClientConfig.java @@ -18,9 +18,6 @@ package test.apache.skywalking.apm.testcase.jdk.httpclient.config; import org.springframework.ai.chat.client.ChatClient; -import org.springframework.ai.minimax.MiniMaxChatModel; -import org.springframework.ai.mistralai.MistralAiChatModel; -import org.springframework.ai.ollama.OllamaChatModel; import org.springframework.ai.openai.OpenAiChatModel; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -32,19 +29,4 @@ public class ChatClientConfig { public ChatClient openAIChatClient(OpenAiChatModel model) { return ChatClient.create(model); } - -// @Bean -// public ChatClient anthropicChatClient(MiniMaxChatModel model) { -// return ChatClient.create(model); -// } - -// @Bean -// public ChatClient anthropicChatClient(MistralAiChatModel model) { -// return ChatClient.create(model); -// } - -// @Bean -// public ChatClient anthropicChatClient(OllamaChatModel model) { -// return ChatClient.create(model); -// } } diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml index 75a26b2bc9..c4f5c58851 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/resources/application.yaml @@ -22,7 +22,7 @@ server: spring: ai: openai: - api-key: noaichaPCNAC09DHBWQCOACNacoi + api-key: xxxxxxxxxxxxxxxxxxxxxxxxxxx base-url: http://localhost:8080/spring-ai-1.x-scenario/llm chat: options: @@ -32,3 +32,4 @@ spring: top-p: 0.9 + From 9f98420fb48093f4dd268a1432756aa934f26590 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Wed, 18 Feb 2026 16:48:56 +0800 Subject: [PATCH 21/48] fix --- .../apm/agent/core/context/tag/Tags.java | 15 ---- .../v1/VectorStoreRetrieverInterceptor.java | 85 ------------------- .../VectorStoreRetrieverInstrumentation.java | 73 ---------------- 3 files changed, 173 deletions(-) delete mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/VectorStoreRetrieverInterceptor.java delete mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/VectorStoreRetrieverInstrumentation.java diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java index 074dffdb57..995b91f582 100644 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/context/tag/Tags.java @@ -240,21 +240,6 @@ public static final class HTTP { */ public static final StringTag GEN_AI_STREAM_TTFR = new StringTag(40, "gen_ai.stream.ttfr"); - /** - * GEN_AI_VECTOR_STORE_TOP_K represents the target number of top results to return from the vector store. - */ - public static final StringTag GEN_AI_VECTOR_STORE_TOP_K = new StringTag(41, "gen_ai.vector_store.top_k"); - - /** - * GEN_AI_VECTOR_STORE_FILTER_EXPRESSION represents the filter expression used in the vector store search. - */ - public static final StringTag GEN_AI_VECTOR_STORE_FILTER_EXPRESSION = new StringTag(42, "gen_ai.vector_store.filter_expression"); - - /** - * GEN_AI_VECTOR_STORE_RECORD_IDS represents the unique identifiers of the records retrieved from the vector store. - */ - public static final StringTag GEN_AI_VECTOR_STORE_RECORD_IDS = new StringTag(43, "gen_ai.vector_store.record_ids"); - /** * GEN_AI_INPUT_MESSAGES represents the chat history provided to the model as an input. */ 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/VectorStoreRetrieverInterceptor.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/VectorStoreRetrieverInterceptor.java deleted file mode 100644 index da443dc797..0000000000 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/VectorStoreRetrieverInterceptor.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.skywalking.apm.plugin.spring.ai.v1; - -import org.apache.skywalking.apm.agent.core.context.ContextManager; -import org.apache.skywalking.apm.agent.core.context.tag.Tags; -import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; -import org.springframework.ai.document.Document; -import org.springframework.ai.vectorstore.SearchRequest; - -import java.lang.reflect.Method; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -public class VectorStoreRetrieverInterceptor implements InstanceMethodsAroundInterceptor { - - @Override - public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - MethodInterceptResult result) throws Throwable { - - AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/vectorStore/retrieve"); - span.setComponent(ComponentsDefine.SPRING_AI); - SearchRequest searchRequest = (SearchRequest) allArguments[0]; - - Tags.GEN_AI_VECTOR_STORE_TOP_K.set(span, String.valueOf(searchRequest.getTopK())); - - if (searchRequest.getFilterExpression() != null) { - Tags.GEN_AI_VECTOR_STORE_FILTER_EXPRESSION.set(span, searchRequest.getFilterExpression().toString()); - } - } - - @Override - public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, - Object ret) throws Throwable { - if (!ContextManager.isActive()) { - return ret; - } - - if (ret != null) { - List documents = (List) ret; - AbstractSpan span = ContextManager.activeSpan(); - if (!documents.isEmpty()) { - String recordIds = documents.stream() - .map(Document::getId) - .filter(Objects::nonNull) - .collect(Collectors.joining(",")); - - if (!recordIds.isEmpty()) { - Tags.GEN_AI_VECTOR_STORE_RECORD_IDS.set(span, recordIds); - } - } - } - ContextManager.stopSpan(); - return ret; - } - - @Override - public void handleMethodException(EnhancedInstance objInst, Method method, Object[] allArguments, - Class[] argumentsTypes, Throwable t) { - if (ContextManager.isActive()) { - ContextManager.activeSpan().log(t); - } - } -} 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/define/VectorStoreRetrieverInstrumentation.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/define/VectorStoreRetrieverInstrumentation.java deleted file mode 100644 index 6c09e083fd..0000000000 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/define/VectorStoreRetrieverInstrumentation.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -package org.apache.skywalking.apm.plugin.spring.ai.v1.define; - -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.ConstructorInterceptPoint; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.InstanceMethodsInterceptPoint; -import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.ClassInstanceMethodsEnhancePluginDefine; -import org.apache.skywalking.apm.agent.core.plugin.match.ClassMatch; -import org.apache.skywalking.apm.agent.core.plugin.match.HierarchyMatch; - -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import static org.apache.skywalking.apm.agent.core.plugin.bytebuddy.ArgumentTypeNameMatch.takesArgumentWithType; - -public class VectorStoreRetrieverInstrumentation extends ClassInstanceMethodsEnhancePluginDefine { - - private static final String ENHANCE_INTERFACE = "org.springframework.ai.vectorstore.VectorStoreRetriever"; - private static final String INTERCEPTOR_CLASS = "org.apache.skywalking.apm.plugin.spring.ai.v1.VectorStoreRetrieverInterceptor"; - - private static final String INTERCEPT_METHOD = "doSimilaritySearch"; - - @Override - protected ClassMatch enhanceClass() { - return HierarchyMatch.byHierarchyMatch(ENHANCE_INTERFACE); - } - - @Override - public ConstructorInterceptPoint[] getConstructorsInterceptPoints() { - return new ConstructorInterceptPoint[0]; - } - - @Override - public InstanceMethodsInterceptPoint[] getInstanceMethodsInterceptPoints() { - return new InstanceMethodsInterceptPoint[]{ - new InstanceMethodsInterceptPoint() { - @Override - public ElementMatcher getMethodsMatcher() { - return named(INTERCEPT_METHOD) - .and(takesArguments(1)) - .and(takesArgumentWithType(0, "org.springframework.ai.vectorstore.SearchRequest")); - } - - @Override - public String getMethodsInterceptor() { - return INTERCEPTOR_CLASS; - } - - @Override - public boolean isOverrideArgs() { - return false; - } - } - }; - } -} From be4827d4abd1d983e39436d3dfcca2cc1d3e0dd1 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Wed, 18 Feb 2026 17:29:45 +0800 Subject: [PATCH 22/48] fix --- .../testcase/jdk/httpclient/controller/CaseController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java index d939c16844..d6512b726e 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java @@ -47,12 +47,12 @@ public String testCase() throws Exception { Do not use outside knowledge. Be concise. """; - System.out.println(chatClient + chatClient .prompt("What's the weather in New York?") .system(systemPrompt) .tools(weatherTool) .call() - .content()); + .content(); chatClient .prompt("What's the weather in New York?") From 43905d52cc394aba0dce08b81f59ab53f81cb7e3 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Fri, 20 Feb 2026 17:52:16 +0800 Subject: [PATCH 23/48] fix --- .../trace/component/ComponentsDefine.java | 32 ++- .../apm/agent/core/util/GsonUtil.java | 36 +++ .../spring-ai-1.x-plugin/pom.xml | 6 - .../ai/v1/ChatModelCallInterceptor.java | 52 ++-- .../ai/v1/ChatModelStreamInterceptor.java | 48 ++-- .../v1/common/ChatModelMetadataResolver.java | 61 +++- .../spring/ai/v1/enums/AiProviderEnum.java | 2 +- .../spring/ai/v1/messages/InputMessages.java | 271 ++++++++++++++++++ .../spring/ai/v1/messages/OutputMessages.java | 121 ++++++++ .../src/main/resources/skywalking-plugin.def | 1 - .../config/expectedData.yaml | 127 +++++--- .../controller/LLMMockController.java | 16 ++ 12 files changed, 668 insertions(+), 105 deletions(-) create mode 100644 apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/util/GsonUtil.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/messages/InputMessages.java create mode 100644 apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/messages/OutputMessages.java diff --git a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java index 4135aab449..9fa2973619 100755 --- a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java +++ b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java @@ -265,6 +265,36 @@ public class ComponentsDefine { public static final OfficialComponent DMDB_JDBC_DRIVER = new OfficialComponent(163, "Dmdb-jdbc-driver"); - public static final OfficialComponent SPRING_AI = new OfficialComponent(164, "Spring-ai"); + public static final OfficialComponent SPRING_AI_UNKNOWN = new OfficialComponent(164, "spring-ai-unknown"); + + public static final OfficialComponent SPRING_AI_ANTHROPIC = new OfficialComponent(165, "spring-ai-anthropic"); + + public static final OfficialComponent SPRING_AI_BEDROCK = new OfficialComponent(166, "spring-ai-aws-bedrock"); + + public static final OfficialComponent SPRING_AI_AZURE_OPENAI = new OfficialComponent(167, "spring-ai-azure-openai"); + + public static final OfficialComponent SPRING_AI_COHERE = new OfficialComponent(168, "spring-ai-cohere"); + + public static final OfficialComponent SPRING_AI_DEEPSEEK = new OfficialComponent(169, "spring-ai-deepseek"); + + public static final OfficialComponent SPRING_AI_GOOGLE_GENAI = new OfficialComponent(170, "spring-ai-gcp-genai"); + + public static final OfficialComponent SPRING_AI_VERTEXAI = new OfficialComponent(171, "spring-ai-gcp-vertex-ai"); + + public static final OfficialComponent SPRING_AI_MISTRAL_AI = new OfficialComponent(172, "spring-ai-mistral-ai"); + + public static final OfficialComponent SPRING_AI_OPENAI = new OfficialComponent(173, "spring-ai-openai"); + + public static final OfficialComponent SPRING_AI_HUGGINGFACE = new OfficialComponent(174, "spring-ai-huggingface"); + + public static final OfficialComponent SPRING_AI_MINIMAX = new OfficialComponent(175, "spring-ai-minimax"); + + public static final OfficialComponent SPRING_AI_OLLAMA = new OfficialComponent(176, "spring-ai-ollama"); + + public static final OfficialComponent SPRING_AI_OPENAI_SDK = new OfficialComponent(177, "spring-ai-openai-sdk"); + + public static final OfficialComponent SPRING_AI_ZHIPU_AI = new OfficialComponent(178, "spring-ai-zhipu-ai"); + + public static final OfficialComponent SPRING_AI = new OfficialComponent(179, "spring-ai"); } diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/util/GsonUtil.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/util/GsonUtil.java new file mode 100644 index 0000000000..fb710e4a61 --- /dev/null +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/util/GsonUtil.java @@ -0,0 +1,36 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.agent.core.util; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +public class GsonUtil { + + private static final Gson GSON = new GsonBuilder() + .disableHtmlEscaping() + .create(); + + public static String toJson(Object src) { + if (src == null) { + return null; + } + return GSON.toJson(src); + } +} diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml index b15ec1c429..a68d7170f2 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml @@ -43,11 +43,5 @@ provided - - org.springframework.ai - spring-ai-advisors-vector-store - 1.1.0 - provided - \ No newline at end of file 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/ChatModelCallInterceptor.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/ChatModelCallInterceptor.java index 64c6cfac02..557e696400 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/ChatModelCallInterceptor.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/ChatModelCallInterceptor.java @@ -26,11 +26,13 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; +import org.apache.skywalking.apm.network.trace.component.OfficialComponent; import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; import org.apache.skywalking.apm.plugin.spring.ai.v1.config.SpringAiPluginConfig; import org.apache.skywalking.apm.plugin.spring.ai.v1.contant.Constants; import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; -import org.springframework.ai.chat.messages.Message; +import org.apache.skywalking.apm.plugin.spring.ai.v1.messages.InputMessages; +import org.apache.skywalking.apm.plugin.spring.ai.v1.messages.OutputMessages; import org.springframework.ai.chat.metadata.ChatResponseMetadata; import org.springframework.ai.chat.metadata.Usage; import org.springframework.ai.chat.model.ChatResponse; @@ -45,17 +47,22 @@ public class ChatModelCallInterceptor implements InstanceMethodsAroundIntercepto @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { ChatModelMetadataResolver.ApiMetadata apiMetadata = ChatModelMetadataResolver.getMetadata(objInst); - String providerName = AiProviderEnum.UNKNOW.getValue(); + String providerName = AiProviderEnum.UNKNOWN.getValue(); + OfficialComponent component = ComponentsDefine.SPRING_AI_UNKNOWN; String peer = null; if (apiMetadata != null) { if (apiMetadata.getProviderName() != null) { providerName = apiMetadata.getProviderName(); + component = apiMetadata.getComponent(); } peer = apiMetadata.getPeer(); } AbstractSpan span = ContextManager.createExitSpan("Spring-ai/" + providerName + "/call", peer); SpanLayer.asGenAI(span); + span.setComponent(component); + Tags.GEN_AI_OPERATION_NAME.set(span, Constants.CHAT); + Tags.GEN_AI_PROVIDER_NAME.set(span, apiMetadata.getProviderName()); Prompt prompt = (Prompt) allArguments[0]; ChatOptions chatOptions = prompt.getOptions(); @@ -63,9 +70,6 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr return; } - span.setComponent(ComponentsDefine.SPRING_AI); - Tags.GEN_AI_OPERATION_NAME.set(span, Constants.CHAT); - Tags.GEN_AI_PROVIDER_NAME.set(span, apiMetadata.getProviderName()); Tags.GEN_AI_REQUEST_MODEL.set(span, chatOptions.getModel()); Tags.GEN_AI_TEMPERATURE.set(span, String.valueOf(chatOptions.getTemperature())); Tags.GEN_AI_TOP_K.set(span, String.valueOf(chatOptions.getTopK())); @@ -120,7 +124,7 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA } } - collectContent(span, allArguments, generation, totalTokens); + collectContent(span, allArguments, response, totalTokens); } finally { ContextManager.stopSpan(); } @@ -134,7 +138,7 @@ public void handleMethodException(EnhancedInstance objInst, Method method, Objec } } - private void collectContent(AbstractSpan span, Object[] allArguments, Generation generation, long totalTokens) { + private void collectContent(AbstractSpan span, Object[] allArguments, ChatResponse response, long totalTokens) { int tokenThreshold = SpringAiPluginConfig.Plugin.SpringAi.CONTENT_COLLECT_THRESHOLD_TOKENS; if (tokenThreshold >= 0 && totalTokens < tokenThreshold) { @@ -146,7 +150,7 @@ private void collectContent(AbstractSpan span, Object[] allArguments, Generation } if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_COMPLETION) { - collectCompletion(span, generation); + collectCompletion(span, response); } } @@ -161,33 +165,25 @@ private void collectPrompt(AbstractSpan span, Object[] allArguments) { return; } + InputMessages inputMessages = InputMessages.fromPrompt(prompt); + String inputMessagesJson = inputMessages.toJson(); int limit = SpringAiPluginConfig.Plugin.SpringAi.PROMPT_LENGTH_LIMIT; - if (limit > 0 && promptText.length() > limit) { - promptText = promptText.substring(0, limit); - } - - StringBuilder stringBuilder = new StringBuilder(); - for (Message instruction : prompt.getInstructions()) { - stringBuilder.append(instruction.getText()); + if (limit > 0 && inputMessagesJson.length() > limit) { + inputMessagesJson = inputMessagesJson.substring(0, limit); } - Tags.GEN_AI_INPUT_MESSAGES.set(span, promptText); + Tags.GEN_AI_INPUT_MESSAGES.set(span, inputMessagesJson); } - private void collectCompletion(AbstractSpan span, Generation generation) { - if (generation == null || generation.getOutput() == null) { - return; - } - - String completionText = generation.getOutput().getText(); - if (completionText == null) { - return; - } + private void collectCompletion(AbstractSpan span, ChatResponse response) { + OutputMessages outputMessages = OutputMessages.fromChatResponse(response); + String outputMessagesJson = outputMessages.toJson(); int limit = SpringAiPluginConfig.Plugin.SpringAi.COMPLETION_LENGTH_LIMIT; - if (limit > 0 && completionText.length() > limit) { - completionText = completionText.substring(0, limit); + + if (limit > 0 && outputMessagesJson.length() > limit) { + outputMessagesJson = outputMessagesJson.substring(0, limit); } - Tags.GEN_AI_OUTPUT_MESSAGES.set(span, completionText); + Tags.GEN_AI_OUTPUT_MESSAGES.set(span, outputMessagesJson); } } 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 abaf0ee93b..ff597207ee 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 @@ -27,10 +27,13 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; +import org.apache.skywalking.apm.network.trace.component.OfficialComponent; import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; import org.apache.skywalking.apm.plugin.spring.ai.v1.config.SpringAiPluginConfig; import org.apache.skywalking.apm.plugin.spring.ai.v1.contant.Constants; import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; +import org.apache.skywalking.apm.plugin.spring.ai.v1.messages.InputMessages; +import org.apache.skywalking.apm.plugin.spring.ai.v1.messages.OutputMessages; import org.springframework.ai.chat.metadata.ChatResponseMetadata; import org.springframework.ai.chat.metadata.Usage; import org.springframework.ai.chat.model.ChatResponse; @@ -41,6 +44,8 @@ import reactor.core.publisher.Flux; import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; @@ -49,19 +54,21 @@ public class ChatModelStreamInterceptor implements InstanceMethodsAroundIntercep @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { ChatModelMetadataResolver.ApiMetadata apiMetadata = ChatModelMetadataResolver.getMetadata(objInst); - String providerName = AiProviderEnum.UNKNOW.getValue(); + String providerName = AiProviderEnum.UNKNOWN.getValue(); + OfficialComponent component = ComponentsDefine.SPRING_AI_UNKNOWN; String peer = null; if (apiMetadata != null) { if (apiMetadata.getProviderName() != null) { providerName = apiMetadata.getProviderName(); + component = apiMetadata.getComponent(); } peer = apiMetadata.getPeer(); } AbstractSpan span = ContextManager.createExitSpan("Spring-ai/" + providerName + "/stream", peer); SpanLayer.asGenAI(span); - span.setComponent(ComponentsDefine.SPRING_AI); + span.setComponent(component); SpanLayer.asGenAI(span); Prompt prompt = (Prompt) allArguments[0]; @@ -212,27 +219,36 @@ private void collectPrompt(AbstractSpan span, Object[] allArguments) { if (prompt == null) { return; } - String promptText = prompt.getContents(); - if (promptText == null) { - return; - } + + InputMessages inputMessages = InputMessages.fromPrompt(prompt); + String inputMessagesJson = inputMessages.toJson(); + int limit = SpringAiPluginConfig.Plugin.SpringAi.PROMPT_LENGTH_LIMIT; - Tags.GEN_AI_INPUT_MESSAGES.set(span, truncate(promptText, limit)); + if (limit > 0 && inputMessagesJson.length() > limit) { + inputMessagesJson = inputMessagesJson.substring(0, limit); + } + + Tags.GEN_AI_INPUT_MESSAGES.set(span, inputMessagesJson); } private void collectCompletion(AbstractSpan span, StreamState state) { - int limit = SpringAiPluginConfig.Plugin.SpringAi.COMPLETION_LENGTH_LIMIT; - Tags.GEN_AI_OUTPUT_MESSAGES.set(span, truncate(state.completionBuilder.toString(), limit)); - } - private String truncate(String s, int limit) { - if (s == null) { - return null; + String fullText = state.completionBuilder.toString(); + String finishReason = state.finishReason.get(); + List parts = new ArrayList<>(); + if (fullText != null && !fullText.isEmpty()) { + parts.add(new InputMessages.TextPart(fullText)); } - if (limit > 0 && s.length() > limit) { - return s.substring(0, limit); + + OutputMessages outputMessages = OutputMessages.create().append(OutputMessages.OutputMessage.create("assistant", parts, finishReason)); + String outputMessagesJson = outputMessages.toJson(); + + int limit = SpringAiPluginConfig.Plugin.SpringAi.COMPLETION_LENGTH_LIMIT; + if (limit > 0 && outputMessagesJson.length() > limit) { + outputMessagesJson = outputMessagesJson.substring(0, limit); } - return s; + + Tags.GEN_AI_OUTPUT_MESSAGES.set(span, outputMessagesJson); } private Long readAndClearStartTime() { 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/common/ChatModelMetadataResolver.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/common/ChatModelMetadataResolver.java index 0eac0a6157..e8010d2d0d 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/common/ChatModelMetadataResolver.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/common/ChatModelMetadataResolver.java @@ -20,6 +20,8 @@ import org.apache.skywalking.apm.agent.core.logging.api.ILog; import org.apache.skywalking.apm.agent.core.logging.api.LogManager; +import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; +import org.apache.skywalking.apm.network.trace.component.OfficialComponent; import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; import java.util.HashMap; @@ -36,29 +38,56 @@ public class ChatModelMetadataResolver { if (provider.getModelClassName() != null && provider.getValue() != null) { MODEL_METADATA_MAP.put( provider.getModelClassName(), - new ApiMetadata(provider.getValue()) + new ApiMetadata(provider.getValue(), matchComponent(provider)) ); } } } - public static ApiMetadata getMetadata(Object chatModelInstance) { - ApiMetadata metadata = MODEL_METADATA_MAP.get(chatModelInstance.getClass().getName()); - if (metadata == null) { - return null; + private static OfficialComponent matchComponent(AiProviderEnum provider) { + switch (provider) { + case ANTHROPIC_CLAUDE: + return ComponentsDefine.SPRING_AI_ANTHROPIC; + case AMAZON_BEDROCK_CONVERSE: + return ComponentsDefine.SPRING_AI_BEDROCK; + case AZURE_OPENAI: + return ComponentsDefine.SPRING_AI_AZURE_OPENAI; + case OCI_GENAI_COHERE: + return ComponentsDefine.SPRING_AI_COHERE; + case DEEPSEEK: + return ComponentsDefine.SPRING_AI_DEEPSEEK; + case GOOGLE_GENAI: + return ComponentsDefine.SPRING_AI_GOOGLE_GENAI; + case GOOGLE_VERTEXAI_GEMINI: + return ComponentsDefine.SPRING_AI_VERTEXAI; + case MISTRAL_AI: + return ComponentsDefine.SPRING_AI_MISTRAL_AI; + case OPENAI: + return ComponentsDefine.SPRING_AI_OPENAI; + case HUGGINGFACE: + return ComponentsDefine.SPRING_AI_HUGGINGFACE; + case MINIMAX: + return ComponentsDefine.SPRING_AI_MINIMAX; + case OLLAMA: + return ComponentsDefine.SPRING_AI_OLLAMA; + case OPENAI_SDK_OFFICIAL: + return ComponentsDefine.SPRING_AI_OPENAI_SDK; + case ZHIPU_AI: + return ComponentsDefine.SPRING_AI_ZHIPU_AI; + case UNKNOWN: + default: + return ComponentsDefine.SPRING_AI_UNKNOWN; } + } + public static ApiMetadata getMetadata(Object chatModelInstance) { + ApiMetadata metadata = MODEL_METADATA_MAP.get(chatModelInstance.getClass().getName()); return metadata; } public static ApiMetadata getMetadata(String modelClassName) { try { - ApiMetadata metadata = MODEL_METADATA_MAP.get(modelClassName); - if (metadata == null) { - return null; - } - - return metadata; + return MODEL_METADATA_MAP.get(modelClassName); } catch (Exception e) { LOGGER.error("spring-ai plugin get modelMetadata error: ", e); return null; @@ -68,17 +97,23 @@ public static ApiMetadata getMetadata(String modelClassName) { public static class ApiMetadata { private final String providerName; + private final OfficialComponent component; private volatile String baseUrl; private volatile String completionsPath; - ApiMetadata(String providerName) { + ApiMetadata(String providerName, OfficialComponent component) { this.providerName = providerName; + this.component = component; } public String getProviderName() { return providerName; } + public OfficialComponent getComponent() { + return component; + } + public String getBaseUrl() { return baseUrl; } @@ -104,4 +139,4 @@ public String getPeer() { return providerName; } } -} +} \ No newline at end of file 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/enums/AiProviderEnum.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/enums/AiProviderEnum.java index 25a330d31a..5137ab7d7e 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/enums/AiProviderEnum.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/enums/AiProviderEnum.java @@ -20,7 +20,7 @@ public enum AiProviderEnum { - UNKNOW("unknow", null), + UNKNOWN("unknown", null), ANTHROPIC_CLAUDE("anthropic", "org.springframework.ai.anthropic.AnthropicChatModel"), 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/messages/InputMessages.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/messages/InputMessages.java new file mode 100644 index 0000000000..794748bc49 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/messages/InputMessages.java @@ -0,0 +1,271 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.messages; + +import org.apache.skywalking.apm.agent.core.util.GsonUtil; +import org.springframework.ai.chat.messages.AssistantMessage; +import org.springframework.ai.chat.messages.Message; +import org.springframework.ai.chat.messages.MessageType; +import org.springframework.ai.chat.messages.ToolResponseMessage; +import org.springframework.ai.chat.messages.UserMessage; +import org.springframework.ai.chat.prompt.Prompt; +import org.springframework.ai.content.Media; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class InputMessages { + + private final List messages = new ArrayList<>(); + + public static InputMessages create() { + return new InputMessages(); + } + + public InputMessages append(InputMessage message) { + this.messages.add(message); + return this; + } + + public String toJson() { + return GsonUtil.toJson( + messages.stream() + .map(InputMessage::toMap) + .collect(Collectors.toList()) + ); + } + + public static class InputMessage { + private final String role; + private final List parts; + + private InputMessage(String role, List parts) { + this.role = role; + this.parts = parts; + } + + public static InputMessage create(String role, List parts) { + return new InputMessage(role, parts); + } + + public Map toMap() { + List> partMaps = parts.stream() + .map(MessagePart::toMap) + .collect(Collectors.toList()); + + Map map = new HashMap<>(); + map.put("role", role != null ? role : "unknown"); + map.put("parts", partMaps); + return map; + } + } + + public interface MessagePart { + Map toMap(); + } + + public static class TextPart implements MessagePart { + private final String content; + + public TextPart(String content) { + this.content = content; + } + + @Override + public Map toMap() { + return Map.of("type", "text", "content", content != null ? content : ""); + } + } + + public static class ToolCallPart implements MessagePart { + private final String id; + private final String name; + private final String arguments; + + public ToolCallPart(String id, String name, String arguments) { + this.id = id; + this.name = name; + this.arguments = arguments; + } + + @Override + public Map toMap() { + Map map = new java.util.LinkedHashMap<>(); + map.put("type", "tool_call"); + if (id != null) { + map.put("id", id); + } + map.put("name", name != null ? name : ""); + map.put("arguments", arguments != null ? arguments : ""); + return map; + } + } + + public static class ToolCallResponsePart implements MessagePart { + private final String id; + private final String result; + + public ToolCallResponsePart(String id, String result) { + this.id = id; + this.result = result; + } + + @Override + public Map toMap() { + Map map = new LinkedHashMap<>(); + map.put("type", "tool_call_response"); + if (id != null) { + map.put("id", id); + } + map.put("result", result != null ? result : ""); + return map; + } + } + + public static InputMessages fromPrompt(Prompt prompt) { + InputMessages inputMessages = InputMessages.create(); + + if (prompt == null || prompt.getInstructions() == null) { + return inputMessages; + } + + for (Message message : prompt.getInstructions()) { + MessageType type = message.getMessageType(); + + switch (type) { + case SYSTEM: + inputMessages.append(InputMessage.create( + type.getValue(), + textParts(message.getText()) + )); + break; + + case USER: + inputMessages.append(InputMessage.create( + type.getValue(), + userMessageParts(message) + )); + break; + + case ASSISTANT: + inputMessages.append(InputMessage.create( + type.getValue(), + assistantMessageParts(message) + )); + break; + + case TOOL: + inputMessages.append(InputMessage.create( + type.getValue(), + toolMessageParts(message) + )); + break; + default: + inputMessages.append(InputMessage.create( + type.getValue(), + textParts(message.getText()) + )); + break; + } + } + + return inputMessages; + } + + private static List textParts(String text) { + List parts = new ArrayList<>(); + if (text != null && !text.isEmpty()) { + parts.add(new TextPart(text)); + } + return parts; + } + + private static List userMessageParts(Message message) { + List parts = new ArrayList<>(); + + String text = message.getText(); + if (text != null && !text.isEmpty()) { + parts.add(new TextPart(text)); + } + + if (message instanceof UserMessage) { + UserMessage userMessage = (UserMessage) message; + if (userMessage.getMedia() != null) { + for (Media media : userMessage.getMedia()) { + parts.add(new TextPart("[media: " + media.getMimeType() + "]")); + } + } + } + + return parts; + } + + private static List assistantMessageParts(Message message) { + List parts = new ArrayList<>(); + + String text = message.getText(); + if (text != null && !text.isEmpty()) { + parts.add(new TextPart(text)); + } + + if (message instanceof AssistantMessage) { + AssistantMessage assistantMessage = (AssistantMessage) message; + List toolCalls = assistantMessage.getToolCalls(); + if (toolCalls != null) { + for (AssistantMessage.ToolCall toolCall : toolCalls) { + parts.add(new ToolCallPart( + toolCall.id(), + toolCall.name(), + toolCall.arguments() + )); + } + } + } + + return parts; + } + + private static List toolMessageParts(Message message) { + List parts = new ArrayList<>(); + + if (message instanceof ToolResponseMessage) { + ToolResponseMessage toolResponse = (ToolResponseMessage) message; + List responses = toolResponse.getResponses(); + if (responses != null) { + for (ToolResponseMessage.ToolResponse response : responses) { + parts.add(new ToolCallResponsePart( + response.id(), + response.responseData() + )); + } + } + } else { + String text = message.getText(); + if (text != null && !text.isEmpty()) { + parts.add(new ToolCallResponsePart(null, text)); + } + } + + return parts; + } +} 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/messages/OutputMessages.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/messages/OutputMessages.java new file mode 100644 index 0000000000..bc73165fc0 --- /dev/null +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/java/org/apache/skywalking/apm/plugin/spring/ai/v1/messages/OutputMessages.java @@ -0,0 +1,121 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.skywalking.apm.plugin.spring.ai.v1.messages; + +import org.apache.skywalking.apm.agent.core.util.GsonUtil; +import org.springframework.ai.chat.messages.AssistantMessage; +import org.springframework.ai.chat.model.ChatResponse; +import org.springframework.ai.chat.model.Generation; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class OutputMessages { + private final List messages = new ArrayList<>(); + + public static OutputMessages create() { + return new OutputMessages(); + } + + public OutputMessages append(OutputMessage message) { + this.messages.add(message); + return this; + } + + public String toJson() { + return GsonUtil.toJson( + messages.stream() + .map(OutputMessage::toMap) + .collect(Collectors.toList()) + ); + } + + public static class OutputMessage { + private final String role; + private final List parts; + private final String finishReason; + + private OutputMessage(String role, List parts, String finishReason) { + this.role = role; + this.parts = parts; + this.finishReason = finishReason; + } + + public static OutputMessage create(String role, List parts, String finishReason) { + return new OutputMessage(role, parts, finishReason); + } + + public Map toMap() { + Map map = new LinkedHashMap<>(); + map.put("role", role != null ? role : "assistant"); + map.put("parts", parts.stream() + .map(InputMessages.MessagePart::toMap) + .collect(Collectors.toList())); + if (finishReason != null && !finishReason.isEmpty()) { + map.put("finish_reason", finishReason); + } + return map; + } + } + + public static OutputMessages fromChatResponse(ChatResponse chatResponse) { + OutputMessages outputMessages = OutputMessages.create(); + + if (chatResponse == null || chatResponse.getResults() == null) { + return outputMessages; + } + + for (Generation generation : chatResponse.getResults()) { + List messageParts = new ArrayList<>(); + + AssistantMessage assistantMessage = generation.getOutput(); + if (assistantMessage != null) { + // Text content + String text = assistantMessage.getText(); + if (text != null && !text.isEmpty()) { + messageParts.add(new InputMessages.TextPart(text)); + } + + // Tool calls + List toolCalls = assistantMessage.getToolCalls(); + if (toolCalls != null) { + for (AssistantMessage.ToolCall toolCall : toolCalls) { + messageParts.add(new InputMessages.ToolCallPart( + toolCall.id(), + toolCall.name(), + toolCall.arguments() + )); + } + } + } + + String finishReason = ""; + if (generation.getMetadata() != null && generation.getMetadata().getFinishReason() != null) { + finishReason = generation.getMetadata().getFinishReason().toLowerCase(); + } + + outputMessages.append(OutputMessage.create("assistant", messageParts, finishReason)); + } + + return outputMessages; + } +} diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def index 47f85834f3..7e2b0cd68c 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -16,7 +16,6 @@ spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.ChatModelInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.ToolCallbackInstrumentation -spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.VectorStoreRetrieverInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.DefaultToolCallingManagerInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.DefaultToolCallingManagerInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.AnthropicApiInstrumentation diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index 7abee75316..3087440021 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -17,61 +17,110 @@ segmentItems: - serviceName: spring-ai-1.x-scenario segmentSize: gt 0 segments: + - segmentId: not null spans: - - operationName: Spring-ai/tool/get_weather + + - operationName: GET:/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case + parentSpanId: -1 + spanId: 0 + spanLayer: Http + spanType: Entry + componentId: 1 + tags: + - { key: url, value: http://localhost:8080/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case } + - { key: http.method, value: GET } + - { key: http.status_code, value: '200' } + + - operationName: Spring-ai/openai/call + parentSpanId: 0 + spanId: 1 + spanLayer: UNRECOGNIZED + spanType: Exit + peer: http://localhost:8080/spring-ai-1.x-scenario/llm/v1/chat/completions + tags: + - { key: gen_ai.operation.name, value: chat } + - { key: gen_ai.provider.name, value: openai } + - { key: gen_ai.request.model, value: gpt-4.1-2025-04-14 } + - { key: gen_ai.request.temperature, value: '0.7' } + - { key: gen_ai.request.top_p, value: '0.9' } + - { key: gen_ai.output.messages, value: "The weather in New York is currently sunny with a temperature of 10°C." } + + - operationName: Spring-ai/tool/call parentSpanId: 1 spanId: 2 spanLayer: Unknown - startTime: not null - endTime: not null - componentId: 164 - isError: false spanType: Local - peer: '' - skipAnalysis: 'false' + + - operationName: Spring-ai/tool/execute/get_weather + parentSpanId: 2 + spanId: 3 + spanLayer: UNRECOGNIZED + spanType: Local tags: - { key: gen_ai.tool.name, value: get_weather } - - { key: gen_ai.tool.input, value: '{"arg0":"new york"}' } - - { key: gen_ai.tool.output, value: '"Sunny, 10°C"' } + - { key: gen_ai.operation.name, value: execute_tool } + - { key: gen_ai.tool.call.arguments, value: '{"arg0":"new york"}' } + - { key: gen_ai.tool.call.result, value: '"Sunny, 10°C"' } - - operationName: Spring-ai/chat-client/call + - operationName: Spring-ai/openai/stream parentSpanId: 0 - spanId: 1 + spanId: 4 + spanLayer: UNRECOGNIZED + spanType: Exit + peer: http://localhost:8080/spring-ai-1.x-scenario/llm/v1/chat/completions + tags: + - { key: gen_ai.operation.name, value: chat } + - { key: gen_ai.provider.name, value: openai } + - { key: gen_ai.request.model, value: gpt-4.1-2025-04-14 } + - { key: gen_ai.stream.ttfr, value: '385' } + - { key: gen_ai.response.id, value: chatcmpl-cb9fe83f-bc71-4e48-a26e-69c444e73d9d } + + - operationName: /spring-ai-1.x-scenario/llm/v1/chat/completions + parentSpanId: 0 + spanId: 5 + spanLayer: Http + spanType: Exit + componentId: 99 + tags: + - { key: url, value: http://localhost:8080/spring-ai-1.x-scenario/llm/v1/chat/completions } + - { key: http.method, value: POST } + - { key: http.status_code, value: '200' } + + - segmentId: not null + spans: + + - operationName: Spring-ai/tool/call + parentSpanId: -1 + spanId: 0 spanLayer: Unknown - startTime: not null - endTime: not null - componentId: 164 - isError: false spanType: Local - peer: '' - skipAnalysis: 'false' + refs: + - { parentSpanId: 4, type: CROSS_THREAD } + + - operationName: Spring-ai/tool/execute/get_weather + parentSpanId: 0 + spanId: 1 + spanLayer: UNRECOGNIZED + spanType: Local tags: - - { key: gen_ai.request.model, value: gpt-4.1-2025-04-14 } - - { key: gen_ai.temperature, value: '0.7' } - - { key: gen_ai.top.k, value: null } - - { key: gen_ai.top.p, value: '0.9' } - - { key: gen_ai.response.id, value: not null } - - { key: gen_ai.response.model, value: gpt-4.1-2025-04-14 } - - { key: gen_ai.usage.input_tokens, value: not null } - - { key: gen_ai.usage.output_tokens, value: not null } - - { key: gen_ai.usage.total_tokens, value: not null } - - { key: gen_ai.response.finish_reasons, value: STOP } - - { key: gen_ai.prompt, value: "What's the weather in New York?" } - - { key: gen_ai.completion, value: "The weather in New York is currently sunny with a temperature of 10°C." } + - { key: gen_ai.tool.name, value: get_weather } + - { key: gen_ai.operation.name, value: execute_tool } + - { key: gen_ai.tool.call.arguments, value: '{"arg0":"new york"}' } + - { key: gen_ai.tool.call.result, value: '"Sunny, 10°C"' } - - operationName: GET:/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case + - segmentId: not null + spans: + + - operationName: /spring-ai-1.x-scenario/llm/v1/chat/completions parentSpanId: -1 spanId: 0 spanLayer: Http - startTime: not null - endTime: not null - componentId: 1 - isError: false - spanType: Entry - peer: '' - skipAnalysis: 'false' + spanType: Exit + componentId: 99 + refs: + - { parentSpanId: 4, type: CROSS_THREAD } tags: - - { key: url, value: http://localhost:8080/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case } - - { key: http.method, value: GET } + - { key: url, value: http://localhost:8080/spring-ai-1.x-scenario/llm/v1/chat/completions } + - { key: http.method, value: POST } - { key: http.status_code, value: '200' } diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java index 864d5b2ea4..4e7a83e507 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java @@ -142,6 +142,22 @@ public Object completions(@RequestBody JSONObject request, HttpServletResponse r } ], "created": 1768490813, + "id": "chatcmpl-CyJXJt7gxwDgz", + "usage": { + "completion_tokens": 17, + "completion_tokens_details": { + "accepted_prediction_tokens": 0, + "audio_tokens": 0, + "reasoning_tokens": 0, + "rejected_prediction_tokens": 0 + }, + "prompt_tokens": 52, + "prompt_tokens_details": { + "audio_tokens": 0, + "cached_tokens": 0 + }, + "total_tokens": 69 + } "model": "gpt-4.1-2025-04-14", "object": "chat.completion" } From cbb951fde202d9074e3ed9487ea6915288977c27 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Sat, 21 Feb 2026 12:23:12 +0800 Subject: [PATCH 24/48] fix --- .../trace/component/ComponentsDefine.java | 6 +- .../ai/v1/ChatModelCallInterceptor.java | 41 +++++----- .../ai/v1/ChatModelStreamInterceptor.java | 23 ++---- .../v1/common/ChatModelMetadataResolver.java | 7 +- .../v1/define/ChatModelInstrumentation.java | 2 +- .../config/expectedData.yaml | 74 +++---------------- .../httpclient/controller/CaseController.java | 9 --- .../controller/LLMMockController.java | 2 +- 8 files changed, 43 insertions(+), 121 deletions(-) diff --git a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java index 9fa2973619..a8b57ba7f8 100755 --- a/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java +++ b/apm-protocol/apm-network/src/main/java/org/apache/skywalking/apm/network/trace/component/ComponentsDefine.java @@ -291,10 +291,8 @@ public class ComponentsDefine { public static final OfficialComponent SPRING_AI_OLLAMA = new OfficialComponent(176, "spring-ai-ollama"); - public static final OfficialComponent SPRING_AI_OPENAI_SDK = new OfficialComponent(177, "spring-ai-openai-sdk"); + public static final OfficialComponent SPRING_AI_ZHIPU_AI = new OfficialComponent(177, "spring-ai-zhipu-ai"); - public static final OfficialComponent SPRING_AI_ZHIPU_AI = new OfficialComponent(178, "spring-ai-zhipu-ai"); - - public static final OfficialComponent SPRING_AI = new OfficialComponent(179, "spring-ai"); + public static final OfficialComponent SPRING_AI = new OfficialComponent(178, "spring-ai"); } 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/ChatModelCallInterceptor.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/ChatModelCallInterceptor.java index 557e696400..12c1a901f5 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/ChatModelCallInterceptor.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/ChatModelCallInterceptor.java @@ -25,12 +25,9 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; -import org.apache.skywalking.apm.network.trace.component.OfficialComponent; import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; import org.apache.skywalking.apm.plugin.spring.ai.v1.config.SpringAiPluginConfig; import org.apache.skywalking.apm.plugin.spring.ai.v1.contant.Constants; -import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; import org.apache.skywalking.apm.plugin.spring.ai.v1.messages.InputMessages; import org.apache.skywalking.apm.plugin.spring.ai.v1.messages.OutputMessages; import org.springframework.ai.chat.metadata.ChatResponseMetadata; @@ -47,20 +44,9 @@ public class ChatModelCallInterceptor implements InstanceMethodsAroundIntercepto @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { ChatModelMetadataResolver.ApiMetadata apiMetadata = ChatModelMetadataResolver.getMetadata(objInst); - String providerName = AiProviderEnum.UNKNOWN.getValue(); - OfficialComponent component = ComponentsDefine.SPRING_AI_UNKNOWN; - String peer = null; - - if (apiMetadata != null) { - if (apiMetadata.getProviderName() != null) { - providerName = apiMetadata.getProviderName(); - component = apiMetadata.getComponent(); - } - peer = apiMetadata.getPeer(); - } - AbstractSpan span = ContextManager.createExitSpan("Spring-ai/" + providerName + "/call", peer); + AbstractSpan span = ContextManager.createExitSpan("Spring-ai/" + apiMetadata.getProviderName() + "/call", apiMetadata.getPeer()); SpanLayer.asGenAI(span); - span.setComponent(component); + span.setComponent(apiMetadata.getComponent()); Tags.GEN_AI_OPERATION_NAME.set(span, Constants.CHAT); Tags.GEN_AI_PROVIDER_NAME.set(span, apiMetadata.getProviderName()); @@ -70,10 +56,18 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr return; } - Tags.GEN_AI_REQUEST_MODEL.set(span, chatOptions.getModel()); - Tags.GEN_AI_TEMPERATURE.set(span, String.valueOf(chatOptions.getTemperature())); - Tags.GEN_AI_TOP_K.set(span, String.valueOf(chatOptions.getTopK())); - Tags.GEN_AI_TOP_P.set(span, String.valueOf(chatOptions.getTopP())); + if (chatOptions.getModel() != null) { + Tags.GEN_AI_REQUEST_MODEL.set(span, chatOptions.getModel()); + } + if (chatOptions.getTemperature() != null) { + Tags.GEN_AI_TEMPERATURE.set(span, String.valueOf(chatOptions.getTemperature())); + } + if (chatOptions.getTopK() != null) { + Tags.GEN_AI_TOP_K.set(span, String.valueOf(chatOptions.getTopK())); + } + if (chatOptions.getTopP() != null) { + Tags.GEN_AI_TOP_P.set(span, String.valueOf(chatOptions.getTopP())); + } } @Override @@ -83,11 +77,12 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA } try { - ChatResponse response = (ChatResponse) ret; - if (response == null) { - return null; + if (!(ret instanceof ChatResponse)) { + return ret; } + ChatResponse response = (ChatResponse) ret; + AbstractSpan span = ContextManager.activeSpan(); ChatResponseMetadata metadata = response.getMetadata(); 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 ff597207ee..71cf537ea7 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 @@ -26,12 +26,9 @@ import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; -import org.apache.skywalking.apm.network.trace.component.ComponentsDefine; -import org.apache.skywalking.apm.network.trace.component.OfficialComponent; import org.apache.skywalking.apm.plugin.spring.ai.v1.common.ChatModelMetadataResolver; import org.apache.skywalking.apm.plugin.spring.ai.v1.config.SpringAiPluginConfig; import org.apache.skywalking.apm.plugin.spring.ai.v1.contant.Constants; -import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; import org.apache.skywalking.apm.plugin.spring.ai.v1.messages.InputMessages; import org.apache.skywalking.apm.plugin.spring.ai.v1.messages.OutputMessages; import org.springframework.ai.chat.metadata.ChatResponseMetadata; @@ -54,21 +51,12 @@ public class ChatModelStreamInterceptor implements InstanceMethodsAroundIntercep @Override public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allArguments, Class[] argumentsTypes, MethodInterceptResult result) throws Throwable { ChatModelMetadataResolver.ApiMetadata apiMetadata = ChatModelMetadataResolver.getMetadata(objInst); - String providerName = AiProviderEnum.UNKNOWN.getValue(); - OfficialComponent component = ComponentsDefine.SPRING_AI_UNKNOWN; - String peer = null; - - if (apiMetadata != null) { - if (apiMetadata.getProviderName() != null) { - providerName = apiMetadata.getProviderName(); - component = apiMetadata.getComponent(); - } - peer = apiMetadata.getPeer(); - } - AbstractSpan span = ContextManager.createExitSpan("Spring-ai/" + providerName + "/stream", peer); + AbstractSpan span = ContextManager.createExitSpan("Spring-ai/" + apiMetadata.getProviderName() + "/stream", apiMetadata.getPeer()); SpanLayer.asGenAI(span); - span.setComponent(component); + span.setComponent(apiMetadata.getComponent()); + Tags.GEN_AI_OPERATION_NAME.set(span, Constants.CHAT); + Tags.GEN_AI_PROVIDER_NAME.set(span, apiMetadata.getProviderName()); SpanLayer.asGenAI(span); Prompt prompt = (Prompt) allArguments[0]; @@ -81,8 +69,6 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr return; } - Tags.GEN_AI_OPERATION_NAME.set(span, Constants.CHAT); - Tags.GEN_AI_PROVIDER_NAME.set(span, apiMetadata.getProviderName()); Tags.GEN_AI_REQUEST_MODEL.set(span, chatOptions.getModel()); Tags.GEN_AI_TEMPERATURE.set(span, String.valueOf(chatOptions.getTemperature())); Tags.GEN_AI_TOP_K.set(span, String.valueOf(chatOptions.getTopK())); @@ -96,6 +82,7 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA if (!ContextManager.isActive()) { return ret; } + final AbstractSpan span = ContextManager.activeSpan(); final ContextSnapshot snapshot = ContextManager.capture(); 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/common/ChatModelMetadataResolver.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/common/ChatModelMetadataResolver.java index e8010d2d0d..501f5e026c 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/common/ChatModelMetadataResolver.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/common/ChatModelMetadataResolver.java @@ -24,6 +24,7 @@ import org.apache.skywalking.apm.network.trace.component.OfficialComponent; import org.apache.skywalking.apm.plugin.spring.ai.v1.enums.AiProviderEnum; +import javax.validation.constraints.NotNull; import java.util.HashMap; import java.util.Map; @@ -71,7 +72,7 @@ private static OfficialComponent matchComponent(AiProviderEnum provider) { case OLLAMA: return ComponentsDefine.SPRING_AI_OLLAMA; case OPENAI_SDK_OFFICIAL: - return ComponentsDefine.SPRING_AI_OPENAI_SDK; + return ComponentsDefine.SPRING_AI_OPENAI; case ZHIPU_AI: return ComponentsDefine.SPRING_AI_ZHIPU_AI; case UNKNOWN: @@ -80,8 +81,12 @@ private static OfficialComponent matchComponent(AiProviderEnum provider) { } } + @NotNull public static ApiMetadata getMetadata(Object chatModelInstance) { ApiMetadata metadata = MODEL_METADATA_MAP.get(chatModelInstance.getClass().getName()); + if (metadata == null) { + MODEL_METADATA_MAP.get(AiProviderEnum.UNKNOWN); + } return metadata; } 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/define/ChatModelInstrumentation.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/define/ChatModelInstrumentation.java index d084f6a814..13aa1d381d 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/define/ChatModelInstrumentation.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/define/ChatModelInstrumentation.java @@ -84,7 +84,7 @@ public String getMethodsInterceptor() { @Override public boolean isOverrideArgs() { - return false; + return true; } } }; diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index 3087440021..d822590af8 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -20,7 +20,6 @@ segmentItems: - segmentId: not null spans: - - operationName: GET:/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case parentSpanId: -1 spanId: 0 @@ -36,6 +35,7 @@ segmentItems: parentSpanId: 0 spanId: 1 spanLayer: UNRECOGNIZED + componentId: 173 spanType: Exit peer: http://localhost:8080/spring-ai-1.x-scenario/llm/v1/chat/completions tags: @@ -44,7 +44,15 @@ segmentItems: - { key: gen_ai.request.model, value: gpt-4.1-2025-04-14 } - { key: gen_ai.request.temperature, value: '0.7' } - { key: gen_ai.request.top_p, value: '0.9' } - - { key: gen_ai.output.messages, value: "The weather in New York is currently sunny with a temperature of 10°C." } + - { key: gen_ai.request.top_k, value: null } + - { key: gen_ai.response.id, value: '' } + - { key: gen_ai.response.model, value: gpt-4.1-2025-04-14 } + - { key: gen_ai.usage.input_tokens, value: '52' } + - { key: gen_ai.usage.output_tokens, value: '17' } + - { key: gen_ai.client.token.usage, value: '69' } + - { key: gen_ai.response.finish_reasons, value: STOP } + - { key: gen_ai.input.messages, value: '[{"role":"system","parts":[{"type":"text","content":"You are a professional technical assistant.\\nStrictly use the provided context to answer questions.\\nIf the information is not in the context, say: \\\"I''m sorry, I don''t have that information in my knowledge base.\\\"\\nDo not use outside knowledge. Be concise.\\n"}]},{"role":"user","parts":[{"type":"text","content":"What''s the weather in New York?"}]}]' } + - { key: gen_ai.output.messages, value: '[{"role":"assistant","parts":[{"type":"text","content":"The weather in New York is currently sunny with a temperature of 10°C."}],"finish_reason":"stop"}]' } - operationName: Spring-ai/tool/call parentSpanId: 1 @@ -62,65 +70,3 @@ segmentItems: - { key: gen_ai.operation.name, value: execute_tool } - { key: gen_ai.tool.call.arguments, value: '{"arg0":"new york"}' } - { key: gen_ai.tool.call.result, value: '"Sunny, 10°C"' } - - - operationName: Spring-ai/openai/stream - parentSpanId: 0 - spanId: 4 - spanLayer: UNRECOGNIZED - spanType: Exit - peer: http://localhost:8080/spring-ai-1.x-scenario/llm/v1/chat/completions - tags: - - { key: gen_ai.operation.name, value: chat } - - { key: gen_ai.provider.name, value: openai } - - { key: gen_ai.request.model, value: gpt-4.1-2025-04-14 } - - { key: gen_ai.stream.ttfr, value: '385' } - - { key: gen_ai.response.id, value: chatcmpl-cb9fe83f-bc71-4e48-a26e-69c444e73d9d } - - - operationName: /spring-ai-1.x-scenario/llm/v1/chat/completions - parentSpanId: 0 - spanId: 5 - spanLayer: Http - spanType: Exit - componentId: 99 - tags: - - { key: url, value: http://localhost:8080/spring-ai-1.x-scenario/llm/v1/chat/completions } - - { key: http.method, value: POST } - - { key: http.status_code, value: '200' } - - - segmentId: not null - spans: - - - operationName: Spring-ai/tool/call - parentSpanId: -1 - spanId: 0 - spanLayer: Unknown - spanType: Local - refs: - - { parentSpanId: 4, type: CROSS_THREAD } - - - operationName: Spring-ai/tool/execute/get_weather - parentSpanId: 0 - spanId: 1 - spanLayer: UNRECOGNIZED - spanType: Local - tags: - - { key: gen_ai.tool.name, value: get_weather } - - { key: gen_ai.operation.name, value: execute_tool } - - { key: gen_ai.tool.call.arguments, value: '{"arg0":"new york"}' } - - { key: gen_ai.tool.call.result, value: '"Sunny, 10°C"' } - - - segmentId: not null - spans: - - - operationName: /spring-ai-1.x-scenario/llm/v1/chat/completions - parentSpanId: -1 - spanId: 0 - spanLayer: Http - spanType: Exit - componentId: 99 - refs: - - { parentSpanId: 4, type: CROSS_THREAD } - tags: - - { key: url, value: http://localhost:8080/spring-ai-1.x-scenario/llm/v1/chat/completions } - - { key: http.method, value: POST } - - { key: http.status_code, value: '200' } diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java index d6512b726e..e3370e89d6 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java @@ -54,15 +54,6 @@ public String testCase() throws Exception { .call() .content(); - chatClient - .prompt("What's the weather in New York?") - .system(systemPrompt) - .tools(weatherTool) - .stream() - .content() - .doOnNext(System.out::println) - .blockLast(); - return "success"; } } diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java index 4e7a83e507..fa5f66e9c3 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java @@ -157,7 +157,7 @@ public Object completions(@RequestBody JSONObject request, HttpServletResponse r "cached_tokens": 0 }, "total_tokens": 69 - } + }, "model": "gpt-4.1-2025-04-14", "object": "chat.completion" } From 9149dc91434827197b08c76fb5fba7c4de3e2b07 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Sat, 21 Feb 2026 15:46:10 +0800 Subject: [PATCH 25/48] fix --- .../config/expectedData.yaml | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index d822590af8..d4840971a3 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -20,6 +20,24 @@ segmentItems: - segmentId: not null spans: + - operationName: Spring-ai/tool/execute/get_weather + parentSpanId: 2 + spanId: 3 + spanLayer: UNRECOGNIZED + spanType: Local + tags: + - { key: gen_ai.tool.name, value: get_weather } + - { key: gen_ai.operation.name, value: execute_tool } + - { key: gen_ai.tool.call.arguments, value: '{"arg0":"new york"}' } + - { key: gen_ai.tool.call.result, value: '"Sunny, 10°C"' } + + - operationName: Spring-ai/tool/call + parentSpanId: 1 + spanId: 2 + spanLayer: Unknown + spanType: Local + + - operationName: GET:/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case parentSpanId: -1 spanId: 0 @@ -52,21 +70,4 @@ segmentItems: - { key: gen_ai.client.token.usage, value: '69' } - { key: gen_ai.response.finish_reasons, value: STOP } - { key: gen_ai.input.messages, value: '[{"role":"system","parts":[{"type":"text","content":"You are a professional technical assistant.\\nStrictly use the provided context to answer questions.\\nIf the information is not in the context, say: \\\"I''m sorry, I don''t have that information in my knowledge base.\\\"\\nDo not use outside knowledge. Be concise.\\n"}]},{"role":"user","parts":[{"type":"text","content":"What''s the weather in New York?"}]}]' } - - { key: gen_ai.output.messages, value: '[{"role":"assistant","parts":[{"type":"text","content":"The weather in New York is currently sunny with a temperature of 10°C."}],"finish_reason":"stop"}]' } - - - operationName: Spring-ai/tool/call - parentSpanId: 1 - spanId: 2 - spanLayer: Unknown - spanType: Local - - - operationName: Spring-ai/tool/execute/get_weather - parentSpanId: 2 - spanId: 3 - spanLayer: UNRECOGNIZED - spanType: Local - tags: - - { key: gen_ai.tool.name, value: get_weather } - - { key: gen_ai.operation.name, value: execute_tool } - - { key: gen_ai.tool.call.arguments, value: '{"arg0":"new york"}' } - - { key: gen_ai.tool.call.result, value: '"Sunny, 10°C"' } + - { key: gen_ai.output.messages, value: '[{"role":"assistant","parts":[{"type":"text","content":"The weather in New York is currently sunny with a temperature of 10°C."}],"finish_reason":"stop"}]' } \ No newline at end of file From a6eeffad7e915a5307b527422c5ea27937b0fa2b Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Sat, 21 Feb 2026 16:04:57 +0800 Subject: [PATCH 26/48] fix --- .../ai/v1/ChatModelStreamInterceptor.java | 11 +++++--- .../config/expectedData.yaml | 27 +++++++++---------- .../controller/LLMMockController.java | 3 ++- 3 files changed, 23 insertions(+), 18 deletions(-) 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 71cf537ea7..58f3b80b0e 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 @@ -57,7 +57,6 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr span.setComponent(apiMetadata.getComponent()); Tags.GEN_AI_OPERATION_NAME.set(span, Constants.CHAT); Tags.GEN_AI_PROVIDER_NAME.set(span, apiMetadata.getProviderName()); - SpanLayer.asGenAI(span); Prompt prompt = (Prompt) allArguments[0]; if (prompt == null) { @@ -193,8 +192,14 @@ private long collectUsageTags(AbstractSpan span, Usage usage) { if (usage == null) { return 0; } - Tags.GEN_AI_USAGE_INPUT_TOKENS.set(span, String.valueOf(usage.getPromptTokens())); - Tags.GEN_AI_USAGE_OUTPUT_TOKENS.set(span, String.valueOf(usage.getCompletionTokens())); + + if (usage.getPromptTokens() != null) { + Tags.GEN_AI_USAGE_INPUT_TOKENS.set(span, String.valueOf(usage.getPromptTokens())); + } + + if (usage.getCompletionTokens() != null) { + Tags.GEN_AI_USAGE_OUTPUT_TOKENS.set(span, String.valueOf(usage.getCompletionTokens())); + } long total = usage.getTotalTokens() != null ? usage.getTotalTokens() : 0; Tags.GEN_AI_CLIENT_TOKEN_USAGE.set(span, String.valueOf(total)); diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index d4840971a3..542bd93ba2 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -37,18 +37,6 @@ segmentItems: spanLayer: Unknown spanType: Local - - - operationName: GET:/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case - parentSpanId: -1 - spanId: 0 - spanLayer: Http - spanType: Entry - componentId: 1 - tags: - - { key: url, value: http://localhost:8080/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case } - - { key: http.method, value: GET } - - { key: http.status_code, value: '200' } - - operationName: Spring-ai/openai/call parentSpanId: 0 spanId: 1 @@ -63,11 +51,22 @@ segmentItems: - { key: gen_ai.request.temperature, value: '0.7' } - { key: gen_ai.request.top_p, value: '0.9' } - { key: gen_ai.request.top_k, value: null } - - { key: gen_ai.response.id, value: '' } + - { key: gen_ai.response.id, value: 'chatcmpl-CyJXJt7gxwDgz' } - { key: gen_ai.response.model, value: gpt-4.1-2025-04-14 } - { key: gen_ai.usage.input_tokens, value: '52' } - { key: gen_ai.usage.output_tokens, value: '17' } - { key: gen_ai.client.token.usage, value: '69' } - { key: gen_ai.response.finish_reasons, value: STOP } - { key: gen_ai.input.messages, value: '[{"role":"system","parts":[{"type":"text","content":"You are a professional technical assistant.\\nStrictly use the provided context to answer questions.\\nIf the information is not in the context, say: \\\"I''m sorry, I don''t have that information in my knowledge base.\\\"\\nDo not use outside knowledge. Be concise.\\n"}]},{"role":"user","parts":[{"type":"text","content":"What''s the weather in New York?"}]}]' } - - { key: gen_ai.output.messages, value: '[{"role":"assistant","parts":[{"type":"text","content":"The weather in New York is currently sunny with a temperature of 10°C."}],"finish_reason":"stop"}]' } \ No newline at end of file + - { key: gen_ai.output.messages, value: '[{"role":"assistant","parts":[{"type":"text","content":"The weather in New York is currently sunny with a temperature of 10°C."}],"finish_reason":"stop"}]' } + + - operationName: GET:/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case + parentSpanId: -1 + spanId: 0 + spanLayer: Http + spanType: Entry + componentId: 1 + tags: + - { key: url, value: http://localhost:8080/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case } + - { key: http.method, value: GET } + - { key: http.status_code, value: '200' } \ No newline at end of file diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java index fa5f66e9c3..7cba6ce344 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java @@ -143,7 +143,7 @@ public Object completions(@RequestBody JSONObject request, HttpServletResponse r ], "created": 1768490813, "id": "chatcmpl-CyJXJt7gxwDgz", - "usage": { + "usage": { "completion_tokens": 17, "completion_tokens_details": { "accepted_prediction_tokens": 0, @@ -176,6 +176,7 @@ public Object completions(@RequestBody JSONObject request, HttpServletResponse r } ], "created": 1768491057, + "id":"chatcmpl-CyJXJt7gxwDgz", "model": "gpt-4.1-2025-04-14", "object": "chat.completion" } From 4f9734661c75aef2cb489911e63110230f30977a Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Sat, 21 Feb 2026 16:39:52 +0800 Subject: [PATCH 27/48] fix --- .../scenarios/spring-ai-1.x-scenario/config/expectedData.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index 542bd93ba2..2c6568f220 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -50,7 +50,6 @@ segmentItems: - { key: gen_ai.request.model, value: gpt-4.1-2025-04-14 } - { key: gen_ai.request.temperature, value: '0.7' } - { key: gen_ai.request.top_p, value: '0.9' } - - { key: gen_ai.request.top_k, value: null } - { key: gen_ai.response.id, value: 'chatcmpl-CyJXJt7gxwDgz' } - { key: gen_ai.response.model, value: gpt-4.1-2025-04-14 } - { key: gen_ai.usage.input_tokens, value: '52' } From f9730ba3d7209c842bd9143389382c6ee383465b Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Sat, 21 Feb 2026 23:24:29 +0800 Subject: [PATCH 28/48] fix --- .../ai/v1/ChatModelCallInterceptor.java | 8 +++--- .../ai/v1/ChatModelStreamInterceptor.java | 25 ++++++++----------- .../ai/v1/config/SpringAiPluginConfig.java | 10 ++++---- .../src/main/resources/skywalking-plugin.def | 1 - .../config/expectedData.yaml | 4 +-- 5 files changed, 22 insertions(+), 26 deletions(-) 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/ChatModelCallInterceptor.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/ChatModelCallInterceptor.java index 12c1a901f5..51ac0776df 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/ChatModelCallInterceptor.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/ChatModelCallInterceptor.java @@ -140,11 +140,11 @@ private void collectContent(AbstractSpan span, Object[] allArguments, ChatRespon return; } - if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_PROMPT) { + if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_INPUT_MESSAGES) { collectPrompt(span, allArguments); } - if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_COMPLETION) { + if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_OUTPUT_MESSAGES) { collectCompletion(span, response); } } @@ -162,7 +162,7 @@ private void collectPrompt(AbstractSpan span, Object[] allArguments) { InputMessages inputMessages = InputMessages.fromPrompt(prompt); String inputMessagesJson = inputMessages.toJson(); - int limit = SpringAiPluginConfig.Plugin.SpringAi.PROMPT_LENGTH_LIMIT; + int limit = SpringAiPluginConfig.Plugin.SpringAi.INPUT_MESSAGES_LENGTH_LIMIT; if (limit > 0 && inputMessagesJson.length() > limit) { inputMessagesJson = inputMessagesJson.substring(0, limit); } @@ -174,7 +174,7 @@ private void collectCompletion(AbstractSpan span, ChatResponse response) { OutputMessages outputMessages = OutputMessages.fromChatResponse(response); String outputMessagesJson = outputMessages.toJson(); - int limit = SpringAiPluginConfig.Plugin.SpringAi.COMPLETION_LENGTH_LIMIT; + int limit = SpringAiPluginConfig.Plugin.SpringAi.OUTPUT_MESSAGES_LENGTH_LIMIT; if (limit > 0 && outputMessagesJson.length() > limit) { outputMessagesJson = outputMessagesJson.substring(0, limit); 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 58f3b80b0e..831bd3810f 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 @@ -115,28 +115,25 @@ private void onStreamNext(AbstractSpan span, ChatResponse response, StreamState private void onStreamFinally(AbstractSpan span, Object[] allArguments, StreamState state) { try { ChatResponse finalResponse = state.lastResponseRef.get(); - if (finalResponse == null) { - return; - } + long totalTokens = 0; - ChatResponseMetadata metadata = finalResponse.getMetadata(); - if (metadata == null) { - return; + if (finalResponse != null && finalResponse.getMetadata() != null) { + ChatResponseMetadata metadata = finalResponse.getMetadata(); + collectResponseTags(span, metadata, state); + collectUsageTags(span, metadata.getUsage()); + totalTokens = collectUsageTags(span, metadata.getUsage()); } - collectResponseTags(span, metadata, state); - - long totalTokens = collectUsageTags(span, metadata.getUsage()); - int tokenThreshold = SpringAiPluginConfig.Plugin.SpringAi.CONTENT_COLLECT_THRESHOLD_TOKENS; if (tokenThreshold >= 0 && totalTokens < tokenThreshold) { return; } - if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_PROMPT) { + if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_INPUT_MESSAGES) { collectPrompt(span, allArguments); } - if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_COMPLETION) { + + if (SpringAiPluginConfig.Plugin.SpringAi.COLLECT_OUTPUT_MESSAGES) { collectCompletion(span, state); } } catch (Throwable t) { @@ -215,7 +212,7 @@ private void collectPrompt(AbstractSpan span, Object[] allArguments) { InputMessages inputMessages = InputMessages.fromPrompt(prompt); String inputMessagesJson = inputMessages.toJson(); - int limit = SpringAiPluginConfig.Plugin.SpringAi.PROMPT_LENGTH_LIMIT; + int limit = SpringAiPluginConfig.Plugin.SpringAi.INPUT_MESSAGES_LENGTH_LIMIT; if (limit > 0 && inputMessagesJson.length() > limit) { inputMessagesJson = inputMessagesJson.substring(0, limit); } @@ -235,7 +232,7 @@ private void collectCompletion(AbstractSpan span, StreamState state) { OutputMessages outputMessages = OutputMessages.create().append(OutputMessages.OutputMessage.create("assistant", parts, finishReason)); String outputMessagesJson = outputMessages.toJson(); - int limit = SpringAiPluginConfig.Plugin.SpringAi.COMPLETION_LENGTH_LIMIT; + int limit = SpringAiPluginConfig.Plugin.SpringAi.OUTPUT_MESSAGES_LENGTH_LIMIT; if (limit > 0 && outputMessagesJson.length() > limit) { outputMessagesJson = outputMessagesJson.substring(0, limit); } 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/config/SpringAiPluginConfig.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/config/SpringAiPluginConfig.java index 9869ea3ea6..d2d5eef6f6 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/config/SpringAiPluginConfig.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/config/SpringAiPluginConfig.java @@ -30,32 +30,32 @@ public static class SpringAi { /** * Whether to collect the prompt content (input text) of the GenAI request. */ - public static boolean COLLECT_PROMPT = false; + public static boolean COLLECT_INPUT_MESSAGES = false; /** * Whether to collect the completion content (output text) of the GenAI response. */ - public static boolean COLLECT_COMPLETION = false; + public static boolean COLLECT_OUTPUT_MESSAGES = false; /** * The maximum characters of the collected prompt content. * If the content exceeds this limit, it will be truncated. * Use a negative value to represent no limit, but be aware this could cause OOM. */ - public static int PROMPT_LENGTH_LIMIT = 1024; + public static int INPUT_MESSAGES_LENGTH_LIMIT = 1024; /** * The maximum characters of the collected completion content. * If the content exceeds this limit, it will be truncated. * Use a negative value to represent no limit, but be aware this could cause OOM. */ - public static int COMPLETION_LENGTH_LIMIT = 1024; + public static int OUTPUT_MESSAGES_LENGTH_LIMIT = 1024; /** * The threshold for token usage to trigger content collection. * When set to a positive value, prompt and completion will only be collected * if the total token usage of the request exceeds this threshold. - * * This requires {@link #COLLECT_PROMPT} or {@link #COLLECT_COMPLETION} to be enabled first. + * * This requires {@link #COLLECT_INPUT_MESSAGES} or {@link #COLLECT_OUTPUT_MESSAGES} to be enabled first. * Use a negative value to disable this threshold-based filtering (collect all). */ public static int CONTENT_COLLECT_THRESHOLD_TOKENS = -1; diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def index 7e2b0cd68c..5c7eec110c 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -17,7 +17,6 @@ spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.ChatModelInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.ToolCallbackInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.DefaultToolCallingManagerInstrumentation -spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.DefaultToolCallingManagerInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.AnthropicApiInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.DeepSeekApiInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.HuggingfaceChatModelInstrumentation diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index 2c6568f220..3a5609400d 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -56,8 +56,8 @@ segmentItems: - { key: gen_ai.usage.output_tokens, value: '17' } - { key: gen_ai.client.token.usage, value: '69' } - { key: gen_ai.response.finish_reasons, value: STOP } - - { key: gen_ai.input.messages, value: '[{"role":"system","parts":[{"type":"text","content":"You are a professional technical assistant.\\nStrictly use the provided context to answer questions.\\nIf the information is not in the context, say: \\\"I''m sorry, I don''t have that information in my knowledge base.\\\"\\nDo not use outside knowledge. Be concise.\\n"}]},{"role":"user","parts":[{"type":"text","content":"What''s the weather in New York?"}]}]' } - - { key: gen_ai.output.messages, value: '[{"role":"assistant","parts":[{"type":"text","content":"The weather in New York is currently sunny with a temperature of 10°C."}],"finish_reason":"stop"}]' } + - { key: gen_ai.input.messages, value: not null } + - { key: gen_ai.output.messages, value: not null } - operationName: GET:/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case parentSpanId: -1 From a4994a59681cda3c5fe6c13dfb6b5c9339a9a255 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Sat, 21 Feb 2026 23:30:04 +0800 Subject: [PATCH 29/48] Revert "Begin 9.7.0 iteration, 9.6.0 is tagged for release. (#791)" This reverts commit b03d63c8babcface3498344bf5feb1be2883393d. --- .github/actions/build/action.yml | 1 - .github/actions/run/action.yml | 19 +--- .github/workflows/e2e.yaml | 2 +- .github/workflows/plugins-jdk11-test.3.yaml | 15 ---- .github/workflows/plugins-jdk17-test.0.yaml | 15 ---- .github/workflows/plugins-jdk17-test.1.yaml | 15 ---- .github/workflows/plugins-jdk21-test.0.yaml | 15 ---- .github/workflows/plugins-jdk25-test.0.yaml | 15 ---- .github/workflows/plugins-test.0.yaml | 15 ---- .github/workflows/plugins-test.1.yaml | 15 ---- .github/workflows/plugins-test.2.yaml | 17 +--- .github/workflows/plugins-test.3.yaml | 15 ---- .../workflows/plugins-tomcat10-test.0.yaml | 15 ---- .github/workflows/plugins-tomcat9-test.0.yaml | 15 ---- .github/workflows/publish-docker.yaml | 15 ---- CHANGES.md | 29 +++++- .../apm-toolkit-kafka/pom.xml | 2 +- .../apm-toolkit-log4j-1.x/pom.xml | 2 +- .../apm-toolkit-log4j-2.x/pom.xml | 2 +- .../apm-toolkit-logback-1.x/pom.xml | 2 +- .../apm-toolkit-meter/pom.xml | 2 +- .../apm-toolkit-micrometer-1.10/pom.xml | 2 +- .../apm-toolkit-micrometer-registry/pom.xml | 2 +- .../apm-toolkit-opentracing/pom.xml | 2 +- .../apm-toolkit-trace/pom.xml | 2 +- .../apm-toolkit-webflux/pom.xml | 2 +- apm-application-toolkit/pom.xml | 2 +- apm-commons/apm-datacarrier/pom.xml | 2 +- apm-commons/apm-util/pom.xml | 2 +- apm-commons/pom.xml | 2 +- apm-protocol/apm-network/pom.xml | 2 +- apm-protocol/pom.xml | 2 +- apm-sniffer/apm-agent-core/pom.xml | 2 +- apm-sniffer/apm-agent/pom.xml | 2 +- .../activemq-5.x-plugin/pom.xml | 2 +- .../pom.xml | 2 +- .../apm-sdk-plugin/aerospike-plugin/pom.xml | 2 +- .../apm-armeria-0.84.x-plugin/pom.xml | 2 +- .../apm-armeria-0.85.x-plugin/pom.xml | 2 +- .../apm-armeria-1.0.x-plugin/pom.xml | 2 +- .../apm-armeria-plugins/pom.xml | 2 +- .../asynchttpclient-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/avro-plugin/pom.xml | 2 +- .../baidu-brpc-3.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/baidu-brpc-plugin/pom.xml | 2 +- .../apm-sdk-plugin/c3p0-0.9.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/canal-1.x-plugin/pom.xml | 2 +- .../cassandra-java-driver-3.x-plugin/pom.xml | 2 +- .../clickhouse-0.3.1-plugin/pom.xml | 2 +- .../clickhouse-0.3.2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/cxf-3.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/dbcp-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/druid-1.x-plugin/pom.xml | 2 +- .../dubbo-2.7.x-conflict-patch/pom.xml | 2 +- .../apm-sdk-plugin/dubbo-2.7.x-plugin/pom.xml | 2 +- .../dubbo-3.x-conflict-patch/pom.xml | 2 +- .../apm-sdk-plugin/dubbo-3.x-plugin/pom.xml | 2 +- .../dubbo-conflict-patch/pom.xml | 2 +- .../apm-sdk-plugin/dubbo-plugin/pom.xml | 2 +- .../elastic-job-2.x-plugin/pom.xml | 2 +- .../elasticjob-3.x-plugin/pom.xml | 2 +- .../elasticsearch-5.x-plugin/pom.xml | 2 +- .../elasticsearch-6.x-plugin/pom.xml | 2 +- .../elasticsearch-7.x-plugin/pom.xml | 2 +- .../elasticsearch-common/pom.xml | 2 +- .../feign-default-http-9.x-plugin/pom.xml | 2 +- .../finagle-6.25.x-plugin/pom.xml | 2 +- .../graphql-12.x-15.x-plugin/pom.xml | 2 +- .../graphql-16plus-plugin/pom.xml | 2 +- .../graphql-plugin/graphql-8.x-plugin/pom.xml | 2 +- .../graphql-plugin/graphql-9.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/graphql-plugin/pom.xml | 2 +- .../grizzly-2.3.x-4.x-plugin/pom.xml | 2 +- .../pom.xml | 2 +- .../apm-sdk-plugin/grpc-1.x-plugin/pom.xml | 2 +- .../guava-eventbus-plugin/pom.xml | 2 +- .../apm-sdk-plugin/h2-1.x-plugin/pom.xml | 2 +- .../hbase-1.x-2.x-plugin/pom.xml | 2 +- .../hikaricp-3.x-4.x-plugin/pom.xml | 2 +- .../httpClient-4.x-plugin/pom.xml | 2 +- .../httpasyncclient-4.x-plugin/pom.xml | 2 +- .../httpclient-3.x-plugin/pom.xml | 2 +- .../httpclient-5.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/httpclient-commons/pom.xml | 2 +- .../hutool-http-5.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/hutool-plugins/pom.xml | 2 +- .../apm-sdk-plugin/hystrix-1.x-plugin/pom.xml | 2 +- .../influxdb-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/jdbc-commons/pom.xml | 2 +- .../jedis-2.x-3.x-plugin/pom.xml | 2 +- .../jedis-plugins/jedis-4.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/jedis-plugins/pom.xml | 2 +- .../apm-sdk-plugin/jersey-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/jersey-3.x-plugin/pom.xml | 2 +- .../jetty-client-11.x-plugin/pom.xml | 2 +- .../jetty-client-9.0-plugin/pom.xml | 2 +- .../jetty-client-9.x-plugin/pom.xml | 2 +- .../jetty-server-11.x-plugin/pom.xml | 2 +- .../jetty-server-9.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/jetty-plugin/pom.xml | 2 +- .../jetty-thread-pool-plugin/pom.xml | 2 +- .../jsonrpc4j-1.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/kafka-commons/pom.xml | 2 +- .../apm-sdk-plugin/kafka-plugin/pom.xml | 2 +- .../kylin-jdbc-2.6.x-3.x-4.x-plugin/pom.xml | 2 +- .../lettuce-5.x-6.4.x-plugin/pom.xml | 2 +- .../lettuce-6.5.x-plugin/pom.xml | 2 +- .../lettuce-plugins/lettuce-common/pom.xml | 2 +- .../apm-sdk-plugin/lettuce-plugins/pom.xml | 2 +- .../light4j-plugins/light4j-plugin/pom.xml | 2 +- .../apm-sdk-plugin/light4j-plugins/pom.xml | 2 +- .../apm-sdk-plugin/mariadb-2.x-plugin/pom.xml | 2 +- .../micronaut-http-client-plugin/pom.xml | 2 +- .../micronaut-http-server-plugin/pom.xml | 2 +- .../apm-sdk-plugin/micronaut-plugins/pom.xml | 2 +- .../apm-sdk-plugin/mongodb-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/mongodb-3.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/mongodb-4.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/motan-plugin/pom.xml | 2 +- .../apm-sdk-plugin/mssql-commons/pom.xml | 2 +- .../apm-sdk-plugin/mssql-jdbc-plugin/pom.xml | 2 +- .../mssql-jtds-1.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/mysql-5.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/mysql-6.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/mysql-8.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/mysql-common/pom.xml | 2 +- .../nats-2.14.x-2.16.5-plugin/pom.xml | 2 +- .../apm-sdk-plugin/neo4j-4.x-plugin/pom.xml | 2 +- .../netty-socketio-plugin/pom.xml | 2 +- .../nutz-plugins/http-1.x-plugin/pom.xml | 2 +- .../mvc-annotation-1.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/nutz-plugins/pom.xml | 2 +- .../apm-sdk-plugin/okhttp-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/okhttp-3.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/okhttp-4.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/okhttp-common/pom.xml | 2 +- .../apm-sdk-plugin/play-2.x-plugin/pom.xml | 2 +- apm-sniffer/apm-sdk-plugin/pom.xml | 2 +- .../postgresql-8.x-plugin/pom.xml | 2 +- .../pulsar-2.2-2.7-plugin/pom.xml | 2 +- .../pulsar-2.8.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/pulsar-common/pom.xml | 2 +- .../apm-sdk-plugin/quasar-plugin/pom.xml | 2 +- .../apm-sdk-plugin/rabbitmq-plugin/pom.xml | 2 +- .../redisson-3.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/resteasy-plugin/pom.xml | 2 +- .../resteasy-server-3.x-plugin/pom.xml | 2 +- .../resteasy-server-4.x-plugin/pom.xml | 2 +- .../resteasy-server-6.x-plugin/pom.xml | 2 +- .../rocketMQ-3.x-plugin/pom.xml | 2 +- .../rocketMQ-4.x-plugin/pom.xml | 2 +- .../rocketMQ-5.x-plugin/pom.xml | 2 +- .../rocketMQ-client-java-5.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/servicecomb-plugin/pom.xml | 2 +- .../pom.xml | 2 +- .../shardingsphere-plugins/pom.xml | 2 +- .../sharding-sphere-3.x-plugin/pom.xml | 2 +- .../sharding-sphere-4.0.x-plugin/pom.xml | 2 +- .../sharding-sphere-4.1.0-plugin/pom.xml | 2 +- .../sharding-sphere-5.0.0-plugin/pom.xml | 2 +- .../apm-sdk-plugin/sofarpc-plugin/pom.xml | 2 +- .../sofarpc/InvokeCallbackWrapperTest.java | 11 +-- .../apm-sdk-plugin/solon-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/solrj-7.x-plugin/pom.xml | 2 +- .../async-annotation-plugin/pom.xml | 2 +- .../concurrent-util-4.x-plugin/pom.xml | 2 +- .../spring-plugins/core-patch/pom.xml | 2 +- .../mvc-annotation-3.x-plugin/pom.xml | 2 +- .../mvc-annotation-4.x-plugin/pom.xml | 2 +- .../mvc-annotation-5.x-plugin/pom.xml | 2 +- .../mvc-annotation-commons/pom.xml | 2 +- .../apm-sdk-plugin/spring-plugins/pom.xml | 2 +- .../resttemplate-3.x-plugin/pom.xml | 2 +- .../resttemplate-4.x-plugin/pom.xml | 2 +- .../resttemplate-commons/pom.xml | 2 +- .../scheduled-annotation-plugin/pom.xml | 2 +- .../spring-cloud/netflix-plugins/pom.xml | 2 +- .../spring-cloud-feign-1.x-plugin/pom.xml | 2 +- .../spring-plugins/spring-cloud/pom.xml | 2 +- .../spring-cloud-feign-2.x-plugin/pom.xml | 2 +- .../spring-plugins/spring-commons/pom.xml | 2 +- .../spring-kafka-1.x-plugin/pom.xml | 2 +- .../spring-kafka-2.x-plugin/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../spymemcached-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/struts2-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/thrift-plugin/pom.xml | 2 +- .../apm-sdk-plugin/tomcat-10x-plugin/pom.xml | 2 +- .../tomcat-7.x-8.x-plugin/pom.xml | 2 +- .../tomcat-thread-pool-plugin/pom.xml | 2 +- .../apm-sdk-plugin/undertow-plugins/pom.xml | 2 +- .../undertow-2.x-plugin/pom.xml | 2 +- .../pom.xml | 2 +- .../apm-sdk-plugin/vertx-plugins/pom.xml | 2 +- .../vertx-core-3.x-plugin/pom.xml | 2 +- .../vertx-core-4.x-plugin/pom.xml | 2 +- .../websphere-liberty-23.x-plugin/pom.xml | 2 +- .../xmemcached-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/xxl-job-2.x-plugin/pom.xml | 2 +- apm-sniffer/apm-test-tools/pom.xml | 2 +- .../apm-toolkit-kafka-activation/pom.xml | 2 +- .../apm-toolkit-log4j-1.x-activation/pom.xml | 2 +- .../apm-toolkit-log4j-2.x-activation/pom.xml | 2 +- .../pom.xml | 2 +- .../apm-toolkit-logging-common/pom.xml | 2 +- .../apm-toolkit-meter-activation/pom.xml | 2 +- .../apm-toolkit-micrometer-activation/pom.xml | 2 +- .../pom.xml | 2 +- .../apm-toolkit-trace-activation/pom.xml | 2 +- .../apm-toolkit-webflux-activation/pom.xml | 2 +- apm-sniffer/apm-toolkit-activation/pom.xml | 2 +- .../jdk-forkjoinpool-plugin/pom.xml | 2 +- .../bootstrap-plugins/jdk-http-plugin/pom.xml | 4 +- .../jdk-httpclient-plugin/pom.xml | 2 +- .../jdk-threading-plugin/pom.xml | 2 +- .../jdk-threadpool-plugin/pom.xml | 2 +- .../pom.xml | 2 +- apm-sniffer/bootstrap-plugins/pom.xml | 2 +- apm-sniffer/bytebuddy-patch/pom.xml | 2 +- .../impala-jdbc-2.6.x-plugin/pom.xml | 2 +- apm-sniffer/expired-plugins/pom.xml | 2 +- .../caffeine-3.x-plugin/pom.xml | 2 +- .../customize-enhance-plugin/pom.xml | 2 +- .../ehcache-2.x-plugin/pom.xml | 2 +- .../fastjson-1.2.x-plugin/pom.xml | 2 +- .../gson-2.8.x-plugin/pom.xml | 2 +- .../guava-cache-plugin/pom.xml | 2 +- .../jackson-2.x-plugin/pom.xml | 2 +- .../kotlin-coroutine-plugin/pom.xml | 2 +- .../mybatis-3.x-plugin/pom.xml | 2 +- .../nacos-client-2.x-plugin/pom.xml | 2 +- .../netty-http-4.1.x-plugin/pom.xml | 2 +- .../mvc-annotation-6.x-plugin/pom.xml | 2 +- .../gateway-2.0.x-plugin/pom.xml | 2 +- .../gateway-2.1.x-plugin/pom.xml | 2 +- .../gateway-3.x-plugin/pom.xml | 2 +- .../gateway-4.x-plugin/pom.xml | 2 +- .../optional-spring-cloud/pom.xml | 2 +- .../optional-spring-plugins/pom.xml | 2 +- .../resttemplate-6.x-plugin/pom.xml | 2 +- .../spring-annotation-plugin/pom.xml | 2 +- .../spring-tx-plugin/pom.xml | 2 +- .../spring-webflux-5.x-plugin/pom.xml | 2 +- .../spring-webflux-6.x-plugin/pom.xml | 2 +- apm-sniffer/optional-plugins/pom.xml | 2 +- .../quartz-scheduler-2.x-plugin/pom.xml | 2 +- .../sentinel-1.x-plugin/pom.xml | 2 +- .../shenyu-2.4.x-plugin/pom.xml | 2 +- .../trace-ignore-plugin/pom.xml | 2 +- .../trace-sampler-cpu-policy-plugin/pom.xml | 2 +- .../zookeeper-3.4.x-plugin/pom.xml | 2 +- .../kafka-config-extension/pom.xml | 2 +- .../kafka-reporter-plugin/pom.xml | 2 +- apm-sniffer/optional-reporter-plugins/pom.xml | 2 +- apm-sniffer/pom.xml | 2 +- changes/changes-9.6.0.md | 33 ------- pom.xml | 2 +- .../jvm-container/src/main/docker/run.sh | 7 +- .../resources/compose-start-script.template | 35 +------- .../resources/container-start-script.template | 16 +--- .../configuration.yml | 5 +- .../support-version.list | 1 + .../configuration.yml | 2 +- .../rocketmq-5-grpc-scenario/pom.xml | 2 +- .../java/controller/CaseController.java | 72 +++++---------- .../java/controller/MessageService.java | 18 ++-- .../src/main/resources/log4j2.xml | 2 +- .../support-version.list | 1 + .../rocketmq/controller/CaseController.java | 90 +++++++------------ .../src/main/resources/log4j2.xml | 2 +- .../rocketmq-scenario/support-version.list | 2 +- 272 files changed, 351 insertions(+), 663 deletions(-) delete mode 100644 changes/changes-9.6.0.md diff --git a/.github/actions/build/action.yml b/.github/actions/build/action.yml index 80e4344366..a41636ac28 100644 --- a/.github/actions/build/action.yml +++ b/.github/actions/build/action.yml @@ -88,7 +88,6 @@ runs: mkdir -p test-containers docker save -o test-containers/skywalking-agent-test-jvm-1.0.0.tgz skywalking/agent-test-jvm:1.0.0 docker save -o test-containers/skywalking-agent-test-tomcat-1.0.0.tgz skywalking/agent-test-tomcat:1.0.0 - ls -la test-containers/ echo "::endgroup::" - uses: actions/upload-artifact@v4 name: Upload Test Containers diff --git a/.github/actions/run/action.yml b/.github/actions/run/action.yml index bb9b3c6143..75a7ee9c26 100644 --- a/.github/actions/run/action.yml +++ b/.github/actions/run/action.yml @@ -32,22 +32,6 @@ runs: - uses: actions/download-artifact@v4 with: name: test-tools - - name: Disable containerd image store - shell: bash - run: | - DAEMON_JSON="/etc/docker/daemon.json" - if [ -f "$DAEMON_JSON" ]; then - sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ - | sudo tee "${DAEMON_JSON}.tmp" > /dev/null - sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" - else - echo '{"features": {"containerd-snapshotter": false}}' \ - | sudo tee "$DAEMON_JSON" > /dev/null - fi - sudo systemctl restart docker - docker version - docker info - echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Load Test Containers shell: bash run: | @@ -57,7 +41,6 @@ runs: if ls test-containers/skywalking-agent-test-tomcat-1.0.0.tgz; then docker load -i test-containers/skywalking-agent-test-tomcat-1.0.0.tgz fi - docker images - name: Cache local Maven repository uses: actions/cache@v4 with: @@ -68,7 +51,7 @@ runs: shell: bash run: | echo "::group::Run Plugin Test ${{ inputs.test_case }}" - bash test/plugin/run.sh --debug ${{ inputs.test_case }} + bash test/plugin/run.sh ${{ inputs.test_case }} echo "::endgroup::" - uses: actions/upload-artifact@v4 name: Upload Agent diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index a2393b4942..dc595bc85c 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -60,7 +60,7 @@ jobs: with: go-version: '1.24' - name: Run E2E Tests - uses: apache/skywalking-infra-e2e@8c21e43e241a32a54bdf8eeceb9099eb27e5e9b4 + uses: apache/skywalking-infra-e2e@7e4b5b68716fdb7b79b21fa8908f9db497e1b115 with: e2e-file: ${{ matrix.case.path }} - uses: actions/upload-artifact@v4 diff --git a/.github/workflows/plugins-jdk11-test.3.yaml b/.github/workflows/plugins-jdk11-test.3.yaml index 238fd4047c..0e1fe2f74b 100644 --- a/.github/workflows/plugins-jdk11-test.3.yaml +++ b/.github/workflows/plugins-jdk11-test.3.yaml @@ -41,21 +41,6 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - name: Disable containerd image store - run: | - DAEMON_JSON="/etc/docker/daemon.json" - if [ -f "$DAEMON_JSON" ]; then - sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ - | sudo tee "${DAEMON_JSON}.tmp" > /dev/null - sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" - else - echo '{"features": {"containerd-snapshotter": false}}' \ - | sudo tee "$DAEMON_JSON" > /dev/null - fi - sudo systemctl restart docker - docker version - docker info - echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build with: diff --git a/.github/workflows/plugins-jdk17-test.0.yaml b/.github/workflows/plugins-jdk17-test.0.yaml index 092fa2daae..542d98411a 100644 --- a/.github/workflows/plugins-jdk17-test.0.yaml +++ b/.github/workflows/plugins-jdk17-test.0.yaml @@ -41,21 +41,6 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - name: Disable containerd image store - run: | - DAEMON_JSON="/etc/docker/daemon.json" - if [ -f "$DAEMON_JSON" ]; then - sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ - | sudo tee "${DAEMON_JSON}.tmp" > /dev/null - sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" - else - echo '{"features": {"containerd-snapshotter": false}}' \ - | sudo tee "$DAEMON_JSON" > /dev/null - fi - sudo systemctl restart docker - docker version - docker info - echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build with: diff --git a/.github/workflows/plugins-jdk17-test.1.yaml b/.github/workflows/plugins-jdk17-test.1.yaml index 0aa6266813..418da87f35 100644 --- a/.github/workflows/plugins-jdk17-test.1.yaml +++ b/.github/workflows/plugins-jdk17-test.1.yaml @@ -41,21 +41,6 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - name: Disable containerd image store - run: | - DAEMON_JSON="/etc/docker/daemon.json" - if [ -f "$DAEMON_JSON" ]; then - sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ - | sudo tee "${DAEMON_JSON}.tmp" > /dev/null - sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" - else - echo '{"features": {"containerd-snapshotter": false}}' \ - | sudo tee "$DAEMON_JSON" > /dev/null - fi - sudo systemctl restart docker - docker version - docker info - echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build with: diff --git a/.github/workflows/plugins-jdk21-test.0.yaml b/.github/workflows/plugins-jdk21-test.0.yaml index 9e6805515f..87b058284c 100644 --- a/.github/workflows/plugins-jdk21-test.0.yaml +++ b/.github/workflows/plugins-jdk21-test.0.yaml @@ -41,21 +41,6 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - name: Disable containerd image store - run: | - DAEMON_JSON="/etc/docker/daemon.json" - if [ -f "$DAEMON_JSON" ]; then - sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ - | sudo tee "${DAEMON_JSON}.tmp" > /dev/null - sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" - else - echo '{"features": {"containerd-snapshotter": false}}' \ - | sudo tee "$DAEMON_JSON" > /dev/null - fi - sudo systemctl restart docker - docker version - docker info - echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build with: diff --git a/.github/workflows/plugins-jdk25-test.0.yaml b/.github/workflows/plugins-jdk25-test.0.yaml index 06526df29f..88c7213101 100644 --- a/.github/workflows/plugins-jdk25-test.0.yaml +++ b/.github/workflows/plugins-jdk25-test.0.yaml @@ -41,21 +41,6 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - name: Disable containerd image store - run: | - DAEMON_JSON="/etc/docker/daemon.json" - if [ -f "$DAEMON_JSON" ]; then - sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ - | sudo tee "${DAEMON_JSON}.tmp" > /dev/null - sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" - else - echo '{"features": {"containerd-snapshotter": false}}' \ - | sudo tee "$DAEMON_JSON" > /dev/null - fi - sudo systemctl restart docker - docker version - docker info - echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build local tomcat-curl image run: | docker build -t tomcat-curl:10.1.50-jdk25-temurin \ diff --git a/.github/workflows/plugins-test.0.yaml b/.github/workflows/plugins-test.0.yaml index 0c86b2e8ad..a3f2653a1e 100644 --- a/.github/workflows/plugins-test.0.yaml +++ b/.github/workflows/plugins-test.0.yaml @@ -41,21 +41,6 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - name: Disable containerd image store - run: | - DAEMON_JSON="/etc/docker/daemon.json" - if [ -f "$DAEMON_JSON" ]; then - sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ - | sudo tee "${DAEMON_JSON}.tmp" > /dev/null - sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" - else - echo '{"features": {"containerd-snapshotter": false}}' \ - | sudo tee "$DAEMON_JSON" > /dev/null - fi - sudo systemctl restart docker - docker version - docker info - echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build diff --git a/.github/workflows/plugins-test.1.yaml b/.github/workflows/plugins-test.1.yaml index 5b67f1d22d..2c012792fc 100644 --- a/.github/workflows/plugins-test.1.yaml +++ b/.github/workflows/plugins-test.1.yaml @@ -41,21 +41,6 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - name: Disable containerd image store - run: | - DAEMON_JSON="/etc/docker/daemon.json" - if [ -f "$DAEMON_JSON" ]; then - sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ - | sudo tee "${DAEMON_JSON}.tmp" > /dev/null - sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" - else - echo '{"features": {"containerd-snapshotter": false}}' \ - | sudo tee "$DAEMON_JSON" > /dev/null - fi - sudo systemctl restart docker - docker version - docker info - echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build diff --git a/.github/workflows/plugins-test.2.yaml b/.github/workflows/plugins-test.2.yaml index 5fe28c244f..ccb6a7865d 100644 --- a/.github/workflows/plugins-test.2.yaml +++ b/.github/workflows/plugins-test.2.yaml @@ -41,21 +41,6 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - name: Disable containerd image store - run: | - DAEMON_JSON="/etc/docker/daemon.json" - if [ -f "$DAEMON_JSON" ]; then - sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ - | sudo tee "${DAEMON_JSON}.tmp" > /dev/null - sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" - else - echo '{"features": {"containerd-snapshotter": false}}' \ - | sudo tee "$DAEMON_JSON" > /dev/null - fi - sudo systemctl restart docker - docker version - docker info - echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build @@ -91,11 +76,11 @@ jobs: - struts2.5-scenario - cxf-scenario - okhttp2-scenario + - rocketmq-scenario - jersey-2.0.x-2.25.x-scenario - jersey-2.26.x-2.39.x-scenario - websphere-liberty-23.x-scenario - nacos-client-2.x-scenario - - rocketmq-scenario - rocketmq-5-grpc-scenario steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/plugins-test.3.yaml b/.github/workflows/plugins-test.3.yaml index 3d5880fd9f..b6766b15a0 100644 --- a/.github/workflows/plugins-test.3.yaml +++ b/.github/workflows/plugins-test.3.yaml @@ -41,21 +41,6 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - name: Disable containerd image store - run: | - DAEMON_JSON="/etc/docker/daemon.json" - if [ -f "$DAEMON_JSON" ]; then - sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ - | sudo tee "${DAEMON_JSON}.tmp" > /dev/null - sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" - else - echo '{"features": {"containerd-snapshotter": false}}' \ - | sudo tee "$DAEMON_JSON" > /dev/null - fi - sudo systemctl restart docker - docker version - docker info - echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build diff --git a/.github/workflows/plugins-tomcat10-test.0.yaml b/.github/workflows/plugins-tomcat10-test.0.yaml index 9bac4133d9..6ba26a754c 100644 --- a/.github/workflows/plugins-tomcat10-test.0.yaml +++ b/.github/workflows/plugins-tomcat10-test.0.yaml @@ -41,21 +41,6 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - name: Disable containerd image store - run: | - DAEMON_JSON="/etc/docker/daemon.json" - if [ -f "$DAEMON_JSON" ]; then - sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ - | sudo tee "${DAEMON_JSON}.tmp" > /dev/null - sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" - else - echo '{"features": {"containerd-snapshotter": false}}' \ - | sudo tee "$DAEMON_JSON" > /dev/null - fi - sudo systemctl restart docker - docker version - docker info - echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build with: diff --git a/.github/workflows/plugins-tomcat9-test.0.yaml b/.github/workflows/plugins-tomcat9-test.0.yaml index 400e8a0ff6..8f54080254 100644 --- a/.github/workflows/plugins-tomcat9-test.0.yaml +++ b/.github/workflows/plugins-tomcat9-test.0.yaml @@ -41,21 +41,6 @@ jobs: - uses: actions/checkout@v2 with: submodules: true - - name: Disable containerd image store - run: | - DAEMON_JSON="/etc/docker/daemon.json" - if [ -f "$DAEMON_JSON" ]; then - sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ - | sudo tee "${DAEMON_JSON}.tmp" > /dev/null - sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" - else - echo '{"features": {"containerd-snapshotter": false}}' \ - | sudo tee "$DAEMON_JSON" > /dev/null - fi - sudo systemctl restart docker - docker version - docker info - echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build with: diff --git a/.github/workflows/publish-docker.yaml b/.github/workflows/publish-docker.yaml index 1eb75de778..7c1f4726b5 100644 --- a/.github/workflows/publish-docker.yaml +++ b/.github/workflows/publish-docker.yaml @@ -75,21 +75,6 @@ jobs: with: name: skywalking-agent path: skywalking-agent - - name: Disable containerd image store - run: | - DAEMON_JSON="/etc/docker/daemon.json" - if [ -f "$DAEMON_JSON" ]; then - sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ - | sudo tee "${DAEMON_JSON}.tmp" > /dev/null - sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" - else - echo '{"features": {"containerd-snapshotter": false}}' \ - | sudo tee "$DAEMON_JSON" > /dev/null - fi - sudo systemctl restart docker - docker version - docker info - echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Log in to the Container registry uses: docker/login-action@v1.10.0 with: diff --git a/CHANGES.md b/CHANGES.md index eaa28ff2c8..979502ce7a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,12 +2,35 @@ Changes by Version ================== Release Notes. -9.7.0 +9.6.0 ------------------ +* Add CLAUDE.md for AI assistant guidance. +* Bump up agent-oap protocol to latest(16c51358ebcf42629bf4ffdf952253971f20eb25). +* Bump up gRPC to v1.74.0. +* Bump up netty to v4.1.124.Final. +* Bump up GSON to v2.13.1. +* Bump up guava to v32.1.3. +* Bump up oap to the 10.3-dev.latest(dc8740d4757b35374283c4850a9a080e40f0eb79) in e2e. +* Bump up cli to the 0.15.0-dev.latest(77b4c49e89c9c000278f44e62729d534f2ec842e) in e2e. +* Bump up apache parent pom to v35. +* Update Maven to 3.6.3 in mvnw. +* Fix OOM due to too many span logs. +* Fix ClassLoader cache OOM issue with WeakHashMap. +* Fix Jetty client cannot receive the HTTP response body. +* Eliminate repeated code with HttpServletRequestWrapper in mvc-annotation-commons. +* Add the jdk httpclient plugin. +* Fix Gateway 2.0.x plugin not activated for spring-cloud-starter-gateway 2.0.0.RELEASE. +* Support kafka-clients-3.9.x intercept. +* Upgrade kafka-clients version in optional-reporter-plugins to 3.9.1. +* Fix AbstractLogger replaceParam when the replaced string contains a replacement marker. +* Fix `JDBCPluginConfig.Plugin.JDBC.SQL_BODY_MAX_LENGTH` was not working in some plugins. +* Bump up Lombok to v1.18.42 to adopt JDK25 compiling. +* Add `eclipse-temurin:25-jre` as another base image. +* Add JDK25 plugin tests for Spring 6. +* Ignore classes starting with "sun.nio.cs" in bytebuddy due to potential class loading deadlock. - -All issues and pull requests are [here](https://github.com/apache/skywalking/milestone/249?closed=1) +All issues and pull requests are [here](https://github.com/apache/skywalking/milestone/242?closed=1) ------------------ Find change logs of all versions [here](changes). diff --git a/apm-application-toolkit/apm-toolkit-kafka/pom.xml b/apm-application-toolkit/apm-toolkit-kafka/pom.xml index 695985162e..05365ce572 100644 --- a/apm-application-toolkit/apm-toolkit-kafka/pom.xml +++ b/apm-application-toolkit/apm-toolkit-kafka/pom.xml @@ -21,7 +21,7 @@ apm-application-toolkit org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-log4j-1.x/pom.xml b/apm-application-toolkit/apm-toolkit-log4j-1.x/pom.xml index 6983c0d2e9..e2b12f7171 100644 --- a/apm-application-toolkit/apm-toolkit-log4j-1.x/pom.xml +++ b/apm-application-toolkit/apm-toolkit-log4j-1.x/pom.xml @@ -21,7 +21,7 @@ apm-application-toolkit org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-log4j-2.x/pom.xml b/apm-application-toolkit/apm-toolkit-log4j-2.x/pom.xml index 393ea94496..3b0ecb2103 100644 --- a/apm-application-toolkit/apm-toolkit-log4j-2.x/pom.xml +++ b/apm-application-toolkit/apm-toolkit-log4j-2.x/pom.xml @@ -21,7 +21,7 @@ apm-application-toolkit org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-logback-1.x/pom.xml b/apm-application-toolkit/apm-toolkit-logback-1.x/pom.xml index f5b9d63625..f7f441bde3 100644 --- a/apm-application-toolkit/apm-toolkit-logback-1.x/pom.xml +++ b/apm-application-toolkit/apm-toolkit-logback-1.x/pom.xml @@ -21,7 +21,7 @@ apm-application-toolkit org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-meter/pom.xml b/apm-application-toolkit/apm-toolkit-meter/pom.xml index 9c2af46e51..b5d212c20c 100644 --- a/apm-application-toolkit/apm-toolkit-meter/pom.xml +++ b/apm-application-toolkit/apm-toolkit-meter/pom.xml @@ -20,7 +20,7 @@ apm-application-toolkit org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-micrometer-1.10/pom.xml b/apm-application-toolkit/apm-toolkit-micrometer-1.10/pom.xml index 70e3a957d6..b570a7fda8 100644 --- a/apm-application-toolkit/apm-toolkit-micrometer-1.10/pom.xml +++ b/apm-application-toolkit/apm-toolkit-micrometer-1.10/pom.xml @@ -20,7 +20,7 @@ apm-application-toolkit org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-micrometer-registry/pom.xml b/apm-application-toolkit/apm-toolkit-micrometer-registry/pom.xml index 5658bea135..8c972efdc2 100644 --- a/apm-application-toolkit/apm-toolkit-micrometer-registry/pom.xml +++ b/apm-application-toolkit/apm-toolkit-micrometer-registry/pom.xml @@ -20,7 +20,7 @@ apm-application-toolkit org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-opentracing/pom.xml b/apm-application-toolkit/apm-toolkit-opentracing/pom.xml index a7d9aefd2a..5d0dc02d38 100644 --- a/apm-application-toolkit/apm-toolkit-opentracing/pom.xml +++ b/apm-application-toolkit/apm-toolkit-opentracing/pom.xml @@ -21,7 +21,7 @@ apm-application-toolkit org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-trace/pom.xml b/apm-application-toolkit/apm-toolkit-trace/pom.xml index 642a551645..5b186af0d9 100644 --- a/apm-application-toolkit/apm-toolkit-trace/pom.xml +++ b/apm-application-toolkit/apm-toolkit-trace/pom.xml @@ -20,7 +20,7 @@ apm-application-toolkit org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-webflux/pom.xml b/apm-application-toolkit/apm-toolkit-webflux/pom.xml index 8397b9193f..2dab4fc7ea 100644 --- a/apm-application-toolkit/apm-toolkit-webflux/pom.xml +++ b/apm-application-toolkit/apm-toolkit-webflux/pom.xml @@ -20,7 +20,7 @@ apm-application-toolkit org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/pom.xml b/apm-application-toolkit/pom.xml index cc173543d0..e004d63b06 100644 --- a/apm-application-toolkit/pom.xml +++ b/apm-application-toolkit/pom.xml @@ -20,7 +20,7 @@ java-agent org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 apm-application-toolkit diff --git a/apm-commons/apm-datacarrier/pom.xml b/apm-commons/apm-datacarrier/pom.xml index a3c91d10ba..fd0cbf6280 100644 --- a/apm-commons/apm-datacarrier/pom.xml +++ b/apm-commons/apm-datacarrier/pom.xml @@ -21,7 +21,7 @@ java-agent-commons org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-commons/apm-util/pom.xml b/apm-commons/apm-util/pom.xml index 1bbb7009a4..bf1169bfde 100644 --- a/apm-commons/apm-util/pom.xml +++ b/apm-commons/apm-util/pom.xml @@ -20,7 +20,7 @@ java-agent-commons org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-commons/pom.xml b/apm-commons/pom.xml index 79e66796ca..3b54179ebe 100644 --- a/apm-commons/pom.xml +++ b/apm-commons/pom.xml @@ -20,7 +20,7 @@ java-agent org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-protocol/apm-network/pom.xml b/apm-protocol/apm-network/pom.xml index a1531c3ca0..9964486b65 100644 --- a/apm-protocol/apm-network/pom.xml +++ b/apm-protocol/apm-network/pom.xml @@ -21,7 +21,7 @@ java-agent-protocol org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-protocol/pom.xml b/apm-protocol/pom.xml index 3cfb939955..10be0c6791 100644 --- a/apm-protocol/pom.xml +++ b/apm-protocol/pom.xml @@ -21,7 +21,7 @@ java-agent org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-agent-core/pom.xml b/apm-sniffer/apm-agent-core/pom.xml index 43670f03ba..d251748fe3 100644 --- a/apm-sniffer/apm-agent-core/pom.xml +++ b/apm-sniffer/apm-agent-core/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking java-agent-sniffer - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-agent-core diff --git a/apm-sniffer/apm-agent/pom.xml b/apm-sniffer/apm-agent/pom.xml index 78a3b733ac..07cdd3e195 100644 --- a/apm-sniffer/apm-agent/pom.xml +++ b/apm-sniffer/apm-agent/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking java-agent-sniffer - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-agent diff --git a/apm-sniffer/apm-sdk-plugin/activemq-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/activemq-5.x-plugin/pom.xml index 00abc003dc..19d0a0ac07 100644 --- a/apm-sniffer/apm-sdk-plugin/activemq-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/activemq-5.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/activemq-artemis-jakarta-client-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/activemq-artemis-jakarta-client-2.x-plugin/pom.xml index 17f0dc4442..da27f49425 100644 --- a/apm-sniffer/apm-sdk-plugin/activemq-artemis-jakarta-client-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/activemq-artemis-jakarta-client-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/aerospike-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/aerospike-plugin/pom.xml index f2c5ac64f4..9dfc94d3f0 100644 --- a/apm-sniffer/apm-sdk-plugin/aerospike-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/aerospike-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.84.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.84.x-plugin/pom.xml index 81ea378be9..fee4c87555 100644 --- a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.84.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.84.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-armeria-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.85.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.85.x-plugin/pom.xml index d4897e1325..bd33a3f2de 100644 --- a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.85.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.85.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-armeria-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-1.0.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-1.0.x-plugin/pom.xml index 6a32acee05..2e711d08f1 100644 --- a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-1.0.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-1.0.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-armeria-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/pom.xml index f55ffcb8fc..d3bb98f95c 100644 --- a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 pom diff --git a/apm-sniffer/apm-sdk-plugin/asynchttpclient-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/asynchttpclient-2.x-plugin/pom.xml index fe491b9ee2..5b9862e235 100644 --- a/apm-sniffer/apm-sdk-plugin/asynchttpclient-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/asynchttpclient-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/avro-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/avro-plugin/pom.xml index cf5039fc31..e58c105c66 100644 --- a/apm-sniffer/apm-sdk-plugin/avro-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/avro-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/baidu-brpc-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/baidu-brpc-3.x-plugin/pom.xml index 6716583e00..a9a5903d55 100644 --- a/apm-sniffer/apm-sdk-plugin/baidu-brpc-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/baidu-brpc-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 jar diff --git a/apm-sniffer/apm-sdk-plugin/baidu-brpc-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/baidu-brpc-plugin/pom.xml index 7f31b50046..96e05ed0c8 100644 --- a/apm-sniffer/apm-sdk-plugin/baidu-brpc-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/baidu-brpc-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 jar diff --git a/apm-sniffer/apm-sdk-plugin/c3p0-0.9.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/c3p0-0.9.x-plugin/pom.xml index 7b7a82628a..a6d5abaa51 100644 --- a/apm-sniffer/apm-sdk-plugin/c3p0-0.9.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/c3p0-0.9.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/canal-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/canal-1.x-plugin/pom.xml index fd4b295a51..143239cf4c 100644 --- a/apm-sniffer/apm-sdk-plugin/canal-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/canal-1.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/cassandra-java-driver-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/cassandra-java-driver-3.x-plugin/pom.xml index ecc5d3535d..f710b489eb 100644 --- a/apm-sniffer/apm-sdk-plugin/cassandra-java-driver-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/cassandra-java-driver-3.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.1-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.1-plugin/pom.xml index c80e82160b..a669888e52 100755 --- a/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.1-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.1-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.2.x-plugin/pom.xml index e50763327d..f02f4b7c73 100755 --- a/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.2.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/cxf-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/cxf-3.x-plugin/pom.xml index 9744820eca..93f8952933 100644 --- a/apm-sniffer/apm-sdk-plugin/cxf-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/cxf-3.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/dbcp-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/dbcp-2.x-plugin/pom.xml index 2ae4ae4b3f..7e073160b5 100644 --- a/apm-sniffer/apm-sdk-plugin/dbcp-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/dbcp-2.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/druid-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/druid-1.x-plugin/pom.xml index bd8f9d6e39..9b236f308f 100644 --- a/apm-sniffer/apm-sdk-plugin/druid-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/druid-1.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-conflict-patch/pom.xml b/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-conflict-patch/pom.xml index 4880f503ff..0e9cee5454 100644 --- a/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-conflict-patch/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-conflict-patch/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-plugin/pom.xml index 4608dc3006..0c98cc6695 100644 --- a/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/dubbo-3.x-conflict-patch/pom.xml b/apm-sniffer/apm-sdk-plugin/dubbo-3.x-conflict-patch/pom.xml index f1eb7380c9..c092225837 100644 --- a/apm-sniffer/apm-sdk-plugin/dubbo-3.x-conflict-patch/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/dubbo-3.x-conflict-patch/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/dubbo-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/dubbo-3.x-plugin/pom.xml index 48e35f1950..02d82c2341 100644 --- a/apm-sniffer/apm-sdk-plugin/dubbo-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/dubbo-3.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/dubbo-conflict-patch/pom.xml b/apm-sniffer/apm-sdk-plugin/dubbo-conflict-patch/pom.xml index 70adb55678..744e911633 100644 --- a/apm-sniffer/apm-sdk-plugin/dubbo-conflict-patch/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/dubbo-conflict-patch/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/dubbo-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/dubbo-plugin/pom.xml index de7bd3752b..a83f02078c 100644 --- a/apm-sniffer/apm-sdk-plugin/dubbo-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/dubbo-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/elastic-job-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/elastic-job-2.x-plugin/pom.xml index 01e5f81dfe..0d12e32ca6 100644 --- a/apm-sniffer/apm-sdk-plugin/elastic-job-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/elastic-job-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/elasticjob-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/elasticjob-3.x-plugin/pom.xml index a965673abb..065469ee06 100644 --- a/apm-sniffer/apm-sdk-plugin/elasticjob-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/elasticjob-3.x-plugin/pom.xml @@ -20,7 +20,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/elasticsearch-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/elasticsearch-5.x-plugin/pom.xml index 6f048e9caf..224a41ee5e 100644 --- a/apm-sniffer/apm-sdk-plugin/elasticsearch-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/elasticsearch-5.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/elasticsearch-6.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/elasticsearch-6.x-plugin/pom.xml index e1a226cc08..a727f273ee 100644 --- a/apm-sniffer/apm-sdk-plugin/elasticsearch-6.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/elasticsearch-6.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/elasticsearch-7.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/elasticsearch-7.x-plugin/pom.xml index 89a90b55f2..1e22dbef16 100644 --- a/apm-sniffer/apm-sdk-plugin/elasticsearch-7.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/elasticsearch-7.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/elasticsearch-common/pom.xml b/apm-sniffer/apm-sdk-plugin/elasticsearch-common/pom.xml index 51acbee581..1e43afaef4 100644 --- a/apm-sniffer/apm-sdk-plugin/elasticsearch-common/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/elasticsearch-common/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/pom.xml index a97bc44739..77b513f56b 100644 --- a/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/pom.xml index 89f906c289..790a4b46a4 100644 --- a/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-12.x-15.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-12.x-15.x-plugin/pom.xml index 170586098e..9a0b7824df 100644 --- a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-12.x-15.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-12.x-15.x-plugin/pom.xml @@ -21,7 +21,7 @@ graphql-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-16plus-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-16plus-plugin/pom.xml index 474b404f95..2fe40768a5 100644 --- a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-16plus-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-16plus-plugin/pom.xml @@ -21,7 +21,7 @@ graphql-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-8.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-8.x-plugin/pom.xml index cb6d9e0e02..6de13ee103 100644 --- a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-8.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-8.x-plugin/pom.xml @@ -21,7 +21,7 @@ graphql-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-9.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-9.x-plugin/pom.xml index d1e081d15c..4fef19e90f 100644 --- a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-9.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-9.x-plugin/pom.xml @@ -21,7 +21,7 @@ graphql-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/graphql-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/graphql-plugin/pom.xml index 74e296d1bd..ebbeb91191 100644 --- a/apm-sniffer/apm-sdk-plugin/graphql-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/graphql-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 pom diff --git a/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-plugin/pom.xml index 191aa45db8..9b650f7cd9 100644 --- a/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-plugin/pom.xml @@ -20,7 +20,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-work-threadpool-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-work-threadpool-plugin/pom.xml index 5db8506875..84699cac8b 100644 --- a/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-work-threadpool-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-work-threadpool-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-grizzly-2.x-4.x-work-threadpool-plugin diff --git a/apm-sniffer/apm-sdk-plugin/grpc-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/grpc-1.x-plugin/pom.xml index 72884e2d48..12f7b140d8 100644 --- a/apm-sniffer/apm-sdk-plugin/grpc-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/grpc-1.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-grpc-1.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/guava-eventbus-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/guava-eventbus-plugin/pom.xml index d2ad8e9292..678218e2ba 100644 --- a/apm-sniffer/apm-sdk-plugin/guava-eventbus-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/guava-eventbus-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/h2-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/h2-1.x-plugin/pom.xml index 4c359960a0..ad985a3ee7 100755 --- a/apm-sniffer/apm-sdk-plugin/h2-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/h2-1.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/hbase-1.x-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/hbase-1.x-2.x-plugin/pom.xml index d256acb1c5..2809352c1b 100644 --- a/apm-sniffer/apm-sdk-plugin/hbase-1.x-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/hbase-1.x-2.x-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-hbase-1.x-2.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/hikaricp-3.x-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/hikaricp-3.x-4.x-plugin/pom.xml index 864b91b125..330c7bcf37 100644 --- a/apm-sniffer/apm-sdk-plugin/hikaricp-3.x-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/hikaricp-3.x-4.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/pom.xml index 0fcdd24c95..00d5f64d55 100644 --- a/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-httpClient-4.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/httpasyncclient-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/httpasyncclient-4.x-plugin/pom.xml index 2cd5025cd6..6b60405e18 100644 --- a/apm-sniffer/apm-sdk-plugin/httpasyncclient-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/httpasyncclient-4.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-httpasyncclient-4.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/httpclient-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/httpclient-3.x-plugin/pom.xml index 2127da9e0d..3203867e3a 100644 --- a/apm-sniffer/apm-sdk-plugin/httpclient-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/httpclient-3.x-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-httpclient-3.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/httpclient-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/httpclient-5.x-plugin/pom.xml index ba159639a4..f1a047e813 100644 --- a/apm-sniffer/apm-sdk-plugin/httpclient-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/httpclient-5.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-httpclient-5.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/httpclient-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/httpclient-commons/pom.xml index c9976aadf2..37bedce74c 100644 --- a/apm-sniffer/apm-sdk-plugin/httpclient-commons/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/httpclient-commons/pom.xml @@ -22,7 +22,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-httpclient-commons diff --git a/apm-sniffer/apm-sdk-plugin/hutool-plugins/hutool-http-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/hutool-plugins/hutool-http-5.x-plugin/pom.xml index b31ba12cf4..9ff2019872 100644 --- a/apm-sniffer/apm-sdk-plugin/hutool-plugins/hutool-http-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/hutool-plugins/hutool-http-5.x-plugin/pom.xml @@ -20,7 +20,7 @@ hutool-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/hutool-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/hutool-plugins/pom.xml index 6c41996fb0..92249a85a5 100644 --- a/apm-sniffer/apm-sdk-plugin/hutool-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/hutool-plugins/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/pom.xml index 83f8023afe..ba9914c170 100644 --- a/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/influxdb-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/influxdb-2.x-plugin/pom.xml index e360c9ac4b..f9e47326cf 100644 --- a/apm-sniffer/apm-sdk-plugin/influxdb-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/influxdb-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jdbc-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/jdbc-commons/pom.xml index 1eecc0d35c..46759160e6 100755 --- a/apm-sniffer/apm-sdk-plugin/jdbc-commons/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jdbc-commons/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-2.x-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-2.x-3.x-plugin/pom.xml index 53f72f82af..9da30b3367 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-2.x-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-2.x-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking jedis-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-4.x-plugin/pom.xml index 4593b1c654..3b72ba9d1b 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ jedis-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jedis-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/jedis-plugins/pom.xml index a337f0c2f8..8b58716509 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jedis-plugins/pom.xml @@ -20,7 +20,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT diff --git a/apm-sniffer/apm-sdk-plugin/jersey-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jersey-2.x-plugin/pom.xml index f3a8001daf..8d9f6824b1 100644 --- a/apm-sniffer/apm-sdk-plugin/jersey-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jersey-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jersey-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jersey-3.x-plugin/pom.xml index 94fd991b19..0524344fdd 100644 --- a/apm-sniffer/apm-sdk-plugin/jersey-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jersey-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-11.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-11.x-plugin/pom.xml index d800a09ddd..79ffd36ac4 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-11.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-11.x-plugin/pom.xml @@ -20,7 +20,7 @@ jetty-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/pom.xml index be26052758..0d7545a5f2 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/pom.xml @@ -20,7 +20,7 @@ jetty-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml index a7f7168743..229c401f21 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml @@ -20,7 +20,7 @@ jetty-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-11.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-11.x-plugin/pom.xml index c70f0ddd37..a5d993b031 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-11.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-11.x-plugin/pom.xml @@ -20,7 +20,7 @@ jetty-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/pom.xml index d4602b83c4..17049eadd7 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/pom.xml @@ -20,7 +20,7 @@ jetty-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-plugin/pom.xml index 0d051bd4c0..230c49aff0 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT jetty-plugins diff --git a/apm-sniffer/apm-sdk-plugin/jetty-thread-pool-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-thread-pool-plugin/pom.xml index 533868c65d..db583d1800 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-thread-pool-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jetty-thread-pool-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jsonrpc4j-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jsonrpc4j-1.x-plugin/pom.xml index f4ef9b5118..b0d5740694 100644 --- a/apm-sniffer/apm-sdk-plugin/jsonrpc4j-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jsonrpc4j-1.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/kafka-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/kafka-commons/pom.xml index 9870095054..322b7fc81b 100644 --- a/apm-sniffer/apm-sdk-plugin/kafka-commons/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/kafka-commons/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-kafka-commons diff --git a/apm-sniffer/apm-sdk-plugin/kafka-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/kafka-plugin/pom.xml index 9c03ef164a..1e3f0588a4 100644 --- a/apm-sniffer/apm-sdk-plugin/kafka-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/kafka-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/kylin-jdbc-2.6.x-3.x-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/kylin-jdbc-2.6.x-3.x-4.x-plugin/pom.xml index 54d4d9e605..4bff437545 100644 --- a/apm-sniffer/apm-sdk-plugin/kylin-jdbc-2.6.x-3.x-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/kylin-jdbc-2.6.x-3.x-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-5.x-6.4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-5.x-6.4.x-plugin/pom.xml index c2158fcb4a..facce0452d 100644 --- a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-5.x-6.4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-5.x-6.4.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking lettuce-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-lettuce-5.x-6.4.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-6.5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-6.5.x-plugin/pom.xml index 2bf20982cf..1e4461f495 100644 --- a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-6.5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-6.5.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking lettuce-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-lettuce-6.5.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-common/pom.xml b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-common/pom.xml index 6062c90bce..463250cf39 100644 --- a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-common/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-common/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking lettuce-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-lettuce-common diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/pom.xml index 924a0e0ce7..c9cfe8d17c 100644 --- a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT lettuce-plugins diff --git a/apm-sniffer/apm-sdk-plugin/light4j-plugins/light4j-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/light4j-plugins/light4j-plugin/pom.xml index 12b4e3a59e..5785ce44cd 100644 --- a/apm-sniffer/apm-sdk-plugin/light4j-plugins/light4j-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/light4j-plugins/light4j-plugin/pom.xml @@ -20,7 +20,7 @@ light4j-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/light4j-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/light4j-plugins/pom.xml index cd9ab3c418..1d8da85b79 100644 --- a/apm-sniffer/apm-sdk-plugin/light4j-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/light4j-plugins/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT light4j-plugins diff --git a/apm-sniffer/apm-sdk-plugin/mariadb-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mariadb-2.x-plugin/pom.xml index 2ec8ab3063..802ed1f44c 100644 --- a/apm-sniffer/apm-sdk-plugin/mariadb-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mariadb-2.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-client-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-client-plugin/pom.xml index a0955c19d2..dfd0f426bb 100644 --- a/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-client-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-client-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking micronaut-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-server-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-server-plugin/pom.xml index a8fd47deac..4d7e5f56de 100644 --- a/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-server-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-server-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking micronaut-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/micronaut-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/micronaut-plugins/pom.xml index 0025bcf432..89fb218808 100644 --- a/apm-sniffer/apm-sdk-plugin/micronaut-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/micronaut-plugins/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mongodb-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mongodb-2.x-plugin/pom.xml index e16638a4b9..1f2e130efb 100644 --- a/apm-sniffer/apm-sdk-plugin/mongodb-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mongodb-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/pom.xml index 212222c6d6..6ff822a4a0 100644 --- a/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-mongodb-3.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/mongodb-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mongodb-4.x-plugin/pom.xml index cb0363cb8e..de38fedcae 100644 --- a/apm-sniffer/apm-sdk-plugin/mongodb-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mongodb-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-mongodb-4.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/motan-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/motan-plugin/pom.xml index b74bc6d54d..d3319b9cdb 100644 --- a/apm-sniffer/apm-sdk-plugin/motan-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/motan-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mssql-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/mssql-commons/pom.xml index ff9f083f6d..441bf6601d 100644 --- a/apm-sniffer/apm-sdk-plugin/mssql-commons/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mssql-commons/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mssql-jdbc-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mssql-jdbc-plugin/pom.xml index ff678a1a00..13d0cb16ff 100644 --- a/apm-sniffer/apm-sdk-plugin/mssql-jdbc-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mssql-jdbc-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mssql-jtds-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mssql-jtds-1.x-plugin/pom.xml index 2f3dd90ea6..04687dbcc1 100644 --- a/apm-sniffer/apm-sdk-plugin/mssql-jtds-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mssql-jtds-1.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mysql-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mysql-5.x-plugin/pom.xml index 361f5bc821..ee171e5c32 100755 --- a/apm-sniffer/apm-sdk-plugin/mysql-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mysql-5.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mysql-6.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mysql-6.x-plugin/pom.xml index edaef2cf28..1e07e995b8 100755 --- a/apm-sniffer/apm-sdk-plugin/mysql-6.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mysql-6.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mysql-8.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mysql-8.x-plugin/pom.xml index 11ee950a57..b84115d907 100755 --- a/apm-sniffer/apm-sdk-plugin/mysql-8.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mysql-8.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mysql-common/pom.xml b/apm-sniffer/apm-sdk-plugin/mysql-common/pom.xml index 92aa8ee5d8..c832784e25 100755 --- a/apm-sniffer/apm-sdk-plugin/mysql-common/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mysql-common/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.16.5-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.16.5-plugin/pom.xml index 60bba313b0..2d85d4cd9b 100644 --- a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.16.5-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.16.5-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/neo4j-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/neo4j-4.x-plugin/pom.xml index 1bf1de4bfd..0b98a3efe2 100644 --- a/apm-sniffer/apm-sdk-plugin/neo4j-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/neo4j-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/netty-socketio-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/netty-socketio-plugin/pom.xml index 2fc96f1c2f..5c8a854b9b 100644 --- a/apm-sniffer/apm-sdk-plugin/netty-socketio-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/netty-socketio-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml index 3f2b4d0b67..d1fe436ea6 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml @@ -20,7 +20,7 @@ nutz-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml index cd772375c6..2f968d2bf5 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml @@ -20,7 +20,7 @@ nutz-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml index 0b8fe2d545..711786d120 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT nutz-plugins diff --git a/apm-sniffer/apm-sdk-plugin/okhttp-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/okhttp-2.x-plugin/pom.xml index 14d05d0135..ede53c4ff8 100644 --- a/apm-sniffer/apm-sdk-plugin/okhttp-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/okhttp-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/pom.xml index b25f764a6e..ef6fcb0239 100644 --- a/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/okhttp-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/okhttp-4.x-plugin/pom.xml index ce5434d9cb..a8d0a42612 100644 --- a/apm-sniffer/apm-sdk-plugin/okhttp-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/okhttp-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/okhttp-common/pom.xml b/apm-sniffer/apm-sdk-plugin/okhttp-common/pom.xml index 68437b314a..96d60b3765 100644 --- a/apm-sniffer/apm-sdk-plugin/okhttp-common/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/okhttp-common/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/play-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/play-2.x-plugin/pom.xml index 5c74e133d8..26491de16c 100644 --- a/apm-sniffer/apm-sdk-plugin/play-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/play-2.x-plugin/pom.xml @@ -22,7 +22,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-play-2.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/pom.xml index 1c792ed425..ea21985349 100644 --- a/apm-sniffer/apm-sdk-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking java-agent-sniffer - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-sdk-plugin diff --git a/apm-sniffer/apm-sdk-plugin/postgresql-8.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/postgresql-8.x-plugin/pom.xml index 181a48d08c..4ce5b69ecd 100755 --- a/apm-sniffer/apm-sdk-plugin/postgresql-8.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/postgresql-8.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/pulsar-2.2-2.7-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/pulsar-2.2-2.7-plugin/pom.xml index 862269d01e..98a45766bb 100644 --- a/apm-sniffer/apm-sdk-plugin/pulsar-2.2-2.7-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/pulsar-2.2-2.7-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/pulsar-2.8.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/pulsar-2.8.x-plugin/pom.xml index c464911398..fbe2c3fe00 100644 --- a/apm-sniffer/apm-sdk-plugin/pulsar-2.8.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/pulsar-2.8.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/pulsar-common/pom.xml b/apm-sniffer/apm-sdk-plugin/pulsar-common/pom.xml index 9679ea88fb..7fa0685161 100644 --- a/apm-sniffer/apm-sdk-plugin/pulsar-common/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/pulsar-common/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/quasar-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/quasar-plugin/pom.xml index a980a658d8..99bd15fb4f 100644 --- a/apm-sniffer/apm-sdk-plugin/quasar-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/quasar-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-quasar-plugin diff --git a/apm-sniffer/apm-sdk-plugin/rabbitmq-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/rabbitmq-plugin/pom.xml index 492b479b07..65f78a5467 100644 --- a/apm-sniffer/apm-sdk-plugin/rabbitmq-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/rabbitmq-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/pom.xml index 7ba9d05be3..55edbdeac3 100644 --- a/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-redisson-3.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/pom.xml index 4f661c38ba..6ff7caaaaa 100644 --- a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT resteasy-plugin diff --git a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/pom.xml index 83b9d357cc..14d989003f 100644 --- a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ resteasy-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT resteasy-server-3.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-4.x-plugin/pom.xml index 63eb0c4826..f21d450b6a 100644 --- a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ resteasy-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT resteasy-server-4.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-6.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-6.x-plugin/pom.xml index f20ab70b3e..f259291bfd 100644 --- a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-6.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-6.x-plugin/pom.xml @@ -21,7 +21,7 @@ resteasy-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT resteasy-server-6.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/rocketMQ-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/rocketMQ-3.x-plugin/pom.xml index 5a7c711dd2..6b206013d9 100644 --- a/apm-sniffer/apm-sdk-plugin/rocketMQ-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/rocketMQ-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/rocketMQ-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/rocketMQ-4.x-plugin/pom.xml index a30e1b09e0..6fa277b4ef 100644 --- a/apm-sniffer/apm-sdk-plugin/rocketMQ-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/rocketMQ-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/rocketMQ-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/rocketMQ-5.x-plugin/pom.xml index 62c1fbb3e3..ad51da8c77 100644 --- a/apm-sniffer/apm-sdk-plugin/rocketMQ-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/rocketMQ-5.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/rocketMQ-client-java-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/rocketMQ-client-java-5.x-plugin/pom.xml index e4dc8d8988..d07527b994 100644 --- a/apm-sniffer/apm-sdk-plugin/rocketMQ-client-java-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/rocketMQ-client-java-5.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/pom.xml index 06f9d58672..e010d7cc09 100644 --- a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-2.x-plugin/pom.xml index 6c26908ce4..f92f636768 100644 --- a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ servicecomb-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/pom.xml index 6d38f040f2..60d101c987 100644 --- a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 pom diff --git a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-3.x-plugin/pom.xml index 033f5afc04..48776bf7e7 100644 --- a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ shardingsphere-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.0.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.0.x-plugin/pom.xml index fa282b6571..cdbdf13335 100644 --- a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.0.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.0.x-plugin/pom.xml @@ -20,7 +20,7 @@ shardingsphere-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.1.0-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.1.0-plugin/pom.xml index 803c61dbeb..99b838e1e7 100644 --- a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.1.0-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.1.0-plugin/pom.xml @@ -20,7 +20,7 @@ shardingsphere-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-5.0.0-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-5.0.0-plugin/pom.xml index e17d47b46d..013e5929ed 100644 --- a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-5.0.0-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-5.0.0-plugin/pom.xml @@ -21,7 +21,7 @@ shardingsphere-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/pom.xml index 21f8795238..c685c69dd7 100644 --- a/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/InvokeCallbackWrapperTest.java b/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/InvokeCallbackWrapperTest.java index d05d4026c2..ef9c9f3cb0 100644 --- a/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/InvokeCallbackWrapperTest.java +++ b/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/InvokeCallbackWrapperTest.java @@ -141,10 +141,7 @@ public void testOnResponse() throws InterruptedException { TraceSegment traceSegment2 = segmentStorage.getTraceSegments().get(1); List spans2 = SegmentHelper.getSpans(traceSegment2); assertThat(spans2.size(), is(1)); - - // Segment order is non-deterministic; find the child segment (the one with a ref) - TraceSegment childSegment = traceSegment.getRef() != null ? traceSegment : traceSegment2; - assertEquals("sofarpc", childSegment.getRef().getParentEndpoint()); + assertEquals("sofarpc", traceSegment2.getRef().getParentEndpoint()); } @Test @@ -165,11 +162,7 @@ public void testOnException() throws InterruptedException { TraceSegment traceSegment2 = segmentStorage.getTraceSegments().get(1); List spans2 = SegmentHelper.getSpans(traceSegment2); assertThat(spans2.size(), is(1)); - - // Segment order is non-deterministic; find the child segment (the one with a ref) - TraceSegment childSegment = traceSegment.getRef() != null ? traceSegment : traceSegment2; - List childSpans = SegmentHelper.getSpans(childSegment); - assertThat(SpanHelper.getLogs(childSpans.get(0)).size(), is(1)); + assertThat(SpanHelper.getLogs(spans2.get(0)).size(), is(1)); } diff --git a/apm-sniffer/apm-sdk-plugin/solon-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/solon-2.x-plugin/pom.xml index 543d27c2c4..5221d63d04 100644 --- a/apm-sniffer/apm-sdk-plugin/solon-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/solon-2.x-plugin/pom.xml @@ -22,7 +22,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT solon-2.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/solrj-7.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/solrj-7.x-plugin/pom.xml index 2377a233f7..f8b02211f4 100644 --- a/apm-sniffer/apm-sdk-plugin/solrj-7.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/solrj-7.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/async-annotation-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/async-annotation-plugin/pom.xml index 337a154135..556c7f269a 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/async-annotation-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/async-annotation-plugin/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/concurrent-util-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/concurrent-util-4.x-plugin/pom.xml index fa85530d61..8c922b6c28 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/concurrent-util-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/concurrent-util-4.x-plugin/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/pom.xml index 58e530913a..0b367dffe7 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/pom.xml @@ -21,7 +21,7 @@ spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/pom.xml index 02fa8639d0..a3ad988877 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/pom.xml index f48ace4499..d551f811a0 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/pom.xml index bea4ce00a9..c8eae36531 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/pom.xml @@ -19,7 +19,7 @@ spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml index 65c554bb88..67bcaaac46 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml index 5a307810b3..8aeb72256e 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT spring-plugins diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-3.x-plugin/pom.xml index 2dab6a46c9..2b8cb9beed 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-3.x-plugin/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/pom.xml index 966de1995f..9bcaa96cbf 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-commons/pom.xml index 19ecc7989c..7317ad938a 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-commons/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-commons/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/scheduled-annotation-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/scheduled-annotation-plugin/pom.xml index c4dfd6d15f..3bb2740074 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/scheduled-annotation-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/scheduled-annotation-plugin/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/pom.xml index 34769eadbb..7df17507ae 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking spring-cloud - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT netflix-plugins diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/pom.xml index 6fb11aaa57..4a76383083 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking netflix-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-spring-cloud-feign-1.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/pom.xml index d1f4409bce..19d050291c 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking spring-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT spring-cloud diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/spring-cloud-feign-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/spring-cloud-feign-2.x-plugin/pom.xml index 579c404b7a..bd7a6d2f3f 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/spring-cloud-feign-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/spring-cloud-feign-2.x-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking spring-cloud - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-spring-cloud-feign-2.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-commons/pom.xml index ff67ee32df..7e1ff15179 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-commons/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-commons/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-1.x-plugin/pom.xml index d8bf75bf9e..a8afa0c54a 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-1.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking spring-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-spring-kafka-1.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-2.x-plugin/pom.xml index 2cff5cf300..267f56a506 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-2.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking spring-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-spring-kafka-2.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-5.x-webclient-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-5.x-webclient-plugin/pom.xml index 1a3cfbfeb7..2c818ab342 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-5.x-webclient-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-5.x-webclient-plugin/pom.xml @@ -21,7 +21,7 @@ spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-6.x-webclient-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-6.x-webclient-plugin/pom.xml index 6f67c4b024..6d50169112 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-6.x-webclient-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-6.x-webclient-plugin/pom.xml @@ -21,7 +21,7 @@ spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spymemcached-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spymemcached-2.x-plugin/pom.xml index 1b123e2207..4eda0fae4c 100644 --- a/apm-sniffer/apm-sdk-plugin/spymemcached-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spymemcached-2.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-spymemcached-2.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/pom.xml index eb3e342fd3..9e164a9477 100644 --- a/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/thrift-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/thrift-plugin/pom.xml index dc51e01a99..c481a809ef 100644 --- a/apm-sniffer/apm-sdk-plugin/thrift-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/thrift-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/tomcat-10x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/tomcat-10x-plugin/pom.xml index 62896f4b61..ca896b0cef 100644 --- a/apm-sniffer/apm-sdk-plugin/tomcat-10x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/tomcat-10x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/pom.xml index 0763bcca65..7307cd3f9a 100644 --- a/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/tomcat-thread-pool-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/tomcat-thread-pool-plugin/pom.xml index 2007b9711e..7c5eb5597b 100644 --- a/apm-sniffer/apm-sdk-plugin/tomcat-thread-pool-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/tomcat-thread-pool-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/undertow-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/undertow-plugins/pom.xml index 14d23e7692..10a4132bfd 100644 --- a/apm-sniffer/apm-sdk-plugin/undertow-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/undertow-plugins/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT undertow-plugins diff --git a/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/pom.xml index 8b722364c6..952be80876 100644 --- a/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/pom.xml @@ -20,7 +20,7 @@ undertow-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/undertow-worker-thread-pool-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/undertow-worker-thread-pool-plugin/pom.xml index aed38b73f1..a46b602982 100644 --- a/apm-sniffer/apm-sdk-plugin/undertow-worker-thread-pool-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/undertow-worker-thread-pool-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/vertx-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/vertx-plugins/pom.xml index a7f441800d..a33ebb009e 100644 --- a/apm-sniffer/apm-sdk-plugin/vertx-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/vertx-plugins/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT vertx-plugins diff --git a/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-3.x-plugin/pom.xml index b1d89698a5..1a33046229 100644 --- a/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-3.x-plugin/pom.xml @@ -20,7 +20,7 @@ vertx-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-4.x-plugin/pom.xml index 9e21fe716a..981b6bdd3d 100644 --- a/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-4.x-plugin/pom.xml @@ -20,7 +20,7 @@ vertx-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/websphere-liberty-23.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/websphere-liberty-23.x-plugin/pom.xml index 7795fd9659..4d1971ea07 100644 --- a/apm-sniffer/apm-sdk-plugin/websphere-liberty-23.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/websphere-liberty-23.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/xmemcached-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/xmemcached-2.x-plugin/pom.xml index 35876e8aff..fa896a48e2 100644 --- a/apm-sniffer/apm-sdk-plugin/xmemcached-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/xmemcached-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-xmemcached-2.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/xxl-job-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/xxl-job-2.x-plugin/pom.xml index da1409f18d..5566ea223c 100644 --- a/apm-sniffer/apm-sdk-plugin/xxl-job-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/xxl-job-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-test-tools/pom.xml b/apm-sniffer/apm-test-tools/pom.xml index 9dd0f43cb3..8b406e428e 100644 --- a/apm-sniffer/apm-test-tools/pom.xml +++ b/apm-sniffer/apm-test-tools/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking java-agent-sniffer - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-test-tools diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-kafka-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-kafka-activation/pom.xml index a914b8d528..c14b96205e 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-kafka-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-kafka-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-1.x-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-1.x-activation/pom.xml index 86e57d28bb..b3a5651b21 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-1.x-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-1.x-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-2.x-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-2.x-activation/pom.xml index 5e1a0fb598..747d520d74 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-2.x-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-2.x-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/pom.xml index 341faac073..75b3b31866 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-logging-common/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-logging-common/pom.xml index ae19d88816..57033d5b09 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-logging-common/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-logging-common/pom.xml @@ -20,7 +20,7 @@ apm-toolkit-activation org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-meter-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-meter-activation/pom.xml index 4d260f63e5..c04acb613b 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-meter-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-meter-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/pom.xml index 7e9c7d103f..fb6e91be34 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/pom.xml @@ -20,7 +20,7 @@ apm-toolkit-activation org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-opentracing-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-opentracing-activation/pom.xml index 05dc1b4ac9..a260c73ed8 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-opentracing-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-opentracing-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/pom.xml index f93d0a3397..e0d378caea 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-webflux-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-webflux-activation/pom.xml index d8832e24f5..b82def92b1 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-webflux-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-webflux-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/pom.xml index f6e3b542c5..09206213e1 100644 --- a/apm-sniffer/apm-toolkit-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/pom.xml @@ -21,7 +21,7 @@ java-agent-sniffer org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 pom diff --git a/apm-sniffer/bootstrap-plugins/jdk-forkjoinpool-plugin/pom.xml b/apm-sniffer/bootstrap-plugins/jdk-forkjoinpool-plugin/pom.xml index 5de97c5a33..94de5b8c2a 100644 --- a/apm-sniffer/bootstrap-plugins/jdk-forkjoinpool-plugin/pom.xml +++ b/apm-sniffer/bootstrap-plugins/jdk-forkjoinpool-plugin/pom.xml @@ -20,7 +20,7 @@ org.apache.skywalking bootstrap-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/bootstrap-plugins/jdk-http-plugin/pom.xml b/apm-sniffer/bootstrap-plugins/jdk-http-plugin/pom.xml index 1692e684a6..8bfa622165 100755 --- a/apm-sniffer/bootstrap-plugins/jdk-http-plugin/pom.xml +++ b/apm-sniffer/bootstrap-plugins/jdk-http-plugin/pom.xml @@ -20,7 +20,7 @@ org.apache.skywalking bootstrap-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 @@ -33,7 +33,7 @@ UTF-8 - + diff --git a/apm-sniffer/bootstrap-plugins/jdk-httpclient-plugin/pom.xml b/apm-sniffer/bootstrap-plugins/jdk-httpclient-plugin/pom.xml index f537f685e6..88a0f72a99 100644 --- a/apm-sniffer/bootstrap-plugins/jdk-httpclient-plugin/pom.xml +++ b/apm-sniffer/bootstrap-plugins/jdk-httpclient-plugin/pom.xml @@ -20,7 +20,7 @@ bootstrap-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/bootstrap-plugins/jdk-threading-plugin/pom.xml b/apm-sniffer/bootstrap-plugins/jdk-threading-plugin/pom.xml index 33dd7a3b4d..6bed3de12b 100755 --- a/apm-sniffer/bootstrap-plugins/jdk-threading-plugin/pom.xml +++ b/apm-sniffer/bootstrap-plugins/jdk-threading-plugin/pom.xml @@ -20,7 +20,7 @@ org.apache.skywalking bootstrap-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/bootstrap-plugins/jdk-threadpool-plugin/pom.xml b/apm-sniffer/bootstrap-plugins/jdk-threadpool-plugin/pom.xml index 3da184c381..ca7eb8cac7 100644 --- a/apm-sniffer/bootstrap-plugins/jdk-threadpool-plugin/pom.xml +++ b/apm-sniffer/bootstrap-plugins/jdk-threadpool-plugin/pom.xml @@ -20,7 +20,7 @@ bootstrap-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/bootstrap-plugins/jdk-virtual-thread-executor-plugin/pom.xml b/apm-sniffer/bootstrap-plugins/jdk-virtual-thread-executor-plugin/pom.xml index 9a3eee820f..67766ef3eb 100644 --- a/apm-sniffer/bootstrap-plugins/jdk-virtual-thread-executor-plugin/pom.xml +++ b/apm-sniffer/bootstrap-plugins/jdk-virtual-thread-executor-plugin/pom.xml @@ -20,7 +20,7 @@ bootstrap-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/bootstrap-plugins/pom.xml b/apm-sniffer/bootstrap-plugins/pom.xml index fe3bf24930..cf1285cc07 100644 --- a/apm-sniffer/bootstrap-plugins/pom.xml +++ b/apm-sniffer/bootstrap-plugins/pom.xml @@ -21,7 +21,7 @@ java-agent-sniffer org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/bytebuddy-patch/pom.xml b/apm-sniffer/bytebuddy-patch/pom.xml index 460631dfc3..60b20cffe9 100644 --- a/apm-sniffer/bytebuddy-patch/pom.xml +++ b/apm-sniffer/bytebuddy-patch/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking java-agent-sniffer - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/expired-plugins/impala-jdbc-2.6.x-plugin/pom.xml b/apm-sniffer/expired-plugins/impala-jdbc-2.6.x-plugin/pom.xml index 5dfd4ed7ab..5ac2465450 100644 --- a/apm-sniffer/expired-plugins/impala-jdbc-2.6.x-plugin/pom.xml +++ b/apm-sniffer/expired-plugins/impala-jdbc-2.6.x-plugin/pom.xml @@ -24,7 +24,7 @@ org.apache.skywalking expired-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-impala-jdbc-2.6.x-plugin diff --git a/apm-sniffer/expired-plugins/pom.xml b/apm-sniffer/expired-plugins/pom.xml index 4385464c61..f33497cec5 100644 --- a/apm-sniffer/expired-plugins/pom.xml +++ b/apm-sniffer/expired-plugins/pom.xml @@ -21,7 +21,7 @@ java-agent-sniffer org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/caffeine-3.x-plugin/pom.xml b/apm-sniffer/optional-plugins/caffeine-3.x-plugin/pom.xml index 89d8d96b65..8428e0e60e 100644 --- a/apm-sniffer/optional-plugins/caffeine-3.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/caffeine-3.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking optional-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-caffeine-3.x-plugin diff --git a/apm-sniffer/optional-plugins/customize-enhance-plugin/pom.xml b/apm-sniffer/optional-plugins/customize-enhance-plugin/pom.xml index fb100e0d94..14fc75ee0e 100644 --- a/apm-sniffer/optional-plugins/customize-enhance-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/customize-enhance-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking optional-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/ehcache-2.x-plugin/pom.xml b/apm-sniffer/optional-plugins/ehcache-2.x-plugin/pom.xml index 60906ea1df..9dea5174c9 100644 --- a/apm-sniffer/optional-plugins/ehcache-2.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/ehcache-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking optional-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/fastjson-1.2.x-plugin/pom.xml b/apm-sniffer/optional-plugins/fastjson-1.2.x-plugin/pom.xml index fd47548245..630524d970 100644 --- a/apm-sniffer/optional-plugins/fastjson-1.2.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/fastjson-1.2.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking optional-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-fastjson-1.x-plugin diff --git a/apm-sniffer/optional-plugins/gson-2.8.x-plugin/pom.xml b/apm-sniffer/optional-plugins/gson-2.8.x-plugin/pom.xml index 3cacbd71f0..f45e92d2f5 100644 --- a/apm-sniffer/optional-plugins/gson-2.8.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/gson-2.8.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking optional-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-gson-2.x-plugin diff --git a/apm-sniffer/optional-plugins/guava-cache-plugin/pom.xml b/apm-sniffer/optional-plugins/guava-cache-plugin/pom.xml index 4b678e32ed..e32c47ce81 100644 --- a/apm-sniffer/optional-plugins/guava-cache-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/guava-cache-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking optional-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-guava-cache-plugin diff --git a/apm-sniffer/optional-plugins/jackson-2.x-plugin/pom.xml b/apm-sniffer/optional-plugins/jackson-2.x-plugin/pom.xml index 6cc5017d9c..1b1d26a818 100644 --- a/apm-sniffer/optional-plugins/jackson-2.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/jackson-2.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking optional-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-jackson-2.x-plugin diff --git a/apm-sniffer/optional-plugins/kotlin-coroutine-plugin/pom.xml b/apm-sniffer/optional-plugins/kotlin-coroutine-plugin/pom.xml index ab831b6c1b..0f55f43e47 100644 --- a/apm-sniffer/optional-plugins/kotlin-coroutine-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/kotlin-coroutine-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking optional-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-kotlin-coroutine-plugin diff --git a/apm-sniffer/optional-plugins/mybatis-3.x-plugin/pom.xml b/apm-sniffer/optional-plugins/mybatis-3.x-plugin/pom.xml index 7da71f0c1c..84ba662bcf 100644 --- a/apm-sniffer/optional-plugins/mybatis-3.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/mybatis-3.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking optional-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-mybatis-3.x-plugin diff --git a/apm-sniffer/optional-plugins/nacos-client-2.x-plugin/pom.xml b/apm-sniffer/optional-plugins/nacos-client-2.x-plugin/pom.xml index 7f5ea9441e..acbd852ce7 100644 --- a/apm-sniffer/optional-plugins/nacos-client-2.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/nacos-client-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking optional-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/netty-http-4.1.x-plugin/pom.xml b/apm-sniffer/optional-plugins/netty-http-4.1.x-plugin/pom.xml index b8313a57c7..daeacb30d2 100644 --- a/apm-sniffer/optional-plugins/netty-http-4.1.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/netty-http-4.1.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking optional-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/mvc-annotation-6.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/mvc-annotation-6.x-plugin/pom.xml index a2399d0bc6..b7f5b84a75 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/mvc-annotation-6.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/mvc-annotation-6.x-plugin/pom.xml @@ -19,7 +19,7 @@ optional-spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.0.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.0.x-plugin/pom.xml index b2963c4c23..b798e59499 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.0.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.0.x-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking optional-spring-cloud - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-spring-cloud-gateway-2.0.x-plugin diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.1.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.1.x-plugin/pom.xml index c9a0dfb040..e5b6e7e100 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.1.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.1.x-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking optional-spring-cloud - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-spring-cloud-gateway-2.1.x-plugin diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-3.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-3.x-plugin/pom.xml index 33180c560c..5bfe88aef2 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-3.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ optional-spring-cloud org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-4.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-4.x-plugin/pom.xml index bcd6ffcca4..d890c84e7c 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-4.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ optional-spring-cloud org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/pom.xml index 8e5547689c..281fb79f0e 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking optional-spring-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT optional-spring-cloud diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/pom.xml index 3b34789ab4..344126cd75 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/pom.xml @@ -21,7 +21,7 @@ optional-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 pom diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/resttemplate-6.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/resttemplate-6.x-plugin/pom.xml index 8fc5797da0..18d0a3037c 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/resttemplate-6.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/resttemplate-6.x-plugin/pom.xml @@ -20,7 +20,7 @@ optional-spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-annotation-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-annotation-plugin/pom.xml index 367a58c61b..e943d2451c 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-annotation-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-annotation-plugin/pom.xml @@ -21,7 +21,7 @@ optional-spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 jar diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-tx-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-tx-plugin/pom.xml index 74f0694de2..f03fd451c0 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-tx-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-tx-plugin/pom.xml @@ -21,7 +21,7 @@ optional-spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 jar diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-5.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-5.x-plugin/pom.xml index e597375432..2ef8246634 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-5.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-5.x-plugin/pom.xml @@ -21,7 +21,7 @@ optional-spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-6.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-6.x-plugin/pom.xml index 98c5f9bc71..ca9e22a8d0 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-6.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-6.x-plugin/pom.xml @@ -21,7 +21,7 @@ optional-spring-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/pom.xml b/apm-sniffer/optional-plugins/pom.xml index c1d0d8adb7..143a79f94b 100644 --- a/apm-sniffer/optional-plugins/pom.xml +++ b/apm-sniffer/optional-plugins/pom.xml @@ -21,7 +21,7 @@ java-agent-sniffer org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/quartz-scheduler-2.x-plugin/pom.xml b/apm-sniffer/optional-plugins/quartz-scheduler-2.x-plugin/pom.xml index acc3b85a35..ab9894e133 100644 --- a/apm-sniffer/optional-plugins/quartz-scheduler-2.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/quartz-scheduler-2.x-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking optional-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-quartz-scheduler-2.x-plugin diff --git a/apm-sniffer/optional-plugins/sentinel-1.x-plugin/pom.xml b/apm-sniffer/optional-plugins/sentinel-1.x-plugin/pom.xml index fd4abb4af5..c3c4a2f162 100644 --- a/apm-sniffer/optional-plugins/sentinel-1.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/sentinel-1.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking optional-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/shenyu-2.4.x-plugin/pom.xml b/apm-sniffer/optional-plugins/shenyu-2.4.x-plugin/pom.xml index 7f712e7582..10f4d208fa 100644 --- a/apm-sniffer/optional-plugins/shenyu-2.4.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/shenyu-2.4.x-plugin/pom.xml @@ -21,7 +21,7 @@ optional-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/trace-ignore-plugin/pom.xml b/apm-sniffer/optional-plugins/trace-ignore-plugin/pom.xml index ec9d193fc6..32d5002b57 100644 --- a/apm-sniffer/optional-plugins/trace-ignore-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/trace-ignore-plugin/pom.xml @@ -20,7 +20,7 @@ optional-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/trace-sampler-cpu-policy-plugin/pom.xml b/apm-sniffer/optional-plugins/trace-sampler-cpu-policy-plugin/pom.xml index cc4f683ed6..b2dfdfdfe9 100644 --- a/apm-sniffer/optional-plugins/trace-sampler-cpu-policy-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/trace-sampler-cpu-policy-plugin/pom.xml @@ -20,7 +20,7 @@ optional-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/zookeeper-3.4.x-plugin/pom.xml b/apm-sniffer/optional-plugins/zookeeper-3.4.x-plugin/pom.xml index 530f490fd5..723e675445 100644 --- a/apm-sniffer/optional-plugins/zookeeper-3.4.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/zookeeper-3.4.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking optional-plugins - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT apm-zookeeper-3.4.x-plugin diff --git a/apm-sniffer/optional-reporter-plugins/kafka-config-extension/pom.xml b/apm-sniffer/optional-reporter-plugins/kafka-config-extension/pom.xml index 52374f2631..15026e49df 100644 --- a/apm-sniffer/optional-reporter-plugins/kafka-config-extension/pom.xml +++ b/apm-sniffer/optional-reporter-plugins/kafka-config-extension/pom.xml @@ -20,7 +20,7 @@ optional-reporter-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-reporter-plugins/kafka-reporter-plugin/pom.xml b/apm-sniffer/optional-reporter-plugins/kafka-reporter-plugin/pom.xml index 127e923448..99b9cf3679 100644 --- a/apm-sniffer/optional-reporter-plugins/kafka-reporter-plugin/pom.xml +++ b/apm-sniffer/optional-reporter-plugins/kafka-reporter-plugin/pom.xml @@ -21,7 +21,7 @@ optional-reporter-plugins org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-reporter-plugins/pom.xml b/apm-sniffer/optional-reporter-plugins/pom.xml index 13b9fc86f7..260ddc308b 100644 --- a/apm-sniffer/optional-reporter-plugins/pom.xml +++ b/apm-sniffer/optional-reporter-plugins/pom.xml @@ -21,7 +21,7 @@ java-agent-sniffer org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/pom.xml b/apm-sniffer/pom.xml index 94ea5a16bd..4cb926b474 100644 --- a/apm-sniffer/pom.xml +++ b/apm-sniffer/pom.xml @@ -21,7 +21,7 @@ java-agent org.apache.skywalking - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT 4.0.0 diff --git a/changes/changes-9.6.0.md b/changes/changes-9.6.0.md deleted file mode 100644 index 74a4739aaa..0000000000 --- a/changes/changes-9.6.0.md +++ /dev/null @@ -1,33 +0,0 @@ -Changes by Version -================== -Release Notes. - -9.6.0 ------------------- - -* Add CLAUDE.md for AI assistant guidance. -* Bump up agent-oap protocol to latest(16c51358ebcf42629bf4ffdf952253971f20eb25). -* Bump up gRPC to v1.74.0. -* Bump up netty to v4.1.124.Final. -* Bump up GSON to v2.13.1. -* Bump up guava to v32.1.3. -* Bump up oap to the 10.3-dev.latest(dc8740d4757b35374283c4850a9a080e40f0eb79) in e2e. -* Bump up cli to the 0.15.0-dev.latest(77b4c49e89c9c000278f44e62729d534f2ec842e) in e2e. -* Bump up apache parent pom to v35. -* Update Maven to 3.6.3 in mvnw. -* Fix OOM due to too many span logs. -* Fix ClassLoader cache OOM issue with WeakHashMap. -* Fix Jetty client cannot receive the HTTP response body. -* Eliminate repeated code with HttpServletRequestWrapper in mvc-annotation-commons. -* Add the jdk httpclient plugin. -* Fix Gateway 2.0.x plugin not activated for spring-cloud-starter-gateway 2.0.0.RELEASE. -* Support kafka-clients-3.9.x intercept. -* Upgrade kafka-clients version in optional-reporter-plugins to 3.9.1. -* Fix AbstractLogger replaceParam when the replaced string contains a replacement marker. -* Fix `JDBCPluginConfig.Plugin.JDBC.SQL_BODY_MAX_LENGTH` was not working in some plugins. -* Bump up Lombok to v1.18.42 to adopt JDK25 compiling. -* Add `eclipse-temurin:25-jre` as another base image. -* Add JDK25 plugin tests for Spring 6. -* Ignore classes starting with "sun.nio.cs" in bytebuddy due to potential class loading deadlock. - -All issues and pull requests are [here](https://github.com/apache/skywalking/milestone/242?closed=1) diff --git a/pom.xml b/pom.xml index b675688a4a..6077be71f5 100755 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking java-agent - 9.7.0-SNAPSHOT + 9.6.0-SNAPSHOT org.apache diff --git a/test/plugin/containers/jvm-container/src/main/docker/run.sh b/test/plugin/containers/jvm-container/src/main/docker/run.sh index 3a70fe4930..9d1327c621 100644 --- a/test/plugin/containers/jvm-container/src/main/docker/run.sh +++ b/test/plugin/containers/jvm-container/src/main/docker/run.sh @@ -24,10 +24,7 @@ exitOnError() { } exitAndClean() { - if [[ -n $DEBUG_MODE ]]; then - chmod -R a+r ${SCENARIO_HOME} 2>/dev/null - exit $1 - fi + [[ -n $DEBUG_MODE ]] && exit $1; [[ -f ${SCENARIO_HOME}/data/actualData.yaml ]] && rm -rf ${SCENARIO_HOME}/data/actualData.yaml [[ -d ${LOGS_HOME} ]] && rm -rf ${LOGS_HOME} @@ -87,7 +84,7 @@ export agent_opts=" -Dskywalking.meter.report_interval=1 -Xms256m -Xmx256m ${agent_opts}" -bash /var/run/${SCENARIO_NAME}/${SCENARIO_START_SCRIPT} >${LOGS_HOME}/scenario.out 2>&1 & +bash /var/run/${SCENARIO_NAME}/${SCENARIO_START_SCRIPT} 1>${LOGS_HOME}/scenario.out & sleep 5 healthCheck ${SCENARIO_HEALTH_CHECK_URL} diff --git a/test/plugin/runner-helper/src/main/resources/compose-start-script.template b/test/plugin/runner-helper/src/main/resources/compose-start-script.template index c94e415bf2..3ef6a15466 100644 --- a/test/plugin/runner-helper/src/main/resources/compose-start-script.template +++ b/test/plugin/runner-helper/src/main/resources/compose-start-script.template @@ -26,47 +26,16 @@ docker_container_name="${docker_container_name}_1" <#noparse> container_name="${project_name}_${docker_container_name}" - -# Diagnostic: log docker compose version -docker compose version >&2 || true - -echo "=== Starting docker compose ===" >&2 -compose_output=$(docker compose -p ${project_name} -f ${compose_file} up -d 2>&1) -compose_exit=$? -echo "${compose_output}" >&2 -if [[ ${compose_exit} -ne 0 ]]; then - echo "docker compose up exited with code ${compose_exit}" >&2 -fi +docker compose -p ${project_name} -f ${compose_file} up -d container_id=`docker ps -qf "name=${container_name}"` if [[ -z "${container_id}" ]]; then - echo "docker startup failure! container_name=${container_name} not found." >&2 - echo "=== docker ps -a ===" >&2 - docker ps -a >&2 || true - echo "=== docker compose logs ===" >&2 - docker compose -p ${project_name} -f ${compose_file} logs 2>&1 >&2 || true - # Create container.log with diagnostic info - mkdir -p ${SCENARIO_HOME}/logs - { - echo "=== CONTAINER STARTUP FAILURE ===" - echo "container_name=${container_name} was not found by docker ps" - echo "compose_exit_code=${compose_exit}" - echo "compose_output:" - echo "${compose_output}" - echo "=== docker ps -a ===" - docker ps -a 2>&1 || true - echo "=== docker compose logs ===" - docker compose -p ${project_name} -f ${compose_file} logs 2>&1 || true - } >${SCENARIO_HOME}/logs/container.log - docker compose -p ${project_name} -f ${compose_file} kill 2>/dev/null || true - docker compose -p ${project_name} -f ${compose_file} rm -f 2>/dev/null || true + echo "docker startup failure!" >&2 status=1 else status=`docker wait ${container_id}` [[ $status -ne 0 ]] && docker logs ${container_id} >&2 - # Recreate logs dir in case the container removed it via volume mount - mkdir -p ${SCENARIO_HOME}/logs docker logs ${container_id} >${SCENARIO_HOME}/logs/container.log docker compose -p ${project_name} -f ${compose_file} kill diff --git a/test/plugin/runner-helper/src/main/resources/container-start-script.template b/test/plugin/runner-helper/src/main/resources/container-start-script.template index 97ee284649..0f072afdf1 100644 --- a/test/plugin/runner-helper/src/main/resources/container-start-script.template +++ b/test/plugin/runner-helper/src/main/resources/container-start-script.template @@ -47,25 +47,13 @@ sleep 3 container_name=`docker ps -aqf "name=${docker_container_name}"` <#noparse> +status=$(docker wait ${container_name}) + if [[ -z ${container_name} ]]; then echo "docker startup failure!" >&2 - echo "=== docker ps -a ===" >&2 - docker ps -a >&2 || true - # Create container.log with diagnostic info - mkdir -p ${SCENARIO_HOME}/logs - { - echo "=== CONTAINER STARTUP FAILURE ===" - echo "Container not found by docker ps" - echo "=== docker ps -a ===" - docker ps -a 2>&1 || true - } >${SCENARIO_HOME}/logs/container.log status=1 else - status=$(docker wait ${container_name}) - [[ $status -ne 0 ]] && docker logs ${container_name} >&2 - # Recreate logs dir in case the container removed it via volume mount - mkdir -p ${SCENARIO_HOME}/logs docker logs ${container_name} >${SCENARIO_HOME}/logs/container.log docker container rm -f $container_name fi diff --git a/test/plugin/scenarios/elasticsearch-7.x-scenario/configuration.yml b/test/plugin/scenarios/elasticsearch-7.x-scenario/configuration.yml index aa43501041..853e67498e 100644 --- a/test/plugin/scenarios/elasticsearch-7.x-scenario/configuration.yml +++ b/test/plugin/scenarios/elasticsearch-7.x-scenario/configuration.yml @@ -22,7 +22,7 @@ environment: - elasticsearch.server=elasticsearch-server-7.x:9200 dependencies: elasticsearch-server-7.x: - image: docker.elastic.co/elasticsearch/elasticsearch:${CASE_SERVER_IMAGE_VERSION} + image: elasticsearch:${CASE_SERVER_IMAGE_VERSION} hostname: elasticsearch-server-7.x removeOnExit: true expose: @@ -30,5 +30,6 @@ dependencies: environment: - cluster.name=docker-node - xpack.security.enabled=false - - "ES_JAVA_OPTS=-Xms512m -Xmx512m" + - bootstrap.memory_lock=true + - "ES_JAVA_OPTS=-Xms256m -Xmx256m" - discovery.type=single-node diff --git a/test/plugin/scenarios/elasticsearch-7.x-scenario/support-version.list b/test/plugin/scenarios/elasticsearch-7.x-scenario/support-version.list index e5b98548c6..d5108d7a3c 100644 --- a/test/plugin/scenarios/elasticsearch-7.x-scenario/support-version.list +++ b/test/plugin/scenarios/elasticsearch-7.x-scenario/support-version.list @@ -27,4 +27,5 @@ 7.12.1 7.13.4 7.14.2 +7.16.3 7.17.21 \ No newline at end of file diff --git a/test/plugin/scenarios/elasticsearch-rest-high-level-6.x-scenario/configuration.yml b/test/plugin/scenarios/elasticsearch-rest-high-level-6.x-scenario/configuration.yml index 72c856d395..bab1c5a875 100644 --- a/test/plugin/scenarios/elasticsearch-rest-high-level-6.x-scenario/configuration.yml +++ b/test/plugin/scenarios/elasticsearch-rest-high-level-6.x-scenario/configuration.yml @@ -20,7 +20,7 @@ environment: - elasticsearch.server=elasticsearch-server-6.x:9200 dependencies: elasticsearch-server-6.x: - image: docker.elastic.co/elasticsearch/elasticsearch:${CASE_SERVER_IMAGE_VERSION} + image: elasticsearch:${CASE_SERVER_IMAGE_VERSION} hostname: elasticsearch-server-6.x removeOnExit: true expose: diff --git a/test/plugin/scenarios/rocketmq-5-grpc-scenario/pom.xml b/test/plugin/scenarios/rocketmq-5-grpc-scenario/pom.xml index 018ce5430e..d27b6488b1 100644 --- a/test/plugin/scenarios/rocketmq-5-grpc-scenario/pom.xml +++ b/test/plugin/scenarios/rocketmq-5-grpc-scenario/pom.xml @@ -34,7 +34,7 @@ 1.8 3.8.1 5.0.5 - 5.1.4 + 5.1.1 2.1.6.RELEASE 1.18.20 diff --git a/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/CaseController.java b/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/CaseController.java index 313389913e..5219bc8db9 100644 --- a/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/CaseController.java +++ b/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/CaseController.java @@ -48,27 +48,35 @@ public class CaseController { @Autowired private MessageService messageService; - private volatile boolean consumerStarted = false; - @RequestMapping("/rocketmq-5-grpc-scenario") @ResponseBody public String testcase() { try { messageService.sendNormalMessage(NORMAL_TOPIC, TAG_NOMARL, GROUP); + Thread t1 = new Thread(() -> messageService.pushConsumes( + Collections.singletonList(NORMAL_TOPIC), + Collections.singletonList(TAG_NOMARL), + GROUP + )); + t1.start(); + t1.join(); messageService.sendNormalMessageAsync(ASYNC_PRODUCER_TOPIC, TAG_ASYNC_PRODUCER, GROUP); messageService.sendNormalMessageAsync(ASYNC_PRODUCER_TOPIC, TAG_ASYNC_PRODUCER, GROUP); - new Thread(() -> messageService.simpleConsumes( - Collections.singletonList(ASYNC_PRODUCER_TOPIC), - Collections.singletonList(TAG_ASYNC_PRODUCER), GROUP, - 10, 10 - )).start(); + Thread t2 = new Thread(() -> messageService.simpleConsumes(Collections.singletonList(ASYNC_PRODUCER_TOPIC), + Collections.singletonList(TAG_ASYNC_PRODUCER), GROUP, + 10, 10 + )); + t2.start(); + t2.join(); messageService.sendNormalMessage(ASYNC_CONSUMER_TOPIC, TAG_ASYNC_CONSUMER, GROUP); messageService.sendNormalMessage(ASYNC_CONSUMER_TOPIC, TAG_ASYNC_CONSUMER, GROUP); - new Thread(() -> messageService.simpleConsumeAsync( - ASYNC_CONSUMER_TOPIC, TAG_ASYNC_CONSUMER, GROUP, 10, 10 - )).start(); + Thread t3 = new Thread(() -> messageService.simpleConsumeAsync(ASYNC_CONSUMER_TOPIC, TAG_ASYNC_CONSUMER, GROUP, 10, + 10 + )); + t3.start(); + t3.join(); } catch (Exception e) { log.error("testcase error", e); } @@ -78,45 +86,11 @@ public String testcase() { @RequestMapping("/healthCheck") @ResponseBody public String healthCheck() throws Exception { - if (!consumerStarted) { - // Set flag early to prevent re-entry from concurrent healthCheck - // requests (each curl has a 3s timeout, and initialization may - // take longer than that). - consumerStarted = true; - try { - System.setProperty(MixAll.ROCKETMQ_HOME_ENV, this.getClass().getResource("/").getPath()); - messageService.updateNormalTopic(NORMAL_TOPIC); - messageService.updateNormalTopic(ASYNC_PRODUCER_TOPIC); - messageService.updateNormalTopic(ASYNC_CONSUMER_TOPIC); - // Start push consumer early so it has time to receive messages - messageService.pushConsumes( - Collections.singletonList(NORMAL_TOPIC), - Collections.singletonList(TAG_NOMARL), - GROUP - ); - final Producer producer = ProducerSingleton.getInstance(endpoints, NORMAL_TOPIC); - // Send a probe message so the consumer has something to receive - messageService.sendNormalMessage(NORMAL_TOPIC, TAG_NOMARL, GROUP); - } catch (Exception e) { - consumerStarted = false; - throw e; - } - } - - // Wait until the consumer has actually received a probe message, - // confirming it can consume from the topic. - // Send a fresh probe on every retry so the consumer picks it up once - // rebalance finishes (messages sent before rebalance may never arrive). - if (!MessageService.CONSUMER_READY) { - try { - messageService.sendNormalMessage(NORMAL_TOPIC, TAG_NOMARL, GROUP); - System.out.printf("HealthCheck: sent probe message (consumer not ready yet).%n"); - } catch (Exception e) { - System.out.printf("HealthCheck: failed to send probe: %s%n", e.getMessage()); - } - throw new RuntimeException("Consumer has not received probe message yet"); - } - + System.setProperty(MixAll.ROCKETMQ_HOME_ENV, this.getClass().getResource("/").getPath()); + messageService.updateNormalTopic(NORMAL_TOPIC); + messageService.updateNormalTopic(ASYNC_PRODUCER_TOPIC); + messageService.updateNormalTopic(ASYNC_CONSUMER_TOPIC); + final Producer producer = ProducerSingleton.getInstance(endpoints, NORMAL_TOPIC); return SUCCESS; } } diff --git a/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/MessageService.java b/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/MessageService.java index 33b9bad539..f7d4dc3c9b 100644 --- a/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/MessageService.java +++ b/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/MessageService.java @@ -203,23 +203,26 @@ public void simpleConsumeAsync(String topic, maxMessageNum, invisibleDuration ); - future0.thenComposeAsync(messages -> { + future0.whenCompleteAsync((messages, throwable) -> { + if (null != throwable) { + log.error("Failed to receive message from remote", throwable); + return; + } log.info("Received {} message(s)", messages.size()); final Map> map = messages.stream().collect(Collectors.toMap(message -> message, consumer::ackAsync)); - List> ackFutures = map.entrySet().stream().map(entry -> { + for (Map.Entry> entry : map.entrySet()) { final MessageId messageId = entry.getKey().getMessageId(); final CompletableFuture future = entry.getValue(); - return future.whenCompleteAsync((v, t) -> { + future.whenCompleteAsync((v, t) -> { if (null != t) { log.error("Message is failed to be acknowledged, messageId={}", messageId, t); return; } log.info("Message is acknowledged successfully, messageId={}", messageId); }, ackCallbackExecutor); - }).collect(Collectors.toList()); - return CompletableFuture.allOf(ackFutures.toArray(new CompletableFuture[0])); - }, receiveCallbackExecutor).join(); + } + }, receiveCallbackExecutor); } catch (Exception e) { log.error("consumer start error", e); } @@ -240,8 +243,6 @@ public void updateNormalTopic(String topic) { MQAdminStartup.main(subArgs); } - public static volatile boolean CONSUMER_READY = false; - public static class MyConsumer implements MessageListener { @Override @@ -249,7 +250,6 @@ public ConsumeResult consume(MessageView messageView) { log.info("Consume message successfully, messageId={},messageBody={}", messageView.getMessageId(), messageView.getBody().toString() ); - CONSUMER_READY = true; return ConsumeResult.SUCCESS; } } diff --git a/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/resources/log4j2.xml b/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/resources/log4j2.xml index b16354bfa3..9849ed5a8a 100644 --- a/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/resources/log4j2.xml +++ b/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/resources/log4j2.xml @@ -23,7 +23,7 @@ - + diff --git a/test/plugin/scenarios/rocketmq-5-grpc-scenario/support-version.list b/test/plugin/scenarios/rocketmq-5-grpc-scenario/support-version.list index da0221c8c1..4f8dd365dc 100644 --- a/test/plugin/scenarios/rocketmq-5-grpc-scenario/support-version.list +++ b/test/plugin/scenarios/rocketmq-5-grpc-scenario/support-version.list @@ -16,4 +16,5 @@ # lists your version here (Contains only the last version number of each minor version.) +5.1.1 5.1.4 diff --git a/test/plugin/scenarios/rocketmq-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/controller/CaseController.java b/test/plugin/scenarios/rocketmq-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/controller/CaseController.java index 85d32069a5..ab96fd6a7c 100644 --- a/test/plugin/scenarios/rocketmq-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/controller/CaseController.java +++ b/test/plugin/scenarios/rocketmq-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/controller/CaseController.java @@ -25,7 +25,6 @@ import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.client.producer.SendResult; -import org.apache.rocketmq.common.consumer.ConsumeFromWhere; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.remoting.common.RemotingHelper; @@ -48,19 +47,17 @@ public class CaseController { @Value("${name.server}") private String namerServer; - private volatile boolean consumerStarted = false; - private volatile boolean consumerReady = false; - private DefaultMQProducer probeProducer; - @RequestMapping("/rocketmq-scenario") @ResponseBody public String testcase() { try { + // start producer DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); producer.setNamesrvAddr(namerServer); producer.start(); System.out.printf("Provider Started.%n"); + // send msg Message msg = new Message("TopicTest", ("Hello RocketMQ sendMsg " + new Date()).getBytes(RemotingHelper.DEFAULT_CHARSET) ); @@ -68,6 +65,30 @@ public String testcase() { msg.setKeys("KeyA"); SendResult sendResult = producer.send(msg); System.out.printf("%s send msg: %s%n", new Date(), sendResult); + + // start consumer + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + try { + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name"); + consumer.setNamesrvAddr(namerServer); + consumer.subscribe("TopicTest", "*"); + consumer.registerMessageListener(new MessageListenerConcurrently() { + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), new String(msgs.get(0).getBody(), StandardCharsets.UTF_8)); + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + } + }); + consumer.start(); + System.out.printf("Consumer Started.%n"); + } catch (Exception e) { + log.error("consumer start error", e); + } + } + }); + thread.start(); } catch (Exception e) { log.error("testcase error", e); } @@ -77,60 +98,11 @@ public String testcase() { @RequestMapping("/healthCheck") @ResponseBody public String healthCheck() throws Exception { - if (!consumerStarted) { - // Set flag early to prevent re-entry from concurrent healthCheck - // requests (each curl has a 3s timeout, and initialization may - // take longer than that). - consumerStarted = true; - try { - // Speed up client-side rebalance from default 20s to 2s so the - // consumer discovers topic queues faster after startup. - System.setProperty("rocketmq.client.rebalance.waitInterval", "2000"); - - // Start a producer that stays alive to send probe messages on each retry. - probeProducer = new DefaultMQProducer("healthCheck_please_rename_unique_group_name"); - probeProducer.setNamesrvAddr(namerServer); - probeProducer.start(); - Message probeMsg = new Message("TopicTest", "probe".getBytes(StandardCharsets.UTF_8)); - probeProducer.send(probeMsg); - System.out.printf("HealthCheck: Topic created via probe message.%n"); - - // Start consumer after topic exists so rebalance finds queues immediately. - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name"); - consumer.setNamesrvAddr(namerServer); - consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); - consumer.subscribe("TopicTest", "*"); - consumer.registerMessageListener(new MessageListenerConcurrently() { - @Override - public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { - System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), new String(msgs.get(0).getBody(), StandardCharsets.UTF_8)); - consumerReady = true; - return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; - } - }); - consumer.start(); - System.out.printf("Consumer Started.%n"); - } catch (Exception e) { - consumerStarted = false; - throw e; - } - } - - // Wait until the consumer has actually received a probe message, - // confirming rebalance is complete and it can consume from the topic. - // Send a fresh probe on every retry so the consumer picks it up once - // rebalance finishes (messages sent before rebalance may never arrive). - if (!consumerReady) { - try { - Message probeMsg = new Message("TopicTest", "probe".getBytes(StandardCharsets.UTF_8)); - probeProducer.send(probeMsg); - System.out.printf("HealthCheck: sent probe message (consumer not ready yet).%n"); - } catch (Exception e) { - System.out.printf("HealthCheck: failed to send probe: %s%n", e.getMessage()); - } - throw new RuntimeException("Consumer has not received probe message yet"); - } - + // start producer + DefaultMQProducer producer = new DefaultMQProducer("healthCheck_please_rename_unique_group_name"); + producer.setNamesrvAddr(namerServer); + producer.start(); + System.out.printf("HealthCheck Provider Started.%n"); return SUCCESS; } diff --git a/test/plugin/scenarios/rocketmq-scenario/src/main/resources/log4j2.xml b/test/plugin/scenarios/rocketmq-scenario/src/main/resources/log4j2.xml index b16354bfa3..9849ed5a8a 100644 --- a/test/plugin/scenarios/rocketmq-scenario/src/main/resources/log4j2.xml +++ b/test/plugin/scenarios/rocketmq-scenario/src/main/resources/log4j2.xml @@ -23,7 +23,7 @@ - + diff --git a/test/plugin/scenarios/rocketmq-scenario/support-version.list b/test/plugin/scenarios/rocketmq-scenario/support-version.list index 7de5cb6f6d..b391ea9d2a 100644 --- a/test/plugin/scenarios/rocketmq-scenario/support-version.list +++ b/test/plugin/scenarios/rocketmq-scenario/support-version.list @@ -16,7 +16,7 @@ # lists your version here (Contains only the last version number of each minor version.) -5.1.4 +5.1.0 4.9.4 4.8.0 4.7.1 From 339afdfce24e7c71fc387d716cc60c5fb82f41f1 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Sun, 22 Feb 2026 09:29:09 +0800 Subject: [PATCH 30/48] fix --- .../apm/plugin/spring/ai/v1/ChatModelCallInterceptor.java | 5 ----- apm-sniffer/config/agent.config | 8 ++++---- 2 files changed, 4 insertions(+), 9 deletions(-) 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/ChatModelCallInterceptor.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/ChatModelCallInterceptor.java index 51ac0776df..302db3c407 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/ChatModelCallInterceptor.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/ChatModelCallInterceptor.java @@ -155,11 +155,6 @@ private void collectPrompt(AbstractSpan span, Object[] allArguments) { return; } - String promptText = prompt.getContents(); - if (promptText == null) { - return; - } - InputMessages inputMessages = InputMessages.fromPrompt(prompt); String inputMessagesJson = inputMessages.toJson(); int limit = SpringAiPluginConfig.Plugin.SpringAi.INPUT_MESSAGES_LENGTH_LIMIT; diff --git a/apm-sniffer/config/agent.config b/apm-sniffer/config/agent.config index 4e54651a58..84b5c41622 100755 --- a/apm-sniffer/config/agent.config +++ b/apm-sniffer/config/agent.config @@ -339,10 +339,10 @@ plugin.solon.http_body_length_threshold=${SW_PLUGIN_SOLON_HTTP_BODY_LENGTH_THRES plugin.caffeine.operation_mapping_write=${SW_PLUGIN_CAFFEINE_OPERATION_MAPPING_WRITE:put,putAll,remove,clear} # Specify which command should be converted to read operation plugin.caffeine.operation_mapping_read=${SW_PLUGIN_CAFFEINE_OPERATION_MAPPING_READ:getIfPresent,getAllPresent,computeIfAbsent} -# Whether to collect the prompt content (input text) of the GenAI request. -plugin.springai.collect_prompt=${SW_PLUGIN_SPRINGAI_COLLECT_PROMPT:false} -# Whether to collect the completion content (output text) of the GenAI response. -plugin.springai.collect_completion=${SW_PLUGIN_SPRINGAI_COLLECT_COMPLETION:false} +# Whether to collect the input messages of the GenAI request. +plugin.springai.collect_input_messages=${SW_PLUGIN_SPRINGAI_COLLECT_INPUT_MESSAGES:false} +# Whether to collect the output messages of the GenAI response. +plugin.springai.collect_output_messages=${SW_PLUGIN_SPRINGAI_COLLECT_OUTPUT_MESSAGES:false} # The maximum characters of the collected prompt content. # If the content exceeds this limit, it will be truncated. # Use a negative value to represent no limit, but be aware this could cause OOM. From 768c97de219c8a2c050056cc94947c1d11021e6a Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Sun, 22 Feb 2026 15:06:08 +0800 Subject: [PATCH 31/48] fix --- .github/workflows/plugins-test.0.yaml | 72 ++++++------ .github/workflows/plugins-test.1.yaml | 58 ++++----- .github/workflows/plugins-test.2.yaml | 58 ++++----- .github/workflows/plugins-test.3.yaml | 110 +++++++++--------- .../spring-ai-1.x-scenario/bin/startup.sh | 2 +- 5 files changed, 150 insertions(+), 150 deletions(-) diff --git a/.github/workflows/plugins-test.0.yaml b/.github/workflows/plugins-test.0.yaml index a3f2653a1e..06002b049c 100644 --- a/.github/workflows/plugins-test.0.yaml +++ b/.github/workflows/plugins-test.0.yaml @@ -53,42 +53,42 @@ jobs: matrix: case: - activemq-scenario - - agent-so11y-scenario - - apm-toolkit-trace-scenario - - apm-toolkit-tracer-scenario - - armeria-0.96minus-scenario - - armeria-0.96plus-scenario - - avro-scenario - - asynchttpclient-scenario - - canal-scenario - - cassandra-java-driver-3.x-scenario - - customize-scenario - - correlation-autotag-scenario - - dubbo-2.5.x-scenario - - dubbo-2.7.x-scenario - - dubbo-3.x-scenario - - ehcache-2.x-scenario - - elasticsearch-5.x-scenario - - elasticsearch-rest-high-level-6.x-scenario - - elasticsearch-transport-6.x-scenario - - elasticsearch-7.x-scenario - - exception-checker-spring-scenario - - exception-checker-tomcat-scenario - - feign-scenario - - finagle-17.10.x-scenario - - finagle-6.44.x-scenario - - gateway-2.1.x-scenario - - gateway-2.0.x-scenario - - grpc-scenario - - grpc-1.59.x-1.70.x-scenario - - grpc-1.30.x-1.39.x-scenario - - gson-scenario - - guava-cache-scenario - - elasticjob-3.x-scenario - - springmvc-reactive-scenario - - springmvc-reactive-devtools-scenario - - fastjson-scenario - - jackson-scenario +# - agent-so11y-scenario +# - apm-toolkit-trace-scenario +# - apm-toolkit-tracer-scenario +# - armeria-0.96minus-scenario +# - armeria-0.96plus-scenario +# - avro-scenario +# - asynchttpclient-scenario +# - canal-scenario +# - cassandra-java-driver-3.x-scenario +# - customize-scenario +# - correlation-autotag-scenario +# - dubbo-2.5.x-scenario +# - dubbo-2.7.x-scenario +# - dubbo-3.x-scenario +# - ehcache-2.x-scenario +# - elasticsearch-5.x-scenario +# - elasticsearch-rest-high-level-6.x-scenario +# - elasticsearch-transport-6.x-scenario +# - elasticsearch-7.x-scenario +# - exception-checker-spring-scenario +# - exception-checker-tomcat-scenario +# - feign-scenario +# - finagle-17.10.x-scenario +# - finagle-6.44.x-scenario +# - gateway-2.1.x-scenario +# - gateway-2.0.x-scenario +# - grpc-scenario +# - grpc-1.59.x-1.70.x-scenario +# - grpc-1.30.x-1.39.x-scenario +# - gson-scenario +# - guava-cache-scenario +# - elasticjob-3.x-scenario +# - springmvc-reactive-scenario +# - springmvc-reactive-devtools-scenario +# - fastjson-scenario +# - jackson-scenario steps: - uses: actions/checkout@v2 with: diff --git a/.github/workflows/plugins-test.1.yaml b/.github/workflows/plugins-test.1.yaml index 2c012792fc..ef210493f8 100644 --- a/.github/workflows/plugins-test.1.yaml +++ b/.github/workflows/plugins-test.1.yaml @@ -53,35 +53,35 @@ jobs: matrix: case: - h2-scenario - - httpasyncclient-scenario - - httpclient-3.x-scenario - - httpclient-4.3.x-scenario - - httpclient-5.x-scenario - - hutool-http-5.x-scenario - - hystrix-scenario - - sentinel-scenario - - influxdb-scenario - - jdk-http-scenario - - jdk-threading-scenario - - jedis-2.x-scenario - - jedis-3.1.x-plus-scenario - - jedis-4.x-scenario - - jedis-3.3.x-plus-scenario - - jedis-2.x-3.x-cluster-scenario - - jetty-scenario - - kafka-scenario - - kotlin-coroutine-scenario - - lettuce-scenario - - lettuce-6.5.x-scenario - - mongodb-3.x-scenario - - mongodb-4.x-scenario - - netty-socketio-scenario - - postgresql-above9.4.1207-scenario - - mssql-jtds-scenario - - mssql-jdbc-scenario - - mybatis-3.x-scenario - - resteasy-4.x-scenario - - netty-http-4.1.x-scenario +# - httpasyncclient-scenario +# - httpclient-3.x-scenario +# - httpclient-4.3.x-scenario +# - httpclient-5.x-scenario +# - hutool-http-5.x-scenario +# - hystrix-scenario +# - sentinel-scenario +# - influxdb-scenario +# - jdk-http-scenario +# - jdk-threading-scenario +# - jedis-2.x-scenario +# - jedis-3.1.x-plus-scenario +# - jedis-4.x-scenario +# - jedis-3.3.x-plus-scenario +# - jedis-2.x-3.x-cluster-scenario +# - jetty-scenario +# - kafka-scenario +# - kotlin-coroutine-scenario +# - lettuce-scenario +# - lettuce-6.5.x-scenario +# - mongodb-3.x-scenario +# - mongodb-4.x-scenario +# - netty-socketio-scenario +# - postgresql-above9.4.1207-scenario +# - mssql-jtds-scenario +# - mssql-jdbc-scenario +# - mybatis-3.x-scenario +# - resteasy-4.x-scenario +# - netty-http-4.1.x-scenario steps: - uses: actions/checkout@v2 with: diff --git a/.github/workflows/plugins-test.2.yaml b/.github/workflows/plugins-test.2.yaml index ccb6a7865d..f2641e5e79 100644 --- a/.github/workflows/plugins-test.2.yaml +++ b/.github/workflows/plugins-test.2.yaml @@ -53,35 +53,35 @@ jobs: matrix: case: - okhttp-scenario - - play-scenario - - postgresql-scenario - - pulsar-scenario - - rabbitmq-scenario - - redisson-scenario - - resttemplate-4.x-scenario - - servicecomb-1.x-scenario - - servicecomb-2.x-scenario - - shardingsphere-3.x-scenario - - shardingsphere-4.0.x-scenario - - shardingsphere-4.x-scenario - - shardingsphere-5.0.0-scenario - - sofarpc-scenario - - solrj-7.x-scenario - - spring-3.0.x-scenario - - spring-cloud-feign-1.1.x-scenario - - spring-cloud-feign-1.2.x-scenario - - spring-cloud-feign-2.x-scenario - - spring-tx-scenario - - struts2.3-scenario - - struts2.5-scenario - - cxf-scenario - - okhttp2-scenario - - rocketmq-scenario - - jersey-2.0.x-2.25.x-scenario - - jersey-2.26.x-2.39.x-scenario - - websphere-liberty-23.x-scenario - - nacos-client-2.x-scenario - - rocketmq-5-grpc-scenario +# - play-scenario +# - postgresql-scenario +# - pulsar-scenario +# - rabbitmq-scenario +# - redisson-scenario +# - resttemplate-4.x-scenario +# - servicecomb-1.x-scenario +# - servicecomb-2.x-scenario +# - shardingsphere-3.x-scenario +# - shardingsphere-4.0.x-scenario +# - shardingsphere-4.x-scenario +# - shardingsphere-5.0.0-scenario +# - sofarpc-scenario +# - solrj-7.x-scenario +# - spring-3.0.x-scenario +# - spring-cloud-feign-1.1.x-scenario +# - spring-cloud-feign-1.2.x-scenario +# - spring-cloud-feign-2.x-scenario +# - spring-tx-scenario +# - struts2.3-scenario +# - struts2.5-scenario +# - cxf-scenario +# - okhttp2-scenario +# - rocketmq-scenario +# - jersey-2.0.x-2.25.x-scenario +# - jersey-2.26.x-2.39.x-scenario +# - websphere-liberty-23.x-scenario +# - nacos-client-2.x-scenario +# - rocketmq-5-grpc-scenario steps: - uses: actions/checkout@v2 with: diff --git a/.github/workflows/plugins-test.3.yaml b/.github/workflows/plugins-test.3.yaml index b6766b15a0..a02891432a 100644 --- a/.github/workflows/plugins-test.3.yaml +++ b/.github/workflows/plugins-test.3.yaml @@ -53,61 +53,61 @@ jobs: matrix: case: - aerospike-scenario - - mysql-scenario - - undertow-scenario - - webflux-scenario - - zookeeper-scenario - - spring-3.1.x-scenario - - spring-4.1.x-scenario - - spring-4.3.x-scenario - - spring-async-scenario - - vertx-core-4.x-scenario - - vertx-eventbus-3.x-scenario - - vertx-web-3.54minus-scenario - - vertx-web-3.6plus-scenario - - mariadb-scenario - - micronaut-http-scenario - - nats-2.14.x-2.16.5-scenario - - quasar-scenario - - baidu-brpc-scenario - - baidu-brpc-3.x-scenario - - retransform-class-scenario - - retransform-class-tomcat-scenario - - graphql-8.x-scenario - - graphql-9.x-scenario - - graphql-16plus-scenario - - graphql-12.x-15.x-scenario - - hbase-scenario - - spring-kafka-1.3.x-scenario - - spring-kafka-2.2.x-scenario - - spring-kafka-2.3.x-scenario - - spring-scheduled-3.x-5.x-scenario - - elasticjob-2.x-scenario - - quartz-scheduler-2.x-scenario - - xxl-job-2.2.0-scenario - - xxl-job-2.3.x-scenario - - thrift-scenario - - dbcp-2.x-scenario - - jsonrpc4j-1.x-scenario - - gateway-3.x-scenario - - gateway-3.x-filter-context-scenario - - neo4j-4.x-scenario - - druid-1.x-scenario - - hikaricp-scenario - - clickhouse-0.3.1-scenario - - clickhouse-0.3.2.x-scenario - - kylin-jdbc-2.6.x-3.x-4.x-scenario - - undertow-worker-thread-pool-scenario - - tomcat-thread-pool-scenario - - guava-eventbus-scenario - - shenyu-2.4.x-scenario - - jdk-threadpool-scenario - - jdk-forkjoinpool-scenario - - shenyu-2.4.x-dubbo-scenario - - grpc-generic-call-scenario - - shenyu-2.4.x-grpc-scenario - - shenyu-2.4.x-sofarpc-scenario - - solon-2.x-scenario +# - mysql-scenario +# - undertow-scenario +# - webflux-scenario +# - zookeeper-scenario +# - spring-3.1.x-scenario +# - spring-4.1.x-scenario +# - spring-4.3.x-scenario +# - spring-async-scenario +# - vertx-core-4.x-scenario +# - vertx-eventbus-3.x-scenario +# - vertx-web-3.54minus-scenario +# - vertx-web-3.6plus-scenario +# - mariadb-scenario +# - micronaut-http-scenario +# - nats-2.14.x-2.16.5-scenario +# - quasar-scenario +# - baidu-brpc-scenario +# - baidu-brpc-3.x-scenario +# - retransform-class-scenario +# - retransform-class-tomcat-scenario +# - graphql-8.x-scenario +# - graphql-9.x-scenario +# - graphql-16plus-scenario +# - graphql-12.x-15.x-scenario +# - hbase-scenario +# - spring-kafka-1.3.x-scenario +# - spring-kafka-2.2.x-scenario +# - spring-kafka-2.3.x-scenario +# - spring-scheduled-3.x-5.x-scenario +# - elasticjob-2.x-scenario +# - quartz-scheduler-2.x-scenario +# - xxl-job-2.2.0-scenario +# - xxl-job-2.3.x-scenario +# - thrift-scenario +# - dbcp-2.x-scenario +# - jsonrpc4j-1.x-scenario +# - gateway-3.x-scenario +# - gateway-3.x-filter-context-scenario +# - neo4j-4.x-scenario +# - druid-1.x-scenario +# - hikaricp-scenario +# - clickhouse-0.3.1-scenario +# - clickhouse-0.3.2.x-scenario +# - kylin-jdbc-2.6.x-3.x-4.x-scenario +# - undertow-worker-thread-pool-scenario +# - tomcat-thread-pool-scenario +# - guava-eventbus-scenario +# - shenyu-2.4.x-scenario +# - jdk-threadpool-scenario +# - jdk-forkjoinpool-scenario +# - shenyu-2.4.x-dubbo-scenario +# - grpc-generic-call-scenario +# - shenyu-2.4.x-grpc-scenario +# - shenyu-2.4.x-sofarpc-scenario +# - solon-2.x-scenario steps: - uses: actions/checkout@v2 with: diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh b/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh index 8a1c2e0480..8cb423ece2 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/bin/startup.sh @@ -18,4 +18,4 @@ home="$(cd "$(dirname $0)"; pwd)" -java -Dskywalking.plugin.springai.collect_prompt=true -Dskywalking.plugin.springai.collect_completion=true -Dskywalking.plugin.springai.collect_tool_input=true -Dskywalking.plugin.springai.collect_tool_output=true -jar ${agent_opts} ${home}/../libs/spring-ai-1.x-scenario.jar & \ No newline at end of file +java -Dskywalking.plugin.springai.collect_input_messages=true -Dskywalking.plugin.springai.collect_output_messages=true -Dskywalking.plugin.springai.collect_tool_input=true -Dskywalking.plugin.springai.collect_tool_output=true -jar ${agent_opts} ${home}/../libs/spring-ai-1.x-scenario.jar & \ No newline at end of file From 2fb4307fe1fed3801f20bd49d51dbbeb0870ac8f Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Sun, 22 Feb 2026 15:59:25 +0800 Subject: [PATCH 32/48] fix --- .../ai/v1/ToolCallbackCallInterceptor.java | 1 - .../src/main/resources/skywalking-plugin.def | 1 - .../config/expectedData.yaml | 26 +++++++++++++++++-- .../httpclient/controller/CaseController.java | 9 +++++++ 4 files changed, 33 insertions(+), 4 deletions(-) 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/ToolCallbackCallInterceptor.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/ToolCallbackCallInterceptor.java index abcafa4b55..784c6fbe74 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/ToolCallbackCallInterceptor.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/ToolCallbackCallInterceptor.java @@ -45,7 +45,6 @@ public void beforeMethod(EnhancedInstance objInst, Method method, Object[] allAr AbstractSpan span = ContextManager.createLocalSpan("Spring-ai/tool/execute/" + toolName); span.setComponent(ComponentsDefine.SPRING_AI); - SpanLayer.asGenAI(span); Tags.GEN_AI_TOOL_NAME.set(span, toolName); Tags.GEN_AI_OPERATION_NAME.set(span, Constants.EXECUTE_TOOL); diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def index 5c7eec110c..fde46c9c06 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -16,7 +16,6 @@ spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.ChatModelInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.ToolCallbackInstrumentation -spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.DefaultToolCallingManagerInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.AnthropicApiInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.DeepSeekApiInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.HuggingfaceChatModelInstrumentation diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index 3a5609400d..7422e7663b 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -23,7 +23,7 @@ segmentItems: - operationName: Spring-ai/tool/execute/get_weather parentSpanId: 2 spanId: 3 - spanLayer: UNRECOGNIZED + spanLayer: Unknown spanType: Local tags: - { key: gen_ai.tool.name, value: get_weather } @@ -40,7 +40,29 @@ segmentItems: - operationName: Spring-ai/openai/call parentSpanId: 0 spanId: 1 - spanLayer: UNRECOGNIZED + spanLayer: GenAI + componentId: 173 + spanType: Exit + peer: http://localhost:8080/spring-ai-1.x-scenario/llm/v1/chat/completions + tags: + - { key: gen_ai.operation.name, value: chat } + - { key: gen_ai.provider.name, value: openai } + - { key: gen_ai.request.model, value: gpt-4.1-2025-04-14 } + - { key: gen_ai.request.temperature, value: '0.7' } + - { key: gen_ai.request.top_p, value: '0.9' } + - { key: gen_ai.response.id, value: 'chatcmpl-CyJXJt7gxwDgz' } + - { key: gen_ai.response.model, value: gpt-4.1-2025-04-14 } + - { key: gen_ai.usage.input_tokens, value: '52' } + - { key: gen_ai.usage.output_tokens, value: '17' } + - { key: gen_ai.client.token.usage, value: '69' } + - { key: gen_ai.response.finish_reasons, value: STOP } + - { key: gen_ai.input.messages, value: not null } + - { key: gen_ai.output.messages, value: not null } + + - operationName: Spring-ai/openai/stream + parentSpanId: 0 + spanId: 4 + spanLayer: GenAI componentId: 173 spanType: Exit peer: http://localhost:8080/spring-ai-1.x-scenario/llm/v1/chat/completions diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java index e3370e89d6..d6512b726e 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java @@ -54,6 +54,15 @@ public String testCase() throws Exception { .call() .content(); + chatClient + .prompt("What's the weather in New York?") + .system(systemPrompt) + .tools(weatherTool) + .stream() + .content() + .doOnNext(System.out::println) + .blockLast(); + return "success"; } } From eeba921498bac7dde75cfcd46ca417f5b590a59a Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Sun, 22 Feb 2026 15:59:46 +0800 Subject: [PATCH 33/48] fix --- .../src/main/resources/skywalking-plugin.def | 1 + 1 file changed, 1 insertion(+) diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def index fde46c9c06..5c7eec110c 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/src/main/resources/skywalking-plugin.def @@ -16,6 +16,7 @@ spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.ChatModelInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.ToolCallbackInstrumentation +spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.DefaultToolCallingManagerInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.AnthropicApiInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.DeepSeekApiInstrumentation spring-ai-1.x=org.apache.skywalking.apm.plugin.spring.ai.v1.define.provider.HuggingfaceChatModelInstrumentation From 7243f372fd87580c80a72a7694cefe1f6292cde2 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Sun, 22 Feb 2026 22:16:07 +0800 Subject: [PATCH 34/48] fix --- .../apm/plugin/spring/ai/v1/ToolCallbackCallInterceptor.java | 1 - 1 file changed, 1 deletion(-) 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/ToolCallbackCallInterceptor.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/ToolCallbackCallInterceptor.java index 784c6fbe74..637599da57 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/ToolCallbackCallInterceptor.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/ToolCallbackCallInterceptor.java @@ -21,7 +21,6 @@ import org.apache.skywalking.apm.agent.core.context.ContextManager; import org.apache.skywalking.apm.agent.core.context.tag.Tags; import org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan; -import org.apache.skywalking.apm.agent.core.context.trace.SpanLayer; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.EnhancedInstance; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstanceMethodsAroundInterceptor; import org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.MethodInterceptResult; From b8e67cb46ac30e665b2004ea90309d6c18ea03c4 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Mon, 23 Feb 2026 10:05:46 +0800 Subject: [PATCH 35/48] fix --- .../config/expectedData.yaml | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index 7422e7663b..b8410abbf9 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -17,6 +17,40 @@ segmentItems: - serviceName: spring-ai-1.x-scenario segmentSize: gt 0 segments: + - segmentId: not null + spans: + - operationName: Spring-ai/tool/execute/get_weather + parentSpanId: 0 + spanId: 1 + spanLayer: Unknown + startTime: 1771770588452 + componentId: 178 + isError: false + spanType: Local + peer: '' + skipAnalysis: false + tags: + - { key: gen_ai.tool.name, value: get_weather } + - { key: gen_ai.operation.name, value: execute_tool } + - { key: gen_ai.tool.call.arguments, value: '{"arg0":"new york"}' } + - { key: gen_ai.tool.call.result, value: '"Sunny, 10°C"' } + + - operationName: Spring-ai/tool/call + parentSpanId: -1 + spanId: 0 + spanLayer: Unknown + startTime: 1771770588450 + endTime: 1771770588453 + componentId: 178 + isError: false + spanType: Local + peer: '' + skipAnalysis: false + refs: + - { parentEndpoint: 'GET:/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case', + networkAddress: '', refType: CrossThread, parentSpanId: 4, parentTraceSegmentId: not null, + parentServiceInstance: not null, parentService: spring-ai-1.x-scenario, + traceId: not null } - segmentId: not null spans: @@ -81,6 +115,22 @@ segmentItems: - { key: gen_ai.input.messages, value: not null } - { key: gen_ai.output.messages, value: not null } + - operationName: /spring-ai-1.x-scenario/llm/v1/chat/completions + parentSpanId: 0 + spanId: 5 + spanLayer: Http + startTime: 1771770588332 + endTime: 1771770588445 + componentId: 99 + isError: false + spanType: Exit + peer: localhost:8080 + skipAnalysis: false + tags: + - { key: url, value: 'http://localhost:8080/spring-ai-1.x-scenario/llm/v1/chat/completions' } + - { key: http.method, value: POST } + - { key: http.status_code, value: '200' } + - operationName: GET:/spring-ai-1.x-scenario/case/spring-ai-1.x-scenario-case parentSpanId: -1 spanId: 0 From 874fe2f6a3fe4749adcb7af52c197af7cdf44056 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Mon, 23 Feb 2026 11:51:01 +0800 Subject: [PATCH 36/48] fix --- .../scenarios/spring-ai-1.x-scenario/config/expectedData.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index b8410abbf9..bded8e8c35 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -23,7 +23,6 @@ segmentItems: parentSpanId: 0 spanId: 1 spanLayer: Unknown - startTime: 1771770588452 componentId: 178 isError: false spanType: Local @@ -39,8 +38,6 @@ segmentItems: parentSpanId: -1 spanId: 0 spanLayer: Unknown - startTime: 1771770588450 - endTime: 1771770588453 componentId: 178 isError: false spanType: Local From b0f481db0ee7cf7a3daa20495ce03b5529b08ffa Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Mon, 23 Feb 2026 17:26:28 +0800 Subject: [PATCH 37/48] fix --- .../config/expectedData.yaml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index bded8e8c35..92f6d44320 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -23,6 +23,8 @@ segmentItems: parentSpanId: 0 spanId: 1 spanLayer: Unknown + startTime: not null + endTime: not null componentId: 178 isError: false spanType: Local @@ -38,6 +40,8 @@ segmentItems: parentSpanId: -1 spanId: 0 spanLayer: Unknown + startTime: not null + endTime: not null componentId: 178 isError: false spanType: Local @@ -56,6 +60,8 @@ segmentItems: spanId: 3 spanLayer: Unknown spanType: Local + startTime: not null + endTime: not null tags: - { key: gen_ai.tool.name, value: get_weather } - { key: gen_ai.operation.name, value: execute_tool } @@ -66,12 +72,16 @@ segmentItems: parentSpanId: 1 spanId: 2 spanLayer: Unknown + startTime: not null + endTime: not null spanType: Local - operationName: Spring-ai/openai/call parentSpanId: 0 spanId: 1 spanLayer: GenAI + startTime: not null + endTime: not null componentId: 173 spanType: Exit peer: http://localhost:8080/spring-ai-1.x-scenario/llm/v1/chat/completions @@ -94,6 +104,8 @@ segmentItems: parentSpanId: 0 spanId: 4 spanLayer: GenAI + startTime: not null + endTime: not null componentId: 173 spanType: Exit peer: http://localhost:8080/spring-ai-1.x-scenario/llm/v1/chat/completions @@ -116,8 +128,8 @@ segmentItems: parentSpanId: 0 spanId: 5 spanLayer: Http - startTime: 1771770588332 - endTime: 1771770588445 + startTime: not null + endTime: not null componentId: 99 isError: false spanType: Exit @@ -132,6 +144,8 @@ segmentItems: parentSpanId: -1 spanId: 0 spanLayer: Http + startTime: not null + endTime: not null spanType: Entry componentId: 1 tags: From ffa75f68d2e0a2761026dc38c331d89be92e9245 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Mon, 23 Feb 2026 21:30:44 +0800 Subject: [PATCH 38/48] fix --- .../httpclient/controller/LLMMockController.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java index 7cba6ce344..4f38d27913 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java @@ -201,7 +201,21 @@ private void writeStreamChunk(PrintWriter writer, String id, long created, Strin } ], "object": "chat.completion.chunk", - "usage": null, + "usage": { + "completion_tokens": 17, + "completion_tokens_details": { + "accepted_prediction_tokens": 0, + "audio_tokens": 0, + "reasoning_tokens": 0, + "rejected_prediction_tokens": 0 + }, + "prompt_tokens": 52, + "prompt_tokens_details": { + "audio_tokens": 0, + "cached_tokens": 0 + }, + "total_tokens": 69 + }, "created": %d, "system_fingerprint": null, "model": "%s", From 4f5c8ffb2ce70145f5854025e3c42e3b52e15e1e Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Mon, 23 Feb 2026 22:07:23 +0800 Subject: [PATCH 39/48] fix --- .../scenarios/spring-ai-1.x-scenario/config/expectedData.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index 92f6d44320..cdf8a6aecc 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -79,7 +79,7 @@ segmentItems: - operationName: Spring-ai/openai/call parentSpanId: 0 spanId: 1 - spanLayer: GenAI + spanLayer: not null startTime: not null endTime: not null componentId: 173 @@ -103,7 +103,7 @@ segmentItems: - operationName: Spring-ai/openai/stream parentSpanId: 0 spanId: 4 - spanLayer: GenAI + spanLayer: not null startTime: not null endTime: not null componentId: 173 From 976e65cb5e51a6d1375582d71772e2363b2ed1a4 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Tue, 24 Feb 2026 10:56:37 +0800 Subject: [PATCH 40/48] fix --- .github/actions/build/action.yml | 1 + .github/actions/run/action.yml | 19 +++- .github/workflows/e2e.yaml | 2 +- .github/workflows/plugins-jdk11-test.3.yaml | 15 ++++ .github/workflows/plugins-jdk17-test.0.yaml | 15 ++++ .github/workflows/plugins-jdk17-test.1.yaml | 15 ++++ .github/workflows/plugins-jdk21-test.0.yaml | 15 ++++ .github/workflows/plugins-jdk25-test.0.yaml | 15 ++++ .github/workflows/plugins-test.0.yaml | 15 ++++ .github/workflows/plugins-test.1.yaml | 15 ++++ .github/workflows/plugins-test.2.yaml | 73 +++++++++------ .github/workflows/plugins-test.3.yaml | 15 ++++ .../workflows/plugins-tomcat10-test.0.yaml | 15 ++++ .github/workflows/plugins-tomcat9-test.0.yaml | 15 ++++ .github/workflows/publish-docker.yaml | 15 ++++ CHANGES.md | 29 +----- .../apm-toolkit-kafka/pom.xml | 2 +- .../apm-toolkit-log4j-1.x/pom.xml | 2 +- .../apm-toolkit-log4j-2.x/pom.xml | 2 +- .../apm-toolkit-logback-1.x/pom.xml | 2 +- .../apm-toolkit-meter/pom.xml | 2 +- .../apm-toolkit-micrometer-1.10/pom.xml | 2 +- .../apm-toolkit-micrometer-registry/pom.xml | 2 +- .../apm-toolkit-opentracing/pom.xml | 2 +- .../apm-toolkit-trace/pom.xml | 2 +- .../apm-toolkit-webflux/pom.xml | 2 +- apm-application-toolkit/pom.xml | 2 +- apm-commons/apm-datacarrier/pom.xml | 2 +- apm-commons/apm-util/pom.xml | 2 +- apm-commons/pom.xml | 2 +- apm-protocol/apm-network/pom.xml | 2 +- apm-protocol/pom.xml | 2 +- apm-sniffer/apm-agent-core/pom.xml | 2 +- apm-sniffer/apm-agent/pom.xml | 2 +- .../activemq-5.x-plugin/pom.xml | 2 +- .../pom.xml | 2 +- .../apm-sdk-plugin/aerospike-plugin/pom.xml | 2 +- .../apm-armeria-0.84.x-plugin/pom.xml | 2 +- .../apm-armeria-0.85.x-plugin/pom.xml | 2 +- .../apm-armeria-1.0.x-plugin/pom.xml | 2 +- .../apm-armeria-plugins/pom.xml | 2 +- .../asynchttpclient-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/avro-plugin/pom.xml | 2 +- .../baidu-brpc-3.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/baidu-brpc-plugin/pom.xml | 2 +- .../apm-sdk-plugin/c3p0-0.9.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/canal-1.x-plugin/pom.xml | 2 +- .../cassandra-java-driver-3.x-plugin/pom.xml | 2 +- .../clickhouse-0.3.1-plugin/pom.xml | 2 +- .../clickhouse-0.3.2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/cxf-3.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/dbcp-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/druid-1.x-plugin/pom.xml | 2 +- .../dubbo-2.7.x-conflict-patch/pom.xml | 2 +- .../apm-sdk-plugin/dubbo-2.7.x-plugin/pom.xml | 2 +- .../dubbo-3.x-conflict-patch/pom.xml | 2 +- .../apm-sdk-plugin/dubbo-3.x-plugin/pom.xml | 2 +- .../dubbo-conflict-patch/pom.xml | 2 +- .../apm-sdk-plugin/dubbo-plugin/pom.xml | 2 +- .../elastic-job-2.x-plugin/pom.xml | 2 +- .../elasticjob-3.x-plugin/pom.xml | 2 +- .../elasticsearch-5.x-plugin/pom.xml | 2 +- .../elasticsearch-6.x-plugin/pom.xml | 2 +- .../elasticsearch-7.x-plugin/pom.xml | 2 +- .../elasticsearch-common/pom.xml | 2 +- .../feign-default-http-9.x-plugin/pom.xml | 2 +- .../finagle-6.25.x-plugin/pom.xml | 2 +- .../graphql-12.x-15.x-plugin/pom.xml | 2 +- .../graphql-16plus-plugin/pom.xml | 2 +- .../graphql-plugin/graphql-8.x-plugin/pom.xml | 2 +- .../graphql-plugin/graphql-9.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/graphql-plugin/pom.xml | 2 +- .../grizzly-2.3.x-4.x-plugin/pom.xml | 2 +- .../pom.xml | 2 +- .../apm-sdk-plugin/grpc-1.x-plugin/pom.xml | 2 +- .../guava-eventbus-plugin/pom.xml | 2 +- .../apm-sdk-plugin/h2-1.x-plugin/pom.xml | 2 +- .../hbase-1.x-2.x-plugin/pom.xml | 2 +- .../hikaricp-3.x-4.x-plugin/pom.xml | 2 +- .../httpClient-4.x-plugin/pom.xml | 2 +- .../httpasyncclient-4.x-plugin/pom.xml | 2 +- .../httpclient-3.x-plugin/pom.xml | 2 +- .../httpclient-5.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/httpclient-commons/pom.xml | 2 +- .../hutool-http-5.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/hutool-plugins/pom.xml | 2 +- .../apm-sdk-plugin/hystrix-1.x-plugin/pom.xml | 2 +- .../influxdb-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/jdbc-commons/pom.xml | 2 +- .../jedis-2.x-3.x-plugin/pom.xml | 2 +- .../jedis-plugins/jedis-4.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/jedis-plugins/pom.xml | 2 +- .../apm-sdk-plugin/jersey-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/jersey-3.x-plugin/pom.xml | 2 +- .../jetty-client-11.x-plugin/pom.xml | 2 +- .../jetty-client-9.0-plugin/pom.xml | 2 +- .../jetty-client-9.x-plugin/pom.xml | 2 +- .../jetty-server-11.x-plugin/pom.xml | 2 +- .../jetty-server-9.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/jetty-plugin/pom.xml | 2 +- .../jetty-thread-pool-plugin/pom.xml | 2 +- .../jsonrpc4j-1.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/kafka-commons/pom.xml | 2 +- .../apm-sdk-plugin/kafka-plugin/pom.xml | 2 +- .../kylin-jdbc-2.6.x-3.x-4.x-plugin/pom.xml | 2 +- .../lettuce-5.x-6.4.x-plugin/pom.xml | 2 +- .../lettuce-6.5.x-plugin/pom.xml | 2 +- .../lettuce-plugins/lettuce-common/pom.xml | 2 +- .../apm-sdk-plugin/lettuce-plugins/pom.xml | 2 +- .../light4j-plugins/light4j-plugin/pom.xml | 2 +- .../apm-sdk-plugin/light4j-plugins/pom.xml | 2 +- .../apm-sdk-plugin/mariadb-2.x-plugin/pom.xml | 2 +- .../micronaut-http-client-plugin/pom.xml | 2 +- .../micronaut-http-server-plugin/pom.xml | 2 +- .../apm-sdk-plugin/micronaut-plugins/pom.xml | 2 +- .../apm-sdk-plugin/mongodb-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/mongodb-3.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/mongodb-4.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/motan-plugin/pom.xml | 2 +- .../apm-sdk-plugin/mssql-commons/pom.xml | 2 +- .../apm-sdk-plugin/mssql-jdbc-plugin/pom.xml | 2 +- .../mssql-jtds-1.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/mysql-5.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/mysql-6.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/mysql-8.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/mysql-common/pom.xml | 2 +- .../nats-2.14.x-2.16.5-plugin/pom.xml | 2 +- .../apm-sdk-plugin/neo4j-4.x-plugin/pom.xml | 2 +- .../netty-socketio-plugin/pom.xml | 2 +- .../nutz-plugins/http-1.x-plugin/pom.xml | 2 +- .../mvc-annotation-1.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/nutz-plugins/pom.xml | 2 +- .../apm-sdk-plugin/okhttp-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/okhttp-3.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/okhttp-4.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/okhttp-common/pom.xml | 2 +- .../apm-sdk-plugin/play-2.x-plugin/pom.xml | 2 +- apm-sniffer/apm-sdk-plugin/pom.xml | 2 +- .../postgresql-8.x-plugin/pom.xml | 2 +- .../pulsar-2.2-2.7-plugin/pom.xml | 2 +- .../pulsar-2.8.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/pulsar-common/pom.xml | 2 +- .../apm-sdk-plugin/quasar-plugin/pom.xml | 2 +- .../apm-sdk-plugin/rabbitmq-plugin/pom.xml | 2 +- .../redisson-3.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/resteasy-plugin/pom.xml | 2 +- .../resteasy-server-3.x-plugin/pom.xml | 2 +- .../resteasy-server-4.x-plugin/pom.xml | 2 +- .../resteasy-server-6.x-plugin/pom.xml | 2 +- .../rocketMQ-3.x-plugin/pom.xml | 2 +- .../rocketMQ-4.x-plugin/pom.xml | 2 +- .../rocketMQ-5.x-plugin/pom.xml | 2 +- .../rocketMQ-client-java-5.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/servicecomb-plugin/pom.xml | 2 +- .../pom.xml | 2 +- .../shardingsphere-plugins/pom.xml | 2 +- .../sharding-sphere-3.x-plugin/pom.xml | 2 +- .../sharding-sphere-4.0.x-plugin/pom.xml | 2 +- .../sharding-sphere-4.1.0-plugin/pom.xml | 2 +- .../sharding-sphere-5.0.0-plugin/pom.xml | 2 +- .../apm-sdk-plugin/sofarpc-plugin/pom.xml | 2 +- .../sofarpc/InvokeCallbackWrapperTest.java | 11 ++- .../apm-sdk-plugin/solon-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/solrj-7.x-plugin/pom.xml | 2 +- .../async-annotation-plugin/pom.xml | 2 +- .../concurrent-util-4.x-plugin/pom.xml | 2 +- .../spring-plugins/core-patch/pom.xml | 2 +- .../mvc-annotation-3.x-plugin/pom.xml | 2 +- .../mvc-annotation-4.x-plugin/pom.xml | 2 +- .../mvc-annotation-5.x-plugin/pom.xml | 2 +- .../mvc-annotation-commons/pom.xml | 2 +- .../apm-sdk-plugin/spring-plugins/pom.xml | 2 +- .../resttemplate-3.x-plugin/pom.xml | 2 +- .../resttemplate-4.x-plugin/pom.xml | 2 +- .../resttemplate-commons/pom.xml | 2 +- .../scheduled-annotation-plugin/pom.xml | 2 +- .../spring-cloud/netflix-plugins/pom.xml | 2 +- .../spring-cloud-feign-1.x-plugin/pom.xml | 2 +- .../spring-plugins/spring-cloud/pom.xml | 2 +- .../spring-cloud-feign-2.x-plugin/pom.xml | 2 +- .../spring-plugins/spring-commons/pom.xml | 2 +- .../spring-kafka-1.x-plugin/pom.xml | 2 +- .../spring-kafka-2.x-plugin/pom.xml | 2 +- .../pom.xml | 2 +- .../pom.xml | 2 +- .../spymemcached-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/struts2-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/thrift-plugin/pom.xml | 2 +- .../apm-sdk-plugin/tomcat-10x-plugin/pom.xml | 2 +- .../tomcat-7.x-8.x-plugin/pom.xml | 2 +- .../tomcat-thread-pool-plugin/pom.xml | 2 +- .../apm-sdk-plugin/undertow-plugins/pom.xml | 2 +- .../undertow-2.x-plugin/pom.xml | 2 +- .../pom.xml | 2 +- .../apm-sdk-plugin/vertx-plugins/pom.xml | 2 +- .../vertx-core-3.x-plugin/pom.xml | 2 +- .../vertx-core-4.x-plugin/pom.xml | 2 +- .../websphere-liberty-23.x-plugin/pom.xml | 2 +- .../xmemcached-2.x-plugin/pom.xml | 2 +- .../apm-sdk-plugin/xxl-job-2.x-plugin/pom.xml | 2 +- apm-sniffer/apm-test-tools/pom.xml | 2 +- .../apm-toolkit-kafka-activation/pom.xml | 2 +- .../apm-toolkit-log4j-1.x-activation/pom.xml | 2 +- .../apm-toolkit-log4j-2.x-activation/pom.xml | 2 +- .../pom.xml | 2 +- .../apm-toolkit-logging-common/pom.xml | 2 +- .../apm-toolkit-meter-activation/pom.xml | 2 +- .../apm-toolkit-micrometer-activation/pom.xml | 2 +- .../pom.xml | 2 +- .../apm-toolkit-trace-activation/pom.xml | 2 +- .../apm-toolkit-webflux-activation/pom.xml | 2 +- apm-sniffer/apm-toolkit-activation/pom.xml | 2 +- .../jdk-forkjoinpool-plugin/pom.xml | 2 +- .../bootstrap-plugins/jdk-http-plugin/pom.xml | 4 +- .../jdk-httpclient-plugin/pom.xml | 2 +- .../jdk-threading-plugin/pom.xml | 2 +- .../jdk-threadpool-plugin/pom.xml | 2 +- .../pom.xml | 2 +- apm-sniffer/bootstrap-plugins/pom.xml | 2 +- apm-sniffer/bytebuddy-patch/pom.xml | 2 +- .../impala-jdbc-2.6.x-plugin/pom.xml | 2 +- apm-sniffer/expired-plugins/pom.xml | 2 +- .../caffeine-3.x-plugin/pom.xml | 2 +- .../customize-enhance-plugin/pom.xml | 2 +- .../ehcache-2.x-plugin/pom.xml | 2 +- .../fastjson-1.2.x-plugin/pom.xml | 2 +- .../gson-2.8.x-plugin/pom.xml | 2 +- .../guava-cache-plugin/pom.xml | 2 +- .../jackson-2.x-plugin/pom.xml | 2 +- .../kotlin-coroutine-plugin/pom.xml | 2 +- .../mybatis-3.x-plugin/pom.xml | 2 +- .../nacos-client-2.x-plugin/pom.xml | 2 +- .../netty-http-4.1.x-plugin/pom.xml | 2 +- .../mvc-annotation-6.x-plugin/pom.xml | 2 +- .../gateway-2.0.x-plugin/pom.xml | 2 +- .../gateway-2.1.x-plugin/pom.xml | 2 +- .../gateway-3.x-plugin/pom.xml | 2 +- .../gateway-4.x-plugin/pom.xml | 2 +- .../optional-spring-cloud/pom.xml | 2 +- .../optional-spring-plugins/pom.xml | 2 +- .../resttemplate-6.x-plugin/pom.xml | 2 +- .../spring-annotation-plugin/pom.xml | 2 +- .../spring-tx-plugin/pom.xml | 2 +- .../spring-webflux-5.x-plugin/pom.xml | 2 +- .../spring-webflux-6.x-plugin/pom.xml | 2 +- apm-sniffer/optional-plugins/pom.xml | 2 +- .../quartz-scheduler-2.x-plugin/pom.xml | 2 +- .../sentinel-1.x-plugin/pom.xml | 2 +- .../shenyu-2.4.x-plugin/pom.xml | 2 +- .../trace-ignore-plugin/pom.xml | 2 +- .../trace-sampler-cpu-policy-plugin/pom.xml | 2 +- .../zookeeper-3.4.x-plugin/pom.xml | 2 +- .../kafka-config-extension/pom.xml | 2 +- .../kafka-reporter-plugin/pom.xml | 2 +- apm-sniffer/optional-reporter-plugins/pom.xml | 2 +- apm-sniffer/pom.xml | 2 +- changes/changes-9.6.0.md | 33 +++++++ pom.xml | 2 +- .../jvm-container/src/main/docker/run.sh | 7 +- .../resources/compose-start-script.template | 35 +++++++- .../resources/container-start-script.template | 16 +++- .../configuration.yml | 5 +- .../support-version.list | 1 - .../configuration.yml | 2 +- .../rocketmq-5-grpc-scenario/pom.xml | 2 +- .../java/controller/CaseController.java | 72 ++++++++++----- .../java/controller/MessageService.java | 18 ++-- .../src/main/resources/log4j2.xml | 2 +- .../support-version.list | 1 - .../rocketmq/controller/CaseController.java | 90 ++++++++++++------- .../src/main/resources/log4j2.xml | 2 +- .../rocketmq-scenario/support-version.list | 2 +- 272 files changed, 691 insertions(+), 379 deletions(-) create mode 100644 changes/changes-9.6.0.md diff --git a/.github/actions/build/action.yml b/.github/actions/build/action.yml index a41636ac28..80e4344366 100644 --- a/.github/actions/build/action.yml +++ b/.github/actions/build/action.yml @@ -88,6 +88,7 @@ runs: mkdir -p test-containers docker save -o test-containers/skywalking-agent-test-jvm-1.0.0.tgz skywalking/agent-test-jvm:1.0.0 docker save -o test-containers/skywalking-agent-test-tomcat-1.0.0.tgz skywalking/agent-test-tomcat:1.0.0 + ls -la test-containers/ echo "::endgroup::" - uses: actions/upload-artifact@v4 name: Upload Test Containers diff --git a/.github/actions/run/action.yml b/.github/actions/run/action.yml index 75a7ee9c26..bb9b3c6143 100644 --- a/.github/actions/run/action.yml +++ b/.github/actions/run/action.yml @@ -32,6 +32,22 @@ runs: - uses: actions/download-artifact@v4 with: name: test-tools + - name: Disable containerd image store + shell: bash + run: | + DAEMON_JSON="/etc/docker/daemon.json" + if [ -f "$DAEMON_JSON" ]; then + sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ + | sudo tee "${DAEMON_JSON}.tmp" > /dev/null + sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" + else + echo '{"features": {"containerd-snapshotter": false}}' \ + | sudo tee "$DAEMON_JSON" > /dev/null + fi + sudo systemctl restart docker + docker version + docker info + echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Load Test Containers shell: bash run: | @@ -41,6 +57,7 @@ runs: if ls test-containers/skywalking-agent-test-tomcat-1.0.0.tgz; then docker load -i test-containers/skywalking-agent-test-tomcat-1.0.0.tgz fi + docker images - name: Cache local Maven repository uses: actions/cache@v4 with: @@ -51,7 +68,7 @@ runs: shell: bash run: | echo "::group::Run Plugin Test ${{ inputs.test_case }}" - bash test/plugin/run.sh ${{ inputs.test_case }} + bash test/plugin/run.sh --debug ${{ inputs.test_case }} echo "::endgroup::" - uses: actions/upload-artifact@v4 name: Upload Agent diff --git a/.github/workflows/e2e.yaml b/.github/workflows/e2e.yaml index dc595bc85c..a2393b4942 100644 --- a/.github/workflows/e2e.yaml +++ b/.github/workflows/e2e.yaml @@ -60,7 +60,7 @@ jobs: with: go-version: '1.24' - name: Run E2E Tests - uses: apache/skywalking-infra-e2e@7e4b5b68716fdb7b79b21fa8908f9db497e1b115 + uses: apache/skywalking-infra-e2e@8c21e43e241a32a54bdf8eeceb9099eb27e5e9b4 with: e2e-file: ${{ matrix.case.path }} - uses: actions/upload-artifact@v4 diff --git a/.github/workflows/plugins-jdk11-test.3.yaml b/.github/workflows/plugins-jdk11-test.3.yaml index 0e1fe2f74b..238fd4047c 100644 --- a/.github/workflows/plugins-jdk11-test.3.yaml +++ b/.github/workflows/plugins-jdk11-test.3.yaml @@ -41,6 +41,21 @@ jobs: - uses: actions/checkout@v2 with: submodules: true + - name: Disable containerd image store + run: | + DAEMON_JSON="/etc/docker/daemon.json" + if [ -f "$DAEMON_JSON" ]; then + sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ + | sudo tee "${DAEMON_JSON}.tmp" > /dev/null + sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" + else + echo '{"features": {"containerd-snapshotter": false}}' \ + | sudo tee "$DAEMON_JSON" > /dev/null + fi + sudo systemctl restart docker + docker version + docker info + echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build with: diff --git a/.github/workflows/plugins-jdk17-test.0.yaml b/.github/workflows/plugins-jdk17-test.0.yaml index 542d98411a..092fa2daae 100644 --- a/.github/workflows/plugins-jdk17-test.0.yaml +++ b/.github/workflows/plugins-jdk17-test.0.yaml @@ -41,6 +41,21 @@ jobs: - uses: actions/checkout@v2 with: submodules: true + - name: Disable containerd image store + run: | + DAEMON_JSON="/etc/docker/daemon.json" + if [ -f "$DAEMON_JSON" ]; then + sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ + | sudo tee "${DAEMON_JSON}.tmp" > /dev/null + sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" + else + echo '{"features": {"containerd-snapshotter": false}}' \ + | sudo tee "$DAEMON_JSON" > /dev/null + fi + sudo systemctl restart docker + docker version + docker info + echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build with: diff --git a/.github/workflows/plugins-jdk17-test.1.yaml b/.github/workflows/plugins-jdk17-test.1.yaml index 418da87f35..0aa6266813 100644 --- a/.github/workflows/plugins-jdk17-test.1.yaml +++ b/.github/workflows/plugins-jdk17-test.1.yaml @@ -41,6 +41,21 @@ jobs: - uses: actions/checkout@v2 with: submodules: true + - name: Disable containerd image store + run: | + DAEMON_JSON="/etc/docker/daemon.json" + if [ -f "$DAEMON_JSON" ]; then + sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ + | sudo tee "${DAEMON_JSON}.tmp" > /dev/null + sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" + else + echo '{"features": {"containerd-snapshotter": false}}' \ + | sudo tee "$DAEMON_JSON" > /dev/null + fi + sudo systemctl restart docker + docker version + docker info + echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build with: diff --git a/.github/workflows/plugins-jdk21-test.0.yaml b/.github/workflows/plugins-jdk21-test.0.yaml index 87b058284c..9e6805515f 100644 --- a/.github/workflows/plugins-jdk21-test.0.yaml +++ b/.github/workflows/plugins-jdk21-test.0.yaml @@ -41,6 +41,21 @@ jobs: - uses: actions/checkout@v2 with: submodules: true + - name: Disable containerd image store + run: | + DAEMON_JSON="/etc/docker/daemon.json" + if [ -f "$DAEMON_JSON" ]; then + sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ + | sudo tee "${DAEMON_JSON}.tmp" > /dev/null + sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" + else + echo '{"features": {"containerd-snapshotter": false}}' \ + | sudo tee "$DAEMON_JSON" > /dev/null + fi + sudo systemctl restart docker + docker version + docker info + echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build with: diff --git a/.github/workflows/plugins-jdk25-test.0.yaml b/.github/workflows/plugins-jdk25-test.0.yaml index 88c7213101..06526df29f 100644 --- a/.github/workflows/plugins-jdk25-test.0.yaml +++ b/.github/workflows/plugins-jdk25-test.0.yaml @@ -41,6 +41,21 @@ jobs: - uses: actions/checkout@v2 with: submodules: true + - name: Disable containerd image store + run: | + DAEMON_JSON="/etc/docker/daemon.json" + if [ -f "$DAEMON_JSON" ]; then + sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ + | sudo tee "${DAEMON_JSON}.tmp" > /dev/null + sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" + else + echo '{"features": {"containerd-snapshotter": false}}' \ + | sudo tee "$DAEMON_JSON" > /dev/null + fi + sudo systemctl restart docker + docker version + docker info + echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build local tomcat-curl image run: | docker build -t tomcat-curl:10.1.50-jdk25-temurin \ diff --git a/.github/workflows/plugins-test.0.yaml b/.github/workflows/plugins-test.0.yaml index 06002b049c..308cc71087 100644 --- a/.github/workflows/plugins-test.0.yaml +++ b/.github/workflows/plugins-test.0.yaml @@ -41,6 +41,21 @@ jobs: - uses: actions/checkout@v2 with: submodules: true + - name: Disable containerd image store + run: | + DAEMON_JSON="/etc/docker/daemon.json" + if [ -f "$DAEMON_JSON" ]; then + sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ + | sudo tee "${DAEMON_JSON}.tmp" > /dev/null + sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" + else + echo '{"features": {"containerd-snapshotter": false}}' \ + | sudo tee "$DAEMON_JSON" > /dev/null + fi + sudo systemctl restart docker + docker version + docker info + echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build diff --git a/.github/workflows/plugins-test.1.yaml b/.github/workflows/plugins-test.1.yaml index ef210493f8..ce15ab7914 100644 --- a/.github/workflows/plugins-test.1.yaml +++ b/.github/workflows/plugins-test.1.yaml @@ -41,6 +41,21 @@ jobs: - uses: actions/checkout@v2 with: submodules: true + - name: Disable containerd image store + run: | + DAEMON_JSON="/etc/docker/daemon.json" + if [ -f "$DAEMON_JSON" ]; then + sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ + | sudo tee "${DAEMON_JSON}.tmp" > /dev/null + sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" + else + echo '{"features": {"containerd-snapshotter": false}}' \ + | sudo tee "$DAEMON_JSON" > /dev/null + fi + sudo systemctl restart docker + docker version + docker info + echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build diff --git a/.github/workflows/plugins-test.2.yaml b/.github/workflows/plugins-test.2.yaml index f2641e5e79..5fe28c244f 100644 --- a/.github/workflows/plugins-test.2.yaml +++ b/.github/workflows/plugins-test.2.yaml @@ -41,6 +41,21 @@ jobs: - uses: actions/checkout@v2 with: submodules: true + - name: Disable containerd image store + run: | + DAEMON_JSON="/etc/docker/daemon.json" + if [ -f "$DAEMON_JSON" ]; then + sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ + | sudo tee "${DAEMON_JSON}.tmp" > /dev/null + sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" + else + echo '{"features": {"containerd-snapshotter": false}}' \ + | sudo tee "$DAEMON_JSON" > /dev/null + fi + sudo systemctl restart docker + docker version + docker info + echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build @@ -53,35 +68,35 @@ jobs: matrix: case: - okhttp-scenario -# - play-scenario -# - postgresql-scenario -# - pulsar-scenario -# - rabbitmq-scenario -# - redisson-scenario -# - resttemplate-4.x-scenario -# - servicecomb-1.x-scenario -# - servicecomb-2.x-scenario -# - shardingsphere-3.x-scenario -# - shardingsphere-4.0.x-scenario -# - shardingsphere-4.x-scenario -# - shardingsphere-5.0.0-scenario -# - sofarpc-scenario -# - solrj-7.x-scenario -# - spring-3.0.x-scenario -# - spring-cloud-feign-1.1.x-scenario -# - spring-cloud-feign-1.2.x-scenario -# - spring-cloud-feign-2.x-scenario -# - spring-tx-scenario -# - struts2.3-scenario -# - struts2.5-scenario -# - cxf-scenario -# - okhttp2-scenario -# - rocketmq-scenario -# - jersey-2.0.x-2.25.x-scenario -# - jersey-2.26.x-2.39.x-scenario -# - websphere-liberty-23.x-scenario -# - nacos-client-2.x-scenario -# - rocketmq-5-grpc-scenario + - play-scenario + - postgresql-scenario + - pulsar-scenario + - rabbitmq-scenario + - redisson-scenario + - resttemplate-4.x-scenario + - servicecomb-1.x-scenario + - servicecomb-2.x-scenario + - shardingsphere-3.x-scenario + - shardingsphere-4.0.x-scenario + - shardingsphere-4.x-scenario + - shardingsphere-5.0.0-scenario + - sofarpc-scenario + - solrj-7.x-scenario + - spring-3.0.x-scenario + - spring-cloud-feign-1.1.x-scenario + - spring-cloud-feign-1.2.x-scenario + - spring-cloud-feign-2.x-scenario + - spring-tx-scenario + - struts2.3-scenario + - struts2.5-scenario + - cxf-scenario + - okhttp2-scenario + - jersey-2.0.x-2.25.x-scenario + - jersey-2.26.x-2.39.x-scenario + - websphere-liberty-23.x-scenario + - nacos-client-2.x-scenario + - rocketmq-scenario + - rocketmq-5-grpc-scenario steps: - uses: actions/checkout@v2 with: diff --git a/.github/workflows/plugins-test.3.yaml b/.github/workflows/plugins-test.3.yaml index a02891432a..d733a2069b 100644 --- a/.github/workflows/plugins-test.3.yaml +++ b/.github/workflows/plugins-test.3.yaml @@ -41,6 +41,21 @@ jobs: - uses: actions/checkout@v2 with: submodules: true + - name: Disable containerd image store + run: | + DAEMON_JSON="/etc/docker/daemon.json" + if [ -f "$DAEMON_JSON" ]; then + sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ + | sudo tee "${DAEMON_JSON}.tmp" > /dev/null + sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" + else + echo '{"features": {"containerd-snapshotter": false}}' \ + | sudo tee "$DAEMON_JSON" > /dev/null + fi + sudo systemctl restart docker + docker version + docker info + echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build diff --git a/.github/workflows/plugins-tomcat10-test.0.yaml b/.github/workflows/plugins-tomcat10-test.0.yaml index 6ba26a754c..9bac4133d9 100644 --- a/.github/workflows/plugins-tomcat10-test.0.yaml +++ b/.github/workflows/plugins-tomcat10-test.0.yaml @@ -41,6 +41,21 @@ jobs: - uses: actions/checkout@v2 with: submodules: true + - name: Disable containerd image store + run: | + DAEMON_JSON="/etc/docker/daemon.json" + if [ -f "$DAEMON_JSON" ]; then + sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ + | sudo tee "${DAEMON_JSON}.tmp" > /dev/null + sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" + else + echo '{"features": {"containerd-snapshotter": false}}' \ + | sudo tee "$DAEMON_JSON" > /dev/null + fi + sudo systemctl restart docker + docker version + docker info + echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build with: diff --git a/.github/workflows/plugins-tomcat9-test.0.yaml b/.github/workflows/plugins-tomcat9-test.0.yaml index 8f54080254..400e8a0ff6 100644 --- a/.github/workflows/plugins-tomcat9-test.0.yaml +++ b/.github/workflows/plugins-tomcat9-test.0.yaml @@ -41,6 +41,21 @@ jobs: - uses: actions/checkout@v2 with: submodules: true + - name: Disable containerd image store + run: | + DAEMON_JSON="/etc/docker/daemon.json" + if [ -f "$DAEMON_JSON" ]; then + sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ + | sudo tee "${DAEMON_JSON}.tmp" > /dev/null + sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" + else + echo '{"features": {"containerd-snapshotter": false}}' \ + | sudo tee "$DAEMON_JSON" > /dev/null + fi + sudo systemctl restart docker + docker version + docker info + echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Build uses: ./.github/actions/build with: diff --git a/.github/workflows/publish-docker.yaml b/.github/workflows/publish-docker.yaml index 7c1f4726b5..1eb75de778 100644 --- a/.github/workflows/publish-docker.yaml +++ b/.github/workflows/publish-docker.yaml @@ -75,6 +75,21 @@ jobs: with: name: skywalking-agent path: skywalking-agent + - name: Disable containerd image store + run: | + DAEMON_JSON="/etc/docker/daemon.json" + if [ -f "$DAEMON_JSON" ]; then + sudo jq '. + {"features": {"containerd-snapshotter": false}}' "$DAEMON_JSON" \ + | sudo tee "${DAEMON_JSON}.tmp" > /dev/null + sudo mv "${DAEMON_JSON}.tmp" "$DAEMON_JSON" + else + echo '{"features": {"containerd-snapshotter": false}}' \ + | sudo tee "$DAEMON_JSON" > /dev/null + fi + sudo systemctl restart docker + docker version + docker info + echo "DOCKER_API_VERSION=$(docker version --format '{{.Server.APIVersion}}')" >> "$GITHUB_ENV" - name: Log in to the Container registry uses: docker/login-action@v1.10.0 with: diff --git a/CHANGES.md b/CHANGES.md index 979502ce7a..eaa28ff2c8 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -2,35 +2,12 @@ Changes by Version ================== Release Notes. -9.6.0 +9.7.0 ------------------ -* Add CLAUDE.md for AI assistant guidance. -* Bump up agent-oap protocol to latest(16c51358ebcf42629bf4ffdf952253971f20eb25). -* Bump up gRPC to v1.74.0. -* Bump up netty to v4.1.124.Final. -* Bump up GSON to v2.13.1. -* Bump up guava to v32.1.3. -* Bump up oap to the 10.3-dev.latest(dc8740d4757b35374283c4850a9a080e40f0eb79) in e2e. -* Bump up cli to the 0.15.0-dev.latest(77b4c49e89c9c000278f44e62729d534f2ec842e) in e2e. -* Bump up apache parent pom to v35. -* Update Maven to 3.6.3 in mvnw. -* Fix OOM due to too many span logs. -* Fix ClassLoader cache OOM issue with WeakHashMap. -* Fix Jetty client cannot receive the HTTP response body. -* Eliminate repeated code with HttpServletRequestWrapper in mvc-annotation-commons. -* Add the jdk httpclient plugin. -* Fix Gateway 2.0.x plugin not activated for spring-cloud-starter-gateway 2.0.0.RELEASE. -* Support kafka-clients-3.9.x intercept. -* Upgrade kafka-clients version in optional-reporter-plugins to 3.9.1. -* Fix AbstractLogger replaceParam when the replaced string contains a replacement marker. -* Fix `JDBCPluginConfig.Plugin.JDBC.SQL_BODY_MAX_LENGTH` was not working in some plugins. -* Bump up Lombok to v1.18.42 to adopt JDK25 compiling. -* Add `eclipse-temurin:25-jre` as another base image. -* Add JDK25 plugin tests for Spring 6. -* Ignore classes starting with "sun.nio.cs" in bytebuddy due to potential class loading deadlock. -All issues and pull requests are [here](https://github.com/apache/skywalking/milestone/242?closed=1) + +All issues and pull requests are [here](https://github.com/apache/skywalking/milestone/249?closed=1) ------------------ Find change logs of all versions [here](changes). diff --git a/apm-application-toolkit/apm-toolkit-kafka/pom.xml b/apm-application-toolkit/apm-toolkit-kafka/pom.xml index 05365ce572..695985162e 100644 --- a/apm-application-toolkit/apm-toolkit-kafka/pom.xml +++ b/apm-application-toolkit/apm-toolkit-kafka/pom.xml @@ -21,7 +21,7 @@ apm-application-toolkit org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-log4j-1.x/pom.xml b/apm-application-toolkit/apm-toolkit-log4j-1.x/pom.xml index e2b12f7171..6983c0d2e9 100644 --- a/apm-application-toolkit/apm-toolkit-log4j-1.x/pom.xml +++ b/apm-application-toolkit/apm-toolkit-log4j-1.x/pom.xml @@ -21,7 +21,7 @@ apm-application-toolkit org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-log4j-2.x/pom.xml b/apm-application-toolkit/apm-toolkit-log4j-2.x/pom.xml index 3b0ecb2103..393ea94496 100644 --- a/apm-application-toolkit/apm-toolkit-log4j-2.x/pom.xml +++ b/apm-application-toolkit/apm-toolkit-log4j-2.x/pom.xml @@ -21,7 +21,7 @@ apm-application-toolkit org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-logback-1.x/pom.xml b/apm-application-toolkit/apm-toolkit-logback-1.x/pom.xml index f7f441bde3..f5b9d63625 100644 --- a/apm-application-toolkit/apm-toolkit-logback-1.x/pom.xml +++ b/apm-application-toolkit/apm-toolkit-logback-1.x/pom.xml @@ -21,7 +21,7 @@ apm-application-toolkit org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-meter/pom.xml b/apm-application-toolkit/apm-toolkit-meter/pom.xml index b5d212c20c..9c2af46e51 100644 --- a/apm-application-toolkit/apm-toolkit-meter/pom.xml +++ b/apm-application-toolkit/apm-toolkit-meter/pom.xml @@ -20,7 +20,7 @@ apm-application-toolkit org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-micrometer-1.10/pom.xml b/apm-application-toolkit/apm-toolkit-micrometer-1.10/pom.xml index b570a7fda8..70e3a957d6 100644 --- a/apm-application-toolkit/apm-toolkit-micrometer-1.10/pom.xml +++ b/apm-application-toolkit/apm-toolkit-micrometer-1.10/pom.xml @@ -20,7 +20,7 @@ apm-application-toolkit org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-micrometer-registry/pom.xml b/apm-application-toolkit/apm-toolkit-micrometer-registry/pom.xml index 8c972efdc2..5658bea135 100644 --- a/apm-application-toolkit/apm-toolkit-micrometer-registry/pom.xml +++ b/apm-application-toolkit/apm-toolkit-micrometer-registry/pom.xml @@ -20,7 +20,7 @@ apm-application-toolkit org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-opentracing/pom.xml b/apm-application-toolkit/apm-toolkit-opentracing/pom.xml index 5d0dc02d38..a7d9aefd2a 100644 --- a/apm-application-toolkit/apm-toolkit-opentracing/pom.xml +++ b/apm-application-toolkit/apm-toolkit-opentracing/pom.xml @@ -21,7 +21,7 @@ apm-application-toolkit org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-trace/pom.xml b/apm-application-toolkit/apm-toolkit-trace/pom.xml index 5b186af0d9..642a551645 100644 --- a/apm-application-toolkit/apm-toolkit-trace/pom.xml +++ b/apm-application-toolkit/apm-toolkit-trace/pom.xml @@ -20,7 +20,7 @@ apm-application-toolkit org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/apm-toolkit-webflux/pom.xml b/apm-application-toolkit/apm-toolkit-webflux/pom.xml index 2dab4fc7ea..8397b9193f 100644 --- a/apm-application-toolkit/apm-toolkit-webflux/pom.xml +++ b/apm-application-toolkit/apm-toolkit-webflux/pom.xml @@ -20,7 +20,7 @@ apm-application-toolkit org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-application-toolkit/pom.xml b/apm-application-toolkit/pom.xml index e004d63b06..cc173543d0 100644 --- a/apm-application-toolkit/pom.xml +++ b/apm-application-toolkit/pom.xml @@ -20,7 +20,7 @@ java-agent org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 apm-application-toolkit diff --git a/apm-commons/apm-datacarrier/pom.xml b/apm-commons/apm-datacarrier/pom.xml index fd0cbf6280..a3c91d10ba 100644 --- a/apm-commons/apm-datacarrier/pom.xml +++ b/apm-commons/apm-datacarrier/pom.xml @@ -21,7 +21,7 @@ java-agent-commons org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-commons/apm-util/pom.xml b/apm-commons/apm-util/pom.xml index bf1169bfde..1bbb7009a4 100644 --- a/apm-commons/apm-util/pom.xml +++ b/apm-commons/apm-util/pom.xml @@ -20,7 +20,7 @@ java-agent-commons org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-commons/pom.xml b/apm-commons/pom.xml index 3b54179ebe..79e66796ca 100644 --- a/apm-commons/pom.xml +++ b/apm-commons/pom.xml @@ -20,7 +20,7 @@ java-agent org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-protocol/apm-network/pom.xml b/apm-protocol/apm-network/pom.xml index 9964486b65..a1531c3ca0 100644 --- a/apm-protocol/apm-network/pom.xml +++ b/apm-protocol/apm-network/pom.xml @@ -21,7 +21,7 @@ java-agent-protocol org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-protocol/pom.xml b/apm-protocol/pom.xml index 10be0c6791..3cfb939955 100644 --- a/apm-protocol/pom.xml +++ b/apm-protocol/pom.xml @@ -21,7 +21,7 @@ java-agent org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-agent-core/pom.xml b/apm-sniffer/apm-agent-core/pom.xml index d251748fe3..43670f03ba 100644 --- a/apm-sniffer/apm-agent-core/pom.xml +++ b/apm-sniffer/apm-agent-core/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking java-agent-sniffer - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-agent-core diff --git a/apm-sniffer/apm-agent/pom.xml b/apm-sniffer/apm-agent/pom.xml index 07cdd3e195..78a3b733ac 100644 --- a/apm-sniffer/apm-agent/pom.xml +++ b/apm-sniffer/apm-agent/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking java-agent-sniffer - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-agent diff --git a/apm-sniffer/apm-sdk-plugin/activemq-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/activemq-5.x-plugin/pom.xml index 19d0a0ac07..00abc003dc 100644 --- a/apm-sniffer/apm-sdk-plugin/activemq-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/activemq-5.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/activemq-artemis-jakarta-client-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/activemq-artemis-jakarta-client-2.x-plugin/pom.xml index da27f49425..17f0dc4442 100644 --- a/apm-sniffer/apm-sdk-plugin/activemq-artemis-jakarta-client-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/activemq-artemis-jakarta-client-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/aerospike-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/aerospike-plugin/pom.xml index 9dfc94d3f0..f2c5ac64f4 100644 --- a/apm-sniffer/apm-sdk-plugin/aerospike-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/aerospike-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.84.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.84.x-plugin/pom.xml index fee4c87555..81ea378be9 100644 --- a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.84.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.84.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-armeria-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.85.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.85.x-plugin/pom.xml index bd33a3f2de..d4897e1325 100644 --- a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.85.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-0.85.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-armeria-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-1.0.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-1.0.x-plugin/pom.xml index 2e711d08f1..6a32acee05 100644 --- a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-1.0.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/apm-armeria-1.0.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-armeria-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/pom.xml index d3bb98f95c..f55ffcb8fc 100644 --- a/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/apm-armeria-plugins/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 pom diff --git a/apm-sniffer/apm-sdk-plugin/asynchttpclient-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/asynchttpclient-2.x-plugin/pom.xml index 5b9862e235..fe491b9ee2 100644 --- a/apm-sniffer/apm-sdk-plugin/asynchttpclient-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/asynchttpclient-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/avro-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/avro-plugin/pom.xml index e58c105c66..cf5039fc31 100644 --- a/apm-sniffer/apm-sdk-plugin/avro-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/avro-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/baidu-brpc-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/baidu-brpc-3.x-plugin/pom.xml index a9a5903d55..6716583e00 100644 --- a/apm-sniffer/apm-sdk-plugin/baidu-brpc-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/baidu-brpc-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 jar diff --git a/apm-sniffer/apm-sdk-plugin/baidu-brpc-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/baidu-brpc-plugin/pom.xml index 96e05ed0c8..7f31b50046 100644 --- a/apm-sniffer/apm-sdk-plugin/baidu-brpc-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/baidu-brpc-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 jar diff --git a/apm-sniffer/apm-sdk-plugin/c3p0-0.9.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/c3p0-0.9.x-plugin/pom.xml index a6d5abaa51..7b7a82628a 100644 --- a/apm-sniffer/apm-sdk-plugin/c3p0-0.9.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/c3p0-0.9.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/canal-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/canal-1.x-plugin/pom.xml index 143239cf4c..fd4b295a51 100644 --- a/apm-sniffer/apm-sdk-plugin/canal-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/canal-1.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/cassandra-java-driver-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/cassandra-java-driver-3.x-plugin/pom.xml index f710b489eb..ecc5d3535d 100644 --- a/apm-sniffer/apm-sdk-plugin/cassandra-java-driver-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/cassandra-java-driver-3.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.1-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.1-plugin/pom.xml index a669888e52..c80e82160b 100755 --- a/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.1-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.1-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.2.x-plugin/pom.xml index f02f4b7c73..e50763327d 100755 --- a/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/clickhouse-0.3.2.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/cxf-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/cxf-3.x-plugin/pom.xml index 93f8952933..9744820eca 100644 --- a/apm-sniffer/apm-sdk-plugin/cxf-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/cxf-3.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/dbcp-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/dbcp-2.x-plugin/pom.xml index 7e073160b5..2ae4ae4b3f 100644 --- a/apm-sniffer/apm-sdk-plugin/dbcp-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/dbcp-2.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/druid-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/druid-1.x-plugin/pom.xml index 9b236f308f..bd8f9d6e39 100644 --- a/apm-sniffer/apm-sdk-plugin/druid-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/druid-1.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-conflict-patch/pom.xml b/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-conflict-patch/pom.xml index 0e9cee5454..4880f503ff 100644 --- a/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-conflict-patch/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-conflict-patch/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-plugin/pom.xml index 0c98cc6695..4608dc3006 100644 --- a/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/dubbo-2.7.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/dubbo-3.x-conflict-patch/pom.xml b/apm-sniffer/apm-sdk-plugin/dubbo-3.x-conflict-patch/pom.xml index c092225837..f1eb7380c9 100644 --- a/apm-sniffer/apm-sdk-plugin/dubbo-3.x-conflict-patch/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/dubbo-3.x-conflict-patch/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/dubbo-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/dubbo-3.x-plugin/pom.xml index 02d82c2341..48e35f1950 100644 --- a/apm-sniffer/apm-sdk-plugin/dubbo-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/dubbo-3.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/dubbo-conflict-patch/pom.xml b/apm-sniffer/apm-sdk-plugin/dubbo-conflict-patch/pom.xml index 744e911633..70adb55678 100644 --- a/apm-sniffer/apm-sdk-plugin/dubbo-conflict-patch/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/dubbo-conflict-patch/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/dubbo-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/dubbo-plugin/pom.xml index a83f02078c..de7bd3752b 100644 --- a/apm-sniffer/apm-sdk-plugin/dubbo-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/dubbo-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/elastic-job-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/elastic-job-2.x-plugin/pom.xml index 0d12e32ca6..01e5f81dfe 100644 --- a/apm-sniffer/apm-sdk-plugin/elastic-job-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/elastic-job-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/elasticjob-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/elasticjob-3.x-plugin/pom.xml index 065469ee06..a965673abb 100644 --- a/apm-sniffer/apm-sdk-plugin/elasticjob-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/elasticjob-3.x-plugin/pom.xml @@ -20,7 +20,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/elasticsearch-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/elasticsearch-5.x-plugin/pom.xml index 224a41ee5e..6f048e9caf 100644 --- a/apm-sniffer/apm-sdk-plugin/elasticsearch-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/elasticsearch-5.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/elasticsearch-6.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/elasticsearch-6.x-plugin/pom.xml index a727f273ee..e1a226cc08 100644 --- a/apm-sniffer/apm-sdk-plugin/elasticsearch-6.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/elasticsearch-6.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/elasticsearch-7.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/elasticsearch-7.x-plugin/pom.xml index 1e22dbef16..89a90b55f2 100644 --- a/apm-sniffer/apm-sdk-plugin/elasticsearch-7.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/elasticsearch-7.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/elasticsearch-common/pom.xml b/apm-sniffer/apm-sdk-plugin/elasticsearch-common/pom.xml index 1e43afaef4..51acbee581 100644 --- a/apm-sniffer/apm-sdk-plugin/elasticsearch-common/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/elasticsearch-common/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/pom.xml index 77b513f56b..a97bc44739 100644 --- a/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/feign-default-http-9.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/pom.xml index 790a4b46a4..89f906c289 100644 --- a/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/finagle-6.25.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-12.x-15.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-12.x-15.x-plugin/pom.xml index 9a0b7824df..170586098e 100644 --- a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-12.x-15.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-12.x-15.x-plugin/pom.xml @@ -21,7 +21,7 @@ graphql-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-16plus-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-16plus-plugin/pom.xml index 2fe40768a5..474b404f95 100644 --- a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-16plus-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-16plus-plugin/pom.xml @@ -21,7 +21,7 @@ graphql-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-8.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-8.x-plugin/pom.xml index 6de13ee103..cb6d9e0e02 100644 --- a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-8.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-8.x-plugin/pom.xml @@ -21,7 +21,7 @@ graphql-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-9.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-9.x-plugin/pom.xml index 4fef19e90f..d1e081d15c 100644 --- a/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-9.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/graphql-plugin/graphql-9.x-plugin/pom.xml @@ -21,7 +21,7 @@ graphql-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/graphql-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/graphql-plugin/pom.xml index ebbeb91191..74e296d1bd 100644 --- a/apm-sniffer/apm-sdk-plugin/graphql-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/graphql-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 pom diff --git a/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-plugin/pom.xml index 9b650f7cd9..191aa45db8 100644 --- a/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-plugin/pom.xml @@ -20,7 +20,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-work-threadpool-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-work-threadpool-plugin/pom.xml index 84699cac8b..5db8506875 100644 --- a/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-work-threadpool-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/grizzly-2.3.x-4.x-work-threadpool-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-grizzly-2.x-4.x-work-threadpool-plugin diff --git a/apm-sniffer/apm-sdk-plugin/grpc-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/grpc-1.x-plugin/pom.xml index 12f7b140d8..72884e2d48 100644 --- a/apm-sniffer/apm-sdk-plugin/grpc-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/grpc-1.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-grpc-1.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/guava-eventbus-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/guava-eventbus-plugin/pom.xml index 678218e2ba..d2ad8e9292 100644 --- a/apm-sniffer/apm-sdk-plugin/guava-eventbus-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/guava-eventbus-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/h2-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/h2-1.x-plugin/pom.xml index ad985a3ee7..4c359960a0 100755 --- a/apm-sniffer/apm-sdk-plugin/h2-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/h2-1.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/hbase-1.x-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/hbase-1.x-2.x-plugin/pom.xml index 2809352c1b..d256acb1c5 100644 --- a/apm-sniffer/apm-sdk-plugin/hbase-1.x-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/hbase-1.x-2.x-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-hbase-1.x-2.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/hikaricp-3.x-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/hikaricp-3.x-4.x-plugin/pom.xml index 330c7bcf37..864b91b125 100644 --- a/apm-sniffer/apm-sdk-plugin/hikaricp-3.x-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/hikaricp-3.x-4.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/pom.xml index 00d5f64d55..0fcdd24c95 100644 --- a/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/httpClient-4.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-httpClient-4.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/httpasyncclient-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/httpasyncclient-4.x-plugin/pom.xml index 6b60405e18..2cd5025cd6 100644 --- a/apm-sniffer/apm-sdk-plugin/httpasyncclient-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/httpasyncclient-4.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-httpasyncclient-4.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/httpclient-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/httpclient-3.x-plugin/pom.xml index 3203867e3a..2127da9e0d 100644 --- a/apm-sniffer/apm-sdk-plugin/httpclient-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/httpclient-3.x-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-httpclient-3.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/httpclient-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/httpclient-5.x-plugin/pom.xml index f1a047e813..ba159639a4 100644 --- a/apm-sniffer/apm-sdk-plugin/httpclient-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/httpclient-5.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-httpclient-5.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/httpclient-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/httpclient-commons/pom.xml index 37bedce74c..c9976aadf2 100644 --- a/apm-sniffer/apm-sdk-plugin/httpclient-commons/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/httpclient-commons/pom.xml @@ -22,7 +22,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-httpclient-commons diff --git a/apm-sniffer/apm-sdk-plugin/hutool-plugins/hutool-http-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/hutool-plugins/hutool-http-5.x-plugin/pom.xml index 9ff2019872..b31ba12cf4 100644 --- a/apm-sniffer/apm-sdk-plugin/hutool-plugins/hutool-http-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/hutool-plugins/hutool-http-5.x-plugin/pom.xml @@ -20,7 +20,7 @@ hutool-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/hutool-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/hutool-plugins/pom.xml index 92249a85a5..6c41996fb0 100644 --- a/apm-sniffer/apm-sdk-plugin/hutool-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/hutool-plugins/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/pom.xml index ba9914c170..83f8023afe 100644 --- a/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/hystrix-1.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/influxdb-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/influxdb-2.x-plugin/pom.xml index f9e47326cf..e360c9ac4b 100644 --- a/apm-sniffer/apm-sdk-plugin/influxdb-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/influxdb-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jdbc-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/jdbc-commons/pom.xml index 46759160e6..1eecc0d35c 100755 --- a/apm-sniffer/apm-sdk-plugin/jdbc-commons/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jdbc-commons/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-2.x-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-2.x-3.x-plugin/pom.xml index 9da30b3367..53f72f82af 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-2.x-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-2.x-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking jedis-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-4.x-plugin/pom.xml index 3b72ba9d1b..4593b1c654 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jedis-plugins/jedis-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ jedis-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jedis-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/jedis-plugins/pom.xml index 8b58716509..a337f0c2f8 100644 --- a/apm-sniffer/apm-sdk-plugin/jedis-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jedis-plugins/pom.xml @@ -20,7 +20,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT diff --git a/apm-sniffer/apm-sdk-plugin/jersey-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jersey-2.x-plugin/pom.xml index 8d9f6824b1..f3a8001daf 100644 --- a/apm-sniffer/apm-sdk-plugin/jersey-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jersey-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jersey-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jersey-3.x-plugin/pom.xml index 0524344fdd..94fd991b19 100644 --- a/apm-sniffer/apm-sdk-plugin/jersey-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jersey-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-11.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-11.x-plugin/pom.xml index 79ffd36ac4..d800a09ddd 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-11.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-11.x-plugin/pom.xml @@ -20,7 +20,7 @@ jetty-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/pom.xml index 0d7545a5f2..be26052758 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.0-plugin/pom.xml @@ -20,7 +20,7 @@ jetty-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml index 229c401f21..a7f7168743 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-client-9.x-plugin/pom.xml @@ -20,7 +20,7 @@ jetty-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-11.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-11.x-plugin/pom.xml index a5d993b031..c70f0ddd37 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-11.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-11.x-plugin/pom.xml @@ -20,7 +20,7 @@ jetty-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/pom.xml index 17049eadd7..d4602b83c4 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/jetty-server-9.x-plugin/pom.xml @@ -20,7 +20,7 @@ jetty-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jetty-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-plugin/pom.xml index 230c49aff0..0d051bd4c0 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jetty-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT jetty-plugins diff --git a/apm-sniffer/apm-sdk-plugin/jetty-thread-pool-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jetty-thread-pool-plugin/pom.xml index db583d1800..533868c65d 100644 --- a/apm-sniffer/apm-sdk-plugin/jetty-thread-pool-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jetty-thread-pool-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/jsonrpc4j-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/jsonrpc4j-1.x-plugin/pom.xml index b0d5740694..f4ef9b5118 100644 --- a/apm-sniffer/apm-sdk-plugin/jsonrpc4j-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/jsonrpc4j-1.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/kafka-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/kafka-commons/pom.xml index 322b7fc81b..9870095054 100644 --- a/apm-sniffer/apm-sdk-plugin/kafka-commons/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/kafka-commons/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-kafka-commons diff --git a/apm-sniffer/apm-sdk-plugin/kafka-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/kafka-plugin/pom.xml index 1e3f0588a4..9c03ef164a 100644 --- a/apm-sniffer/apm-sdk-plugin/kafka-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/kafka-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/kylin-jdbc-2.6.x-3.x-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/kylin-jdbc-2.6.x-3.x-4.x-plugin/pom.xml index 4bff437545..54d4d9e605 100644 --- a/apm-sniffer/apm-sdk-plugin/kylin-jdbc-2.6.x-3.x-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/kylin-jdbc-2.6.x-3.x-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-5.x-6.4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-5.x-6.4.x-plugin/pom.xml index facce0452d..c2158fcb4a 100644 --- a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-5.x-6.4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-5.x-6.4.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking lettuce-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-lettuce-5.x-6.4.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-6.5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-6.5.x-plugin/pom.xml index 1e4461f495..2bf20982cf 100644 --- a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-6.5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-6.5.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking lettuce-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-lettuce-6.5.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-common/pom.xml b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-common/pom.xml index 463250cf39..6062c90bce 100644 --- a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-common/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/lettuce-common/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking lettuce-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-lettuce-common diff --git a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/pom.xml index c9cfe8d17c..924a0e0ce7 100644 --- a/apm-sniffer/apm-sdk-plugin/lettuce-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/lettuce-plugins/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT lettuce-plugins diff --git a/apm-sniffer/apm-sdk-plugin/light4j-plugins/light4j-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/light4j-plugins/light4j-plugin/pom.xml index 5785ce44cd..12b4e3a59e 100644 --- a/apm-sniffer/apm-sdk-plugin/light4j-plugins/light4j-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/light4j-plugins/light4j-plugin/pom.xml @@ -20,7 +20,7 @@ light4j-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/light4j-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/light4j-plugins/pom.xml index 1d8da85b79..cd9ab3c418 100644 --- a/apm-sniffer/apm-sdk-plugin/light4j-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/light4j-plugins/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT light4j-plugins diff --git a/apm-sniffer/apm-sdk-plugin/mariadb-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mariadb-2.x-plugin/pom.xml index 802ed1f44c..2ec8ab3063 100644 --- a/apm-sniffer/apm-sdk-plugin/mariadb-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mariadb-2.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-client-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-client-plugin/pom.xml index dfd0f426bb..a0955c19d2 100644 --- a/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-client-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-client-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking micronaut-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-server-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-server-plugin/pom.xml index 4d7e5f56de..a8fd47deac 100644 --- a/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-server-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/micronaut-plugins/micronaut-http-server-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking micronaut-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/micronaut-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/micronaut-plugins/pom.xml index 89fb218808..0025bcf432 100644 --- a/apm-sniffer/apm-sdk-plugin/micronaut-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/micronaut-plugins/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mongodb-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mongodb-2.x-plugin/pom.xml index 1f2e130efb..e16638a4b9 100644 --- a/apm-sniffer/apm-sdk-plugin/mongodb-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mongodb-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/pom.xml index 6ff822a4a0..212222c6d6 100644 --- a/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mongodb-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-mongodb-3.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/mongodb-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mongodb-4.x-plugin/pom.xml index de38fedcae..cb0363cb8e 100644 --- a/apm-sniffer/apm-sdk-plugin/mongodb-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mongodb-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-mongodb-4.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/motan-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/motan-plugin/pom.xml index d3319b9cdb..b74bc6d54d 100644 --- a/apm-sniffer/apm-sdk-plugin/motan-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/motan-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mssql-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/mssql-commons/pom.xml index 441bf6601d..ff9f083f6d 100644 --- a/apm-sniffer/apm-sdk-plugin/mssql-commons/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mssql-commons/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mssql-jdbc-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mssql-jdbc-plugin/pom.xml index 13d0cb16ff..ff678a1a00 100644 --- a/apm-sniffer/apm-sdk-plugin/mssql-jdbc-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mssql-jdbc-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mssql-jtds-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mssql-jtds-1.x-plugin/pom.xml index 04687dbcc1..2f3dd90ea6 100644 --- a/apm-sniffer/apm-sdk-plugin/mssql-jtds-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mssql-jtds-1.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mysql-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mysql-5.x-plugin/pom.xml index ee171e5c32..361f5bc821 100755 --- a/apm-sniffer/apm-sdk-plugin/mysql-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mysql-5.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mysql-6.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mysql-6.x-plugin/pom.xml index 1e07e995b8..edaef2cf28 100755 --- a/apm-sniffer/apm-sdk-plugin/mysql-6.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mysql-6.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mysql-8.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/mysql-8.x-plugin/pom.xml index b84115d907..11ee950a57 100755 --- a/apm-sniffer/apm-sdk-plugin/mysql-8.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mysql-8.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/mysql-common/pom.xml b/apm-sniffer/apm-sdk-plugin/mysql-common/pom.xml index c832784e25..92aa8ee5d8 100755 --- a/apm-sniffer/apm-sdk-plugin/mysql-common/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/mysql-common/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.16.5-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.16.5-plugin/pom.xml index 2d85d4cd9b..60bba313b0 100644 --- a/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.16.5-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/nats-2.14.x-2.16.5-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/neo4j-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/neo4j-4.x-plugin/pom.xml index 0b98a3efe2..1bf1de4bfd 100644 --- a/apm-sniffer/apm-sdk-plugin/neo4j-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/neo4j-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/netty-socketio-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/netty-socketio-plugin/pom.xml index 5c8a854b9b..2fc96f1c2f 100644 --- a/apm-sniffer/apm-sdk-plugin/netty-socketio-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/netty-socketio-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml index d1fe436ea6..3f2b4d0b67 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/http-1.x-plugin/pom.xml @@ -20,7 +20,7 @@ nutz-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml index 2f968d2bf5..cd772375c6 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/mvc-annotation-1.x-plugin/pom.xml @@ -20,7 +20,7 @@ nutz-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml index 711786d120..0b8fe2d545 100644 --- a/apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/nutz-plugins/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT nutz-plugins diff --git a/apm-sniffer/apm-sdk-plugin/okhttp-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/okhttp-2.x-plugin/pom.xml index ede53c4ff8..14d05d0135 100644 --- a/apm-sniffer/apm-sdk-plugin/okhttp-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/okhttp-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/pom.xml index ef6fcb0239..b25f764a6e 100644 --- a/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/okhttp-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/okhttp-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/okhttp-4.x-plugin/pom.xml index a8d0a42612..ce5434d9cb 100644 --- a/apm-sniffer/apm-sdk-plugin/okhttp-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/okhttp-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/okhttp-common/pom.xml b/apm-sniffer/apm-sdk-plugin/okhttp-common/pom.xml index 96d60b3765..68437b314a 100644 --- a/apm-sniffer/apm-sdk-plugin/okhttp-common/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/okhttp-common/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/play-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/play-2.x-plugin/pom.xml index 26491de16c..5c74e133d8 100644 --- a/apm-sniffer/apm-sdk-plugin/play-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/play-2.x-plugin/pom.xml @@ -22,7 +22,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-play-2.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/pom.xml index ea21985349..1c792ed425 100644 --- a/apm-sniffer/apm-sdk-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking java-agent-sniffer - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-sdk-plugin diff --git a/apm-sniffer/apm-sdk-plugin/postgresql-8.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/postgresql-8.x-plugin/pom.xml index 4ce5b69ecd..181a48d08c 100755 --- a/apm-sniffer/apm-sdk-plugin/postgresql-8.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/postgresql-8.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/pulsar-2.2-2.7-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/pulsar-2.2-2.7-plugin/pom.xml index 98a45766bb..862269d01e 100644 --- a/apm-sniffer/apm-sdk-plugin/pulsar-2.2-2.7-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/pulsar-2.2-2.7-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/pulsar-2.8.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/pulsar-2.8.x-plugin/pom.xml index fbe2c3fe00..c464911398 100644 --- a/apm-sniffer/apm-sdk-plugin/pulsar-2.8.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/pulsar-2.8.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/pulsar-common/pom.xml b/apm-sniffer/apm-sdk-plugin/pulsar-common/pom.xml index 7fa0685161..9679ea88fb 100644 --- a/apm-sniffer/apm-sdk-plugin/pulsar-common/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/pulsar-common/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/quasar-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/quasar-plugin/pom.xml index 99bd15fb4f..a980a658d8 100644 --- a/apm-sniffer/apm-sdk-plugin/quasar-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/quasar-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-quasar-plugin diff --git a/apm-sniffer/apm-sdk-plugin/rabbitmq-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/rabbitmq-plugin/pom.xml index 65f78a5467..492b479b07 100644 --- a/apm-sniffer/apm-sdk-plugin/rabbitmq-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/rabbitmq-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/pom.xml index 55edbdeac3..7ba9d05be3 100644 --- a/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/redisson-3.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-redisson-3.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/pom.xml index 6ff7caaaaa..4f661c38ba 100644 --- a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT resteasy-plugin diff --git a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/pom.xml index 14d989003f..83b9d357cc 100644 --- a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ resteasy-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT resteasy-server-3.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-4.x-plugin/pom.xml index f21d450b6a..63eb0c4826 100644 --- a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ resteasy-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT resteasy-server-4.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-6.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-6.x-plugin/pom.xml index f259291bfd..f20ab70b3e 100644 --- a/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-6.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/resteasy-plugin/resteasy-server-6.x-plugin/pom.xml @@ -21,7 +21,7 @@ resteasy-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT resteasy-server-6.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/rocketMQ-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/rocketMQ-3.x-plugin/pom.xml index 6b206013d9..5a7c711dd2 100644 --- a/apm-sniffer/apm-sdk-plugin/rocketMQ-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/rocketMQ-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/rocketMQ-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/rocketMQ-4.x-plugin/pom.xml index 6fa277b4ef..a30e1b09e0 100644 --- a/apm-sniffer/apm-sdk-plugin/rocketMQ-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/rocketMQ-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/rocketMQ-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/rocketMQ-5.x-plugin/pom.xml index ad51da8c77..62c1fbb3e3 100644 --- a/apm-sniffer/apm-sdk-plugin/rocketMQ-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/rocketMQ-5.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/rocketMQ-client-java-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/rocketMQ-client-java-5.x-plugin/pom.xml index d07527b994..e4dc8d8988 100644 --- a/apm-sniffer/apm-sdk-plugin/rocketMQ-client-java-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/rocketMQ-client-java-5.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/pom.xml index e010d7cc09..06f9d58672 100644 --- a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-2.x-plugin/pom.xml index f92f636768..6c26908ce4 100644 --- a/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/servicecomb-plugin/servicecomb-java-chassis-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ servicecomb-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/pom.xml index 60d101c987..6d38f040f2 100644 --- a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 pom diff --git a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-3.x-plugin/pom.xml index 48776bf7e7..033f5afc04 100644 --- a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ shardingsphere-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.0.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.0.x-plugin/pom.xml index cdbdf13335..fa282b6571 100644 --- a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.0.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.0.x-plugin/pom.xml @@ -20,7 +20,7 @@ shardingsphere-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.1.0-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.1.0-plugin/pom.xml index 99b838e1e7..803c61dbeb 100644 --- a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.1.0-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-4.1.0-plugin/pom.xml @@ -20,7 +20,7 @@ shardingsphere-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-5.0.0-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-5.0.0-plugin/pom.xml index 013e5929ed..e17d47b46d 100644 --- a/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-5.0.0-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/shardingsphere-plugins/sharding-sphere-5.0.0-plugin/pom.xml @@ -21,7 +21,7 @@ shardingsphere-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/pom.xml index c685c69dd7..21f8795238 100644 --- a/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/InvokeCallbackWrapperTest.java b/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/InvokeCallbackWrapperTest.java index ef9c9f3cb0..d05d4026c2 100644 --- a/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/InvokeCallbackWrapperTest.java +++ b/apm-sniffer/apm-sdk-plugin/sofarpc-plugin/src/test/java/org/apache/skywalking/apm/plugin/sofarpc/InvokeCallbackWrapperTest.java @@ -141,7 +141,10 @@ public void testOnResponse() throws InterruptedException { TraceSegment traceSegment2 = segmentStorage.getTraceSegments().get(1); List spans2 = SegmentHelper.getSpans(traceSegment2); assertThat(spans2.size(), is(1)); - assertEquals("sofarpc", traceSegment2.getRef().getParentEndpoint()); + + // Segment order is non-deterministic; find the child segment (the one with a ref) + TraceSegment childSegment = traceSegment.getRef() != null ? traceSegment : traceSegment2; + assertEquals("sofarpc", childSegment.getRef().getParentEndpoint()); } @Test @@ -162,7 +165,11 @@ public void testOnException() throws InterruptedException { TraceSegment traceSegment2 = segmentStorage.getTraceSegments().get(1); List spans2 = SegmentHelper.getSpans(traceSegment2); assertThat(spans2.size(), is(1)); - assertThat(SpanHelper.getLogs(spans2.get(0)).size(), is(1)); + + // Segment order is non-deterministic; find the child segment (the one with a ref) + TraceSegment childSegment = traceSegment.getRef() != null ? traceSegment : traceSegment2; + List childSpans = SegmentHelper.getSpans(childSegment); + assertThat(SpanHelper.getLogs(childSpans.get(0)).size(), is(1)); } diff --git a/apm-sniffer/apm-sdk-plugin/solon-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/solon-2.x-plugin/pom.xml index 5221d63d04..543d27c2c4 100644 --- a/apm-sniffer/apm-sdk-plugin/solon-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/solon-2.x-plugin/pom.xml @@ -22,7 +22,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT solon-2.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/solrj-7.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/solrj-7.x-plugin/pom.xml index f8b02211f4..2377a233f7 100644 --- a/apm-sniffer/apm-sdk-plugin/solrj-7.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/solrj-7.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/async-annotation-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/async-annotation-plugin/pom.xml index 556c7f269a..337a154135 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/async-annotation-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/async-annotation-plugin/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/concurrent-util-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/concurrent-util-4.x-plugin/pom.xml index 8c922b6c28..fa85530d61 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/concurrent-util-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/concurrent-util-4.x-plugin/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/pom.xml index 0b367dffe7..58e530913a 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/core-patch/pom.xml @@ -21,7 +21,7 @@ spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/pom.xml index a3ad988877..02fa8639d0 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-3.x-plugin/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/pom.xml index d551f811a0..f48ace4499 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-4.x-plugin/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/pom.xml index c8eae36531..bea4ce00a9 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-5.x-plugin/pom.xml @@ -19,7 +19,7 @@ spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml index 67bcaaac46..65c554bb88 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/mvc-annotation-commons/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml index 8aeb72256e..5a307810b3 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT spring-plugins diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-3.x-plugin/pom.xml index 2b8cb9beed..2dab6a46c9 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-3.x-plugin/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/pom.xml index 9bcaa96cbf..966de1995f 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-4.x-plugin/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-commons/pom.xml index 7317ad938a..19ecc7989c 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-commons/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/resttemplate-commons/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/scheduled-annotation-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/scheduled-annotation-plugin/pom.xml index 3bb2740074..c4dfd6d15f 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/scheduled-annotation-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/scheduled-annotation-plugin/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/pom.xml index 7df17507ae..34769eadbb 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking spring-cloud - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT netflix-plugins diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/pom.xml index 4a76383083..6fb11aaa57 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/netflix-plugins/spring-cloud-feign-1.x-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking netflix-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-spring-cloud-feign-1.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/pom.xml index 19d050291c..d1f4409bce 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking spring-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT spring-cloud diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/spring-cloud-feign-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/spring-cloud-feign-2.x-plugin/pom.xml index bd7a6d2f3f..579c404b7a 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/spring-cloud-feign-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-cloud/spring-cloud-feign-2.x-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking spring-cloud - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-spring-cloud-feign-2.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-commons/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-commons/pom.xml index 7e1ff15179..ff67ee32df 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-commons/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-commons/pom.xml @@ -20,7 +20,7 @@ spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-1.x-plugin/pom.xml index a8afa0c54a..d8bf75bf9e 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-1.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking spring-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-spring-kafka-1.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-2.x-plugin/pom.xml index 267f56a506..2cff5cf300 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-kafka-2.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking spring-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-spring-kafka-2.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-5.x-webclient-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-5.x-webclient-plugin/pom.xml index 2c818ab342..1a3cfbfeb7 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-5.x-webclient-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-5.x-webclient-plugin/pom.xml @@ -21,7 +21,7 @@ spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-6.x-webclient-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-6.x-webclient-plugin/pom.xml index 6d50169112..6f67c4b024 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-6.x-webclient-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-webflux-6.x-webclient-plugin/pom.xml @@ -21,7 +21,7 @@ spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/spymemcached-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spymemcached-2.x-plugin/pom.xml index 4eda0fae4c..1b123e2207 100644 --- a/apm-sniffer/apm-sdk-plugin/spymemcached-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spymemcached-2.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-spymemcached-2.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/pom.xml index 9e164a9477..eb3e342fd3 100644 --- a/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/struts2-2.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/thrift-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/thrift-plugin/pom.xml index c481a809ef..dc51e01a99 100644 --- a/apm-sniffer/apm-sdk-plugin/thrift-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/thrift-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/tomcat-10x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/tomcat-10x-plugin/pom.xml index ca896b0cef..62896f4b61 100644 --- a/apm-sniffer/apm-sdk-plugin/tomcat-10x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/tomcat-10x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/pom.xml index 7307cd3f9a..0763bcca65 100644 --- a/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/tomcat-7.x-8.x-plugin/pom.xml @@ -20,7 +20,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/tomcat-thread-pool-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/tomcat-thread-pool-plugin/pom.xml index 7c5eb5597b..2007b9711e 100644 --- a/apm-sniffer/apm-sdk-plugin/tomcat-thread-pool-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/tomcat-thread-pool-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/undertow-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/undertow-plugins/pom.xml index 10a4132bfd..14d23e7692 100644 --- a/apm-sniffer/apm-sdk-plugin/undertow-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/undertow-plugins/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT undertow-plugins diff --git a/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/pom.xml index 952be80876..8b722364c6 100644 --- a/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/undertow-plugins/undertow-2.x-plugin/pom.xml @@ -20,7 +20,7 @@ undertow-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/undertow-worker-thread-pool-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/undertow-worker-thread-pool-plugin/pom.xml index a46b602982..aed38b73f1 100644 --- a/apm-sniffer/apm-sdk-plugin/undertow-worker-thread-pool-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/undertow-worker-thread-pool-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/vertx-plugins/pom.xml b/apm-sniffer/apm-sdk-plugin/vertx-plugins/pom.xml index a33ebb009e..a7f441800d 100644 --- a/apm-sniffer/apm-sdk-plugin/vertx-plugins/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/vertx-plugins/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT vertx-plugins diff --git a/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-3.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-3.x-plugin/pom.xml index 1a33046229..b1d89698a5 100644 --- a/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-3.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-3.x-plugin/pom.xml @@ -20,7 +20,7 @@ vertx-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-4.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-4.x-plugin/pom.xml index 981b6bdd3d..9e21fe716a 100644 --- a/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-4.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/vertx-plugins/vertx-core-4.x-plugin/pom.xml @@ -20,7 +20,7 @@ vertx-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/websphere-liberty-23.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/websphere-liberty-23.x-plugin/pom.xml index 4d1971ea07..7795fd9659 100644 --- a/apm-sniffer/apm-sdk-plugin/websphere-liberty-23.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/websphere-liberty-23.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-sdk-plugin/xmemcached-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/xmemcached-2.x-plugin/pom.xml index fa896a48e2..35876e8aff 100644 --- a/apm-sniffer/apm-sdk-plugin/xmemcached-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/xmemcached-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking apm-sdk-plugin - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-xmemcached-2.x-plugin diff --git a/apm-sniffer/apm-sdk-plugin/xxl-job-2.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/xxl-job-2.x-plugin/pom.xml index 5566ea223c..da1409f18d 100644 --- a/apm-sniffer/apm-sdk-plugin/xxl-job-2.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/xxl-job-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ apm-sdk-plugin org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-test-tools/pom.xml b/apm-sniffer/apm-test-tools/pom.xml index 8b406e428e..9dd0f43cb3 100644 --- a/apm-sniffer/apm-test-tools/pom.xml +++ b/apm-sniffer/apm-test-tools/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking java-agent-sniffer - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-test-tools diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-kafka-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-kafka-activation/pom.xml index c14b96205e..a914b8d528 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-kafka-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-kafka-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-1.x-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-1.x-activation/pom.xml index b3a5651b21..86e57d28bb 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-1.x-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-1.x-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-2.x-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-2.x-activation/pom.xml index 747d520d74..5e1a0fb598 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-2.x-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-log4j-2.x-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/pom.xml index 75b3b31866..341faac073 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-logback-1.x-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-logging-common/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-logging-common/pom.xml index 57033d5b09..ae19d88816 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-logging-common/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-logging-common/pom.xml @@ -20,7 +20,7 @@ apm-toolkit-activation org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-meter-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-meter-activation/pom.xml index c04acb613b..4d260f63e5 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-meter-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-meter-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/pom.xml index fb6e91be34..7e9c7d103f 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-micrometer-activation/pom.xml @@ -20,7 +20,7 @@ apm-toolkit-activation org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-opentracing-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-opentracing-activation/pom.xml index a260c73ed8..05dc1b4ac9 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-opentracing-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-opentracing-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/pom.xml index e0d378caea..f93d0a3397 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-trace-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/apm-toolkit-webflux-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/apm-toolkit-webflux-activation/pom.xml index b82def92b1..d8832e24f5 100644 --- a/apm-sniffer/apm-toolkit-activation/apm-toolkit-webflux-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/apm-toolkit-webflux-activation/pom.xml @@ -21,7 +21,7 @@ apm-toolkit-activation org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/apm-toolkit-activation/pom.xml b/apm-sniffer/apm-toolkit-activation/pom.xml index 09206213e1..f6e3b542c5 100644 --- a/apm-sniffer/apm-toolkit-activation/pom.xml +++ b/apm-sniffer/apm-toolkit-activation/pom.xml @@ -21,7 +21,7 @@ java-agent-sniffer org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 pom diff --git a/apm-sniffer/bootstrap-plugins/jdk-forkjoinpool-plugin/pom.xml b/apm-sniffer/bootstrap-plugins/jdk-forkjoinpool-plugin/pom.xml index 94de5b8c2a..5de97c5a33 100644 --- a/apm-sniffer/bootstrap-plugins/jdk-forkjoinpool-plugin/pom.xml +++ b/apm-sniffer/bootstrap-plugins/jdk-forkjoinpool-plugin/pom.xml @@ -20,7 +20,7 @@ org.apache.skywalking bootstrap-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/bootstrap-plugins/jdk-http-plugin/pom.xml b/apm-sniffer/bootstrap-plugins/jdk-http-plugin/pom.xml index 8bfa622165..1692e684a6 100755 --- a/apm-sniffer/bootstrap-plugins/jdk-http-plugin/pom.xml +++ b/apm-sniffer/bootstrap-plugins/jdk-http-plugin/pom.xml @@ -20,7 +20,7 @@ org.apache.skywalking bootstrap-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 @@ -33,7 +33,7 @@ UTF-8 - + diff --git a/apm-sniffer/bootstrap-plugins/jdk-httpclient-plugin/pom.xml b/apm-sniffer/bootstrap-plugins/jdk-httpclient-plugin/pom.xml index 88a0f72a99..f537f685e6 100644 --- a/apm-sniffer/bootstrap-plugins/jdk-httpclient-plugin/pom.xml +++ b/apm-sniffer/bootstrap-plugins/jdk-httpclient-plugin/pom.xml @@ -20,7 +20,7 @@ bootstrap-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/bootstrap-plugins/jdk-threading-plugin/pom.xml b/apm-sniffer/bootstrap-plugins/jdk-threading-plugin/pom.xml index 6bed3de12b..33dd7a3b4d 100755 --- a/apm-sniffer/bootstrap-plugins/jdk-threading-plugin/pom.xml +++ b/apm-sniffer/bootstrap-plugins/jdk-threading-plugin/pom.xml @@ -20,7 +20,7 @@ org.apache.skywalking bootstrap-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/bootstrap-plugins/jdk-threadpool-plugin/pom.xml b/apm-sniffer/bootstrap-plugins/jdk-threadpool-plugin/pom.xml index ca7eb8cac7..3da184c381 100644 --- a/apm-sniffer/bootstrap-plugins/jdk-threadpool-plugin/pom.xml +++ b/apm-sniffer/bootstrap-plugins/jdk-threadpool-plugin/pom.xml @@ -20,7 +20,7 @@ bootstrap-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/bootstrap-plugins/jdk-virtual-thread-executor-plugin/pom.xml b/apm-sniffer/bootstrap-plugins/jdk-virtual-thread-executor-plugin/pom.xml index 67766ef3eb..9a3eee820f 100644 --- a/apm-sniffer/bootstrap-plugins/jdk-virtual-thread-executor-plugin/pom.xml +++ b/apm-sniffer/bootstrap-plugins/jdk-virtual-thread-executor-plugin/pom.xml @@ -20,7 +20,7 @@ bootstrap-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/bootstrap-plugins/pom.xml b/apm-sniffer/bootstrap-plugins/pom.xml index cf1285cc07..fe3bf24930 100644 --- a/apm-sniffer/bootstrap-plugins/pom.xml +++ b/apm-sniffer/bootstrap-plugins/pom.xml @@ -21,7 +21,7 @@ java-agent-sniffer org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/bytebuddy-patch/pom.xml b/apm-sniffer/bytebuddy-patch/pom.xml index 60b20cffe9..460631dfc3 100644 --- a/apm-sniffer/bytebuddy-patch/pom.xml +++ b/apm-sniffer/bytebuddy-patch/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking java-agent-sniffer - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/expired-plugins/impala-jdbc-2.6.x-plugin/pom.xml b/apm-sniffer/expired-plugins/impala-jdbc-2.6.x-plugin/pom.xml index 5ac2465450..5dfd4ed7ab 100644 --- a/apm-sniffer/expired-plugins/impala-jdbc-2.6.x-plugin/pom.xml +++ b/apm-sniffer/expired-plugins/impala-jdbc-2.6.x-plugin/pom.xml @@ -24,7 +24,7 @@ org.apache.skywalking expired-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-impala-jdbc-2.6.x-plugin diff --git a/apm-sniffer/expired-plugins/pom.xml b/apm-sniffer/expired-plugins/pom.xml index f33497cec5..4385464c61 100644 --- a/apm-sniffer/expired-plugins/pom.xml +++ b/apm-sniffer/expired-plugins/pom.xml @@ -21,7 +21,7 @@ java-agent-sniffer org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/caffeine-3.x-plugin/pom.xml b/apm-sniffer/optional-plugins/caffeine-3.x-plugin/pom.xml index 8428e0e60e..89d8d96b65 100644 --- a/apm-sniffer/optional-plugins/caffeine-3.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/caffeine-3.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking optional-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-caffeine-3.x-plugin diff --git a/apm-sniffer/optional-plugins/customize-enhance-plugin/pom.xml b/apm-sniffer/optional-plugins/customize-enhance-plugin/pom.xml index 14fc75ee0e..fb100e0d94 100644 --- a/apm-sniffer/optional-plugins/customize-enhance-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/customize-enhance-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking optional-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/ehcache-2.x-plugin/pom.xml b/apm-sniffer/optional-plugins/ehcache-2.x-plugin/pom.xml index 9dea5174c9..60906ea1df 100644 --- a/apm-sniffer/optional-plugins/ehcache-2.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/ehcache-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking optional-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/fastjson-1.2.x-plugin/pom.xml b/apm-sniffer/optional-plugins/fastjson-1.2.x-plugin/pom.xml index 630524d970..fd47548245 100644 --- a/apm-sniffer/optional-plugins/fastjson-1.2.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/fastjson-1.2.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking optional-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-fastjson-1.x-plugin diff --git a/apm-sniffer/optional-plugins/gson-2.8.x-plugin/pom.xml b/apm-sniffer/optional-plugins/gson-2.8.x-plugin/pom.xml index f45e92d2f5..3cacbd71f0 100644 --- a/apm-sniffer/optional-plugins/gson-2.8.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/gson-2.8.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking optional-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-gson-2.x-plugin diff --git a/apm-sniffer/optional-plugins/guava-cache-plugin/pom.xml b/apm-sniffer/optional-plugins/guava-cache-plugin/pom.xml index e32c47ce81..4b678e32ed 100644 --- a/apm-sniffer/optional-plugins/guava-cache-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/guava-cache-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking optional-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-guava-cache-plugin diff --git a/apm-sniffer/optional-plugins/jackson-2.x-plugin/pom.xml b/apm-sniffer/optional-plugins/jackson-2.x-plugin/pom.xml index 1b1d26a818..6cc5017d9c 100644 --- a/apm-sniffer/optional-plugins/jackson-2.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/jackson-2.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking optional-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-jackson-2.x-plugin diff --git a/apm-sniffer/optional-plugins/kotlin-coroutine-plugin/pom.xml b/apm-sniffer/optional-plugins/kotlin-coroutine-plugin/pom.xml index 0f55f43e47..ab831b6c1b 100644 --- a/apm-sniffer/optional-plugins/kotlin-coroutine-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/kotlin-coroutine-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking optional-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-kotlin-coroutine-plugin diff --git a/apm-sniffer/optional-plugins/mybatis-3.x-plugin/pom.xml b/apm-sniffer/optional-plugins/mybatis-3.x-plugin/pom.xml index 84ba662bcf..7da71f0c1c 100644 --- a/apm-sniffer/optional-plugins/mybatis-3.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/mybatis-3.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking optional-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-mybatis-3.x-plugin diff --git a/apm-sniffer/optional-plugins/nacos-client-2.x-plugin/pom.xml b/apm-sniffer/optional-plugins/nacos-client-2.x-plugin/pom.xml index acbd852ce7..7f5ea9441e 100644 --- a/apm-sniffer/optional-plugins/nacos-client-2.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/nacos-client-2.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking optional-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/netty-http-4.1.x-plugin/pom.xml b/apm-sniffer/optional-plugins/netty-http-4.1.x-plugin/pom.xml index daeacb30d2..b8313a57c7 100644 --- a/apm-sniffer/optional-plugins/netty-http-4.1.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/netty-http-4.1.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking optional-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/mvc-annotation-6.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/mvc-annotation-6.x-plugin/pom.xml index b7f5b84a75..a2399d0bc6 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/mvc-annotation-6.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/mvc-annotation-6.x-plugin/pom.xml @@ -19,7 +19,7 @@ optional-spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.0.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.0.x-plugin/pom.xml index b798e59499..b2963c4c23 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.0.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.0.x-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking optional-spring-cloud - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-spring-cloud-gateway-2.0.x-plugin diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.1.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.1.x-plugin/pom.xml index e5b6e7e100..c9a0dfb040 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.1.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-2.1.x-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking optional-spring-cloud - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-spring-cloud-gateway-2.1.x-plugin diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-3.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-3.x-plugin/pom.xml index 5bfe88aef2..33180c560c 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-3.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-3.x-plugin/pom.xml @@ -21,7 +21,7 @@ optional-spring-cloud org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-4.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-4.x-plugin/pom.xml index d890c84e7c..bcd6ffcca4 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-4.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/gateway-4.x-plugin/pom.xml @@ -21,7 +21,7 @@ optional-spring-cloud org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/pom.xml index 281fb79f0e..8e5547689c 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/optional-spring-cloud/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking optional-spring-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT optional-spring-cloud diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/pom.xml index 344126cd75..3b34789ab4 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/pom.xml @@ -21,7 +21,7 @@ optional-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 pom diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/resttemplate-6.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/resttemplate-6.x-plugin/pom.xml index 18d0a3037c..8fc5797da0 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/resttemplate-6.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/resttemplate-6.x-plugin/pom.xml @@ -20,7 +20,7 @@ optional-spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-annotation-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-annotation-plugin/pom.xml index e943d2451c..367a58c61b 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-annotation-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-annotation-plugin/pom.xml @@ -21,7 +21,7 @@ optional-spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 jar diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-tx-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-tx-plugin/pom.xml index f03fd451c0..74f0694de2 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-tx-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-tx-plugin/pom.xml @@ -21,7 +21,7 @@ optional-spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 jar diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-5.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-5.x-plugin/pom.xml index 2ef8246634..e597375432 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-5.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-5.x-plugin/pom.xml @@ -21,7 +21,7 @@ optional-spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-6.x-plugin/pom.xml b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-6.x-plugin/pom.xml index ca9e22a8d0..98c5f9bc71 100644 --- a/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-6.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/optional-spring-plugins/spring-webflux-6.x-plugin/pom.xml @@ -21,7 +21,7 @@ optional-spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/pom.xml b/apm-sniffer/optional-plugins/pom.xml index 143a79f94b..c1d0d8adb7 100644 --- a/apm-sniffer/optional-plugins/pom.xml +++ b/apm-sniffer/optional-plugins/pom.xml @@ -21,7 +21,7 @@ java-agent-sniffer org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/quartz-scheduler-2.x-plugin/pom.xml b/apm-sniffer/optional-plugins/quartz-scheduler-2.x-plugin/pom.xml index ab9894e133..acc3b85a35 100644 --- a/apm-sniffer/optional-plugins/quartz-scheduler-2.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/quartz-scheduler-2.x-plugin/pom.xml @@ -23,7 +23,7 @@ org.apache.skywalking optional-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-quartz-scheduler-2.x-plugin diff --git a/apm-sniffer/optional-plugins/sentinel-1.x-plugin/pom.xml b/apm-sniffer/optional-plugins/sentinel-1.x-plugin/pom.xml index c3c4a2f162..fd4abb4af5 100644 --- a/apm-sniffer/optional-plugins/sentinel-1.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/sentinel-1.x-plugin/pom.xml @@ -21,7 +21,7 @@ org.apache.skywalking optional-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/shenyu-2.4.x-plugin/pom.xml b/apm-sniffer/optional-plugins/shenyu-2.4.x-plugin/pom.xml index 10f4d208fa..7f712e7582 100644 --- a/apm-sniffer/optional-plugins/shenyu-2.4.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/shenyu-2.4.x-plugin/pom.xml @@ -21,7 +21,7 @@ optional-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/trace-ignore-plugin/pom.xml b/apm-sniffer/optional-plugins/trace-ignore-plugin/pom.xml index 32d5002b57..ec9d193fc6 100644 --- a/apm-sniffer/optional-plugins/trace-ignore-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/trace-ignore-plugin/pom.xml @@ -20,7 +20,7 @@ optional-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/trace-sampler-cpu-policy-plugin/pom.xml b/apm-sniffer/optional-plugins/trace-sampler-cpu-policy-plugin/pom.xml index b2dfdfdfe9..cc4f683ed6 100644 --- a/apm-sniffer/optional-plugins/trace-sampler-cpu-policy-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/trace-sampler-cpu-policy-plugin/pom.xml @@ -20,7 +20,7 @@ optional-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-plugins/zookeeper-3.4.x-plugin/pom.xml b/apm-sniffer/optional-plugins/zookeeper-3.4.x-plugin/pom.xml index 723e675445..530f490fd5 100644 --- a/apm-sniffer/optional-plugins/zookeeper-3.4.x-plugin/pom.xml +++ b/apm-sniffer/optional-plugins/zookeeper-3.4.x-plugin/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking optional-plugins - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT apm-zookeeper-3.4.x-plugin diff --git a/apm-sniffer/optional-reporter-plugins/kafka-config-extension/pom.xml b/apm-sniffer/optional-reporter-plugins/kafka-config-extension/pom.xml index 15026e49df..52374f2631 100644 --- a/apm-sniffer/optional-reporter-plugins/kafka-config-extension/pom.xml +++ b/apm-sniffer/optional-reporter-plugins/kafka-config-extension/pom.xml @@ -20,7 +20,7 @@ optional-reporter-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-reporter-plugins/kafka-reporter-plugin/pom.xml b/apm-sniffer/optional-reporter-plugins/kafka-reporter-plugin/pom.xml index 99b9cf3679..127e923448 100644 --- a/apm-sniffer/optional-reporter-plugins/kafka-reporter-plugin/pom.xml +++ b/apm-sniffer/optional-reporter-plugins/kafka-reporter-plugin/pom.xml @@ -21,7 +21,7 @@ optional-reporter-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/optional-reporter-plugins/pom.xml b/apm-sniffer/optional-reporter-plugins/pom.xml index 260ddc308b..13b9fc86f7 100644 --- a/apm-sniffer/optional-reporter-plugins/pom.xml +++ b/apm-sniffer/optional-reporter-plugins/pom.xml @@ -21,7 +21,7 @@ java-agent-sniffer org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/apm-sniffer/pom.xml b/apm-sniffer/pom.xml index 4cb926b474..94ea5a16bd 100644 --- a/apm-sniffer/pom.xml +++ b/apm-sniffer/pom.xml @@ -21,7 +21,7 @@ java-agent org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 diff --git a/changes/changes-9.6.0.md b/changes/changes-9.6.0.md new file mode 100644 index 0000000000..74a4739aaa --- /dev/null +++ b/changes/changes-9.6.0.md @@ -0,0 +1,33 @@ +Changes by Version +================== +Release Notes. + +9.6.0 +------------------ + +* Add CLAUDE.md for AI assistant guidance. +* Bump up agent-oap protocol to latest(16c51358ebcf42629bf4ffdf952253971f20eb25). +* Bump up gRPC to v1.74.0. +* Bump up netty to v4.1.124.Final. +* Bump up GSON to v2.13.1. +* Bump up guava to v32.1.3. +* Bump up oap to the 10.3-dev.latest(dc8740d4757b35374283c4850a9a080e40f0eb79) in e2e. +* Bump up cli to the 0.15.0-dev.latest(77b4c49e89c9c000278f44e62729d534f2ec842e) in e2e. +* Bump up apache parent pom to v35. +* Update Maven to 3.6.3 in mvnw. +* Fix OOM due to too many span logs. +* Fix ClassLoader cache OOM issue with WeakHashMap. +* Fix Jetty client cannot receive the HTTP response body. +* Eliminate repeated code with HttpServletRequestWrapper in mvc-annotation-commons. +* Add the jdk httpclient plugin. +* Fix Gateway 2.0.x plugin not activated for spring-cloud-starter-gateway 2.0.0.RELEASE. +* Support kafka-clients-3.9.x intercept. +* Upgrade kafka-clients version in optional-reporter-plugins to 3.9.1. +* Fix AbstractLogger replaceParam when the replaced string contains a replacement marker. +* Fix `JDBCPluginConfig.Plugin.JDBC.SQL_BODY_MAX_LENGTH` was not working in some plugins. +* Bump up Lombok to v1.18.42 to adopt JDK25 compiling. +* Add `eclipse-temurin:25-jre` as another base image. +* Add JDK25 plugin tests for Spring 6. +* Ignore classes starting with "sun.nio.cs" in bytebuddy due to potential class loading deadlock. + +All issues and pull requests are [here](https://github.com/apache/skywalking/milestone/242?closed=1) diff --git a/pom.xml b/pom.xml index 6077be71f5..b675688a4a 100755 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ org.apache.skywalking java-agent - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT org.apache diff --git a/test/plugin/containers/jvm-container/src/main/docker/run.sh b/test/plugin/containers/jvm-container/src/main/docker/run.sh index 9d1327c621..3a70fe4930 100644 --- a/test/plugin/containers/jvm-container/src/main/docker/run.sh +++ b/test/plugin/containers/jvm-container/src/main/docker/run.sh @@ -24,7 +24,10 @@ exitOnError() { } exitAndClean() { - [[ -n $DEBUG_MODE ]] && exit $1; + if [[ -n $DEBUG_MODE ]]; then + chmod -R a+r ${SCENARIO_HOME} 2>/dev/null + exit $1 + fi [[ -f ${SCENARIO_HOME}/data/actualData.yaml ]] && rm -rf ${SCENARIO_HOME}/data/actualData.yaml [[ -d ${LOGS_HOME} ]] && rm -rf ${LOGS_HOME} @@ -84,7 +87,7 @@ export agent_opts=" -Dskywalking.meter.report_interval=1 -Xms256m -Xmx256m ${agent_opts}" -bash /var/run/${SCENARIO_NAME}/${SCENARIO_START_SCRIPT} 1>${LOGS_HOME}/scenario.out & +bash /var/run/${SCENARIO_NAME}/${SCENARIO_START_SCRIPT} >${LOGS_HOME}/scenario.out 2>&1 & sleep 5 healthCheck ${SCENARIO_HEALTH_CHECK_URL} diff --git a/test/plugin/runner-helper/src/main/resources/compose-start-script.template b/test/plugin/runner-helper/src/main/resources/compose-start-script.template index 3ef6a15466..c94e415bf2 100644 --- a/test/plugin/runner-helper/src/main/resources/compose-start-script.template +++ b/test/plugin/runner-helper/src/main/resources/compose-start-script.template @@ -26,16 +26,47 @@ docker_container_name="${docker_container_name}_1" <#noparse> container_name="${project_name}_${docker_container_name}" -docker compose -p ${project_name} -f ${compose_file} up -d + +# Diagnostic: log docker compose version +docker compose version >&2 || true + +echo "=== Starting docker compose ===" >&2 +compose_output=$(docker compose -p ${project_name} -f ${compose_file} up -d 2>&1) +compose_exit=$? +echo "${compose_output}" >&2 +if [[ ${compose_exit} -ne 0 ]]; then + echo "docker compose up exited with code ${compose_exit}" >&2 +fi container_id=`docker ps -qf "name=${container_name}"` if [[ -z "${container_id}" ]]; then - echo "docker startup failure!" >&2 + echo "docker startup failure! container_name=${container_name} not found." >&2 + echo "=== docker ps -a ===" >&2 + docker ps -a >&2 || true + echo "=== docker compose logs ===" >&2 + docker compose -p ${project_name} -f ${compose_file} logs 2>&1 >&2 || true + # Create container.log with diagnostic info + mkdir -p ${SCENARIO_HOME}/logs + { + echo "=== CONTAINER STARTUP FAILURE ===" + echo "container_name=${container_name} was not found by docker ps" + echo "compose_exit_code=${compose_exit}" + echo "compose_output:" + echo "${compose_output}" + echo "=== docker ps -a ===" + docker ps -a 2>&1 || true + echo "=== docker compose logs ===" + docker compose -p ${project_name} -f ${compose_file} logs 2>&1 || true + } >${SCENARIO_HOME}/logs/container.log + docker compose -p ${project_name} -f ${compose_file} kill 2>/dev/null || true + docker compose -p ${project_name} -f ${compose_file} rm -f 2>/dev/null || true status=1 else status=`docker wait ${container_id}` [[ $status -ne 0 ]] && docker logs ${container_id} >&2 + # Recreate logs dir in case the container removed it via volume mount + mkdir -p ${SCENARIO_HOME}/logs docker logs ${container_id} >${SCENARIO_HOME}/logs/container.log docker compose -p ${project_name} -f ${compose_file} kill diff --git a/test/plugin/runner-helper/src/main/resources/container-start-script.template b/test/plugin/runner-helper/src/main/resources/container-start-script.template index 0f072afdf1..97ee284649 100644 --- a/test/plugin/runner-helper/src/main/resources/container-start-script.template +++ b/test/plugin/runner-helper/src/main/resources/container-start-script.template @@ -47,13 +47,25 @@ sleep 3 container_name=`docker ps -aqf "name=${docker_container_name}"` <#noparse> -status=$(docker wait ${container_name}) - if [[ -z ${container_name} ]]; then echo "docker startup failure!" >&2 + echo "=== docker ps -a ===" >&2 + docker ps -a >&2 || true + # Create container.log with diagnostic info + mkdir -p ${SCENARIO_HOME}/logs + { + echo "=== CONTAINER STARTUP FAILURE ===" + echo "Container not found by docker ps" + echo "=== docker ps -a ===" + docker ps -a 2>&1 || true + } >${SCENARIO_HOME}/logs/container.log status=1 else + status=$(docker wait ${container_name}) + [[ $status -ne 0 ]] && docker logs ${container_name} >&2 + # Recreate logs dir in case the container removed it via volume mount + mkdir -p ${SCENARIO_HOME}/logs docker logs ${container_name} >${SCENARIO_HOME}/logs/container.log docker container rm -f $container_name fi diff --git a/test/plugin/scenarios/elasticsearch-7.x-scenario/configuration.yml b/test/plugin/scenarios/elasticsearch-7.x-scenario/configuration.yml index 853e67498e..aa43501041 100644 --- a/test/plugin/scenarios/elasticsearch-7.x-scenario/configuration.yml +++ b/test/plugin/scenarios/elasticsearch-7.x-scenario/configuration.yml @@ -22,7 +22,7 @@ environment: - elasticsearch.server=elasticsearch-server-7.x:9200 dependencies: elasticsearch-server-7.x: - image: elasticsearch:${CASE_SERVER_IMAGE_VERSION} + image: docker.elastic.co/elasticsearch/elasticsearch:${CASE_SERVER_IMAGE_VERSION} hostname: elasticsearch-server-7.x removeOnExit: true expose: @@ -30,6 +30,5 @@ dependencies: environment: - cluster.name=docker-node - xpack.security.enabled=false - - bootstrap.memory_lock=true - - "ES_JAVA_OPTS=-Xms256m -Xmx256m" + - "ES_JAVA_OPTS=-Xms512m -Xmx512m" - discovery.type=single-node diff --git a/test/plugin/scenarios/elasticsearch-7.x-scenario/support-version.list b/test/plugin/scenarios/elasticsearch-7.x-scenario/support-version.list index d5108d7a3c..e5b98548c6 100644 --- a/test/plugin/scenarios/elasticsearch-7.x-scenario/support-version.list +++ b/test/plugin/scenarios/elasticsearch-7.x-scenario/support-version.list @@ -27,5 +27,4 @@ 7.12.1 7.13.4 7.14.2 -7.16.3 7.17.21 \ No newline at end of file diff --git a/test/plugin/scenarios/elasticsearch-rest-high-level-6.x-scenario/configuration.yml b/test/plugin/scenarios/elasticsearch-rest-high-level-6.x-scenario/configuration.yml index bab1c5a875..72c856d395 100644 --- a/test/plugin/scenarios/elasticsearch-rest-high-level-6.x-scenario/configuration.yml +++ b/test/plugin/scenarios/elasticsearch-rest-high-level-6.x-scenario/configuration.yml @@ -20,7 +20,7 @@ environment: - elasticsearch.server=elasticsearch-server-6.x:9200 dependencies: elasticsearch-server-6.x: - image: elasticsearch:${CASE_SERVER_IMAGE_VERSION} + image: docker.elastic.co/elasticsearch/elasticsearch:${CASE_SERVER_IMAGE_VERSION} hostname: elasticsearch-server-6.x removeOnExit: true expose: diff --git a/test/plugin/scenarios/rocketmq-5-grpc-scenario/pom.xml b/test/plugin/scenarios/rocketmq-5-grpc-scenario/pom.xml index d27b6488b1..018ce5430e 100644 --- a/test/plugin/scenarios/rocketmq-5-grpc-scenario/pom.xml +++ b/test/plugin/scenarios/rocketmq-5-grpc-scenario/pom.xml @@ -34,7 +34,7 @@ 1.8 3.8.1 5.0.5 - 5.1.1 + 5.1.4 2.1.6.RELEASE 1.18.20 diff --git a/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/CaseController.java b/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/CaseController.java index 5219bc8db9..313389913e 100644 --- a/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/CaseController.java +++ b/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/CaseController.java @@ -48,35 +48,27 @@ public class CaseController { @Autowired private MessageService messageService; + private volatile boolean consumerStarted = false; + @RequestMapping("/rocketmq-5-grpc-scenario") @ResponseBody public String testcase() { try { messageService.sendNormalMessage(NORMAL_TOPIC, TAG_NOMARL, GROUP); - Thread t1 = new Thread(() -> messageService.pushConsumes( - Collections.singletonList(NORMAL_TOPIC), - Collections.singletonList(TAG_NOMARL), - GROUP - )); - t1.start(); - t1.join(); messageService.sendNormalMessageAsync(ASYNC_PRODUCER_TOPIC, TAG_ASYNC_PRODUCER, GROUP); messageService.sendNormalMessageAsync(ASYNC_PRODUCER_TOPIC, TAG_ASYNC_PRODUCER, GROUP); - Thread t2 = new Thread(() -> messageService.simpleConsumes(Collections.singletonList(ASYNC_PRODUCER_TOPIC), - Collections.singletonList(TAG_ASYNC_PRODUCER), GROUP, - 10, 10 - )); - t2.start(); - t2.join(); + new Thread(() -> messageService.simpleConsumes( + Collections.singletonList(ASYNC_PRODUCER_TOPIC), + Collections.singletonList(TAG_ASYNC_PRODUCER), GROUP, + 10, 10 + )).start(); messageService.sendNormalMessage(ASYNC_CONSUMER_TOPIC, TAG_ASYNC_CONSUMER, GROUP); messageService.sendNormalMessage(ASYNC_CONSUMER_TOPIC, TAG_ASYNC_CONSUMER, GROUP); - Thread t3 = new Thread(() -> messageService.simpleConsumeAsync(ASYNC_CONSUMER_TOPIC, TAG_ASYNC_CONSUMER, GROUP, 10, - 10 - )); - t3.start(); - t3.join(); + new Thread(() -> messageService.simpleConsumeAsync( + ASYNC_CONSUMER_TOPIC, TAG_ASYNC_CONSUMER, GROUP, 10, 10 + )).start(); } catch (Exception e) { log.error("testcase error", e); } @@ -86,11 +78,45 @@ public String testcase() { @RequestMapping("/healthCheck") @ResponseBody public String healthCheck() throws Exception { - System.setProperty(MixAll.ROCKETMQ_HOME_ENV, this.getClass().getResource("/").getPath()); - messageService.updateNormalTopic(NORMAL_TOPIC); - messageService.updateNormalTopic(ASYNC_PRODUCER_TOPIC); - messageService.updateNormalTopic(ASYNC_CONSUMER_TOPIC); - final Producer producer = ProducerSingleton.getInstance(endpoints, NORMAL_TOPIC); + if (!consumerStarted) { + // Set flag early to prevent re-entry from concurrent healthCheck + // requests (each curl has a 3s timeout, and initialization may + // take longer than that). + consumerStarted = true; + try { + System.setProperty(MixAll.ROCKETMQ_HOME_ENV, this.getClass().getResource("/").getPath()); + messageService.updateNormalTopic(NORMAL_TOPIC); + messageService.updateNormalTopic(ASYNC_PRODUCER_TOPIC); + messageService.updateNormalTopic(ASYNC_CONSUMER_TOPIC); + // Start push consumer early so it has time to receive messages + messageService.pushConsumes( + Collections.singletonList(NORMAL_TOPIC), + Collections.singletonList(TAG_NOMARL), + GROUP + ); + final Producer producer = ProducerSingleton.getInstance(endpoints, NORMAL_TOPIC); + // Send a probe message so the consumer has something to receive + messageService.sendNormalMessage(NORMAL_TOPIC, TAG_NOMARL, GROUP); + } catch (Exception e) { + consumerStarted = false; + throw e; + } + } + + // Wait until the consumer has actually received a probe message, + // confirming it can consume from the topic. + // Send a fresh probe on every retry so the consumer picks it up once + // rebalance finishes (messages sent before rebalance may never arrive). + if (!MessageService.CONSUMER_READY) { + try { + messageService.sendNormalMessage(NORMAL_TOPIC, TAG_NOMARL, GROUP); + System.out.printf("HealthCheck: sent probe message (consumer not ready yet).%n"); + } catch (Exception e) { + System.out.printf("HealthCheck: failed to send probe: %s%n", e.getMessage()); + } + throw new RuntimeException("Consumer has not received probe message yet"); + } + return SUCCESS; } } diff --git a/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/MessageService.java b/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/MessageService.java index f7d4dc3c9b..33b9bad539 100644 --- a/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/MessageService.java +++ b/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/client/java/controller/MessageService.java @@ -203,26 +203,23 @@ public void simpleConsumeAsync(String topic, maxMessageNum, invisibleDuration ); - future0.whenCompleteAsync((messages, throwable) -> { - if (null != throwable) { - log.error("Failed to receive message from remote", throwable); - return; - } + future0.thenComposeAsync(messages -> { log.info("Received {} message(s)", messages.size()); final Map> map = messages.stream().collect(Collectors.toMap(message -> message, consumer::ackAsync)); - for (Map.Entry> entry : map.entrySet()) { + List> ackFutures = map.entrySet().stream().map(entry -> { final MessageId messageId = entry.getKey().getMessageId(); final CompletableFuture future = entry.getValue(); - future.whenCompleteAsync((v, t) -> { + return future.whenCompleteAsync((v, t) -> { if (null != t) { log.error("Message is failed to be acknowledged, messageId={}", messageId, t); return; } log.info("Message is acknowledged successfully, messageId={}", messageId); }, ackCallbackExecutor); - } - }, receiveCallbackExecutor); + }).collect(Collectors.toList()); + return CompletableFuture.allOf(ackFutures.toArray(new CompletableFuture[0])); + }, receiveCallbackExecutor).join(); } catch (Exception e) { log.error("consumer start error", e); } @@ -243,6 +240,8 @@ public void updateNormalTopic(String topic) { MQAdminStartup.main(subArgs); } + public static volatile boolean CONSUMER_READY = false; + public static class MyConsumer implements MessageListener { @Override @@ -250,6 +249,7 @@ public ConsumeResult consume(MessageView messageView) { log.info("Consume message successfully, messageId={},messageBody={}", messageView.getMessageId(), messageView.getBody().toString() ); + CONSUMER_READY = true; return ConsumeResult.SUCCESS; } } diff --git a/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/resources/log4j2.xml b/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/resources/log4j2.xml index 9849ed5a8a..b16354bfa3 100644 --- a/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/resources/log4j2.xml +++ b/test/plugin/scenarios/rocketmq-5-grpc-scenario/src/main/resources/log4j2.xml @@ -23,7 +23,7 @@ - + diff --git a/test/plugin/scenarios/rocketmq-5-grpc-scenario/support-version.list b/test/plugin/scenarios/rocketmq-5-grpc-scenario/support-version.list index 4f8dd365dc..da0221c8c1 100644 --- a/test/plugin/scenarios/rocketmq-5-grpc-scenario/support-version.list +++ b/test/plugin/scenarios/rocketmq-5-grpc-scenario/support-version.list @@ -16,5 +16,4 @@ # lists your version here (Contains only the last version number of each minor version.) -5.1.1 5.1.4 diff --git a/test/plugin/scenarios/rocketmq-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/controller/CaseController.java b/test/plugin/scenarios/rocketmq-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/controller/CaseController.java index ab96fd6a7c..85d32069a5 100644 --- a/test/plugin/scenarios/rocketmq-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/controller/CaseController.java +++ b/test/plugin/scenarios/rocketmq-scenario/src/main/java/test/apache/skywalking/apm/testcase/rocketmq/controller/CaseController.java @@ -25,6 +25,7 @@ import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.client.producer.SendResult; +import org.apache.rocketmq.common.consumer.ConsumeFromWhere; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.common.message.MessageExt; import org.apache.rocketmq.remoting.common.RemotingHelper; @@ -47,17 +48,19 @@ public class CaseController { @Value("${name.server}") private String namerServer; + private volatile boolean consumerStarted = false; + private volatile boolean consumerReady = false; + private DefaultMQProducer probeProducer; + @RequestMapping("/rocketmq-scenario") @ResponseBody public String testcase() { try { - // start producer DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); producer.setNamesrvAddr(namerServer); producer.start(); System.out.printf("Provider Started.%n"); - // send msg Message msg = new Message("TopicTest", ("Hello RocketMQ sendMsg " + new Date()).getBytes(RemotingHelper.DEFAULT_CHARSET) ); @@ -65,30 +68,6 @@ public String testcase() { msg.setKeys("KeyA"); SendResult sendResult = producer.send(msg); System.out.printf("%s send msg: %s%n", new Date(), sendResult); - - // start consumer - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - try { - DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name"); - consumer.setNamesrvAddr(namerServer); - consumer.subscribe("TopicTest", "*"); - consumer.registerMessageListener(new MessageListenerConcurrently() { - @Override - public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { - System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), new String(msgs.get(0).getBody(), StandardCharsets.UTF_8)); - return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; - } - }); - consumer.start(); - System.out.printf("Consumer Started.%n"); - } catch (Exception e) { - log.error("consumer start error", e); - } - } - }); - thread.start(); } catch (Exception e) { log.error("testcase error", e); } @@ -98,11 +77,60 @@ public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeCo @RequestMapping("/healthCheck") @ResponseBody public String healthCheck() throws Exception { - // start producer - DefaultMQProducer producer = new DefaultMQProducer("healthCheck_please_rename_unique_group_name"); - producer.setNamesrvAddr(namerServer); - producer.start(); - System.out.printf("HealthCheck Provider Started.%n"); + if (!consumerStarted) { + // Set flag early to prevent re-entry from concurrent healthCheck + // requests (each curl has a 3s timeout, and initialization may + // take longer than that). + consumerStarted = true; + try { + // Speed up client-side rebalance from default 20s to 2s so the + // consumer discovers topic queues faster after startup. + System.setProperty("rocketmq.client.rebalance.waitInterval", "2000"); + + // Start a producer that stays alive to send probe messages on each retry. + probeProducer = new DefaultMQProducer("healthCheck_please_rename_unique_group_name"); + probeProducer.setNamesrvAddr(namerServer); + probeProducer.start(); + Message probeMsg = new Message("TopicTest", "probe".getBytes(StandardCharsets.UTF_8)); + probeProducer.send(probeMsg); + System.out.printf("HealthCheck: Topic created via probe message.%n"); + + // Start consumer after topic exists so rebalance finds queues immediately. + DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("please_rename_unique_group_name"); + consumer.setNamesrvAddr(namerServer); + consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET); + consumer.subscribe("TopicTest", "*"); + consumer.registerMessageListener(new MessageListenerConcurrently() { + @Override + public ConsumeConcurrentlyStatus consumeMessage(List msgs, ConsumeConcurrentlyContext context) { + System.out.printf("%s Receive New Messages: %s %n", Thread.currentThread().getName(), new String(msgs.get(0).getBody(), StandardCharsets.UTF_8)); + consumerReady = true; + return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; + } + }); + consumer.start(); + System.out.printf("Consumer Started.%n"); + } catch (Exception e) { + consumerStarted = false; + throw e; + } + } + + // Wait until the consumer has actually received a probe message, + // confirming rebalance is complete and it can consume from the topic. + // Send a fresh probe on every retry so the consumer picks it up once + // rebalance finishes (messages sent before rebalance may never arrive). + if (!consumerReady) { + try { + Message probeMsg = new Message("TopicTest", "probe".getBytes(StandardCharsets.UTF_8)); + probeProducer.send(probeMsg); + System.out.printf("HealthCheck: sent probe message (consumer not ready yet).%n"); + } catch (Exception e) { + System.out.printf("HealthCheck: failed to send probe: %s%n", e.getMessage()); + } + throw new RuntimeException("Consumer has not received probe message yet"); + } + return SUCCESS; } diff --git a/test/plugin/scenarios/rocketmq-scenario/src/main/resources/log4j2.xml b/test/plugin/scenarios/rocketmq-scenario/src/main/resources/log4j2.xml index 9849ed5a8a..b16354bfa3 100644 --- a/test/plugin/scenarios/rocketmq-scenario/src/main/resources/log4j2.xml +++ b/test/plugin/scenarios/rocketmq-scenario/src/main/resources/log4j2.xml @@ -23,7 +23,7 @@ - + diff --git a/test/plugin/scenarios/rocketmq-scenario/support-version.list b/test/plugin/scenarios/rocketmq-scenario/support-version.list index b391ea9d2a..7de5cb6f6d 100644 --- a/test/plugin/scenarios/rocketmq-scenario/support-version.list +++ b/test/plugin/scenarios/rocketmq-scenario/support-version.list @@ -16,7 +16,7 @@ # lists your version here (Contains only the last version number of each minor version.) -5.1.0 +5.1.4 4.9.4 4.8.0 4.7.1 From 4adfbbb90003c9d5b4db312d511c447665b9ab24 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Tue, 24 Feb 2026 11:06:47 +0800 Subject: [PATCH 41/48] fix --- .../apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml index a68d7170f2..b6ea5c9863 100644 --- a/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml +++ b/apm-sniffer/apm-sdk-plugin/spring-plugins/spring-ai-1.x-plugin/pom.xml @@ -21,7 +21,7 @@ spring-plugins org.apache.skywalking - 9.6.0-SNAPSHOT + 9.7.0-SNAPSHOT 4.0.0 From 13baa147f994002c32c008bd3d2af270a27480e3 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Tue, 24 Feb 2026 14:18:27 +0800 Subject: [PATCH 42/48] fix --- .../apm/plugin/spring/ai/v1/ChatModelStreamInterceptor.java | 1 - 1 file changed, 1 deletion(-) 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 831bd3810f..9abb852187 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 @@ -120,7 +120,6 @@ private void onStreamFinally(AbstractSpan span, Object[] allArguments, StreamSta if (finalResponse != null && finalResponse.getMetadata() != null) { ChatResponseMetadata metadata = finalResponse.getMetadata(); collectResponseTags(span, metadata, state); - collectUsageTags(span, metadata.getUsage()); totalTokens = collectUsageTags(span, metadata.getUsage()); } From 3eb47a2d9967ce3df2f27aab0b769eed7469fc28 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Tue, 24 Feb 2026 22:39:20 +0800 Subject: [PATCH 43/48] fix --- .github/workflows/plugins-test.2.yaml | 58 +++++++++---------- .../config/expectedData.yaml | 9 +-- .../httpclient/controller/CaseController.java | 4 +- .../controller/LLMMockController.java | 9 +-- 4 files changed, 38 insertions(+), 42 deletions(-) diff --git a/.github/workflows/plugins-test.2.yaml b/.github/workflows/plugins-test.2.yaml index 5fe28c244f..5b09d30eee 100644 --- a/.github/workflows/plugins-test.2.yaml +++ b/.github/workflows/plugins-test.2.yaml @@ -68,35 +68,35 @@ jobs: matrix: case: - okhttp-scenario - - play-scenario - - postgresql-scenario - - pulsar-scenario - - rabbitmq-scenario - - redisson-scenario - - resttemplate-4.x-scenario - - servicecomb-1.x-scenario - - servicecomb-2.x-scenario - - shardingsphere-3.x-scenario - - shardingsphere-4.0.x-scenario - - shardingsphere-4.x-scenario - - shardingsphere-5.0.0-scenario - - sofarpc-scenario - - solrj-7.x-scenario - - spring-3.0.x-scenario - - spring-cloud-feign-1.1.x-scenario - - spring-cloud-feign-1.2.x-scenario - - spring-cloud-feign-2.x-scenario - - spring-tx-scenario - - struts2.3-scenario - - struts2.5-scenario - - cxf-scenario - - okhttp2-scenario - - jersey-2.0.x-2.25.x-scenario - - jersey-2.26.x-2.39.x-scenario - - websphere-liberty-23.x-scenario - - nacos-client-2.x-scenario - - rocketmq-scenario - - rocketmq-5-grpc-scenario +# - play-scenario +# - postgresql-scenario +# - pulsar-scenario +# - rabbitmq-scenario +# - redisson-scenario +# - resttemplate-4.x-scenario +# - servicecomb-1.x-scenario +# - servicecomb-2.x-scenario +# - shardingsphere-3.x-scenario +# - shardingsphere-4.0.x-scenario +# - shardingsphere-4.x-scenario +# - shardingsphere-5.0.0-scenario +# - sofarpc-scenario +# - solrj-7.x-scenario +# - spring-3.0.x-scenario +# - spring-cloud-feign-1.1.x-scenario +# - spring-cloud-feign-1.2.x-scenario +# - spring-cloud-feign-2.x-scenario +# - spring-tx-scenario +# - struts2.3-scenario +# - struts2.5-scenario +# - cxf-scenario +# - okhttp2-scenario +# - jersey-2.0.x-2.25.x-scenario +# - jersey-2.26.x-2.39.x-scenario +# - websphere-liberty-23.x-scenario +# - nacos-client-2.x-scenario +# - rocketmq-scenario +# - rocketmq-5-grpc-scenario steps: - uses: actions/checkout@v2 with: diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index cdf8a6aecc..11af8caaeb 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -115,12 +115,13 @@ segmentItems: - { key: gen_ai.request.model, value: gpt-4.1-2025-04-14 } - { key: gen_ai.request.temperature, value: '0.7' } - { key: gen_ai.request.top_p, value: '0.9' } - - { key: gen_ai.response.id, value: 'chatcmpl-CyJXJt7gxwDgz' } + - { key: gen_ai.stream.ttfr, value: not null } + - { key: gen_ai.response.id, value: 'chatcmpl-fc1b64d3' } - { key: gen_ai.response.model, value: gpt-4.1-2025-04-14 } - - { key: gen_ai.usage.input_tokens, value: '52' } - - { key: gen_ai.usage.output_tokens, value: '17' } - - { key: gen_ai.client.token.usage, value: '69' } - { key: gen_ai.response.finish_reasons, value: STOP } + - { key: gen_ai.usage.input_tokens, value: '104' } + - { key: gen_ai.usage.output_tokens, value: '34' } + - { key: gen_ai.client.token.usage, value: '138' } - { key: gen_ai.input.messages, value: not null } - { key: gen_ai.output.messages, value: not null } diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java index d6512b726e..d939c16844 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java @@ -47,12 +47,12 @@ public String testCase() throws Exception { Do not use outside knowledge. Be concise. """; - chatClient + System.out.println(chatClient .prompt("What's the weather in New York?") .system(systemPrompt) .tools(weatherTool) .call() - .content(); + .content()); chatClient .prompt("What's the weather in New York?") diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java index 4f38d27913..5221245280 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/LLMMockController.java @@ -28,7 +28,6 @@ import java.io.IOException; import java.io.PrintWriter; import java.time.Instant; -import java.util.UUID; @RestController @RequestMapping("/llm") @@ -49,7 +48,7 @@ public Object completions(@RequestBody JSONObject request, HttpServletResponse r response.setHeader("Connection", "keep-alive"); PrintWriter writer = response.getWriter(); - String id = "chatcmpl-" + UUID.randomUUID(); + String id = "chatcmpl-fc1b64d3"; long created = Instant.now().getEpochSecond(); String model = "gpt-4.1-2025-04-14"; @@ -59,11 +58,7 @@ public Object completions(@RequestBody JSONObject request, HttpServletResponse r writeStreamChunk(writer, id, created, model, "{\"role\":\"assistant\"}", "null"); int len = fullContent.length(); - String[] parts = { - fullContent.substring(0, len / 3), - fullContent.substring(len / 3, len * 2 / 3), - fullContent.substring(len * 2 / 3) - }; + String[] parts = {fullContent.substring(0, len / 3), fullContent.substring(len / 3, len * 2 / 3), fullContent.substring(len * 2 / 3)}; for (String part : parts) { Thread.sleep(50); From 0b870f07410021658c9a522acc8b88b1819fbc6e Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Wed, 25 Feb 2026 09:48:53 +0800 Subject: [PATCH 44/48] fix --- .../testcase/jdk/httpclient/controller/CaseController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java index d939c16844..d6512b726e 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/src/main/java/test/apache/skywalking/apm/testcase/jdk/httpclient/controller/CaseController.java @@ -47,12 +47,12 @@ public String testCase() throws Exception { Do not use outside knowledge. Be concise. """; - System.out.println(chatClient + chatClient .prompt("What's the weather in New York?") .system(systemPrompt) .tools(weatherTool) .call() - .content()); + .content(); chatClient .prompt("What's the weather in New York?") From 947f751c753a24cd27a9f8c3a4e87646989c94c4 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Wed, 25 Feb 2026 15:38:36 +0800 Subject: [PATCH 45/48] fix --- .../scenarios/spring-ai-1.x-scenario/config/expectedData.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index 11af8caaeb..3d543ad27f 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -114,6 +114,7 @@ segmentItems: - { key: gen_ai.provider.name, value: openai } - { key: gen_ai.request.model, value: gpt-4.1-2025-04-14 } - { key: gen_ai.request.temperature, value: '0.7' } + - { key: gen_ai.request.top_k, value: null } - { key: gen_ai.request.top_p, value: '0.9' } - { key: gen_ai.stream.ttfr, value: not null } - { key: gen_ai.response.id, value: 'chatcmpl-fc1b64d3' } From 32d044e440f74994b1549cbeeb1d9aa40b250080 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Wed, 25 Feb 2026 17:20:50 +0800 Subject: [PATCH 46/48] fix --- apm-protocol/apm-network/src/main/proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apm-protocol/apm-network/src/main/proto b/apm-protocol/apm-network/src/main/proto index 16c51358eb..07882d57be 160000 --- a/apm-protocol/apm-network/src/main/proto +++ b/apm-protocol/apm-network/src/main/proto @@ -1 +1 @@ -Subproject commit 16c51358ebcf42629bf4ffdf952253971f20eb25 +Subproject commit 07882d57becb37e341f7fc492c11f9f5a5f311cf From 079a3898a2d9936bb4787aca48645028d42afb7f Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Wed, 25 Feb 2026 19:30:55 +0800 Subject: [PATCH 47/48] fix --- .../scenarios/spring-ai-1.x-scenario/config/expectedData.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index 3d543ad27f..161eb6e2f2 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -79,7 +79,7 @@ segmentItems: - operationName: Spring-ai/openai/call parentSpanId: 0 spanId: 1 - spanLayer: not null + spanLayer: GenAI startTime: not null endTime: not null componentId: 173 @@ -103,7 +103,7 @@ segmentItems: - operationName: Spring-ai/openai/stream parentSpanId: 0 spanId: 4 - spanLayer: not null + spanLayer: GenAI startTime: not null endTime: not null componentId: 173 From 91cfbe53561d8451d260f89cb6f1449bf939fce7 Mon Sep 17 00:00:00 2001 From: peachisai <2581009893@qq.com> Date: Wed, 25 Feb 2026 21:11:24 +0800 Subject: [PATCH 48/48] fix --- .github/workflows/plugins-test.0.yaml | 72 ++++++------ .github/workflows/plugins-test.2.yaml | 58 ++++----- .github/workflows/plugins-test.3.yaml | 110 +++++++++--------- .../config/expectedData.yaml | 4 +- .../support-version.list | 1 + 5 files changed, 123 insertions(+), 122 deletions(-) diff --git a/.github/workflows/plugins-test.0.yaml b/.github/workflows/plugins-test.0.yaml index 308cc71087..0c86b2e8ad 100644 --- a/.github/workflows/plugins-test.0.yaml +++ b/.github/workflows/plugins-test.0.yaml @@ -68,42 +68,42 @@ jobs: matrix: case: - activemq-scenario -# - agent-so11y-scenario -# - apm-toolkit-trace-scenario -# - apm-toolkit-tracer-scenario -# - armeria-0.96minus-scenario -# - armeria-0.96plus-scenario -# - avro-scenario -# - asynchttpclient-scenario -# - canal-scenario -# - cassandra-java-driver-3.x-scenario -# - customize-scenario -# - correlation-autotag-scenario -# - dubbo-2.5.x-scenario -# - dubbo-2.7.x-scenario -# - dubbo-3.x-scenario -# - ehcache-2.x-scenario -# - elasticsearch-5.x-scenario -# - elasticsearch-rest-high-level-6.x-scenario -# - elasticsearch-transport-6.x-scenario -# - elasticsearch-7.x-scenario -# - exception-checker-spring-scenario -# - exception-checker-tomcat-scenario -# - feign-scenario -# - finagle-17.10.x-scenario -# - finagle-6.44.x-scenario -# - gateway-2.1.x-scenario -# - gateway-2.0.x-scenario -# - grpc-scenario -# - grpc-1.59.x-1.70.x-scenario -# - grpc-1.30.x-1.39.x-scenario -# - gson-scenario -# - guava-cache-scenario -# - elasticjob-3.x-scenario -# - springmvc-reactive-scenario -# - springmvc-reactive-devtools-scenario -# - fastjson-scenario -# - jackson-scenario + - agent-so11y-scenario + - apm-toolkit-trace-scenario + - apm-toolkit-tracer-scenario + - armeria-0.96minus-scenario + - armeria-0.96plus-scenario + - avro-scenario + - asynchttpclient-scenario + - canal-scenario + - cassandra-java-driver-3.x-scenario + - customize-scenario + - correlation-autotag-scenario + - dubbo-2.5.x-scenario + - dubbo-2.7.x-scenario + - dubbo-3.x-scenario + - ehcache-2.x-scenario + - elasticsearch-5.x-scenario + - elasticsearch-rest-high-level-6.x-scenario + - elasticsearch-transport-6.x-scenario + - elasticsearch-7.x-scenario + - exception-checker-spring-scenario + - exception-checker-tomcat-scenario + - feign-scenario + - finagle-17.10.x-scenario + - finagle-6.44.x-scenario + - gateway-2.1.x-scenario + - gateway-2.0.x-scenario + - grpc-scenario + - grpc-1.59.x-1.70.x-scenario + - grpc-1.30.x-1.39.x-scenario + - gson-scenario + - guava-cache-scenario + - elasticjob-3.x-scenario + - springmvc-reactive-scenario + - springmvc-reactive-devtools-scenario + - fastjson-scenario + - jackson-scenario steps: - uses: actions/checkout@v2 with: diff --git a/.github/workflows/plugins-test.2.yaml b/.github/workflows/plugins-test.2.yaml index 5b09d30eee..5fe28c244f 100644 --- a/.github/workflows/plugins-test.2.yaml +++ b/.github/workflows/plugins-test.2.yaml @@ -68,35 +68,35 @@ jobs: matrix: case: - okhttp-scenario -# - play-scenario -# - postgresql-scenario -# - pulsar-scenario -# - rabbitmq-scenario -# - redisson-scenario -# - resttemplate-4.x-scenario -# - servicecomb-1.x-scenario -# - servicecomb-2.x-scenario -# - shardingsphere-3.x-scenario -# - shardingsphere-4.0.x-scenario -# - shardingsphere-4.x-scenario -# - shardingsphere-5.0.0-scenario -# - sofarpc-scenario -# - solrj-7.x-scenario -# - spring-3.0.x-scenario -# - spring-cloud-feign-1.1.x-scenario -# - spring-cloud-feign-1.2.x-scenario -# - spring-cloud-feign-2.x-scenario -# - spring-tx-scenario -# - struts2.3-scenario -# - struts2.5-scenario -# - cxf-scenario -# - okhttp2-scenario -# - jersey-2.0.x-2.25.x-scenario -# - jersey-2.26.x-2.39.x-scenario -# - websphere-liberty-23.x-scenario -# - nacos-client-2.x-scenario -# - rocketmq-scenario -# - rocketmq-5-grpc-scenario + - play-scenario + - postgresql-scenario + - pulsar-scenario + - rabbitmq-scenario + - redisson-scenario + - resttemplate-4.x-scenario + - servicecomb-1.x-scenario + - servicecomb-2.x-scenario + - shardingsphere-3.x-scenario + - shardingsphere-4.0.x-scenario + - shardingsphere-4.x-scenario + - shardingsphere-5.0.0-scenario + - sofarpc-scenario + - solrj-7.x-scenario + - spring-3.0.x-scenario + - spring-cloud-feign-1.1.x-scenario + - spring-cloud-feign-1.2.x-scenario + - spring-cloud-feign-2.x-scenario + - spring-tx-scenario + - struts2.3-scenario + - struts2.5-scenario + - cxf-scenario + - okhttp2-scenario + - jersey-2.0.x-2.25.x-scenario + - jersey-2.26.x-2.39.x-scenario + - websphere-liberty-23.x-scenario + - nacos-client-2.x-scenario + - rocketmq-scenario + - rocketmq-5-grpc-scenario steps: - uses: actions/checkout@v2 with: diff --git a/.github/workflows/plugins-test.3.yaml b/.github/workflows/plugins-test.3.yaml index d733a2069b..3d5880fd9f 100644 --- a/.github/workflows/plugins-test.3.yaml +++ b/.github/workflows/plugins-test.3.yaml @@ -68,61 +68,61 @@ jobs: matrix: case: - aerospike-scenario -# - mysql-scenario -# - undertow-scenario -# - webflux-scenario -# - zookeeper-scenario -# - spring-3.1.x-scenario -# - spring-4.1.x-scenario -# - spring-4.3.x-scenario -# - spring-async-scenario -# - vertx-core-4.x-scenario -# - vertx-eventbus-3.x-scenario -# - vertx-web-3.54minus-scenario -# - vertx-web-3.6plus-scenario -# - mariadb-scenario -# - micronaut-http-scenario -# - nats-2.14.x-2.16.5-scenario -# - quasar-scenario -# - baidu-brpc-scenario -# - baidu-brpc-3.x-scenario -# - retransform-class-scenario -# - retransform-class-tomcat-scenario -# - graphql-8.x-scenario -# - graphql-9.x-scenario -# - graphql-16plus-scenario -# - graphql-12.x-15.x-scenario -# - hbase-scenario -# - spring-kafka-1.3.x-scenario -# - spring-kafka-2.2.x-scenario -# - spring-kafka-2.3.x-scenario -# - spring-scheduled-3.x-5.x-scenario -# - elasticjob-2.x-scenario -# - quartz-scheduler-2.x-scenario -# - xxl-job-2.2.0-scenario -# - xxl-job-2.3.x-scenario -# - thrift-scenario -# - dbcp-2.x-scenario -# - jsonrpc4j-1.x-scenario -# - gateway-3.x-scenario -# - gateway-3.x-filter-context-scenario -# - neo4j-4.x-scenario -# - druid-1.x-scenario -# - hikaricp-scenario -# - clickhouse-0.3.1-scenario -# - clickhouse-0.3.2.x-scenario -# - kylin-jdbc-2.6.x-3.x-4.x-scenario -# - undertow-worker-thread-pool-scenario -# - tomcat-thread-pool-scenario -# - guava-eventbus-scenario -# - shenyu-2.4.x-scenario -# - jdk-threadpool-scenario -# - jdk-forkjoinpool-scenario -# - shenyu-2.4.x-dubbo-scenario -# - grpc-generic-call-scenario -# - shenyu-2.4.x-grpc-scenario -# - shenyu-2.4.x-sofarpc-scenario -# - solon-2.x-scenario + - mysql-scenario + - undertow-scenario + - webflux-scenario + - zookeeper-scenario + - spring-3.1.x-scenario + - spring-4.1.x-scenario + - spring-4.3.x-scenario + - spring-async-scenario + - vertx-core-4.x-scenario + - vertx-eventbus-3.x-scenario + - vertx-web-3.54minus-scenario + - vertx-web-3.6plus-scenario + - mariadb-scenario + - micronaut-http-scenario + - nats-2.14.x-2.16.5-scenario + - quasar-scenario + - baidu-brpc-scenario + - baidu-brpc-3.x-scenario + - retransform-class-scenario + - retransform-class-tomcat-scenario + - graphql-8.x-scenario + - graphql-9.x-scenario + - graphql-16plus-scenario + - graphql-12.x-15.x-scenario + - hbase-scenario + - spring-kafka-1.3.x-scenario + - spring-kafka-2.2.x-scenario + - spring-kafka-2.3.x-scenario + - spring-scheduled-3.x-5.x-scenario + - elasticjob-2.x-scenario + - quartz-scheduler-2.x-scenario + - xxl-job-2.2.0-scenario + - xxl-job-2.3.x-scenario + - thrift-scenario + - dbcp-2.x-scenario + - jsonrpc4j-1.x-scenario + - gateway-3.x-scenario + - gateway-3.x-filter-context-scenario + - neo4j-4.x-scenario + - druid-1.x-scenario + - hikaricp-scenario + - clickhouse-0.3.1-scenario + - clickhouse-0.3.2.x-scenario + - kylin-jdbc-2.6.x-3.x-4.x-scenario + - undertow-worker-thread-pool-scenario + - tomcat-thread-pool-scenario + - guava-eventbus-scenario + - shenyu-2.4.x-scenario + - jdk-threadpool-scenario + - jdk-forkjoinpool-scenario + - shenyu-2.4.x-dubbo-scenario + - grpc-generic-call-scenario + - shenyu-2.4.x-grpc-scenario + - shenyu-2.4.x-sofarpc-scenario + - solon-2.x-scenario steps: - uses: actions/checkout@v2 with: diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml index 161eb6e2f2..3d543ad27f 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/config/expectedData.yaml @@ -79,7 +79,7 @@ segmentItems: - operationName: Spring-ai/openai/call parentSpanId: 0 spanId: 1 - spanLayer: GenAI + spanLayer: not null startTime: not null endTime: not null componentId: 173 @@ -103,7 +103,7 @@ segmentItems: - operationName: Spring-ai/openai/stream parentSpanId: 0 spanId: 4 - spanLayer: GenAI + spanLayer: not null startTime: not null endTime: not null componentId: 173 diff --git a/test/plugin/scenarios/spring-ai-1.x-scenario/support-version.list b/test/plugin/scenarios/spring-ai-1.x-scenario/support-version.list index d2f82818c0..9d9826957c 100644 --- a/test/plugin/scenarios/spring-ai-1.x-scenario/support-version.list +++ b/test/plugin/scenarios/spring-ai-1.x-scenario/support-version.list @@ -14,4 +14,5 @@ # See the License for the specific language governing permissions and # limitations under the License. +1.0.1 1.1.1 \ No newline at end of file