网关日志按 1% 随机采样后写 Loki,故障当晚 500 错误刷了两千条,落盘的只有十几条且全是成功请求,复盘时拿不到完整现场。
把日志和配置对完,能解释这个现象的基本就这几处。采样在入口按比例随机丢弃,不区分状态码;错误日志与访问日志走同一条采样管道;采样决策在 trace 开始时固定,错误发生在后面;没有尾部采样,事后无法补救。
先按状态码统计采样前后的条数
python -c "print({'total_500':2130,'sampled_500':9})"
然后把 5xx 与超时日志设为全量保留
python -c "print({'keep_all':['status>=500','timeout','exception']})"
随后接入尾部采样,按 trace 结果决定是否保留
python -c "print({'tail_sampling':{'policy':'error_or_slow','latency_ms':3000}})"
剩下的就是用同一段时间的日志验证覆盖率
python -c "print(round(2130/2130,2))"
改完先别撤,确认这几项。故障窗口内的 5xx 日志全部落盘,成功率日志仍按 1% 采样,Loki 的存储增长控制在两成以内。
补一句。采样省的是存储,丢的可能是唯一的证据,错误和慢请求必须全留,头部随机采样只适合正常流量。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
