通过Pushgateway进行Prometheus的测试警报
太长不看。
-
- prometheusの通知テストしたい
-
- pushgateway使ったらできた
- metricsごとテストをshell scriptにまとめとくと便利
首先
当我更改Prometheus的警告规则或Alertmanager的接收者定义时,我想要进行通知测试。
因为Promtool的check-config很差劲,所以在Slack等地方实际触发警报后,可能会导致显示错乱…
所以我尝试使用pushgateway来发送虚假的指标信息(虽然这不是它的正确使用方法)。
关于pushgateway
-
- prometheus/pushgateway: push acceptor for ephemeral and batch jobs
-
- exporterはpull型前提だけど、バッチとかpushでデータためたい時用のもの
-
- prometheus同様goのバイナリ落としてきて起動するだけ release page
prometheusにはpushgatewayをみるようjob追加しておくこと
安装和启动的过程如下:
# install
$ cd your_pushgateway_dir
$ wget https://github.com/prometheus/pushgateway/releases/download/v0.3.1/pushgateway-0.3.1.linux-amd64.tar.gz
$ tar xvf pushgateway-0.3.1.linux-amd64.tar.gz
# run
$ cd pushgateway-0.3.1.linux-amd64
$ ./pushgateway > pushgateway.log 2>&1 &
# confirm behavior
$ curl localhost:9091/metrics
---
# HELP go_gc_duration_seconds A summary of the GC invocation durations.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 6.0085000000000005e-05
go_gc_duration_seconds{quantile="0.25"} 6.0085000000000005e-05
...
---
将 Prometheus 的配置也添加到 pushgateway 中。
$ cd your_prometheus_dir
$ vim prometheus.yml
# add following
---
scrape_configs:
...
# add following
- job_name: 'pushgateway'
static_configs:
- targets: ['localhost:9091']
labels:
environment: "hoge"
category: "pushgateway"
...
# maybe following job has already existed.
- job_name: 'hoge'
static_configs:
- targets: ['localhost:XXXX']
labels:
environment: "hoge"
category: "anything"
...
---
# reload prometheus setting
$ curl -X POST http://localhost:9090/prometheus/-/reload
将指标推送到pushgateway
按照 pushgateway 的 README.md 文件中所述,hoge_metrics{job=”TEST_JOB”,host_name=”TEST_HOST”}
如果想要触发名为”gauge”的度量标准的警报,在curl中发送以下内容即可:
如果想要增加更多的标签,只需在URL后面不断添加/label_name/label_string/label_name/label_string/…即可。
# push metrics
$ cat <<EOF | curl --data-binary @- http://localhost:9091/metrics/job/TEST_JOB/host_name/TEST_HOST/ENVIRONMENT/TEST_LOCATION
# TYPE hoge_metrics gauge
# HELP hoge_metrics
hoge_metrics 0.0
EOF
# confirm pushgaway metrics
$ curl localhost:9091/metrics
---
...
# TYPE hoge_metrics gauge
hoge_metrics{host_name="TEST_HOST",instance="",job="TEST_JOB"} 0
...
---
响起考试警报
那么我们来实际试一下警报声。试验条件如下所示。
警報規則的定義例
ALERT hoge_alert
IF hoge_metrics == 0
FOR 1s
LABELS {
severity="critical",
}
ANNOTATIONS {
summary = "hoge of {{ $labels.host_name }} is NG.",
}
Alertmanager的接收器定義示例。
global:
route:
receiver: 'slack'
group_by: [alertname, host_name]
group_interval: 5s
group_wait: 5s
receivers:
- name: 'slack'
slack_configs:
- api_url: 'https://hooks.slack.com/services/XXXXXXXXXXXXXXXXXXXXXXXXXXX'
channel: '#alerting-test'
text: "{{ .CommonAnnotations.summary }}"
send_resolved: true
...
另外,将指标发送到pushgateway的方式可以通过编写一个Shell脚本(用于测试警报)来方便执行。
在这里,只有NG警报可能一直持续响起,所以还需要制作OK警报(只需设置为正常值)。
然后,只需触发警报即可。
$ cd your_pushgateway_dir
$ mkdir alert_tests
$ cd alert_tests
# create ng script
$ vim hoge_metrics_ng
---
cat <<EOF | curl --data-binary @- http://localhost:9091/metrics/job/TEST_JOB/host_name/TEST_HOST/ENVIRONMENT/TEST_LOCATION
# TYPE hoge_metrics gauge
# HELP hoge_metrics
hoge_metrics 0.0
EOF
---
# create ok script
$ vim hoge_metrics_ok
---
cat <<EOF | curl --data-binary @- http://localhost:9091/metrics/job/TEST_JOB/host_name/TEST_HOST/ENVIRONMENT/TEST_LOCATION
# TYPE hoge_metrics gauge
# HELP hoge_metrics
hoge_metrics 1.0
EOF
---
$ chmod +x hoge_metrics_*
# fire ng script
$ ./hoge_metrics_ng
# fire ok script
$ ./hoge_metrics_ok
完成了。
总结
-
- alertを実際にならしてみてどう通知されるか?がコマンド1つ2つでできるのは便利
特にresolved時に文言打ち分けとかlabelとvalueの情報をバキバキ通知に使ってると…
運用上気にすること
labelは好きに増やせるけどlabel名と中身のペアが崩れてるとエラーで拾ってくれない
metricsを増やしたらテストアラートスクリプトも一緒につくる
アラート種別分、テストアラートスクリプトにコマンドまとめるといっぺんに確認できて便利
NG用だけだとずっとアラート鳴りっぱなしなのでOK用も作っておく
metrics情報を汚す。なので検証環境のprometheusに向け。deleteもあるが…
pushgateway経由のmetricsはjobはるとexprted_jobとして突っ込まれる(↑のprometheusの図参照)
その他
pushgatewayをmetrics/label変更時の過去データ引っ越しに使えないか…
なくはないが…
しかしpushgatewayの使い方として、既存のmetrics上書きはいかがなものか
以上。