比率的通用模式
比率查询的骨架是两部分相除:分子是符合条件的那部分,分母是全部。两者通常都用速率函数把计数转成每秒变化量,再相除得到比例。错误率、缓存命中率、成功率、超时占比,都是这一个模式的不同变体。
维度对齐为什么重要
分子带标签过滤而分母不带时,两侧的标签集合不同,除法会因为找不到匹配的序列而返回空结果。稳妥做法是两侧使用完全相同的聚合分组,把过滤条件放在选择器里,让向量匹配在相同维度上进行。
分母为零的情况
没有流量的时段分母为零,结果会变成无意义的数值或直接消失。看板应设置空值显示方式,告警表达式则要先确认分母非零,例如要求请求量达到一定规模后再判断比率,否则半夜低流量时段会频繁误报。
基本信息
| 基本形式 | 分子速率除以分母速率 |
|---|---|
| 维度要求 | 两侧聚合分组一致才能正确匹配 |
| 结果范围 | 0 到 1 之间,通常再乘 100 显示百分比 |
| 零流量 | 分母为零时结果异常,需要先过滤 |
典型使用场景
- 错误率:错误请求速率除以总请求速率,是最常用的服务告警
- 缓存命中率:命中量除以命中与未命中之和
- 成功率:成功请求除以全部请求,直接对应可用性目标
- 资源占比:已用连接数除以连接池上限
- 转化率类的业务比率:业务埋点计数相除后按业务域聚合
- 延迟超阈值占比:桶相减后除以总请求数
比率写法示例
比率写法示例
# 5xx 错误率(全局)
sum(rate(http_requests_total{code=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))
# 按服务分组,分子分母分组保持一致
sum by (service) (rate(http_requests_total{code=~"5.."}[5m]))
/ sum by (service) (rate(http_requests_total[5m]))
# 缓存命中率
sum(rate(cache_hits_total[5m]))
/ (sum(rate(cache_hits_total[5m])) + sum(rate(cache_misses_total[5m])))常见比率与写法
| 比率 | 分子 | 分母 |
|---|---|---|
| 错误率 | 5xx 请求速率 | 全部请求速率 |
| 命中率 | 命中速率 | 命中加快未命中速率 |
| 超时占比 | 超过阈值的桶差值 | 桶总数速率 |
| 连接占用率 | 当前连接数 | 连接池上限 |
常见错误与表现
| 错误写法 | 表现 | 修正 |
|---|---|---|
| 分子带过滤、分母不过滤 | 结果为空的序列 | 两侧统一聚合分组 |
| 分组标签写错 | 曲线条数异常 | 核对真实标签集 |
| 低流量时段直接告警 | 夜间高频误报 | 先用请求量做前置条件 |
写好比率查询的要点
- 分子分母同一时间窗口:窗口不一致会让比率短暂偏离真实值
- 保留足够维度:需要按接口或实例下钻时,两侧都要保留该标签
- 乘百显示:面板上以百分比呈现更易读
- 空值处理:无数据与零值要区分显示,避免误读为正常
比率类表达式的可读性来自形状而非精度:曲线长期贴近某条基线,一旦抬升就值得关注,绝对值可以稍后核对。
分母为零时结果是未定义值,告警表达式务必先加上流量下限条件,否则低峰期的零星请求会触发错误率告警。
比率是最容易复制的表达式,也最容易出现口径分叉:把验证过的写法固定在模板或记录规则里,比在每个面板里各写一遍更可靠。
比率不适合回答的问题
- 总共有多少失败:比率只给比例,绝对量要看计数器
- 哪个用户受影响:维度已经聚合掉,需要日志与链路补充
- 故障持续多久:要结合时间窗口与持续时长判断