跳转到内容

Agent 与 LLM 可观测性

Agent 层是 LLM 智能的核心,包括 Turn 执行流、LLM 调用、Token 管理、上下文压缩、Sub-Agent 编排等。这些日志帮助理解 Agent 的决策过程和资源消耗。

事件触发时机关键字段
[turnagent] llm.completeLLM 调用完成session_id, turn_id, model, input_tokens, output_tokens, cached_read_tokens, cached_write_tokens, reasoning_tokens, total_tokens, cost_micros
[turnagent] token_callback.compression_approachingToken 用量接近压缩阈值session_id, usage_ratio
[turnagent] cache hit rate below threshold缓存命中率低于阈值hit_rate, threshold
llm.http.requestLLM HTTP 请求发出(payload 日志)method, url, host
llm.http.response (stream complete)LLM 流式响应完成(payload 日志)url, total_bytes, stream_complete
llm.http.errorLLM 请求失败(payload 日志)url, error

注意:每次 LLM 调用可能产生两条 llm.complete 日志——一条包含完整的 token 统计(带 model),另一条是增量统计(model 为空)。排查 token 消耗时关注带 model 的那条。

事件触发时机关键字段
[turnagent] compact.start压缩开始session_id, turn_id
[turnagent] compact.completed压缩完成session_id, messages_before, messages_after, tokens_saved
[turnagent] compact.reestimate重新估算 Token 数session_id, old_tokens, new_tokens
[turnagent] compress.completed上下文压缩完成session_id, turn_id, messages_compressed
[turnagent] summarize.threshold_fallback摘要阈值回退session_id, threshold
[turnagent] summarize.llm_token_usage摘要 LLM Token 消耗input_tokens, output_tokens
[turnagent] summarize.llm_complete摘要 LLM 调用完成-
[turnagent] reactive_compact.start响应式压缩开始session_id, turn_id, reason
事件触发时机关键字段
[session_memory_extractor] extractor.start记忆提取开始session_id, message_count
[session_memory_extractor] extractor.done记忆提取完成session_id, memory_tokens
[session_memory_extractor] extractor.skip_threshold_not_met未达到提取阈值session_id, token_count, threshold
[triggerSessionMemoryExtraction] extracted记忆提取成功session_id, memory_tokens
save_session_memory.successSession 记忆提取成功(后台 Agent)session_id, memory_tokens
saveMemory.success用户记忆保存成功user_id, memory_id, category, importance
tool.webSearch.completedWeb 搜索完成session_id, query, result_count, provider
tool.webFetch.completedWeb 抓取完成session_id, url, bytes, status_code, cached
事件触发时机关键字段
[turnagent] handleStreamEnd.start流式响应结束处理turn_id, session_id, role, token_usage_total, markdown_finalized, thinking_finalized
[turnagent] handleStreamEnd.update_token_usage更新 Token 使用量turn_id, session_id, input_tokens, output_tokens
[turnagent] appendStreamChunk.finalize流式块最终合并message_id, kind (thinking/markdown), chunk_count, full_content_len, full_content_preview
[turnagent] on_agent_events.startAgent 事件处理开始session_id, turn_id
[turnagent] on_agent_events.doneAgent 事件处理完成session_id, turn_id
[turnagent] on_agent_events.interruptedAgent 事件处理被中断session_id, turn_id, num_contexts
事件触发时机关键字段
[turnagent] gen_input.start生成 LLM 输入开始session_id, turn_id, checkpoint_id, item_count, is_resume
[turnagent] gen_resume.called生成恢复参数turn_id, session_id, checkpoint_id, interrupted_count, unhandled_count, newItems_count
[turnagent] gen_resume.resume_params恢复参数详情turn_id, session_id, interrupt_id, has_result
[turnagent] gen_resume.result恢复结果turn_id, session_id, consumed_count, has_resume_params
[turnagent] normalizeMessagesForLLM.applied消息序列规范化session_id, before, after
事件触发时机关键字段
[turnagent] session_manager.createdSession 管理器创建session_id, turn_id, worker_id
[turnagent] session_manager.cleanup_doneSession 管理器清理完成session_id, turn_id
事件触发时机关键字段
notificationMessage.created通知消息创建(Loop 触发等)session_id, text_len
[primitives.CreateMessage]消息持久化id, session, turn, role, content_type
事件触发时机关键字段
[turnagent] subAgent.createdSub-Agent 创建sub_agent_session_id, parent_session_id, mode
[turnagent] subAgent.work_submittedSub-Agent 任务提交sub_agent_session_id, turn_id
[turnagent] subAgent.async.returned_immediately异步 Sub-Agent 立即返回sub_agent_session_id
[turnagent] subAgent.resume.completedSub-Agent 恢复完成sub_agent_session_id
[turnagent] stopSubAgent.stoppedSub-Agent 已停止sub_agent_session_id
[turnagent] stopSubAgent.completedSub-Agent 完成清理sub_agent_session_id
[turnagent] resumeParentAfterSubAgent.done父 Session 恢复完成parent_session_id
[turnagent] notifyParentAfterAsyncSubAgent.done异步 Sub-Agent 通知父 Sessionparent_session_id
事件触发时机关键字段
[turnagent] createTools.doneAgent 工具创建完成session_id, tool_count
[turnagent] createAgent.startAgent 创建开始session_id, turn_id
[turnagent] createAgent.doneAgent 创建完成session_id, turn_id
[turnagent] createAgent.failedAgent 创建失败session_id, error
[turnagent] todoWriteTool.publish_updateTodo 工具更新发布session_id, turn_id
{service="server"} | json input_tokens="input_tokens", output_tokens="output_tokens" | msg="[turnagent] llm.complete"
{service="server"} | json session_id="session_id", usage_ratio="usage_ratio" | msg="[turnagent] token_callback.compression_approaching"
{service="server"} | json session_id="session_id" | msg=~"\\[turnagent\\] (compact\\.(start|completed|reestimate)|compress\\.completed|reactive_compact\\.start)" | session_id="session-abc"
{service="server"} | json tokens_saved="tokens_saved" | msg="[turnagent] compact.completed"
{service="server"} | json session_id="session_id", memory_tokens="memory_tokens" | msg=~"\\[session_memory_extractor\\] extractor\\.(start|done)|\\[triggerSessionMemoryExtraction\\] extracted"
{service="server"} | json hit_rate="hit_rate", threshold="threshold" | msg="[turnagent] cache hit rate below threshold"
{service="server"} | json sub_agent_session_id="sub_agent_session_id" | msg=~"\\[turnagent\\] (subAgent\\.(created|work_submitted|resume\\.completed|async\\.returned_immediately)|stopSubAgent\\.(stopped|completed))"
{service="server"} | json | msg=~"\\[turnagent\\] (subAgent|stopSubAgent|resumeParentAfterSubAgent|notifyParentAfterAsyncSubAgent)\\..*(failed|error)"
{service="server"} | json session_id="session_id", error="error" | msg="[turnagent] createAgent.failed"

