Zabbix 最新情報セミナー Prometheus を利用した Zabbix 応用監視 2019/7/10 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 1
Zabbix 4.2 の新機能 アイテムの保存前処理で Prometheus との連携が可能に Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 2
内容 1. Prometheus? 2. Zabbix 4.2 Prometheusとの連携 3. Zabbix と Alertmanagerの連携 Alertmanager を利用して重複通知の削除 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 3
Prometheus? Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 4
Prometheus? メトリックスベースのモニタリングシステム Go 言語で作成 Apache ライセンス 2.0 Cloud Native Computing Foundation で開発 メンテナンス CNCF の目的 オープンソースでベンダー中立プロジェクトのエコシステムを育成 維持して このパラダイムの採用を促進したいと考えてます 私たちは最先端のパターンを民主化し これらのイノベーションを誰もが利用できるようにします Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 5
成熟度 6 プロジェクト 17 プロジェクト 15 プロジェクト Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 6
Prometheus のアーキテクチャ Prometheus サーバ AWS EC2 Azure DNS File scraping discovery evaluation WEB API HTTP Push GCP GCE OpenStack Kubernetes 監視対象の自動登録 HTTP Pull metrics HTTP PromQL Alertmanager exporter 監視対象 Pushgateway HTTP PUSH Prometheus WEB UI 可視化 通知 バッチジョブ Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 7
サーバと exporter について Prometheus サーバ discovery evaluation scraping WEB API HTTP Pull metrics exporter メトリックスを収集するエージェント 収集したいメトリックスごとに exporter を導入 Ex) http,postgresql,node 各 exporter は異なるポート番号で HTTP リクエストを待ち受け exporter 監視対象 Pushgateway HTTP PUSH バッチジョブ Prometheus サーバは定期的に HTTP リクエストを発行して exporter で公開されているメトリックスを収集 exporter 側の設定で公開するメトリックスを定義 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 8
exporter の種類 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 9
サーバと Pushgateway Prometheus サーバ discovery evaluation メトリックスを PUSH したい場合に利用 バッチジョブ等の実行結果を Pushgateway に PUSH scraping WEB API Pushgateway では PUSH された最新値を保存 HTTP Pull metrics Prometheus サーバからは Pushgateway に対してデータを PULL する exporter 監視対象 Pushgateway HTTP PUSH バッチジョブ Prometheus サーバに対して直接メトリックスを PUSH できない サーバはメトリックスを Pull するだけ 安定性に貢献 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 10
WEB UI と PromQL Prometheus サーバ discovery evaluation Prometheus サーバが WEB UI を提供しているが 1 度きりのグラフ作成 ダッシュボードとしては Grafana を利用 scraping WEB API Grafana は HTTP を利用してサーバからメトリックスを取得 PromQL でデータの選択 集計 HTTP PromQL 多数から絞り込んで少数のデータを参照例 ) パーティションの利用率を知りたい part_usage 各パーティションの利用率 (/,/var,/home,/data) part_usage{part= /var } /var の利用率 Prometheus WEB UI 可視化 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 11
ディスカバリ自動登録 Prometheus サーバ discovery evaluation scraping WEB API AWS EC2 GCP GCE OpenStack Azure DNS File Kubernetes 監視対象の自動登録 定期的に Prometheus がサービスディスカバリを行い監視対象を自動登録 EC2 のインスタンスのディスカバリを行う設定 - job_name: ec2sd' ec2_sd_configs: - region: xxx access_key: yyy secret_key: zzz port: 9100 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 12
評価と通知 Prometheus サーバ discovery evaluation Scraping 処理とは別処理でメトリックスの評価をおこなう PromQL によりメトリックに対して計算式を定義し新たなメトリックスを定義することもできる 閾値を定義して Alertmanager に HTTP で Push scraping WEB API HTTP Push Alertmanager Alertmanager が受け取ったデータはラベルが定義されており ラベル別に整理 集約ができる ラベル service : database があるアラートは管理者に通知ラベル env : staging は通知を行わないラベル alertname : httpd_down のアラートは 5 分ごとにまとめて WEB 管理者へ通知 通知 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 13
2.Zabbix 4.2 Prometheus との連携 X Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 14
exporter から metrics を取得 exporter HTTP メトリクス名 { ラベル名 = ラベル値, } メトリクス値 Prometheus の metrics を HTTP エージェントで取得 解析可能に Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 15
exporter の種類 Zabbix で使える! Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 16
Prometheus パターンの実例 1 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 17
Prometheus パターンの実例 2 1 つのメトリクスを特定できるようなパラメータ設定が必須 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 18
Prometheus パターンの実例 3 < ラベル名 >= ~ < ラベル値の正規表現 > も可能 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 19
Prometheus から JSON の設定 取得した Prometheus のメトリクスを JSON へ変換 JSON に変換したいメトリクスを < メトリクス名 >{< ラベル名 >=< ラベル値 >, }==< 値 > で指定 ( 組み合わせ自由 ) Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 20
Prometheus から JSON の実例 1 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 21
Prometheus から JSON の実例 2 [ { "name":"node_cpu_seconds_total", "value":"664924.22", line_raw":"node_cpu_seconds_total{cpu= "0 ",mode= "idle "} 664924.22 r", "labels":{"cpu":"0","mode":"idle"}, "type":"counter", "help":"seconds the cpus spent in each mode. r }, ] Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 22
Prometheus から JSON の実例 3-1 JSON へ変換して LLD ルールに活用 [ { "name":"node_cpu_seconds_total", "value":"664924.22", line_raw":"node_cpu_seconds_total{cpu= "0 ",mode= "idle "} 664924.22 r", "labels":{"cpu":"0","mode":"idle"}, "type":"counter", "help":"seconds the cpus spent in each mode. r }, ] Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 23
Prometheus から JSON の実例 3-2 プロトタイプを依存アイテムで設定保存前処理で LLD マクロを使用 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 24
Pushgateway との連携 Pushgateway も Exporter として機能 Pushgateway HTTP PUSH cat <<EOF curl --data-binary @- http://pushgateway.example.org:9091/metrics/job/s ome_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 バッチジョブ Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 25
Prometheus Federationとの連携 Federation Prometheusサーバ自身がExporterとして機能 Prometheus Prometheus Prometheus サーバ サーバ サーバ HTTP エージェント オンプレ-クラウド連携 -部分参照 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 26
3. Zabbix と Alertmanager の連携 X 対象 : Zabbix 3.2( 障害の手動クローズ ) 以降 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 27
Alertmanager が受信するデータ 1 [ 障害発生 ] Prometheus サーバから Alertmanager(AM) へ次の形式のデータを POST [ { "labels": { alertname : <requiredalertname>, <labelname> : <labelvalue>,... }, "annotations": { "<labelname>": "<labelvalue>", }, startsat : <rfc3339>, endsat : <rfc3339>, "generatorurl": "<generator_url>" }] 赤文字 : 必須緑文字 : 自由定義 青文字 : 省略可 Labels の内容が変わると違う通知データと解釈 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 28
Alertmanagerが受信するデータ 2 [障害復旧] Prometheusサーバから Alertmanager(AM)へ次の形式のデータをPOST [ { "labels": 赤文字 必須 { alertname : <requiredalertname>, <labelname> : <labelvalue>, 緑文字 自由定義... }, "annotations": { "<labelname>": "<labelvalue>", }, 青文字 省略可 startsat : <rfc3339>, endsat : 2019-07-04T09:28:21.835576682+09:00, "generatorurl": "<generator_url>" }] endsatで指定した時刻に 同じlabelsのイベントが復旧する Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 29
Zabbix と Alertmanager の連携 1 [ 障害発生 ] Zabbix のアクションから curl で POST [{ "labels":{ }, "alertname":"{event.name}", "hostname":"{host.name}", "severity":"{event.severity}", evnetid":"{event.id}", "itemkey":"{item.key}", "annotations":{ "lastvalue":"{item.value} }, "generatorurl": "http://zabbixurl/zabbix/tr_events.php?triggerid={trigger.id}&eventid ={EVENT.ID}" }] Zabbix のマクロを利用 EVENT.ID を渡すことで labels がユニークになる ITEM.VALUE など変動する値は annotaions に入れる Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 30
Zabbix と Alertmanager の連携 2 [ 障害復旧 ] 復旧時のアクションから POST [{ "labels":{ }, "alertname":"{event.name}", "hostname":"{host.name}", "severity":"{event.severity}", evnetid":"{event.id}", "itemkey":"{item.key}", "annotations":{ "lastvalue":"{item.value} }, endsat : アクション発報時刻を埋め込む, "generatorurl": "http://zabbixurl/zabbix/tr_events.php?triggerid={trigger.id}&eventid ={EVENT.ID}" }] Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 31
Zabbix の準備 Alertscript の作成 /usr/lib/zabbix/alertscripts/sendtoalertmanager.sh #!/bin/bash url="$1" messageorg="$2" fixends=`date "+%Y-%m-%dT%H:%M:%S.%N%:z"` proxy=${3-""} if [[ "$proxy"!= '' ]]; then proxy="-x $proxy" fi message=${messageorg/:endsat:/$fixends} return=$(curl $proxy -H "Content-Type: application/json" -d "${message}" $url) :endsat: というパラメータがあれば date コマンドで作った日時を埋め込む スクリプトの定義 第 1 引数 Alertmanager の URL 第 2 引数 デフォルトのメッセージ Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 32
Zabbix の準備ユーザにメディアを登録 AlertmanagerのURLを指定 http://alertmanager:port/api/v2/alerts Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 33
Zabbix の準備アクションの定義 未使用 POST されるデータ Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 34
Zabbix の準備実行内容の定義 [ 重要 ] 障害中は AM に定期的に通知する設定 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 35
Zabbix の準備アクションの定義 未使用 endsat : :endsat: Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 36
Alertmanager の設定全体 global: smtp_smarthost: smtpserver:25' smtp_from: 'alertmanager@sraoss.co.jp' smtp_require_tls: false resolve_timeout: 5m グローバル設定 SMTP の設定など route: receiver: mailtouser group_wait: 30s group_interval: 5m repeat_interval: 4h group_by: [alertname,hostname] routes: - match: severity: Disaster group_wait: 5s デフォルト設定 ルーティングの設定どういう条件で誰に通知するか? receivers: - name: mailtouser email_configs: - to: someone@sraoss.co.jp' send_resolved: true 通知先の設定 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 37
Alertmanager の設定 global global: smtp_smarthost: smtpserver:25' smtp_from: 'alertmanager@sraoss.co.jp' smtp_require_tls: false resolve_timeout: 5m 障害が発生し Prometheus サーバが AM に通知データを POST したあとは 同じラベルをもったデータを Prometheus が定期的に AM にデータを送る resolve_timeout 時間 (default:5m) データが届かないと回復したとみなす Zabbix からは ステップ を利用して定期的に AM にデータを送る 障害アクション ステップ resolve_timeout の時間を増やして Zabbix のステップ実行間隔も増やすした方がよい Alertmanager 復旧アクション 時間 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 38
Alertmanagerの設定 route: receiver: mailtouser repeat_interval: 4h group_wait: 30s group_interval: 5m group_by: [alertname,hostname] routes: - match: severity: Disaster group_wait: 5s 子ルートの定義 Zabbixの重要度[致命的な障害]の ケースでは group_waitを30秒から 5秒に上書きしている例 route group_wait default:30s) 最初の通知を受信してから発報ま で待つ時間 しばらく待って通知をマージ group_interval(default:5m) 通知をまとめる時間間隔 group_by 指定したラベルで通知を集約 repeat_interval(default:4h) 再通知を行う時間 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 39
Alertmanagerの設定 receivers: - name: mailtouser email_configs: - to: someone@sraoss.co.jp' send_resolved: true receiver send_resolved (deafult: false) 障害回復通知を受け取るかどうか - name: sendtoslack slack_configs: - api_url: 'https://hooks.slack.com/services/xxxx/yyyy/zzzz' channel: '#notification' send_resolved: true title: '{{ if eq.status "firing" }}[障害発生]{{else}}[障害回復]{{end}} {{.GroupLabels.alertname }}' http_config: proxy_url: 'http://proxyurl:proxy-port' Slack通知例 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 40
通知時系列 Labels{ alertname : DB エラー ","hostname": server1, eventid : X } Zabbix から発行された通知 障害復旧 X=1 X=2 X=3 X=4 ( 注 ) 図示していませんがステップ間隔で再送されています 時間 Alertmanager group_wait group_interval 1 通目 2 通目 X=1 X=2 X=1 X=2 X=3 X=4 メール送信された内容 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 41
Labels{ alertname : DB エラー ","hostname": server1, eventid : X } Zabbix から発行された通知 障害 復旧 X=3 X=4 X=1 X=5 時間 Alertmanager group_interval group_interval 2 通目 3 通目 X=1 X=2 X=3 X=4 X=1 X=2 X=3 X=4 X=5 メール送信された内容 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 42
Labels{ alertname : DB エラー ","hostname": server1, eventid : X } Zabbix から発行された通知 障害 復旧 X=1 X=5 X=2 X=3 X=4 X=5 時間 Alertmanager 3 通目 group_interval 4 通目 group_interval X=1 X=2 X=3 X=4 X=5 X=2 X=3 X=4 X=5 メール送信された内容 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 43
実際のメール内容 AlertManager の UI へ Zabbix のイベント障害画面へ Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 44
通知の Silence( ミュート ) 機能 Alertmanager の UI から通知の抑止ができる 指定時間内に特定のラベルがある場合には通知をしない Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 45
Alertmanager クラスタ Labels の内容が同じであれば同じ通知データ Alertmanager Alertmanager 互いの Alertmanager が連携して通知を抑止 Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 46
まとめ Prometheus と連携することで監視メトリックスを効率よく取得できる Alertmanager を使うと通知の集約ができる Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 47
ご清聴ありがとうございました Copyright 2019 SRA OSS, Inc. Japan All rights reserved. 48