Prometheus 2.0 Alpha.3 现已支持新规则格式
2017年6月22日作者 Goutham Veeramachaneni
今天,我们发布了 Prometheus 2.0 的第三个 alpha 版本。除了对新的存储层进行了一系列错误修复外,它还包含了一些预期的破坏性变更。
标志(Flag)变更
首先,我们更换了一个新的标志库,它使用更常见的双横线 -- 前缀来定义标志,而不是 Prometheus 此前使用的单横线。部署配置需要据此进行调整。此外,在此次 alpha 版本中,我们移除了一些标志。自 Prometheus 1.0.0 以来的完整列表如下:
web.telemetry-path- 所有
storage.remote.*标志 - 所有
storage.local.*标志 query.staleness-deltaalertmanager.url
记录规则(Recording Rules)的变更
告警和记录规则是 Prometheus 的关键功能之一,但也存在一些设计问题和缺失功能,具体如下:
-
所有规则都以相同的间隔运行。有些繁重的规则最好以 10 分钟为间隔运行,而有些规则则可以以 15 秒的间隔运行。
-
所有规则都是并发评估的,这实际上是 Prometheus 最古老的 未修复的 Bug。这带来了几个问题,最明显的是,如果你有很多规则,在每个评估间隔负载都会出现峰值。另一个问题是,相互依赖的规则可能会被输入过时的数据。例如:
instance:network_bytes:rate1m = sum by(instance) (rate(network_bytes_total[1m]))
ALERT HighNetworkTraffic
IF instance:network_bytes:rate1m > 10e6
FOR 5m
在这里,我们针对 instance:network_bytes:rate1m 进行告警,但 instance:network_bytes:rate1m 本身是由另一个规则生成的。只有在 instance:network_bytes:rate1m 的当前值被记录之后,再运行告警 HighNetworkTraffic,我们才能得到预期的结果。
- 规则和告警要求用户学习另一种特定领域语言(DSL)。
为了解决上述问题,我们很久以前就提出了规则分组,但直到最近才作为 Prometheus 2.0 的一部分进行了实现。作为此次实现的一部分,我们还将规则迁移到了通用的 YAML 格式,这使得根据用户环境中的通用模式生成告警规则变得更加容易。
新格式如下所示:
groups:
- name: my-group-name
interval: 30s # defaults to global interval
rules:
- record: instance:errors:rate5m
expr: rate(errors_total[5m])
- record: instance:requests:rate5m
expr: rate(requests_total[5m])
- alert: HighErrors
# Expressions remain PromQL as before and can be spread over
# multiple lines via YAML’s multi-line strings.
expr: |
sum without(instance) (instance:errors:rate5m)
/
sum without(instance) (instance:requests:rate5m)
for: 5m
labels:
severity: critical
annotations:
description: "stuff's happening with {{ $labels.service }}"
每个组中的规则按顺序执行,并且您可以为每个组设置评估间隔。
由于这是一个破坏性变更,我们将在 2.0 正式发布时推出,并已在 promtool 中添加了一个用于迁移的命令:promtool update rules <filenames>。转换后的文件将被添加 .yml 后缀,并且您必须相应地调整 Prometheus 配置中的 rule_files 子句。
请通过测试此新的 alpha 版本来帮助我们迈向 Prometheus 2.0 的稳定发布!您可以在我们的 问题追踪器 上报告错误,并通过我们的 社区渠道 提供一般性反馈。