记录规则 (Recording rules)
为记录规则采用一致的命名方案,可以让人一眼就能理解规则的含义。这也能通过让错误或无意义的计算变得显眼,从而避免出错。
本页记录了记录规则的规范命名约定和聚合方式。
命名
- 记录规则应遵循通用的形式:
level:metric:operations。 level表示规则输出的聚合级别和标签。metric是指标名称,除了在使用rate()或irate()时去掉计数器(counter)的_total后缀外,应保持不变。operations是应用于该指标的操作列表,最新的操作排在最前面。
保持指标名称不变,可以方便地了解该指标的含义,并容易在代码库中找到它。
为了保持操作部分的简洁,如果存在其他操作(如 sum()),则省略 _sum。结合性操作可以合并(例如 min_min 与 min 相同)。
如果没有明显的操作可用,请使用 sum。当通过除法计算比例时,使用 _per_ 分隔两个指标,并将该操作命名为 ratio。
聚合
-
在对比例(ratio)进行向上聚合时,请分别聚合分子和分母,然后再进行相除。
-
不要对比例求平均值,也不要对平均值再求平均值,因为这在统计学上是无效的。
-
当对 Summary 类型的
_count和_sum进行向上聚合,并相除以计算平均观测大小时,将其视为比例会很笨拙。取而代之的是,保持指标名称不带_count或_sum后缀,并将操作中的rate替换为mean。这代表了该时间段内的平均观测大小。 -
务必在
without子句中指定你要聚合掉的标签。这样做是为了保留所有其他标签(例如job),从而避免冲突并提供更有用的指标和告警。
示例
注意缩进风格:操作符独立一行并相对于两个向量向外缩进。为了在 Yaml 中实现这种风格,使用了带有缩进指示符的块状引用 (例如 |2)。
对包含 path 标签的每秒请求数进行向上聚合
- record: instance_path:requests:rate5m
expr: rate(requests_total{job="myjob"}[5m])
- record: path:requests:rate5m
expr: sum without (instance)(instance_path:requests:rate5m{job="myjob"})
计算请求失败率并向上聚合至任务级(job-level)失败率
- record: instance_path:request_failures:rate5m
expr: rate(request_failures_total{job="myjob"}[5m])
- record: instance_path:request_failures_per_requests:ratio_rate5m
expr: |2
instance_path:request_failures:rate5m{job="myjob"}
/
instance_path:requests:rate5m{job="myjob"}
# Aggregate up numerator and denominator, then divide to get path-level ratio.
- record: path:request_failures_per_requests:ratio_rate5m
expr: |2
sum without (instance)(instance_path:request_failures:rate5m{job="myjob"})
/
sum without (instance)(instance_path:requests:rate5m{job="myjob"})
# No labels left from instrumentation or distinguishing instances,
# so we use 'job' as the level.
- record: job:request_failures_per_requests:ratio_rate5m
expr: |2
sum without (instance, path)(instance_path:request_failures:rate5m{job="myjob"})
/
sum without (instance, path)(instance_path:requests:rate5m{job="myjob"})
根据 Summary 计算某段时间内的平均延迟
- record: instance_path:request_latency_seconds_count:rate5m
expr: rate(request_latency_seconds_count{job="myjob"}[5m])
- record: instance_path:request_latency_seconds_sum:rate5m
expr: rate(request_latency_seconds_sum{job="myjob"}[5m])
- record: instance_path:request_latency_seconds:mean5m
expr: |2
instance_path:request_latency_seconds_sum:rate5m{job="myjob"}
/
instance_path:request_latency_seconds_count:rate5m{job="myjob"}
# Aggregate up numerator and denominator, then divide.
- record: path:request_latency_seconds:mean5m
expr: |2
sum without (instance)(instance_path:request_latency_seconds_sum:rate5m{job="myjob"})
/
sum without (instance)(instance_path:request_latency_seconds_count:rate5m{job="myjob"})
使用 avg() 函数计算跨实例和路径的平均查询率
- record: job:request_latency_seconds_count:avg_rate5m
expr: avg without (instance, path)(instance_path:request_latency_seconds_count:rate5m{job="myjob"})
请注意,在进行聚合时,与输入指标名称相比,输出指标名称的级别(level)中会移除 without 子句中的标签。当没有聚合发生时,级别总是匹配的。如果情况并非如此,很可能是规则中出现了错误。