目的
Pushgateway, Prometheus, Alertmanagerの連携動作を確認しよう
やること
Pushgatewayにアラートルールを満たすメトリクスをPOSTすると外部サービスでアラートを受信することを確認する。
図をクリックするとPlantUMLを確認できます(gist)。
アプリケーション | 機能 |
---|---|
Pushgateway | ・PUSHされたメトリクスを公開する |
Prometheus | ・メトリクスを収集する ・アラート条件を満たした場合アラートをAlertmanagerに送信する |
Alertmanager | ・アラートを受信しreceiver設定に従い外部サービスに送信する ・receiverにはemailやslack等が用意されている。 ・今回はreceiverとしてWebhookを使用し、自前のサーバに送信するようにした。 |
ExternalService | ・SMTPサーバやslack APIエンドポイント等。 ・今回はnode.jsで簡易なWebサーバを準備した。 |
環境
- クライアント(Ubuntu 17.10)
-
curl
でPushgatewayにメトリクスをPOSTする用
-
- k8sクラスタ(GKE)
- Pushgatewary, Prometheus, Alertmanagerをデプロイ済み
- デプロイツールは
helm
- デプロイ手順はHelm v2のすゝめに記載しています。
- Webサーバー(EC2(Ubuntu 16.04))
- リクエスト内容をログに残す簡易なHTTPサーバーを稼働済み(node.js(Express))。
Prometheus
prometheus.yaml
に以下設定が必要です。
-
targets
に PrometheusがscrapeすべきPushgatewayを設定する -
alertmanagers
に Prometheusがアラートを送信すべきAlertmanagerを設定する -
rule_files
にアラートルールファイルのパスを設定する。
今回はHelmでデプロイしたので1と2はService Discoveryが設定済みです。
Service Discoveryできていることを確認する
Status
-> Configration
を確認します。
Alertmanager や Pushgateway は Service Discovery設定がされています。
Status
-> Runtime & Build Information
を確認します。
AlertmanagerがDiscoveryされています。
Status
-> Targets
を確認します。
PushgatewayがDiscoveryされています。
アラートルールを設定する
公式ドキュメントのサンプルルールを設定してみましょう。
Configmapをeditします。
$ kubectl edit configmap test-prometheus-server -n helm-test
configmap "test-prometheus-server" edited
$ kubectl get configmap test-prometheus-server -n helm-test -o yaml
( 略 : )
rules: |
groups:
- name: example
rules:
# Alert for any instance that is unreachable for >5 minutes.
- alert: InstanceDown
expr: up == 0
for: 5m
labels:
severity: page
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
# Alert for any instance that has a median request latency >1s.
- alert: APIHighRequestLatency
expr: api_http_request_latencies_second{quantile="0.5"} > 1
for: 10m
annotations:
summary: "High request latency on {{ $labels.instance }}"
description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"
( 略 : )
edit後、しばらく待つと設定がリロードされます( 設定をリロードするコンテナがPrometheus Pod内にいます )。
WebUIのAlerts
を確認します。確かにルールを設定できています。
Alertmanager
Prometheusから受信したアラートの送信先(receiver
)の設定が必要です。
今回は外部サーバに送信するため、webhookの設定を行います。
receiverを設定する。
WebUIのStatus
を開いてConfig
を確認します。
ここにreceiverを設定してあげれば様々な外部サービスにアラートを飛ばせます。
今回はwebhook_configsを追加し外部サーバにアラートをPOSTするようにしてみます。
ConfigMapをeditします。
$ kubectl edit configmap test-prometheus-alertmanager -n helm-test
configmap "test-prometheus-alertmanager" edited
$ kubectl get configmap test-prometheus-alertmanager -n helm-test -o yaml
( 略 : )
alertmanager.yml: |
global: {}
receivers:
- name: default-receiver
webhook_configs:
- url: "http://外部サーバのエンドポイント/"
( 略 : )
しばらく待つと設定がリロードされます。
Pushgateway
メトリクスをPOSTする
Pushgateway に公式ドキュメントのサンプルメトリクスをPOSTしてみます。
$ # POSTする
$ cat <<EOF | curl --data-binary @- http://localhost:9091/metrics/job/some_job/instance/some_instance
# TYPE some_metric counter
some_metric{label="val1"} 42
# TYPE another_metric gauge
# HELP another_metric Just an example.
another_metric 2398.283
EOF
$
メトリクスを確認する
WebUI をブラウザで開きます。
POSTしたメトリクスが確かに公開されています。
PrometheusのWebUIでsome_metricで検索します。
確かにPrometheusがメトリクスを収集しています。
アラートを発火させる
ここからが本題です。以下の連携を確認しましょう。
・アラートが発火するようなメトリクスをPushgatewayにPOSTする
・Pushgatewayがメトリクスを公開する
・PrometheusがPushgatewayのメトリクスを収集する
・アラートルールを満たしたらPrometheusがAlertmanagerにアラートを送信する
・Alertmanagerがアラート受信する
・Alertmanagerがreceiver(webhook)の機能で外部サーバにPOSTする
・外部サーバがアラートを受信する
Pushgateway
アラートルール up == 0
を満たすメトリクスをPOSTしてみましょう。
$ cat <<EOF | curl --data-binary @- http://localhost:9091/metrics/job/some_job/instance/some_instance
# TYPE up counter
up 0
EOF
$
Prometheus
Pushgatewayのメトリクスを収集した結果、アラートがPENDING
状態となっています。
5分待ちます。
5分経過しました、アラートがFIRING
状態になり、発火しました!
Alertmanager
Prometheusから送信されたアラートを確かに受信しています。
このアラートをreceiver(Webhook)の機能で外部サーバに送信しているでしょうか?
外部サーバ
Webサーバのログを見ると確かにアラートがPOSTされていました。
アラート情報は以下のようなjsonになっていました。
{ receiver: 'default-receiver',
status: 'firing',
alerts:
[ { status: 'firing',
labels: [Object],
annotations: [Object],
startsAt: '2018-11-29T15:14:18.501662728Z',
endsAt: '2018-11-29T15:17:18.501662728Z',
generatorURL:
'http://test-prometheus-server-7bd886b769-glcgt:9090/graph?g0.expr=up+%3D%3D+0&g0.tab=1' } ],
groupLabels: {},
commonLabels:
{ alertname: 'InstanceDown',
instance: 'some_instance',
job: 'some_job',
severity: 'page' },
commonAnnotations:
{ description:
'some_instance of job some_job has been down for more than 5 minutes.',
summary: 'Instance some_instance down' },
externalURL: '',
version: '4',
groupKey: '{}:{}' }
アラートを鎮火する
アラートを止めるために、up == 1 となるメトリクスをPushgatewayにPOSTしておきましょう。
cat <<EOF | curl --data-binary @- http://localhost:9091/metrics/job/some_job/instance/some_instance
# TYPE up counter
up 1
EOF
まとめ
Pushgateway, Prometheus, Alertmanagerの連携動作を確認できました。
ポイント
- Pushgatewayを使うと手軽にメトリクスを生成できるぞ
- Pushgateway, Prometheus, AlertmanagerをHelmでデプロイした恩恵により、変更する設定項目はアラートルールだけで済んだ(service discovery最高!)
- Webhookを活用するとemailやslackだけでなくいろいろなサービスとも連携できそうですね!