记录规则

一致的记录规则命名方案使人们更容易一眼看出规则的含义。它还可以通过使不正确或毫无意义的计算凸显出来,从而避免错误。

本页介绍了记录规则的正确命名规范和聚合方法。

命名

  • 记录规则应采用 level:metric:operations 的通用形式。
  • level 表示规则输出的聚合级别和标签。
  • metric 是指标名称,除了在使用 rate()irate() 时应从计数器(counter)中去掉 _total 之外,其他均应保持不变。
  • operations 是应用于指标的操作列表,最新操作排在最前面。

保持指标名称不变可以使人们很容易了解指标是什么,并容易在代码库中找到。

为了保持操作简洁,如果存在其他操作(如 sum()),则省略 _sum。结合性操作可以合并(例如 min_minmin 相同)。

如果没有明显可用的操作,请使用 sum。在通过除法计算比例时,使用 _per_ 分隔指标,并将该操作命名为 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 级别的失败率

- 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"})

请注意,在聚合时,与输入指标名称相比,without 子句中的标签会从输出指标名称的 level 中移除。在没有聚合时,level 总是匹配的。如果情况并非如此,则规则中可能存在错误。

本页内容