日志采样
采样高量非错误日志控成本同时保 100% 错误和警告。
为什么
处理 10000 请求/s 每请求 INFO 日志的服务产 600000 日志/分钟 — 即 30B 日志/天,存储 $30k/月且使查询慢。但你不需要每 INFO 日志;你需要所有 ERROR(100%,不采样 — 错误罕见且重要)、所有 WARN(100%,它们是降级信号)和 INFO 样本(1-10%,足以看流量模式并经 trace_id 调试特定请求)。这是尾采样:按级别采样非随机。成本降 90%(保 10% INFO)同时保 100% 事件要紧 的日志。关键规则:从不采样错误。若你 1% 采 ERROR,漏 99% 错误且值班看净仪表盘而服务在失败。
何时使用
当日志量超预算或查询延迟。从 100% 保留始;仅当成本或速度迫时采样。
如何做
1. 从不采样 ERROR 或 WARN 日志 - 这些罕见且重要;采样它们失日志目的 - 配置:level=ERROR → 保 100%;level=WARN → 保 100% 2. 按率或 trace_id 采样 INFO 日志 - 率:保 10% INFO 日志(随机采样) - 基于 trace:保 100% 有 ERROR 的 trace,余采样(尾) - 尾更好 — 它为失败请求保全 trace 3. 用一致哈希做概率采样 - 哈希 trace_id;若 hash % 100 < sample_rate 则保 - 这确保保的 trace_id 的所有日志保(无部分 trace) 4. 按服务调采样率 - 高量服务(checkout):1% INFO - 低量服务(admin):100% INFO - admin 服务日志便宜保且调试有用 5. 监控采样率并调 - 按服务跟踪"保日志 / 发日志" - 若服务错误率升,临时把其 INFO 采样率提到 100% 供诊断
示例
# 采样配置(Loki/Fluentd):
sampling:
- match: { level: "ERROR" }
keep: 1.0 # 100% — 从不采样错误
- match: { level: "WARN" }
keep: 1.0 # 100% — 从不采样警告
- match: { level: "INFO", service: "checkout" }
keep: 0.01 # 1% — 高量服务
strategy: "trace_hash" # 按 trace_id 一致
- match: { level: "INFO", service: "admin" }
keep: 1.0 # 100% — 低量,便宜保
# 尾采样(OpenTelemetry Collector):
processors:
tail_sampling:
decision_wait: 10s
policies:
- name: errors
type: status_code
status_code: { status_codes: [ERROR] } # 保 100% 错误 trace
- name: sample-rest
type: probabilistic
probabilistic: { sampling_percentage: 1 } # 余 1%
# 结果:
# - 所有 ERROR/WARN 日志保(100%)→ 事件全可见
# - 1% checkout INFO 日志保 → 成本降 90%,流量模式仍可见
# - 100% admin INFO 日志保 → 便宜,调试有用
# - 任何带 ERROR 的 trace → 100% 该 trace 日志保(尾)常见问题
- ⚠采样错误 — 1% 错误采样意 99% 错误不可见;值班看净仪表盘而服务失败。
- ⚠无 trace 感知的随机采样 — 保半 trace 日志,故值班看开始非失败且无法重构请求。
- ⚠全 100% 保留 — 成本 $30k/月且查询慢;采样高量 INFO 保 100% 要紧的。
- ⚠所有服务同采样率 — 高量 checkout 服务淹聚合器而低量 admin 服务过采样。
最佳实践
- ✓从不采样 ERROR 或 WARN 日志(保 100%);仅采样 INFO,并用尾采保 100% 带错误的 trace。
- ✓用按 trace_id 一致哈希采样使保 trace 的所有日志保(无困惑值班的半 trace)。
- ✓按服务调采样率:高量(checkout)1%、低量(admin)100%;监控"保日志 / 发日志"并调。
- ✓事件或错误率升时临时把采样提到 100%;为成本采样非为信号失。