MCPcopy Create free account
hub / github.com/astercloud/aster / WrapToolCall

Method WrapToolCall

pkg/middleware/telemetry.go:184–240  ·  view source on GitHub ↗

WrapToolCall 包装工具调用,添加 GenAI 追踪

(ctx context.Context, req *ToolCallRequest, handler ToolCallHandler)

Source from the content-addressed store, hash-verified

182
183// WrapToolCall 包装工具调用,添加 GenAI 追踪
184func (m *TelemetryMiddleware) WrapToolCall(ctx context.Context, req *ToolCallRequest, handler ToolCallHandler) (*ToolCallResponse, error) {
185 startTime := time.Now()
186
187 // 构建 span 名称: "execute_tool {tool_name}"
188 spanName := genai.ToolSpanName(req.ToolName)
189
190 // 构建初始属性
191 attrs := []telemetry.Attribute{
192 telemetry.String(genai.AttrOperationName, genai.OpExecuteTool),
193 telemetry.String(genai.AttrToolName, req.ToolName),
194 telemetry.String(genai.AttrToolCallID, req.ToolCallID),
195 telemetry.String(genai.AttrAgentID, m.agentID),
196 telemetry.String(genai.AttrAgentName, m.agentName),
197 }
198
199 // 添加会话 ID (如果有)
200 if m.conversationID != "" {
201 attrs = append(attrs, telemetry.String(genai.AttrConversationID, m.conversationID))
202 }
203
204 // 开始 span (INTERNAL 类型,因为是进程内操作)
205 ctx, span := m.tracer.StartSpan(ctx, spanName,
206 telemetry.WithSpanKind(telemetry.SpanKindInternal),
207 telemetry.WithAttributes(attrs...),
208 )
209 defer span.End()
210
211 // 记录工具调用事件
212 span.AddEvent(genai.EventToolCall,
213 telemetry.String(genai.AttrToolName, req.ToolName),
214 telemetry.String(genai.AttrToolCallID, req.ToolCallID),
215 )
216
217 // 调用下一层
218 resp, err := handler(ctx, req)
219
220 // 计算延迟
221 latencyMs := time.Since(startTime).Milliseconds()
222 span.SetAttributes(telemetry.Int64(genai.AttrLatencyTotal, latencyMs))
223
224 // 处理错误
225 if err != nil {
226 span.RecordError(err)
227 span.SetStatus(telemetry.StatusCodeError, err.Error())
228 return resp, err
229 }
230
231 // 记录工具结果事件
232 span.AddEvent(genai.EventToolResult,
233 telemetry.String(genai.AttrToolName, req.ToolName),
234 telemetry.String(genai.AttrToolCallID, req.ToolCallID),
235 telemetry.Int64("duration_ms", latencyMs),
236 )
237
238 span.SetStatus(telemetry.StatusCodeOK, "")
239 return resp, nil
240}
241

Calls 13

ToolSpanNameFunction · 0.92
StringFunction · 0.92
WithSpanKindFunction · 0.92
WithAttributesFunction · 0.92
Int64Function · 0.92
handlerFunction · 0.85
StartSpanMethod · 0.65
EndMethod · 0.65
AddEventMethod · 0.65
SetAttributesMethod · 0.65
RecordErrorMethod · 0.65
SetStatusMethod · 0.65