关于 optimize-trace-observability
optimize-trace-observability 是用于提升 Coval 跟踪数据调试价值的技能,帮助开发者检查现有埋点、补充 Span 与属性、保护敏感数据,并验证结果。
主要功能
- 01检查跟踪结构与质量
- 02发现缺失的业务事件覆盖
- 03添加 Coval 原生 Span 和属性
- 04限制敏感及高基数数据
- 05通过跟踪数据和指标验证更改
适用场景
- 01为跟踪数据补充缺失的工具活动
- 02区分对话中的不同轮次
- 03添加用于自定义指标的数值信号
- 04减少跟踪数据中的敏感信息暴露
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ coval-ai/ coval-external-skills --skill optimize-trace-observability安装后在 Claude Code 中输入/optimize-trace-observability确认已加载。
详细介绍
优化 Coval Trace 可观测性
将可用但信息不足的 Coval trace 转化为实用的调试材料。优先检查一条已验证可用的 Coval trace。如果 setup-tracing 已启动初始异步验证运行,且该运行仍在等待中,请利用等待时间安全地补充代码中可见的信息,然后在运行完成后重新检查,再宣布优化完成。
首先阅读
按需加载以下参考资料:
../references/span-schema.md,了解规范 span、属性、别名和防护措施../references/agent-type-routing.md,了解特定框架的 trace 边界../references/coval-tracing-reference.md,了解查看器/搜索行为和数据摄取限制- 当 Agent 使用 Vapi Webhook 时,阅读
../references/vapi-artifact-tracing.md
阶段 1:检查当前 Trace 质量
以证据为依据,而不是凭假设行事。
- 在 Coval 中找到一条近期的仿真或对话 trace。凭据可用时,请使用 Coval CLI/API 或 Trace Search,而不是让用户提供截图。
- 如果唯一的候选项是
setup-tracing启动的进行中验证运行,请启动或继续 有限次数的 CLI/API 轮询,不要干等。等待期间,检查代码路径,只添加基于实现 明确安全的补充信息。 - trace 数据可用后,检查 trace 查看器或导出的 trace dump。
- 对当前 trace 进行分类:
- 没有 trace
- 存在 trace,但只有根 span/提供商 span
- 某一种 span 类型占主导(例如,几乎所有行都是
conversation), 这通常意味着没有发出子 span,或子 span 的命名过于宽泛 - 存在 STT/LLM/TTS span,但缺少属性
- 缺少工具 span
- 父子结构扁平或具有误导性
- 属性不安全、体积过大或基数过高
- 存在 turn span,但无法区分(都命名为
turn,没有角色区别)——这会让 trace 查看器充斥着完全相同的行,并掩盖对话结构;解决方法见阶段 2
- 检查是否应当补充现有框架的检测,而不是重复添加。
对于 Pipecat、LiveKit、Vapi 或现有 OTel 集成已发出的操作,除非无法补充现有 span,否则不要手动添加重复 span。
对于由 Vapi 托管的 PSTN Agent,请准确说明 Webhook 能证明什么:
tool-calls Webhook 是真实的工具执行;end-of-call-report.artifact
消息是真实的转录/turn 源数据;除非 Vapi 明确提供,否则无法获取提供商内部
STT/LLM/TTS 耗时。
阶段 1b:发现代码中已有的业务事件
决定要添加什么之前,先搜索 Agent 代码中客户已经实现、但尚未追踪的业务事件
范围。搜索以下术语:
cart、order、intent、tool_call、function_call、handoff、escalat、
payment、checkout、confirm、cancel、transfer、submit、dispatch、
end_of_call、conversation_end、system_notify、webhook、event_name。
每个匹配项都可以作为一个 business.<event> span 或 llm_tool_call span
的候选项,并添加一个数值属性,以便之后转化为客户信号指标。
这是最常见的覆盖盲区:客户的协议已经定义了有意义的业务事件,但这些事件从未
进入 trace,因为首次检测只覆盖了音频/LLM 流水线。
对于每个不同的业务事件,建议添加一个 span,并至少包含一个数值属性
(购物车总额、商品数量、支付金额、升级处理级别等)。
同时,找出最重要的一个垂直领域特有故障模式,并为其添加一个可用于指标的根属性,例如
roadside.dispatch.latency_ms、reservation.date.changed、
identity.verification.completed、payment_plan.blocked 或
handoff.required。不要等客户问“就这些吗?”之后才添加这些内容。
阶段 2:添加 Coval 原生 Span 覆盖
优先添加能让 Coval 跟踪 UI、内置跟踪指标和自定义跟踪指标更实用的 span:
conversation:完整调用/会话根 spanturn:当框架提供轮次边界时,表示一次用户/助手交互stt:最终语音识别结果stt.provider.<name>:每次 STT 提供商尝试或回退llm:模型调用tts:合成调用llm_tool_call:工具/函数执行vad:在适用时记录语音活动判断pipeline或transport:仅在有助于诊断路由/音频问题时使用
保持 span 名称稳定且基数低。将 ID、提供商名称、端点名称和动态详情放入属性中。 添加自定义业务 span 前,请遵循公开的 span 命名规范: 规范名称会获得语义颜色、标签和内置跟踪指标支持。
对于基于 Vapi artifact 的增强:
- 根据
artifact.messages的时间窗口创建turn.assistant和turn.userspan(而非扁平的turn);按角色区分名称可在跟踪查看器中显示为不同的行;添加turn.text(消息开头约 200 个字符),以便无需打开详情面板即可阅读内容 - 根据实时工具调用 webhook 和处理程序结果创建
llm_tool_callspan - 仅在清楚标记为
trace.timing=metadata_marker时使用提供商标记 span,或者使用stt_marker/llm_marker/tts_marker - 切勿让标记 span 与其所属轮次具有相同的完整时长
- 切勿添加虚假的置信度、虚假的 TTFB 或虚假的提供商延迟值
- 根据 Vapi
artifact.messages重建轮次 span 时,请遵循../references/vapi-artifact-tracing.md中的时间戳限制,避免time字段导致 OTel int64 溢出,以及secondsFromStart值被错误路由
对于时刻性注释,优先使用 OTel span 事件,而不是新增 span。
span 事件(span.add_event("simulation_id_received", {...}))是在现有 span 上添加的轻量级带时间戳标记——它不会增加 span 数量,不会影响跟踪指标,还会在跟踪查看器的父时间线上显示醒目标记。在 conversation 根 span 或相关 turn 上,将事件用于记录 simulation_id_received、first_inbound_audio、first_speech_detected、cart_sent、tool_dispatched、websocket_disconnect 和 conversation_end 等里程碑。仅对具有实质时长或父子结构的事项使用完整 span。
阶段 3:添加高价值属性
使用 ../references/span-schema.md 中的规范属性。
最低有价值属性集:
stt:transcript、metrics.ttfb,以及可用时的stt.confidencestt.provider.<name>:stt.providerName、metrics.ttfb、stt.confidence,以及提供商失败时的错误状态llm:metrics.ttfb、llm.finish_reason、gen_ai.usage.input_tokens、gen_ai.usage.output_tokens,以及可用时的模型/提供商元数据tts:metrics.ttfb,以及安全时的提供商/语音元数据llm_tool_call:function.name、tool_call_id、安全且有界时的function.arguments、tool.latency_ms、数值型tool.error、数值型tool.dependency_unavailable,以及适用时的tool.result.countconversation:在会话边界可用时,包含tool.call.count、tool.failure.count、数值型workflow.completed、数值型workflow.dependency_blocked、数值型workflow.fallback_used- 垂直领域专用根属性:一两个用于描述客户主要工作流风险的数值信号,例如
roadside.dispatch.latency_ms、roadside.dispatch.slow、fnol.fields_captured.count、fraud.pattern_detected、reservation.date.changed、identity.verification.completed或payment_plan.blocked - 安全可用时的会话聚合数据:
call.cost_usd、conversation.summary.length_chars、transcript.length_chars、transcript.turn.count,以及各角色的轮次数 - 自定义 Span:一个可用于自定义 Trace 指标的数值属性,例如
duration_ms、retry_count、confidence_score、queue_wait_ms或external_api_latency_ms
对于失败的提供商/工具/API Span,将 OTel 状态设为 ERROR。Coval 自定义 Trace 指标可以根据 Span 状态计算 error_rate 和 success_rate。
重要比率也应发出数值型 0/1 标记。某些公共指标创建 API 要求 metric_attribute 为数值型;对这些标记取 average,既能保留比率,也能在这些环境中正常使用。
对于由 Vapi 托管的 Agent,除非明确测量了提供商耗时,否则优先使用 tool.error、
tool.latency_ms、tool.call.count、workflow.completed、
workflow.dependency_blocked 和 workflow.fallback_used 等工具/工作流属性,而非提供商耗时属性。
阶段 4:保护客户
提交增强数据前,移除或限制以下内容:
- API 密钥、令牌、密码、会话 Cookie、账户机密和凭据
- 原始音频数据块或 Base64 音频
- 可能包含 PII 的完整提示词/响应
- 与
stt.transcript无关的自定义属性中未设上限的转录文本 - 基数过高的 Span 名称
- 重复的成功导出重试记录
优先使用摘要和计数:
tool.result.counttool.result.successtool.errortool.call.counttool.failure.countworkflow.completedworkflow.dependency_blockedworkflow.fallback_usedprompt.message_countresponse.lengthhttp.status_coderetry_count
阶段 5:验证价值提升
完成更改后:
- 通过 Coval CLI/API 运行一次有代表性的模拟或会话,或者重用正在进行的验证运行(如果它覆盖了已更改的代码)。
- 通过 CLI/API 轮询,直到运行完成且 Trace 数据出现。等待期间,可以准备候选指标或文档说明,不要闲等。
- 打开 Coval Trace 查看器。
- 确认 Trace 具有清晰的层级结构和预期的 Span 颜色。
- 检查 Trace Search 是否可以按 Span 名称、状态、耗时、提供商或属性进行筛选。
- 如果添加了新的数值属性,在 Span/属性出现在实际 Trace 数据中后,运行
configure-trace-metrics,创建至少一个基于这些属性的指标。
以具体内容报告更改前后的差异,例如 Span 数量、新增的 Span 名称、新增的属性,以及现在 Trace 可以回答的具体调试问题。