为省存储把 trace 采样率从 100% 降到 1%,一周后一笔金额不对的请求要复盘,按 request_id 查 Jaeger 完全没有记录,只能从应用日志里拼。
排查方向其实有限,先把可能性排一排。概率采样与请求好坏无关,错误请求同样被丢掉;没有按状态码与耗时做尾部采样;采样决策在上游完成,下游无法补采;request_id 与 trace_id 之间没有映射表。
第一件事是改成尾部采样,错误与慢请求全留
python -c "print('tail_sampling: error or latency>3s')"
日志里同时写 request_id 与 trace_id
python -c "print('log trace_id request_id')"
给慢请求单独提高采样权重
python -c "print({'slow_rate':1.0,'normal_rate':0.01})"
人为触发错误验证是否一定被留
python err_trace_test.py --status 500
这类问题以前遇到过,但这次的触发条件和上次不一样。
这类改动我都写进变更记录,过两周再出问题时能对上号。
改完先别撤,确认这几项。人为触发的 500 与 5 秒慢请求在 Jaeger 里都能查到,正常请求采样率仍接近 1%。
该省的是正常流量的 trace,错误和慢请求是最贵的样本,尾部采样是性价比最高的折中。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。
