4. 错误(Errors)指标详解:错误率定义、HTTP错误码分类、业务错误码、错误预算概念、阈值设定
错误(Errors)是黄金指标的第二个核心支柱。如果说延迟衡量的是“快不快”,那么错误衡量的就是“对不对”。在可观测性体系中,错误不仅仅是HTTP 500状态码,它涵盖了从基础设施到业务逻辑的每一个可能出错的环节。本节将系统性地拆解错误指标的定义、分类、预算机制与阈值设定方法。
4.1 错误率定义:从单点故障到全局视角
错误率是衡量系统健康度的关键比率指标。其核心定义公式为:
错误率 = (错误请求总数 / 总请求数) × 100%
在实际SRE实践中,错误率的计算粒度决定了告警的灵敏度。常见的错误率计算维度包括:
- 全局错误率:所有服务实例的聚合错误率,用于宏观健康度评估。
- 分实例错误率:单个Pod或节点的错误率,用于定位故障域。
- 分接口错误率:特定API端点的错误率,用于精细化监控。
- 分用户错误率:特定用户群体或租户的错误率,用于SLA差异化保障。
实践建议:在定义错误率时,务必明确分母是“所有请求”还是“有效请求”。排除健康检查(Health Check)和爬虫流量,避免错误率被非业务流量稀释。
4.2 HTTP错误码分类:标准协议层的错误语义
HTTP协议定义了清晰的状态码分类,这是错误指标最直接的来源。SRE需要理解每一类状态码的业务含义,并据此设计告警规则。
| 状态码范围 | 分类 | 典型错误码 | SRE关注点 |
|---|---|---|---|
| 1xx | 信息响应 | 101 (Switching Protocols) | 通常不纳入错误率计算,但WebSocket升级失败需关注 |
| 2xx | 成功 | 200 (OK), 201 (Created) | 正常业务流量,错误率计算中的分母 |
| 3xx | 重定向 | 301 (Moved Permanently), 302 (Found) | 异常重定向循环(如302风暴)需单独告警 |
| 4xx | 客户端错误 | 400 (Bad Request), 401 (Unauthorized), 403 (Forbidden), 404 (Not Found), 429 (Too Many Requests) | 区分“客户端可控”与“服务端可控”错误;429通常需要限流告警 |
| 5xx | 服务端错误 | 500 (Internal Server Error), 502 (Bad Gateway), 503 (Service Unavailable), 504 (Gateway Timeout) | 核心告警指标,直接反映服务可用性 |
常见误区:不要将所有4xx错误都视为“客户端问题”而忽略。例如,频繁的401可能意味着认证服务故障;大量的404可能暗示路由配置错误或服务发现失效。建议对4xx错误按子类进行分桶监控。
4.3 业务错误码:超越HTTP协议的应用层语义
HTTP状态码只能表达传输层的成功或失败,无法描述业务逻辑的成败。例如,一个支付接口返回HTTP 200,但响应体中包含“余额不足”的业务错误码。因此,业务错误码是错误指标体系中不可或缺的一环。
业务错误码的设计原则:
- 唯一性:每个错误场景有唯一的错误码,便于快速定位。
- 可枚举:所有业务错误码应在文档中明确列出,避免出现“其他错误”的兜底码。
- 分级:按严重程度分为WARN(警告)、ERROR(错误)、FATAL(致命)。
典型的业务错误码分类示例:
| 错误码范围 | 业务域 | 示例 | 告警级别 |
|---|---|---|---|
| 1000-1999 | 用户认证 | 1001: 过期, 1002: 密码错误 | WARN |
| 2000-2999 | 订单系统 | 2001: 库存不足, 2002: 重复下单 | ERROR |
| 3000-3999 | 支付系统 | 3001: 余额不足, 3002: 支付超时 | ERROR |
| 9000-9999 | 系统内部 | 9001: 数据库连接失败, 9002: 缓存穿透 | FATAL |
// 业务错误码响应体示例(JSON)
{
"code": 2001,
"message": "库存不足",
"severity": "ERROR",
"request_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}
4.4 错误预算概念:可用性与迭代速度的博弈
错误预算(Error Budget)是Google SRE提出的核心管理概念,它将可用性目标转化为可量化的“错误容忍度”。
核心公式:
错误预算 = 1 - 可用性目标(SLO)
例如:如果SLO为99.9%,则错误预算为0.1%(即每月约43分20秒的不可用时间)
错误预算的消耗与燃尽:
- 每次发生错误(5xx或业务FATAL错误)都会消耗错误预算。
- 当错误预算消耗超过阈值(如剩余不足20%),应触发告警并限制高风险发布。
- 当错误预算耗尽,应触发“冻结期”,停止所有非必要变更,全力修复稳定性。
关键认知:错误预算不是用来“节省”的,而是用来“投资”的。只要预算充足,团队可以大胆进行功能迭代和架构升级;预算紧张时,则优先偿还技术债务。这种机制将稳定性从“约束”转化为“资源”。