查看 LLM 请求错误(payload 日志)

Section titled “查看 LLM 请求错误(payload 日志)”
{service="server"} | json | msg="llm.http.error"
{service="server"} | json provider="provider", model="model" | msg="LLM initialized"
{service="server"} | msg="LLM not configured"
{service="server"} | json chunk_count="chunk_count", full_content_len="full_content_len", kind="kind" | msg="[turnagent] appendStreamChunk.finalize"

查看 LLM 调用的 Token 详情(含缓存命中)

Section titled “查看 LLM 调用的 Token 详情(含缓存命中)”
{service="server"} | json model="model", input_tokens="input_tokens", output_tokens="output_tokens", cached_read_tokens="cached_read_tokens", reasoning_tokens="reasoning_tokens", cost_micros="cost_micros" | msg="[turnagent] llm.complete" | model!=""
{service="server"} | json session_id="session_id", turn_id="turn_id", num_contexts="num_contexts" | msg="[turnagent] on_agent_events.interrupted"

查看消息规范化(上下文裁剪)

Section titled “查看消息规范化(上下文裁剪)”
{service="server"} | json session_id="session_id", before="before", after="after" | msg="[turnagent] normalizeMessagesForLLM.applied"

查看恢复参数(排查 RTC 中断恢复)

Section titled “查看恢复参数(排查 RTC 中断恢复)”
{service="server"} | json turn_id="turn_id", interrupt_id="interrupt_id", has_result="has_result" | msg="[turnagent] gen_resume.resume_params"
{service="server"} | json session_id="session_id", text_len="text_len" | msg="notificationMessage.created"

