Prometheus 2.0 Alpha.3 引入新规则格式

2017 年 6 月 22 日作者 Goutham Veeramachaneni

今天,我们发布了 Prometheus 2.0 的第三个 alpha 版本。除了新存储层中的各种 bug 修复外,它还包含了一些计划中的重大更改。

Flag 更改

首先,我们迁移到了一个新的 flag 库,该库使用更常见的双破折号 -- 作为 flag 前缀,而不是 Prometheus 之前使用的单破折号。部署需要相应调整。此外,在此 alpha 版本中,一些 flag 被移除了。自 Prometheus 1.0.0 以来的完整列表如下:

  • web.telemetry-path
  • 所有 storage.remote.* flag
  • 所有 storage.local.* flag
  • query.staleness-delta
  • alertmanager.url

录制规则更改

告警和录制规则是 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 本身是由另一个规则生成的。只有当告警 HighNetworkTrafficinstance:network_bytes:rate1m 的当前值被记录后运行,我们才能得到预期的结果。

  • 规则和告警要求用户学习另一个 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 稳定版本迈进!您可以在我们的 issue tracker  报告 bug,并通过我们的 community channels 提供一般反馈。