2626import org .apache .skywalking .apm .agent .core .plugin .interceptor .enhance .InstanceMethodsAroundInterceptor ;
2727import org .apache .skywalking .apm .agent .core .plugin .interceptor .enhance .MethodInterceptResult ;
2828import org .apache .skywalking .apm .network .trace .component .ComponentsDefine ;
29+ import org .apache .skywalking .apm .network .trace .component .OfficialComponent ;
2930import org .apache .skywalking .apm .plugin .spring .ai .v1 .common .ChatModelMetadataResolver ;
3031import org .apache .skywalking .apm .plugin .spring .ai .v1 .config .SpringAiPluginConfig ;
3132import org .apache .skywalking .apm .plugin .spring .ai .v1 .contant .Constants ;
3233import org .apache .skywalking .apm .plugin .spring .ai .v1 .enums .AiProviderEnum ;
33- import org .springframework .ai .chat .messages .Message ;
34+ import org .apache .skywalking .apm .plugin .spring .ai .v1 .messages .InputMessages ;
35+ import org .apache .skywalking .apm .plugin .spring .ai .v1 .messages .OutputMessages ;
3436import org .springframework .ai .chat .metadata .ChatResponseMetadata ;
3537import org .springframework .ai .chat .metadata .Usage ;
3638import org .springframework .ai .chat .model .ChatResponse ;
@@ -45,27 +47,29 @@ public class ChatModelCallInterceptor implements InstanceMethodsAroundIntercepto
4547 @ Override
4648 public void beforeMethod (EnhancedInstance objInst , Method method , Object [] allArguments , Class <?>[] argumentsTypes , MethodInterceptResult result ) throws Throwable {
4749 ChatModelMetadataResolver .ApiMetadata apiMetadata = ChatModelMetadataResolver .getMetadata (objInst );
48- String providerName = AiProviderEnum .UNKNOW .getValue ();
50+ String providerName = AiProviderEnum .UNKNOWN .getValue ();
51+ OfficialComponent component = ComponentsDefine .SPRING_AI_UNKNOWN ;
4952 String peer = null ;
5053
5154 if (apiMetadata != null ) {
5255 if (apiMetadata .getProviderName () != null ) {
5356 providerName = apiMetadata .getProviderName ();
57+ component = apiMetadata .getComponent ();
5458 }
5559 peer = apiMetadata .getPeer ();
5660 }
5761 AbstractSpan span = ContextManager .createExitSpan ("Spring-ai/" + providerName + "/call" , peer );
5862 SpanLayer .asGenAI (span );
63+ span .setComponent (component );
64+ Tags .GEN_AI_OPERATION_NAME .set (span , Constants .CHAT );
65+ Tags .GEN_AI_PROVIDER_NAME .set (span , apiMetadata .getProviderName ());
5966
6067 Prompt prompt = (Prompt ) allArguments [0 ];
6168 ChatOptions chatOptions = prompt .getOptions ();
6269 if (chatOptions == null ) {
6370 return ;
6471 }
6572
66- span .setComponent (ComponentsDefine .SPRING_AI );
67- Tags .GEN_AI_OPERATION_NAME .set (span , Constants .CHAT );
68- Tags .GEN_AI_PROVIDER_NAME .set (span , apiMetadata .getProviderName ());
6973 Tags .GEN_AI_REQUEST_MODEL .set (span , chatOptions .getModel ());
7074 Tags .GEN_AI_TEMPERATURE .set (span , String .valueOf (chatOptions .getTemperature ()));
7175 Tags .GEN_AI_TOP_K .set (span , String .valueOf (chatOptions .getTopK ()));
@@ -120,7 +124,7 @@ public Object afterMethod(EnhancedInstance objInst, Method method, Object[] allA
120124 }
121125 }
122126
123- collectContent (span , allArguments , generation , totalTokens );
127+ collectContent (span , allArguments , response , totalTokens );
124128 } finally {
125129 ContextManager .stopSpan ();
126130 }
@@ -134,7 +138,7 @@ public void handleMethodException(EnhancedInstance objInst, Method method, Objec
134138 }
135139 }
136140
137- private void collectContent (AbstractSpan span , Object [] allArguments , Generation generation , long totalTokens ) {
141+ private void collectContent (AbstractSpan span , Object [] allArguments , ChatResponse response , long totalTokens ) {
138142 int tokenThreshold = SpringAiPluginConfig .Plugin .SpringAi .CONTENT_COLLECT_THRESHOLD_TOKENS ;
139143
140144 if (tokenThreshold >= 0 && totalTokens < tokenThreshold ) {
@@ -146,7 +150,7 @@ private void collectContent(AbstractSpan span, Object[] allArguments, Generation
146150 }
147151
148152 if (SpringAiPluginConfig .Plugin .SpringAi .COLLECT_COMPLETION ) {
149- collectCompletion (span , generation );
153+ collectCompletion (span , response );
150154 }
151155 }
152156
@@ -161,33 +165,25 @@ private void collectPrompt(AbstractSpan span, Object[] allArguments) {
161165 return ;
162166 }
163167
168+ InputMessages inputMessages = InputMessages .fromPrompt (prompt );
169+ String inputMessagesJson = inputMessages .toJson ();
164170 int limit = SpringAiPluginConfig .Plugin .SpringAi .PROMPT_LENGTH_LIMIT ;
165- if (limit > 0 && promptText .length () > limit ) {
166- promptText = promptText .substring (0 , limit );
167- }
168-
169- StringBuilder stringBuilder = new StringBuilder ();
170- for (Message instruction : prompt .getInstructions ()) {
171- stringBuilder .append (instruction .getText ());
171+ if (limit > 0 && inputMessagesJson .length () > limit ) {
172+ inputMessagesJson = inputMessagesJson .substring (0 , limit );
172173 }
173174
174- Tags .GEN_AI_INPUT_MESSAGES .set (span , promptText );
175+ Tags .GEN_AI_INPUT_MESSAGES .set (span , inputMessagesJson );
175176 }
176177
177- private void collectCompletion (AbstractSpan span , Generation generation ) {
178- if (generation == null || generation .getOutput () == null ) {
179- return ;
180- }
181-
182- String completionText = generation .getOutput ().getText ();
183- if (completionText == null ) {
184- return ;
185- }
178+ private void collectCompletion (AbstractSpan span , ChatResponse response ) {
186179
180+ OutputMessages outputMessages = OutputMessages .fromChatResponse (response );
181+ String outputMessagesJson = outputMessages .toJson ();
187182 int limit = SpringAiPluginConfig .Plugin .SpringAi .COMPLETION_LENGTH_LIMIT ;
188- if (limit > 0 && completionText .length () > limit ) {
189- completionText = completionText .substring (0 , limit );
183+
184+ if (limit > 0 && outputMessagesJson .length () > limit ) {
185+ outputMessagesJson = outputMessagesJson .substring (0 , limit );
190186 }
191- Tags .GEN_AI_OUTPUT_MESSAGES .set (span , completionText );
187+ Tags .GEN_AI_OUTPUT_MESSAGES .set (span , outputMessagesJson );
192188 }
193189}
0 commit comments