# 记录规则

[记录规则](https://hulining.gitbook.io/prometheus/prometheus/configuration/recording_rules)的一致命名方案使一目了然地解释规则的含义变得更加容易。通过使错误或无意义的计算脱颖而出，还可以避免错误。

此页面记录了如何正确进行汇总并提出了命名约定。

## 命名和汇总 <a href="#naming-and-aggregation" id="naming-and-aggregation"></a>

记录规则应为一般形式 `level:metric:operations`。`level` 代表规则输出的聚合级别和标签。`metric` 是度量名称，使用`rate()` 或 `irate()`时，除了从计数器剥离 `_total`，应保持不变。`_total` off counters when using `rate()` or `irate()`. `operations` 是应用到度量标准的操作列表，最新操作优先。

保持数据指标名称不变，可以轻松了解一个数据指标是什么，也可以在代码库中轻松找到。

为了保持操作整洁,如果还有其他操作，则将`_sum`省略，如`sum()`。关联操作可以合并(如，`min_min` 与 `min` 相同).

如果没有明显的操作要使用，请使用 `sum`。通过除法计算比率时，请使用`_per_`分隔度数据指标并将操作叫做`ratio`。

汇总比率时，分别汇总分子和分母，然后相除。不要取比率的平均值或平均值的平均值，因为这在统计上是无效的。

当汇总 Summary 的`_count` 和 `_sum` 并相除计算平均观察值时，将其视为比率是不实用的。而是保留不带 `_count` 或 `_sum` 后缀的数据指标，并将操作中的`rate`替换为`mean`。这表示该时间段内的平均观测大小。

始终使用要聚合的标签指定一个`without`子句。这是为了保留所有其他标签，例如`job`，这将避免冲突并为您提供更多有用的指标和警报。

## 示例 <a href="#examples" id="examples"></a>

*注意在两个向量之间的行上有缩进运算符的缩进样式。为了在 Yaml 中使这种样式，使用*[*带有缩进指示符的块引号*](https://yaml.org/spec/1.2/spec.html#style/block/scalar)*(例如`| 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"})
```

计算请求失败率并汇总到作业级别失败率:

```
- 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()` 函数计算出不同 instance 和 path 的平均查询率:

```
- record: job:request_latency_seconds_count:avg_rate5m
  expr: avg without (instance, path)(instance:request_latency_seconds_count:rate5m{job="myjob"})
```

请注意，在进行聚合时，与输入数据指标名称相比，将`without`子句中的标签从输出数据指标名称的级别中删除。没有聚合时，级别始终匹配。如果不是这种情况，则可能是规则中有错误。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hulining.gitbook.io/prometheus/practices/rules.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
