把散开的日志捆成因果
目标
叠加三种不同格式的日志,将分散的事实串联为一条因果链。
为什么重要
从错误日志开始查看很自然,但这等于从故事中间开始阅读。典型的性能劣化过程是:变更 → 部分请求变慢(警告)→ 资源被占用 → 超时(错误)→ 告警。只看错误日志时,只能看到最后两个阶段。因此,应提出的问题不是“错误从什么时候开始”,而是**“从什么时候开始不再正常”**,最早出现警告级别日志的时间就是答案。
本练习还会让你看到平均值的无力。整体平均延迟无法代表任何一个请求,而“超过 1000ms 的请求有多少个”却能立即暴露问题。如果只能提取一个指标,请选择超过阈值的数量,而不是平均值。
三份日志
/opt/data/app.jsonl— 每行一个 JSON。ts,level,service,request_id,path,status,latency_ms,msg/opt/data/db-slow.log—ts=<epoch> duration_ms=<n> table=<name> query="..."/opt/data/deploy.log— 部署与回滚历史
步骤
- 创建
/root/correlate目录。 - 统计
app.jsonl中level为error的行数,并写入/root/correlate/error_count.txt。 - 将错误消息指向的表名写入
/root/correlate/table.txt。 - 计算所有
latency_ms的平均值,向下取整为整数后写入/root/correlate/avg_latency.txt。 - 将
latency_ms超过 1000 的请求数量写入/root/correlate/slow_count.txt。 - 找出
level为warn的最早一行,将其时间以HH:MM格式写入/root/correlate/first_warn.txt。 - 从
deploy.log中找出事故前刚刚部署的 payment 服务版本,并写入/root/correlate/version.txt。 - 在
/root/correlate/link.md中整理因果关系。必须包含部署版本、变慢的表、首次警告时间和错误时间。
参考
grep '"level": "error"' /opt/data/app.jsonl | wc -l- 使用一行 python3 解析可能更方便:
python3 -c "import json,sys; ..." - 如果有
jq,可以使用jq -r 'select(.level=="warn") | .ts' /opt/data/app.jsonl | sort | head -1 - 常见错误 1:第 4 步进行四舍五入。这里要求向下取整。
- 常见错误 2:第 6 步写入 error 首次出现的时间。warn 出现得更早,而两者之间的间隔正是本练习的重点。
创建工作目录
创建 /root/correlate 目录。
将结果集中放在 /root/correlate 下。
统计错误日志数量
统计 app.jsonl 中 level 为 error 的行数,并写入 /root/correlate/error_count.txt。
app.jsonl 每行都是一个 JSON。统计 level 字段为 error 的行。
确定问题所在的表
将错误消息指向的表名写入 /root/correlate/table.txt。
答案就在错误消息本身。认真读取一行的 msg 字段。
计算平均延迟
计算所有 latency_ms 的平均值,向下取整为整数后写入 /root/correlate/avg_latency.txt。
计算所有 latency_ms 的平均值,并向下取整为整数。该值将与后续步骤形成对比。
统计慢请求数量
将 latency_ms 超过 1000 的请求数量写入 /root/correlate/slow_count.txt。
统计 latency_ms 超过 1000 的请求数量。平均值无法展现的问题会在这里显现。
找出首次警告时间
找出 level 为 warn 的最早一行,将其时间以 HH:MM 格式写入 /root/correlate/first_warn.txt。
在 level 为 warn 的行中,取最早 ts 的 HH:MM。它早于错误发生时间。
找出事故前部署的版本
从 deploy.log 中找出事故前刚刚部署的 payment 服务版本,并写入 /root/correlate/version.txt。
答案是 deploy.log 中在事故时间之前刚刚部署的 payment 服务版本。
整理因果关系
在 /root/correlate/link.md 中整理因果关系。必须包含部署版本、变慢的表、首次警告时间和错误时间。
将部署版本、变慢的表、首次警告时间和错误时间汇总到同一份文档中。