浏览 AI使用教程

线上报错先看浏览器、应用、代理还是上游

线上 502 可能来自浏览器到上游之间的任何一层。固定同一个请求,沿代理、应用和依赖保存时间线,才能避免多人同时改动把证据抹掉。

先比较关键条件,再作选择

把自己的条件代入判断项;没有证据的维度保留未知,不用印象替代结论。

先别急着选

所有人一起改以后错误消失了,根因反而更难找到

同一请求在代理等待响应时达到 30 秒,浏览器收到 504;应用日志随后才出现上游超时。要区分连接建立失败和连接已建立后迟迟未返回响应。

时间、请求 ID 和日志均为构造示例,未执行生产故障恢复。

  • 同一 requestId 贯穿各层
  • 每层状态和耗时可见
  • 修复后从公开入口复测
同一请求的阶段证据

已建立连接,随后等待响应头超时

教学日志

统一为 UTC 时间与 req-demo-39

14:05:00.000Z app request_start id=req-demo-39 path=/reports/7
14:05:00.010Z app vendor_request_start id=req-demo-39 timeout_ms=35000
14:05:30.001Z proxy id=req-demo-39 status=504 upstream_connect_time=0.002 request_time=30.001
14:05:30.001Z proxy upstream timed out while reading response header from upstream
14:05:35.015Z app vendor_timeout id=req-demo-39 elapsed_ms=35005

真实 Nginx error log 不一定包含业务请求 ID,需结合连接标识、时间、请求和 access log 关联;不能伪称每种默认日志格式天然携带 ID。

证据能支持到哪一步

证据支持的判断仍不能确认
connect_time=0.002 且 app request_start该次代理到应用连接已建立其它请求是否也成功
while reading response header等待上游响应头阶段超时为何应用迟迟没有首部
同一 ID 的 vendor_timeout应用也遇到依赖等待超时网络、限流、服务处理还是应用超时设置所致

Nginx proxy_read_timeout 指相邻读取操作之间的超时,不是整个响应的总时长上限。参见 https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout 。

本例材料

先把本例的条件、限制和目标摆出来

需要确认本例内容
现有材料req-demo-39,GET /reports/7,代理上游连接耗时 0.002 秒,总耗时 30.001 秒;下方时间线为教学构造。
不能越过的边界沿同一请求时间线检查浏览器、DNS/TLS、代理、应用和上游;一次只验证一个层;不以重启代替诊断。
要交付的结果故障层级与请求时间线
决定依据

线上服务报错排查,哪些条件会改变最后选择

判断条件本例怎么核对
从用户现场开始记录 URL、账号范围、步骤、时间、地区、浏览器、实际和预期,保留网络请求与响应。
确认边缘与代理检查 DNS、证书、CDN、负载均衡和 Nginx 实际命中的配置、状态和上游目标。
检查应用按请求 ID 查应用日志、版本、实例、异常和资源,区分错误响应与进程不可用。
检查数据和外部依赖关联慢查询、锁、队列、缓存和上游响应,统一时区并识别超时是谁先触发。
用最小请求复测在同一路径逐层旁路或替换,验证根因;任何生产变更先备份、校验和准备回滚。
代入本例

线上服务报错排查:按本例条件得到的结论

可以确认

故障层级与请求时间线

本例证据支持:代理已连上应用,在等待响应头时先达到读取超时;应用 35 秒后记录外部依赖超时。尚不能由这些日志断言外部依赖为何变慢,也不能把它写成连接应用超时。

仍需确认

边界变化后需要重新判断

若缺少某层日志,只能保留假设,不能用错误码直接宣布归因。

常见失败

为什么“将 upstream timed out 一律理解成无法连接”还不能交付

将 upstream timed out 一律理解成无法连接

原因
忽略 while connecting 与 while reading response header 的阶段差异
怎么改
连同连接耗时、响应头耗时、应用接收记录一起判断
验收方式

故障层级与请求时间线通过哪些检查才算完成

进一步核对

部署与线上:参考资料与核对入口