WrapToolCall 包装工具调用,添加 GenAI 追踪
(ctx context.Context, req *ToolCallRequest, handler ToolCallHandler)
| 182 | |
| 183 | // WrapToolCall 包装工具调用,添加 GenAI 追踪 |
| 184 | func (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 |