【服务出错问题排查记录】从一个“点击失败”开始:为什么“系统异常”其实是最差的错误设计

张开发
2026/4/13 1:49:18 15 分钟阅读

分享文章

【服务出错问题排查记录】从一个“点击失败”开始:为什么“系统异常”其实是最差的错误设计
一、问题起点一次“无信息”的失败​ 那天我在页面上点击一个功能按钮预期是触发一次 URL 分析任务。但页面只返回了一句❗“系统异常请稍后重试”。​ 没有错误详情没有接口信息也没有任何可追踪线索。作为算法工程师我的第一反应是是模型推理失败是输入数据异常还是后端服务挂了但很快我意识到一个更本质的问题❗这个错误对“定位问题”没有任何帮助。在这种提示下系统其实等于告诉我一句话“出错了但你自己想办法。”但工程上真正的问题是❗我甚至不知道这个按钮调用的是哪个接口二、从黑盒到请求层错误开始变得“可见”​ 在页面只给出一句“系统异常”的情况下所有业务逻辑都被隐藏在前端之后。这时候能做的第一件事不是猜后端而是把前端请求“扒出来”。2.1 查看真实请求信息​ 我打开了浏览器开发者工具F12切换到 Network 面板开始重新触发按钮操作。关键动作切换到Network过滤XHR / Fetch再次点击页面按钮触发请求这个动作本身很简单但本质上是在做一件事❗把“黑盒交互”变成“可观测请求流”。因为在没有日志、没有报错详情的情况下Network 面板就是唯一能看到系统真实行为的窗口。2.2 定位接口​ 很快一个请求出现了/xxx/po_monitoring/inference​ 在此之前这个系统对我来说是“完全黑盒”的不知道前端调用了什么接口不清楚后端服务结构没有任何请求链路信息而此刻我第一次看到了真实的后端入口。三、接口暴露与问题定位从现象到结构我点击该请求重点确认三部分信息Request URLhttps://xxx/algoapi/po_monitoring/inferenceRequest Payload{text:www.paypal.com}Response{code:500,message:Internal Server Error}​ 这一刻问题发生第一次转向从页面为什么报错变成这个接口为什么返回 500。同时我也重新理解了这个接口的结构/xxx/po_monitoring/inference层级含义xxx后端服务po_monitoring业务模块inference功能入口​ 可以看出这不是“模型接口”而是后端业务系统中的一个函数入口。四、验证与隔离排除前端干扰​ 为了确认问题不在前端我直接用 curl 复现请求curl-XPOSThttps://xxx/po_monitoring/inference\-HContent-Type: application/json\-d{text:www.paypal.com}-k​ 返回结果完全一致{code:500,message:Internal Server Error}​ 此时可以确定前端不是问题来源请求已经成功到达后端后端执行过程中发生异常但问题也开始变得更棘手❗错误存在但不可见没有 traceback五、真正的问题错误信息不可观测​ 到这里问题已经不再是接口本身而是错误设计本身当前系统只能提供{code: 500, message: Internal Server Error}但对于排障来说这几乎等于没有信息。缺失的关键内容包括具体接口路径的错误归属异常类型模型错误 / 参数错误 / 代码异常后端模块信息trace_id无法追踪日志具体异常堆栈六、一个更合理的错误设计应该是什么样​ 如果系统稍微“工程化”一点返回的应该是这样的信息{code:500,api:/xxx/po_monitoring/inference,error_type:ModelInferenceError,message:input parsing failed,trace_id:xxxxxx}​ 这样至少可以做到出错知道在哪个接口可以关联日志 trace_id可以区分错误类型可以快速定位后端模块六、结语​ 这次排障到这里暂时结束。问题已经从前端页面推进到了后端接口层但也卡在了更深一层的系统内部错误是存在的请求是通的但具体异常点不可见这次经历最大的变化不是找到问题而是第一次清晰看到排障不是从“现象”开始而是从“请求链路”开始。

更多文章