Prometheus 2.0 Alpha.3 新规则格式

2017年6月22日作者 Goutham Veeramachaneni

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

标志变更

首先,我们迁移到了一个新的标志库,该库使用更常见的双破折号 -- 作为标志前缀,而不是Prometheus迄今为止使用的单破折号。部署必须相应地进行调整。此外,此alpha版本还移除了一些标志。自Prometheus 1.0.0以来的完整列表是

  • web.telemetry-path
  • 所有 storage.remote.* 标志
  • 所有 storage.local.* 标志
  • 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 本身是由另一个规则生成的。只有在记录了 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稳定版迈进!您可以在我们的问题追踪器上报告错误,并通过我们的社区渠道提供一般性反馈。