关于 setup-tracing
此技能用于在客户的 Agent 或服务仓库中添加并验证 Coval 跟踪。它会分析现有技术栈与关联路径,再通过 Coval 公共接口和可用的 OpenTelemetry 实现增量埋点。
主要功能
- 01分析 Agent 技术栈和跟踪路径
- 02选择 Coval ID 关联方式
- 03在客户自有代码中添加跟踪
- 04可用时采用 OpenTelemetry
- 05按连接路径验证跟踪
适用场景
- 01为现有语音 Agent 添加埋点
- 02将跟踪与模拟关联
- 03跟踪受监控的对话
- 04交接前检查跟踪覆盖
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ coval-ai/ coval-external-skills --skill setup-tracing安装后在 Claude Code 中输入/setup-tracing确认已加载。
附带文件scripts/send-test-span.py
详细介绍
设置 Coval 跟踪
在客户的 Agent 中设置跟踪,以最小的增量改动生成真实的 Coval 跟踪,然后根据 Agent 实际连接 Coval 的路径验证该跟踪。
从客户的 Agent 侧操作。不要假设可以访问 Coval 内部后端、前端、文档、向导、研究资料或示例源代码仓库,也不要向客户索要这些内容。只能使用客户的代码仓库、公开的 Coval 文档、公开的 SDK 示例、Coval CLI/API,以及获取的公开 OpenAPI 规范。 代码改动应放在客户的 Agent/服务代码仓库中。Coval 侧的更改必须仅限于通过 Coval CLI、公开 API 或控制面板进行的文档化配置,并且应在修改前予以说明。
预检
- 确认 Agent 代码仓库或服务的范围。在单体仓库中,除非用户明确要求,否则不要为所有服务添加埋点。
- 检查 Coval 身份验证,但不要读取密钥文件:
如果无法使用 CLI,请从用户的 Shell 环境中读取coval whoami coval agents list --format jsonCOVAL_API_KEY并直接调用 API。切勿打印或存储原始密钥。通过 API 列出 Agent 时,在显示输出前应对metadata脱敏,因为某些提供商集成会在其中存储模型 API 密钥。 - 在编写 API 集成之前,先获取当前的 API 结构:
如需更广泛地查找文档,请先获取curl -fsS https://api.coval.dev/v1/openapihttps://docs.coval.dev/llms.txt,然后获取任务所需的具体公开文档页面。 - 仅在客户拥有的代码范围内操作。不要将
coval-ai/backend、coval-ai/frontend、coval-ai/docs、coval-ai/wizard、内部工程文档或私有 Coval 代码仓库作为本地源代码来引用或要求访问。客户侧 Agent 可使用的参考资料包括公开文档、公开 SDK 示例,以及已安装技能的参考文件。 - 编辑前请阅读共享参考资料:
../references/coval-tracing-reference.md../references/agent-type-routing.md../references/span-schema.md- 如果 Agent 基于 Vapi,请阅读
../references/vapi-artifact-tracing.md
阶段 1:只读分析
完成此阶段前不要编辑文件。
请确定:
- 语言和包管理器
- 应用启动命令及一个有代表性的本地调用方式
- Agent 框架或提供商技术栈:Pipecat、LiveKit、Vapi、Twilio、WebSocket、直接使用 OpenAI/Anthropic、自定义循环等
- 附近是否有相同技术栈的 Agent 实现(如同一工作区中存在),且已能发出更丰富的跟踪;应将其作为增量埋点的参考,而不是重新设计 Span 结构
- Coval Agent 类型和连接路径:SIP 入站、PSTN 入站、语音外呼、WebSocket 语音/聊天,或对话监控
- 每次调用对应的 Coval ID 如何传入 Agent 进程
- 现有遥测的负责人:OpenTelemetry、Sentry、Datadog、Honeycomb、Langfuse、Arize、LangSmith、Traceloop,或自定义 OTLP 导出器
- 短生命周期进程的行为以及关机/刷新路径
- 需要修改的客户所有文件,以及必须通过 CLI/API/控制面板而非代码进行的 Coval 配置更改
返回简洁的分析摘要。如果目标服务或代码仓库范围不明确,请先询问再编辑。不要让客户从菜单中选择关联路径。客户通常无法从外部判断 SIP 标头、调用前 Webhook 或触发器载荷是否受支持;请根据发现的 Agent 配置和以下决策规则推断最佳路径。
阶段 2:选择关联路径
每次导出只能使用一个目标标头:
- 模拟:
X-Simulation-Id,其值为模拟输出 ID - 对话监控:
X-Conversation-Id,其值为POST /v1/conversations:submit返回的conversation_id
如果仓库和 Coval Agent 配置明确表明某条路径更安全,请自行选择该路径。不要提出开放式的“我应该使用哪条路径?”问题。按以下顺序决策:
- 如果当前连接路径已将 Coval ID 传递到进程中,请使用该路径。例如:SIP 参与者属性、出站触发器负载、WebSocket 初始化负载,或监控用的
conversation_id。 - 如果当前 Coval Agent 记录或已获取的 OpenAPI 确认存在现有的呼叫前/注册 Webhook 字段,且服务已提供合适的端点,请配置或复用该 Webhook。
- 对于没有已验证 SIP 标头且未确认已接入 Coval 呼叫前 Webhook 的 PSTN 入站电话 Agent,默认使用独立的注册端点以及一个冒烟测试启动器,在通话前立即注册
simulation_output_id。这是最安全的首次验证方式,因为它无需猜测 Coval Agent 元数据的结构,也不会修改客户的 Agent 配置。验证成功后,说明生产环境的升级方案:在可用时,将同一端点接入已验证的 Coval 呼叫前 Webhook 字段;或者在客户需要由 Coval 管理每通电话的注入时配置 SIP。 - 仅当所有可行路径都需要你无法推断的策略或部署决策时,才向客户提问,例如是否允许公开新的 Webhook、更新 Coval Agent 配置或配置 SIP 路由。在这种情况下,先给出一项建议,解释原因,并询问所需的最少批准。
对于文档中已定义且当前为空的字段,Coval 侧的配置变更若纯粹是增量式的(例如,将 initialization_json 从 "{}" 设为文档规定的 {"simulation_id":"{{simulation_id}}"} 占位符,或填入空的 pre_call_webhook_url),无需征求同意——客户提出的“让跟踪记录正常工作”意图已包含此意,而且该变更可通过同一 PATCH 轻松撤销。在交接说明中展示变更前后的值,但无需询问即可继续。对于删除配置、降低身份验证级别、覆盖非空字段,或修改电话号码、SIP 路由、测试集、Webhook 密钥等共享资源的变更,务必先征求同意。
根据 ../references/agent-type-routing.md 选择路径:
- SIP 入站语音:从 SIP 标头或框架参与者属性中提取
X-Coval-Simulation-Id。 - PSTN 入站电话:不要期待存在 SIP 标头。添加或配置
pre_call_webhook_url/ 注册 Webhook 关联,或引导客户配置 SIP 地址。 - 出站语音:在触发器负载中传递
simulation_output_id,并在触发器处理程序中读取。 - WebSocket 语音/聊天:在初始设置负载或初始化 JSON 中传递模拟输出 ID。
- 对话监控:在通话期间缓冲跨度,在通话结束时提交对话,然后使用
X-Conversation-Id导出缓冲的跨度。
对于直接 WebSocket Agent,优先使用显式初始化负载配置 Coval 元数据,例如:
{"simulation_id": "{{simulation_id}}"}
然后将第一个非音频帧视为设置元数据,提取 simulation_id 或
simulation_output_id,并且仅在该 ID 已存在后才使用 X-Simulation-Id 导出。当前生产示例使用 {{simulation_id}};如果文档提到 {{simulation_output_id}},请先验证当前 Agent 元数据行为,再将任一名称硬编码。
阶段 3:实施增量式监测
优先使用现有的遥测管理方。如果应用已有 TracerProvider,请向其添加 Coval 导出器/处理器,而不是替换该 Provider。如果尚未设置遥测,请创建一个中央模块,例如
coval_tracing.py、covalTracing.ts 或 coval_tracing.go,并让 Agent 入口专注于业务逻辑和 Webhook 路由。除非仓库是一个小型的单文件原型,否则不要将最终实现写成大型的内联追踪代码块,放在 server.py、app.ts 或主 Webhook 处理程序中。
实现要求:
- 端点:
https://api.coval.dev/v1/traces - 认证请求头:使用环境变量中的
x-api-key或X-API-Key,绝不写入字面形式的密钥 - 超时:30 秒
- 资源:将
service.name设置为 Agent 或服务名称。已知时,还要添加客户可见且稳定的资源属性:service.namespace、agent.name、agent.provider、coval.agent_type和coval.correlation.method。 - 只导出一个目标请求头:
X-Simulation-Id或X-Conversation-Id - 仅在 Coval ID 尚未可用时缓冲 Span;并限制缓冲区大小
- 有可用的标准 OpenTelemetry SDK 时,使用该 SDK。对于 Coval 目标 ID 在 Span 启动后才到达的调用流,使用基于 SDK 的缓冲区,例如
InMemorySpanExporter,然后在 ID 已知后,用OTLPSpanExporter导出已结束的 Span。除非该语言/运行时没有可用的 SDK,否则避免手动编写 OTLP JSON 导出器。 - 高流量 Agent 使用
BatchSpanProcessor或等效机制,并确保批次大小远低于 3-4 MB - 短生命周期进程退出前,刷新并关闭追踪
- 仅重试失败的批次;Coval 以仅追加方式存储 Span,不会对成功的重试进行去重
- 更新部署打包配置。Dockerfile、无服务器部署包、Pipecat Cloud 软件包以及 Fly/Render/Heroku 部署必须包含任何新增的追踪辅助模块和依赖文件。
- 优先使用
../references/span-schema.md中的规范 Span 名称:llm、tts、stt、stt.provider.<name>、vad、llm_tool_call、turn、conversation、pipeline和transport。这些名称决定语义 UI 标签、颜色和内置追踪指标。 - 添加工具或工作流 Span 时,从首个实现版本起就包含可用于指标的数值属性:
tool.latency_ms、数值型tool.error、数值型tool.dependency_unavailable、tool.call.count、tool.failure.count、数值型workflow.completed、数值型workflow.dependency_blocked,以及可用时的数值型workflow.fallback_used。这样configure-trace-metrics就不必只使用验证型指标。 - 首轮实现时,为客户最重要的故障模式添加一个特定垂直领域的工作流 Span 或根属性。例如:
roadside.dispatch.latency_ms、reservation.date.changed、identity.verification.completed、payment_plan.blocked或handoff.required。如果代码库明显包含关键业务路径,仅有通用工具指标是不够的。 - 在会话根 Span 上发出 OTel Span 事件,记录
simulation_id_received、dispatch_called、delay_acknowledged、callback_offered、fnol_started、fnol_completed、booking_attempted或escalation_triggered等特定时刻的业务里程碑。时间线标记使用事件;具有持续时间的工作使用 Span。 - 对于 Webhook 式语音 Agent,如果工具调用或轮次 Webhook 已有 Coval 目标 ID,不要只依赖通话结束时的最终事件。目标 ID 已知时导出每个事件的 Span,或先缓冲,待 ID 已知后一次性刷新。避免在成功导出后重放 Span,因为 Coval 追踪接收采用仅追加方式。
- 对于托管在 Vapi 上的 PSTN Agent,在基本工具调用追踪正常工作后,解析
end-of-call-report.artifact.messages。使用 Vapi 消息窗口生成turnSpan,但不要伪造提供商延迟。如果从 Artifact 消息生成stt、llm或ttsSpan,请将其标记为元数据标记,使用trace.source=vapi_artifact、trace.timing=metadata_marker和trace.duration_note;或者使用带标记后缀的 Span 名称。不要根据这些标记 Span 创建 LLM/STT/TTS 延迟指标。
对于 Python 语音 Agent,客户代码库中已有的生成式 coval_tracing.py 辅助模块可以作为可接受的基线,但应针对发现的连接路径和现有遥测进行改进。
第 4 阶段:最小跨度覆盖
第一个可用的跟踪应包含:
- 如果框架提供调用边界,则包含根
conversation或等效的会话跨度 - 至少包含一个与实际 Agent 路径相符的
stt、llm、tts或llm_tool_call跨度 - 框架能够提供时,确保父子关系正确
service.name资源元数据- 与 Coval 兼容的目标 ID 路由
如果应用目前还无法暴露 STT/TTS/LLM 内部信息,先交付最小可用跟踪,然后使用 optimize-trace-observability 丰富信息。
反模式:为每个分块或每帧创建传输跨度。 语音/实时 Agent 会将音频流拆分成许多小块(通常为 20-100 ms)。每个块都生成一个 OTel 跨度,会产生数百个微型跨度,在视觉上淹没跟踪查看器,并让真正的 turn/tts/llm 跨度缩成难以看见的细条——即使跟踪并非空白,看起来也会像是空的。应将每个分块的活动汇总为父流跨度上的计数器属性:
- 在
tts跨度上记录audio.chunks_sent(计数)和audio.chunk_target_ms(配置的节奏) - 在
turn或stt跨度上记录audio.chunks_received audio.payload_bytes、audio.duration_s已记录总量
同样的规则适用于逐帧的 transport.recv_audio、每个 WebSocket 事件的 ping,以及逐 Token 的流式跨度。每个高层操作创建一个跨度;每个分块的细节应写入数值属性。
第 5 阶段:验证
先运行本地检查:
python -m compileall .
npm test
npm run typecheck
go test ./...
使用与仓库匹配的检查;不要臆造包管理器命令。
然后通过 CLI/API 启动 Coval 验证,并在其运行期间开展有效工作。Coval 模拟和监控对话都是异步的;启动后不要闲置。
- 使用发现的 Coval CLI/API 路径,通过客户使用的同一种 Coval Agent 类型启动一次真实测试。有 CLI 命令时优先使用;否则先获取 OpenAPI,再调用公共 API。记录启动后返回的运行 ID、模拟输出 ID、对话 ID、仪表板 URL 或轮询端点。
- 通过 CLI/API 启动有界轮询循环。记录所用命令或端点、轮询间隔和超时时间。不要打印 API 密钥或 Coval Agent 响应中的原始提供商元数据。
对于模拟,不要只等待
GET /v1/runs/{run_id}暴露results.output_ids;该信息可能直到完成后才更新,那时再注册 PSTN/webhook 就太迟了。还要轮询:GET /v1/simulations?filter=run_id%3D%22<RUN_ID>%22,立即注册首个返回的simulation_id/ 模拟输出 ID,然后继续监视运行。 - 运行处于等待状态时,继续进行非阻塞式追踪改进:
- 添加代码路径中可见的安全跨度增强信息,例如稳定的
conversation、turn、stt、llm、tts、llm_tool_call、transport或提供商跨度 - 添加有界且高价值的属性,例如
metrics.ttfb、令牌数、结束原因、工具名称、安全的工具参数摘要、状态和错误 - 添加可转化为指标的客户信号数值属性,例如
tool.error、tool.latency_ms、tool.call.count、workflow.dependency_blocked、workflow.completed和workflow.fallback_used - 改进实现过程中发现的刷新/关闭、缓冲、批次大小、重试或部署打包问题
- 根据预期跨度和已有的历史 Coval 追踪数据,准备自定义追踪指标候选项;通用时长或跨度计数指标只能作为诊断证据,除非它们能回答客户的运营问题
- 当需要追踪上下文来评估顺序、工具输出依据、工具调用前验证或工具错误恢复时,准备设置
include_traces=true的追踪感知型 LLM 评判指标候选项
- 添加代码路径中可见的安全跨度增强信息,例如稳定的
- 等待期间,只有真实追踪数据已证明跨度名称和指标属性存在时,才创建自定义追踪指标;证明数据可以来自历史追踪运行,也可以来自进行中的验证(跨度出现在 Trace Search 中后)。如果此次验证是该 Agent 的首次追踪,则等待期间先拟定指标定义,并在运行产生已确认的跨度后立即创建。
如果 Metrics OpenAPI 支持
include_traces,且追踪感知型 LLM 评判指标的提示词依赖于首条追踪已证明存在的追踪上下文,则应在后续验证运行之前创建这些指标。 - 运行结束后,确认 Agent 导出返回了 200,或导出器记录了批次已成功接收。独立测试脚本返回 404 只能证明身份验证/连接正常,不能证明生命周期接线正常。
- 打开 Coval 运行或对话结果,并确认 OTel Traces 卡片或 Trace Search 结果已显示。
- 检查追踪中是否包含预期跨度和属性。如果缺失、稀疏、重复或关联到了错误结果,请停止继续创建指标,并在继续之前应用
debug-traces。 - 追踪密度自检。 宣布成功前,按名称统计跨度数量。如果某个跨度名称占总跨度的比例超过约 70%,且这些跨度各自都短于约 50 ms,那么它几乎肯定是逐块/逐帧噪声。将其合并为父跨度上的计数器属性,并在向客户打开结果前重新部署;否则追踪查看器会显得空空如也。不要等客户指出视觉噪声。
- 从导出器确认关联已激活,而不是查看已有的 Agent 计数器。 Agent 上已有的计数器(例如
non_audio_messages或non_setup_frames)通常会在设置/初始化分支返回后才递增,因此即使关联成功也可能显示0。模拟 ID 已到达导出器的权威信号是 OTel 日志行(activated OTLP export simulation_id=<id>)或批处理器的批次已接收日志。先检查这些信号;只有导出器从未激活时,才追查计数器。 - 确认初始追踪后,完成所有已准备的指标创建;如果公共 API 支持,则通过 CLI/API 运行一次后续计算/预览/关联运行检查。
- 如果更改了指标定义或关联了新指标,请在更改后执行验证,并持续轮询,直到运行状态为终态(
COMPLETED、FAILED或CANCELLED),且每个新关联的追踪指标在模拟上都有终态输出(COMPLETED或FAILED)。即使progress.completed_test_cases已等于total_test_cases,只要输出仍为IN QUEUE/IN PROGRESS,就不要停止。 - 如果以往运行中有
FAILED的追踪指标,请对照实施了你的埋点和指标更改后启动的第一轮运行进行验证,不要把旧运行当作当前状态的证明。较早运行中的指标失败,可能是因为当时的定义已过时,不再与最新埋点相匹配。 对于 WebSocket Agent,请让冒烟交互持续足够长的时间,以触发 Agent 的响应阈值。如果客户端发送的音频太少,或 Agent 等待的静音/音频时长超过 Coval 发送的时长,即使导出器已正确接入,追踪也可能看起来无法正常工作。如果ttsspan 在播放部分音频后因 WebSocket 断开而标记为ERROR,请缩短预设响应,或在客户端关闭连接时停止流式传输。
仅检查连通性的可选项:
python skills/traces/setup-tracing/scripts/send-test-span.py \
--api-key "$COVAL_API_KEY" \
--simulation-id coval-tracing-test
如果出现 404 和 Simulation output not found,说明密钥已到达 Coval 且身份验证成功,但这并不能证明 Agent 调用生命周期已接通。
交接
结束时提供:
- 更改了哪些文件及原因
- 使用的确切关联路径
- 客户如何设置必需的环境变量
- 运行的命令,包括 Coval 启动和轮询命令/API 端点
- 用于证明的 Coval 追踪 URL 或 simulation/conversation ID
- 以下页面的 Coval 直接 URL:
- runs 列表(
https://app.coval.dev/<org-slug>/runs?sort=createdAt%3Adescending) - run 详情(
https://app.coval.dev/<org-slug>/runs/<run-id>) - run 结果(
https://app.coval.dev/<org-slug>/runs/<run-id>/results/<simulation-output-id>) - 追踪查看器(
https://app.coval.dev/<org-slug>/runs/<run-id>/results/<simulation-output-id>/traces)
- runs 列表(
- 已创建、暂存或推迟的自定义追踪指标及原因
- 仍需通过
optimize-trace-observability、configure-trace-metrics或debug-traces处理的任何问题