【免费下载链接】autoskills
One command. Your entire AI skill stack. Installed.
导读
本文是 autoskills 仓库中 cloudflare-deploy 技能包observability参考集的排障篇(gotchas.md)的完整实战展开。它聚焦于 Cloudflare Workers 可观测性体系中"日志不出现、Trace 不采集、查询结果不准、时间精度变粗"等高频故障与性能陷阱,并给出可直接复制的排查命令、配置样例与 SQL 修正写法。读完本文,你将掌握 Workers Logs、Workers Traces、Analytics Engine 三类观测组件的排障路径、硬性限制边界、采样语义以及 2026 年定价结构,能够在生产 Worker 上快速定位观测数据缺失的根因。
一、排障定位:为什么需要这份 gotchas
在 observability/README.md 给出的决策树中,gotchas 文件被明确路由到两类问题:"Why isn't X working?"(为什么观测不到数据?)与 "Limits?"(限制是什么?)。该参考集按任务类型给出了不同的加载顺序:
| 任务类型 | 加载顺序 | 原因 |
|---|---|---|
| 初始搭建 | configuration.md → gotchas.md | 先配置,再避开陷阱 |
| 实现功能 | patterns.md → api.md → gotchas.md | 模式 → API 细节 → 边界情况 |
| 调试问题 | gotchas.md → configuration.md | 先看常见问题 |
| 查询数据 | api.md → patterns.md | API 语法 → 查询示例 |
也就是说,当你在 configuration.md 完成observability配置、按 patterns.md 落地埋点之后,真正决定观测链路是否可用的,正是本文要展开的这些"坑"。排障时请按 gotchas → configuration 的顺序反查配置。
二、常见错误排障
2.1 "Logs not appearing"(日志不出现)
可能原因:可观测性功能未启用(observability.disabled)、Worker 未重新部署、线上没有流量、采样率(head_sampling_rate)过低,或单条日志超过 256 KB 被截断丢弃。
排查步骤:按"配置 → 部署 → 流量 → 采样 → 体积"五步定位:
# 1. 验证配置:检查 observability 字段是否开启 cat wrangler.jsonc | jq '.observability' # 2. 检查部署:确认最近一次部署确实包含了该配置 wrangler deployments list <WORKER_NAME> # 3. 测试流量:制造一次真实请求,触发日志输出 curl https://your-worker.workers.dev结论判定:
- 确保
observability.enabled = true;配置文件修改后必须重新wrangler deploy才会生效,仅改本地文件不会产生任何观测数据; - 检查
head_sampling_rate——若被调低(如 0.05),则只有对应比例的请求会进入采样,低流量 Worker 下日志自然稀疏; - 确认确实有流量到达(
curl一次即可验证); - 日志对象体积超过 256 KB 会被静默截断,超长日志请拆分输出。
2.2 "Traces not being captured"(Trace 未采集)
可能原因:Trace 未显式开启、采样率设置不正确、Worker 未重新部署,或 Trace 目标端(如 Logpush 目的地)不可用。
排查做法:临时将采样率提到 100% 做全量调试,先确认链路本身没问题,再恢复采样:
// 临时调试配置:100% 采样 + 显式开启 traces { "observability": { "enabled": true, "head_sampling_rate": 1.0, "traces": { "enabled": true } } }结论判定:确保observability.traces.enabled = true;调试期间把head_sampling_rate设为1.0;重新部署 Worker;最后检查 Trace 目的端状态(如 Logpush Job 是否 enabled、目标 bucket/endpoint 是否可达)。调试完成后,务必把采样率调回生产值(详见下文"环境差异化配置"),避免 Trace 费用失控。
2.3 环境差异化配置:避免调试配置泄漏到生产
configuration.md 给出了开发与生产分离的标准做法——开发环境全量采样便于排障,生产环境降采样控成本:
// wrangler.dev.jsonc —— 开发:全量采样 { "observability": { "enabled": true, "head_sampling_rate": 1.0, "traces": { "enabled": true } } }// wrangler.prod.jsonc —— 生产:10% 采样 { "observability": { "enabled": true, "head_sampling_rate": 0.1, "traces": { "enabled": true } } }wrangler deploy --config wrangler.prod.jsonc --env production注意head_sampling_rate的语义:默认值是1.0(100% 采样);高流量 Worker 建议降到0.01 ~ 0.1(1% ~ 10%)。采样率同时影响 Logs 与 Traces 的采集量,是"日志不出现"最常见的误配根因。
三、限制表:观测链路的硬边界
下表是 gotchas 文档给出的官方限制汇总,排查"数据丢失/被截断"类问题时逐项对照:
| 资源/限制 | 数值 | 说明 |
|---|---|---|
| 单条日志最大体积 | 256 KB | 超出会被截断(超长日志请拆分) |
| 默认采样率 | 1.0(100%) | 高流量 Worker 应降低 |
| 最大目的地(Logpush)数量 | 随套餐而异 | 以 Cloudflare Dashboard 实际显示为准 |
| Trace 上下文传播深度 | 最多 100 个 span | 深层调用链可能丢失 span |
| Analytics Engine 每请求写入速率 | 25 次写入/请求 | 超出部分静默丢弃 |
其中"25 次写入/请求"与 api.md 中的字段上限一致:单点最多 20 个 indexes、20 个 blobs、20 个 doubles,单请求最多 25 次writeDataPoint调用。这解释了为什么高吞吐 Worker 必须在写入端做预聚合(见 4.2 节)。
注意:所有"静默丢弃"类限制都不会抛出异常——这正是观测链路最难排查的原因:代码正常、无报错,但数据就是缺。
四、性能陷阱(Performance Gotchas)
4.1 Spectre 缓解导致的时间精度粗化
问题:Date.now()与performance.now()返回的时间精度被粗化(coarsened)到 100μs 级别。这不是 Cloudflare 的 bug,而是 V8 引擎为缓解 Spectre 侧信道漏洞而做的全局降精度处理。
解决思路:面向用户展示耗时用Date.now()完全够用;需要微秒级精确时序做性能分析时,改用 Workers Traces(其 span 记录的是平台侧的精确执行时长,不受 JS 侧降精度影响):
export default { async fetch(request: Request, env: Env, ctx: ExecutionContext): Promise<Response> { // 用户可感知的耗时统计:Date.now() 足够 const start = Date.now(); const response = await processRequest(request); const duration = Date.now() - start; // 精细性能分析:改用 Workers Traces(span 精确) return response; } }换言之:不要把Date.now()的差值当作微秒级性能基准,它粗化到 100μs;同一请求的精确 CPU/wall 时间应通过 Trace 的cpuTime/wallTime(单位微秒,见 api.md 中TraceEvent类型)获取。
4.2 Analytics Engine_sample_interval聚合:不乘就错
问题:Analytics Engine 存储的是"采样后的数据点",每个数据点代表多个真实事件(一个点等价于_sample_interval个事件)。如果聚合查询直接用COUNT(*),结果会系统性低估真实事件数。
解决思路:所有计数/求和类聚合必须乘以_sample_interval:
-- 错误:低估真实事件数 SELECT blob1 AS customer_id, COUNT(*) AS total_calls FROM api_usage GROUP BY customer_id; -- 正确:按采样间隔还原真实事件数 SELECT blob1 AS customer_id, SUM(_sample_interval) AS total_calls FROM api_usage GROUP BY customer_id;这一语义贯穿整个参考集:api.md 的时间序列查询用SUM(_sample_interval)计算total_requests,patterns.md 的用量计费查询用SUM(_sample_interval * double1)还原total_calls——两者都遵循"乘采样间隔"规则。凡是带double数值的计费/统计字段,请统一写成SUM(_sample_interval * doubleN)。
关联陷阱(高吞吐预聚合):在 analytics-engine/gotchas.md 中,当写入速率超过约 1M writes/min 时,Analytics Engine 会进入采样模式,查询返回的点数会少于实际写入数。官方建议写入端先聚合再写:在内存里累计{ count, total },每秒只写一次数据点,而不是每请求写一次。检测是否进入采样:npx wrangler tail日志中查找 "sampling enabled" 字样。同文件还提醒:writeDataPoint返回void、写入可能静默失败,因此不要await它,并以尾日志(tail logs)作为写入成功与否的观测手段。
4.3 Trace 上下文传播深度限制(100 span)
问题:Cloudflare 将 Trace 传播深度限制为最多 100 个 span,目的是防止深层调用链拖垮性能。超过深度的 span 会丢失上下文,下游 Trace 断链。
解决思路:设计更扁平的服务架构;对不可避免的深层调用链,引入自定义关联 ID(correlation ID)跨服务传递:
// 深层调用链:生成自定义关联 ID const correlationId = crypto.randomUUID(); console.log({ correlationId, event: 'request_start' }); // 通过请求头透传给下游服务,实现跨服务串联 await fetch('https://api.example.com', { headers: { 'X-Correlation-ID': correlationId } });配合 patterns.md 的 Tail Worker 过滤模式,可以在下游用该 ID 把分散日志聚合回一条调用链视图。
五、2026 年定价:三类观测组件的成本结构
5.1 Workers Traces
- GA 定价(2026 年 3 月 1 日起生效):每 100 万 span 0.10 美元;
- 免费额度:每月 1000 万 trace span;
- 保留期:14 天(包含在定价内);
- 说明:2026 年 3 月 1 日之前的 Beta 期用量免费。
实操含义:head_sampling_rate = 1.0的 100% 全量采样在高流量下会迅速消耗免费额度,生产环境务必按 configuration.md 的建议将采样率压到 0.01 ~ 0.1。
5.2 Workers Logs
- 包含项:所有 Workers 免费;
- Logpush:需要 Business/Enterprise 套餐;
- 保留:Dashboard 实时日志仅实时可见、无历史存储(历史归档依赖 Logpush 外发)。
5.3 Analytics Engine
- 包含项:Paid Workers 套餐每月 1000 万次写入;
- 超额:超出部分每 100 万次写入 0.25 美元;
- 保留期:90 天(可按需配置到最长 1 年)。
结合 observability/README.md 的定价总表,三类组件的免费边界可归纳为:Logs 永久免费、Traces 每月 1000 万 span、Analytics Engine 每月 1000 万写入。预算控制的核心杠杆是采样率(Traces)与写入预聚合(Analytics Engine)。
六、实战要点总结
把 gotchas 的排障逻辑收敛为以下可执行清单:
- 日志缺失:按
jq查配置 →wrangler deployments list查部署 →curl造流量 → 查head_sampling_rate→ 查 256 KB 截断,五步依次排除; - Trace 缺失:临时 100% 采样 + 显式
traces.enabled,确认链路后立刻恢复采样并重新部署; - 查询总量偏低:Analytics Engine 聚合必须乘
_sample_interval(SUM(_sample_interval)或SUM(_sample_interval * doubleN)); - 时序不准:JS 侧
Date.now()/performance.now()精度粗化到 100μs,精确分析用 Workers Traces 的cpuTime/wallTime; - 深层调用链断链:>100 span 即丢失上下文,用
X-Correlation-ID自建关联; - 成本失控:生产环境降采样(0.01~0.1)、写入端预聚合(每秒 1 次)、关注 2026 GA 定价的免费额度边界。
上述结论均可在仓库中交叉验证:配置语义见 configuration.md,SQL/API 写法见 api.md 与 patterns.md,Analytics Engine 的采样与写入边界见 analytics-engine/gotchas.md。排障顺序始终是:先查 gotchas 的常见错误,再回查 configuration 的配置项——大多数"观测不到数据"的问题,都藏在采样率、重新部署和静默截断这三件事里。
【免费下载链接】autoskills
One command. Your entire AI skill stack. Installed.
相关推荐
Krokiet 免费离线磁盘清理工具:从重复文件识别到照片隐私清理
Krokiet 免费离线磁盘清理工具:从重复文件识别到照片隐私清理 Krokiet 是一款用 Rust 编写的免费、全程离线的磁盘清理工具:它靠内容哈希找出重复
桌面应用autoskills Cloudflare 技能:Workers 可观测性配置全解(Logs、Traces、Analytics Engine、Tail Workers 与 Logpush)
autoskills Cloudflare 技能:Workers 可观测性配置全解(Logs、Traces、Analytics Engine、Tail Work
Cloudflare Workers 可观测性全景实战:Workers Logs、Traces、Analytics Engine、Tail Workers 与 Logpush
Cloudflare Workers 可观测性全景实战:Workers Logs、Traces、Analytics Engine、Tail Workers 与
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考