追踪某个 Session 的 Agent 执行全链路

Section titled “追踪某个 Session 的 Agent 执行全链路”
{service="server"} | json session_id="session_id", msg="msg" | msg=~"\\[turnagent\\] (agent\\.process|createTurn|beginTurn|turn\\.(start|end)|llm\\.complete|on_agent_events|session_manager)" | session_id="session-abc"
指标类型Labels用途
rtc_llm_tokens_totalCountermodel, type (input/output)LLM Token 总消耗
rtc_llm_request_duration_secondsHistogrammodel, statusLLM API 延迟
rtc_llm_http_request_totalCounter-LLM HTTP 请求总数
rtc_llm_http_request_duration_secondsHistogram-LLM HTTP 请求延迟
rtc_llm_http_response_tokens_totalCounter-LLM HTTP 响应 Token 数
# 每分钟 Token 消耗速率
sum by (model, type) (rate(rtc_llm_tokens_total[5m]))
# LLM API 延迟 P95
histogram_quantile(0.95, sum(rate(rtc_llm_request_duration_seconds_bucket[5m])) by (le, model))
# LLM 请求错误率
sum(rate(rtc_llm_request_duration_seconds_count{status="error"}[5m])) / sum(rate(rtc_llm_request_duration_seconds_count[5m]))

除了结构化日志和 Prometheus 指标,Agent 层还通过 OpenTelemetry 自动为关键操作创建 Span,支持在 Grafana Tempo 等追踪后端中查看完整调用链。

💡 所有结构化日志自动注入 trace_id 和 span_id(来自 OpenTelemetry context),可通过 Trace ID 将日志与 Span 关联。详见 通用日志查询模式 — 按 Trace ID 查询。

Span 名称触发时机关键属性
tool.searchMemorysearchMemory 工具调用query, limit, result_count
tool.saveMemorysaveMemory 工具调用category, importance
tool.updateMemoryupdateMemory 工具调用memory_id
tool.deleteMemorydeleteMemory 工具调用memory_id
tool.listMemorieslistMemories 工具调用—
tool.webSearchwebSearch 工具调用query, provider, result_count
tool.webFetchwebFetch 工具调用url, cached
tool.subAgentsubAgent 工具调用mode
tool.stopSubAgentstopSubAgent 工具调用—
tool.createGoalcreateGoal 工具调用—
tool.todoWritetodoWrite 工具调用—
rtcTool.<name>RTC 工具调用(ls/read/write/grep/find/script 等)tool_name
goalWorkflow.onTurnCompleteGoal 工作流转检查—
loopWorkflow.onTurnCompleteLoop 工作流进度检查—
loopWorkflow.scheduleNextLoop 调度下一次执行—
gorm.*所有 SQL 操作(GORM 追踪插件)SQL 语句、影响行数
centrifuge-plus.*Centrifuge 发布/订阅操作channel, offset, queue

📌 OpenTelemetry 追踪在生产环境中通过配置 TracerProvider 启用。未配置时使用 no-op tracer,零开销。

告警条件说明
LLM 错误率过高LLM 请求错误率 > 5%LLM 服务不稳定
Token 消耗过快rate(rtc_llm_tokens_total[5m]) 异常升高可能存在上下文泄漏
缓存命中率低cache hit rate below threshold 频繁出现AutoCacheControl 可能失效

💡 完整的 Prometheus 指标、Grafana 仪表盘和告警规则列表参见 可观测性监控。