Prometheus

55479
下载
Prometheus 是一个开源的监控和告警系统,专注于时间序列数据的采集与存储。由 SoundCloud 开发,配备高级查询语言PromQL,便于数据挖掘与分析,并无缝对接多种可视化平台。

规则的单元测试


你可以使用promtool来测试你的规则。

Terminal window
# 对单一测试文件。
./promtool test rules test.yml
# 如果你有多个测试文件,例如 test1.yml, test2.yml, test2.yml
./promtool test rules test1.yml test2.yml test3.yml

测试文件格式

# 要考虑测试的规则文件列表。支持通配符。
rule_files:
[ - <filename> ]
[ evaluation_interval: <duration> | 默认 = 1m ]
# 下面列出的组名称顺序将在给定计算时间时计算规则组(计算时间)。仅对下面列出的组有效。
# 所有组不一定需要在下面列出。
group_eval_order:
[ - <group_name> ]
# 列出的所有测试。
tests:
[ - <test_group> ]

<test_group>

# 序列数据
[ interval: <duration> | default = evaluation_interval ]
input_series:
[ - <stries> ]
# 测试组的名称
[ name: <string> ]
# 对上述数据进行的单元测试。
# 对告警规则的单元测试。我们从输入文件中考虑告警规则。
alert_rule_test:
[ - <alert_test_case> ]
# 对PromQL表达式的单元测试。
promql_expr_test:
[ - <promql_test_case> ]
# 可访问告警模板的外部标签。
external_labels:
[ <labelname>: <string> ... ]
# 可访问告警模板的外部URL。
# 通常通过`--web.external-url`设置。
[ external_url: <string> ]

<series>

# 遵循通常的序列表示法`<指标名称>{<标签名称>=<标签值>, ...}`。
# 示例:
# series_name{label1="value1", label2="value2"}
# go_goroutines{job="prometheus", instance="localhost:9090"}
series: <string>
# 使用扩展表示法。
# 扩展表示法:
# 'a+bxn' 变为 'a a+b a+(2*b) a+(3*b) … a+(n*b)' - 序列从 a 开始,n 个后续样本递增 b。
# 'a-bxn' 变为 'a a-b a-(2*b) a-(3*b) … a-(n*b)' - 序列从 a 开始,n 个后续样本递减 b(或增加负 b)。
# 'axn' 变为 'a a a … a'(a n+1 次) - 它是'a+0xn'的简写形式,序列从 a 开始,n 个后续样本递增0。
# 存在用于表示缺失和过期样本的特殊值:
# '_' 表示从抓取中缺失的样本
# 'stale' 表示过期的样本
# 示例:
# 1. '-2+4x3' 变为 '-2 2 6 10' - 序列从-2开始,3个后续样本递增4。
# 2. ' 1-2x4' 变为 '1 -1 -3 -5 -7' - 序列从1开始,4个后续样本递减2。
# 3. ' 1x4' 变为 '1 1 1 1 1' - 等同于'1+0x4',序列从1开始,4个后续样本递增0。
# 4. ' 1 _x3 stale' 变为 '1 _ _ _ stale' - 缺失的样本不能递增,因此产生了3个缺失样本由'_x3'表达式产生。
values: <string>

<alert_test_case>

Prometheus 允许你为不同的告警规则具有相同的告警名称。因此,在这个单元测试中,你需要列出给定告警名称下所有触发的告警的并集。

# 告警需要检查的时间从 time=0s 开始。
eval_time: <duration>
# 需要测试的告警名称。
alertname: <string>
# 在给定计算时间下,预期触发的告警列表。如果你想测试某个告警规则不应该触发,可以列出上述字段并将`exp_alerts`留空。
exp_alerts:
[ - <alert> ]

<alert>

# 预期告警的扩展标签和注释。
# 注意:标签也包括与告警关联的样例的标签(在`/alerts`中看到的,没有序列`__name__`和`alertname`)
exp_labels:
[ <labelname>: <string> ]
exp_annotations:
[ <labelname>: <string> ]

<promql_test_case>

# 要计算的表达式
expr: <string>
# 需要检查的表达式的时间,从time=0s开始。
eval_time: <duration>
# 给定计算时间时的预期样本。
exp_samples:
[ - <sample> ]

<sample>

# 样本的标签,遵循通常的序列表示法`<指标名称>{<标签名称>=<标签值>, ...}`。
# 示例:
# series_name{label1="value1", label2="value2"}
# go_goroutines{job="prometheus", instance="localhost:9090"}
labels: <string>
# PromQL表达式的预期值。
value: <number>

示例

这是一个用于单元测试的示例输入文件,它通过了测试。test.yml遵循上述语法,并且alerts.yml包含告警规则。

如果有alerts.yml在同一目录中,运行./promtool test rules test.yml

test.yml

# 单元测试的主要输入。
# 只将此文件作为命令行参数传递。
rule_files:
- alerts.yml
evaluation_interval: 1m
tests:
# 测试 1。
- interval: 1m
# 序列数据。
input_series:
- series: 'up{job="prometheus", instance="localhost:9090"}'
values: '0 0 0 0 0 0 0 0 0 0 0 0 0 0 0'
- series: 'up{job="node_exporter", instance="localhost:9100"}'
values: '1+0x6 0 0 0 0 0 0 0 0' # 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0
- series: 'go_goroutines{job="prometheus", instance="localhost:9090"}'
values: '10+10x2 30+20x5' # 10 20 30 30 50 70 90 110 130
- series: 'go_goroutines{job="node_exporter", instance="localhost:9100"}'
values: '10+10x7 10+30x4' # 10 20 30 40 50 60 70 80 10 40 70 100 130
# 对告警规则的单元测试。
alert_rule_test:
# 单元测试 1。
- eval_time: 10m
alertname: InstanceDown
exp_alerts:
# 告警 1。
- exp_labels:
severity: page
instance: localhost:9090
job: prometheus
exp_annotations:
summary: "Instance localhost:9090 down"
description: "localhost:9090 of job prometheus has been down for more than 5 minutes."
# 对PromQL表达式的单元测试。
promql_expr_test:
# 单元测试 1。
- expr: go_goroutines > 5
eval_time: 4m
exp_samples:
# 样本 1。
- labels: 'go_goroutines{job="prometheus",instance="localhost:9090"}'
value: 50
# 样本 2。
- labels: 'go_goroutines{job="node_exporter",instance="localhost:9100"}'
value: 50

alerts.yml

# 规则文件。
groups:
- name: example
rules:
- alert: InstanceDown
expr: up == 0
for: 5m
labels:
severity: page
annotations:
summary:

该文档基于 Prometheus 官方文档翻译而成。


observability.cn Authors 2024 | Documentation Distributed under CC-BY-4.0
Copyright © 2017-2024, Alibaba. All rights reserved. Alibaba has registered trademarks and uses trademarks.
浙ICP备2021005855号-32