【免费下载链接】autoskills
One command. Your entire AI skill stack. Installed.
导读
本篇指南围绕 autoskills 仓库中 Cloudflare Agents SDK 技能包的 observability.md 文档展开,讲解如何观测基于 Cloudflare Agents SDK 构建的 Agent 应用。Agents SDK 通过 Node.jsdiagnostics_channel向外部暴露结构化事件:开发环境可以直接在代码中订阅,生产环境则通过 Tail Worker 把事件转发到自建的可观测性平台。读完本文,你将掌握agents/observability的订阅 API、全部可用事件通道、按 Agent 粒度开关观测的配置方式,以及基于 Tail Worker 的完整生产采集链路。
背景:Agent 为什么需要独立的可观测性通道
Cloudflare Agents SDK 把每个 Agent 构建为持久化的 Durable Object,运行着状态管理、RPC、调度、WebSocket 连接等大量内部活动。SDK 将这些活动以结构化事件的形式发射到 Node.js 的diagnostics_channel上,而不是仅仅依赖console.log。这样做的好处是:
- 事件带有明确的通道名与载荷(payload),可以被程序化消费、过滤与转发;
- 开发与生产使用同一套事件模型,只是消费方式不同(进程内订阅 vs Tail Worker);
- 不侵入业务代码,Agent 类本身无需埋点。
在 agents-sdk/SKILL.md 的能力清单中,Observability 被明确列为 SDK 的核心能力之一("diagnostics_channelevents for state, RPC, schedule, lifecycle"),与持久化状态、Callable RPC、调度、Workflows 等能力并列,可见它是构建生产级 Agent 不可或缺的一环。
订阅事件:agents/observability的subscribe
开发环境下(例如本地wrangler dev调试、单元测试、或在同进程内运行 Agent),可以通过agents/observability模块导出的subscribe函数订阅事件。每个事件对象包含通道名与 payload,典型用法如下:
import { subscribe } from "agents/observability"; subscribe("agents:rpc", (event) => { console.log(`RPC call: ${event.payload.method}`); }); subscribe("agents:state", (event) => { console.log(`State change on ${event.agent}`); });从代码结构看,subscribe(channel, handler)的第一个参数是通道名,第二个参数是回调;回调收到的event对象携带payload(事件载荷,例如 RPC 调用的方法名)以及agent(触发事件的 Agent 名称或标识)。这种命名模式与 callable.md 中描述的@callable()机制相呼应——每次客户端通过 WebSocket RPC 调用 Agent 上的@callable()方法,都会触发一次agents:rpc事件,载荷中的method字段即被调用的方法名。
可用通道一览
原文档列出了 SDK 发射事件的全部通道。下表在保留原表的基础上,结合 state-scheduling.md 与 callable.md 补充了各事件对应的底层机制说明:
| Channel | Events | 触发来源 |
|---|---|---|
agents:state | State changes | setState()、validateStateChange()、onStateUpdate()触发的状态变更与同步 |
agents:rpc | @callableinvocations | 客户端通过 WebSocket 调用@callable()方法(含流式调用) |
agents:message | WebSocket messages | Agent 收到的 WebSocket 消息 |
agents:schedule | Schedule triggers | schedule()、scheduleEvery()触发的一次性或周期任务 |
agents:lifecycle | Agent start, connect, disconnect | onStart()、onConnect()、连接断开等生命周期钩子 |
agents:workflow | Workflow progress, completion, errors | AgentWorkflow的多步执行进度、完成与错误 |
agents:mcp | MCP server connections, tool calls | McpAgent/ MCP 客户端的连接建立与工具调用 |
agents:email | Email received | Agent 收到邮件 |
这 8 条通道覆盖了 Agent 运行时的全部关键活动面:状态写入(agents:state)、对外接口调用(agents:rpc)、实时通信(agents:message)、后台任务(agents:schedule)、进程生命周期(agents:lifecycle)、长时任务(agents:workflow)、工具集成(agents:mcp)与外部事件入口(agents:email)。在实际观测时,你可以:
- 只订阅关心的通道,降低日志噪音;
- 在同一回调里做聚合统计(如统计 RPC 调用频次、调度失败率);
- 把事件写入本地文件或转发到开发用日志服务。
按 Agent 粒度关闭观测:observability属性
并非所有 Agent 实例都需要发射事件。当某个 Agent 对可观测性没有要求(例如高吞吐的内部工具 Agent,或需要减少事件量的场景)时,可以通过类属性在单个 Agent 级别关闭事件发射:
export class MyAgent extends Agent<Env, State> { observability = undefined; // disable for this agent }这是 Agent 基类上的一个可配置属性:默认情况下 SDK 会为 Agent 发射diagnostics_channel事件;将其显式设置为undefined即可关闭该 Agent 的事件输出。它的粒度是"每个 Agent 类",因此你可以在同一 Worker 内精细控制——敏感的 Agent 保持可观测,冗余的 Agent 静默运行。
生产环境:通过 Tail Worker 采集与转发
开发环境可以在进程内直接subscribe,但生产环境中 Agent 运行在 Cloudflare 的边缘网络上,你无法在自己的 Node.js 进程里挂订阅回调。生产采集的官方路径是Tail Worker:给 Agent 所在的 Worker 挂一个 Tail Worker,Agent 发射的diagnostics_channel事件会以diagnosticsChannelEvents的形式出现在 Tail Worker 收到的event对象上,再由 Tail Worker 转发到你的可观测性平台。
Tail Worker 事件结构中的diagnosticsChannelEvents
根据仓库中 tail-workers/api.md 对TraceItem类型的描述,Tail Worker 的tail处理器收到的每个事件对象包含logs、exceptions、diagnosticsChannelEvents等字段,其中:
diagnosticsChannelEvents: Array<{ channel: string; // 例如 "agents:state"、"agents:rpc" message: unknown; // 事件载荷(即订阅回调中的 event.payload) timestamp: number; // epoch 毫秒 }>;也就是说,Agent 发射的通道名映射为channel字段,订阅回调中的payload映射为message字段。事件按epoch 毫秒计时,直接传给new Date(timestamp)即可,不要乘以 1000(api.md 中专门强调了这一坑点)。
最小可用的 Tail Worker
export default { async tail( events: TraceItem[], env: Env, ctx: ExecutionContext ): Promise<void> { const payload = events.map(event => ({ script: event.scriptName, timestamp: event.eventTimestamp, outcome: event.outcome, agentEvents: event.diagnosticsChannelEvents, })); // Tail 处理器没有返回值,异步工作必须挂在 waitUntil 上 ctx.waitUntil( fetch(env.LOG_ENDPOINT, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload), }) ); } } satisfies ExportedHandler<Env>;关键点:
- Tail 处理器不返回响应,任何异步转发都必须通过
ctx.waitUntil()完成; diagnosticsChannelEvents中可能包含不可 JSON 序列化的载荷(循环引用、BigInt 等),转发前建议做安全序列化(逐层 try/catch 降级为String(m));- 注意
outcome表示脚本执行状态(ok/exception/exceededCpu等),与 HTTP 状态码是两回事,排查 Agent 异常时两者要分开判断。
按事件类型路由与过滤
生产环境的事件量可能很大,通常需要过滤后再转发。tail-workers/patterns.md 给出了若干可直接套用的模式,这里结合 Agent 观测场景给出两个典型示例。
只转发 Agent 诊断事件中的错误(如 workflow 失败、schedule 异常):
export default { async tail(events, env, ctx) { const agentErrors = events.flatMap(event => (event.diagnosticsChannelEvents ?? []) .filter(d => d.channel === "agents:workflow" && d.message?.error) .map(d => ({ agent: event.scriptName, ts: d.timestamp, error: d.message.error })) ); if (agentErrors.length === 0) return; ctx.waitUntil(fetch(env.ERROR_ENDPOINT, { method: "POST", body: JSON.stringify(agentErrors), })); } };按比例采样以控制成本:
export default { async tail(events, env, ctx) { if (Math.random() > 0.1) return; // 10% 采样率 ctx.waitUntil(fetch(env.LOG_ENDPOINT, { method: "POST", body: JSON.stringify(events), })); } };持久化到 KV(带 TTL):
export default { async tail(events, env, ctx) { ctx.waitUntil( Promise.all(events.map(event => env.LOGS_KV.put( `agent:${event.scriptName}:${event.eventTimestamp}`, JSON.stringify(event.diagnosticsChannelEvents), { expirationTtl: 86400 } // 保留 24 小时 ) )) ); } };与 Cloudflare 观测体系的衔接
Tail Worker 只是采集入口,事件落地后的存储与分析可以对接 Workers Logs、Workers Traces、Analytics Engine 或 Logpush 等能力(详见 cloudflare-deploy 的 observability 参考)。典型链路为:Agent 发射diagnostics_channel事件 → Tail Worker 接收diagnosticsChannelEvents→ 过滤/采样/聚合 → 转发到自建平台(HTTP 端点)或写入 KV / Analytics Engine。Analytics Engine 尤其适合对事件做高基数维度(如按 Agent 名、按 RPC 方法名)的 SQL 聚合查询。
一套完整的开发到生产观测方案
综合以上内容,推荐的最小落地组合是:
- 开发阶段:在本地脚本或测试中调用
subscribe("agents:rpc", ...)、subscribe("agents:state", ...)等,验证 Agent 行为是否符合预期; - 上线前:评估哪些 Agent 需要观测,对无关紧要的 Agent 设置
observability = undefined减少边缘事件量; - 生产阶段:为 Agent Worker 配置 Tail Worker,按通道过滤
diagnosticsChannelEvents,通过ctx.waitUntil()异步转发至日志平台,并按需采样、落 KV 或写 Analytics Engine。
小结
Cloudflare Agents SDK 的可观测性设计以diagnostics_channel为统一事件总线:agents:state、agents:rpc、agents:message、agents:schedule、agents:lifecycle、agents:workflow、agents:mcp、agents:email八个通道覆盖了 Agent 的全部核心活动。开发环境用 agents/observability 的subscribe订阅,生产环境通过 Tail Worker 的diagnosticsChannelEvents采集转发,再配合按 Agent 粒度的observability属性做开关控制,即可在不侵入业务代码的前提下,为基于 Agents SDK 的应用构建出完整的可观测链路。
【免费下载链接】autoskills
One command. Your entire AI skill stack. Installed.
相关推荐
Cloudflare Tail Workers API 权威指南:用 TraceItem 与 tail() 处理器构建事件驱动的 Worker 可观测性
Cloudflare Tail Workers API 权威指南:用 TraceItem 与 tail 处理器构建事件驱动的 Worker 可观测性 导读 本文
人工智能AI 技能AI 插件KOReader 插件开发实战:5 个代码块做出你的第一个自定义插件
KOReader 插件开发实战:5 个代码块做出你的第一个自定义插件 KOReader 是跑在 Kindle、Kobo、PocketBook、Android 等
桌面应用跨平台嵌入式RocketRide WebSocket 可观测性协议:基于 `rrext_monitor` 订阅的实时事件流实战指南
RocketRide WebSocket 可观测性协议:基于 rrext_monitor 订阅的实时事件流实战指南 RocketRide 引擎将任务生命周期、周
人工智能大模型数据工程后端RAG本地部署MCP 服务前端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考