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サーバ
discovery
evaluation
scraping

WEB APIHTTPPushAWS EC2

Azure

DNS

GCP GCE

Kubernetes

OpenStack

監視対象の自動登録

File

Alertmanager

HTTP Pull metrics
HTTP
PromQL

exporterPushgateway

監視対象
HTTP PUSH

Prometheus
WEB UI

可視化

通知

バッチジョブ
Copyright © 2019 SRA OSS, Inc. Japan All rights reserved.

7サーバとexporterについて
Prometheusサーバ

exporter メトリックスを収集するエージェント

discovery
evaluation
scraping

WEB API
各exporterは異なるポート番号でHTTPリクエストを待ち受け

HTTP Pull metrics

exporter

収集したいメトリックスごとにexporterを導入
Ex) http,postgresql,nodePushgateway

Prometheusサーバは定期的にHTTPリクエストを発行してexporterで公開されているメトリックスを収集

監視対象
HTTP PUSH

exporter側の設定で公開するメトリックスを定義

バッチジョブ
Copyright © 2019 SRA OSS, Inc. Japan All rights reserved.

8

exporterの種類

Copyright © 2019 SRA OSS, Inc. Japan All rights reserved.

9サーバとPushgateway
Prometheusサーバ

メトリックスをPUSHしたい場合に利用

discovery
evaluationscraping

バッチジョブ等の実行結果をPushgatewayにPUSH

WEB API
PushgatewayではPUSHされた最新値を保存

HTTP Pull metrics

PrometheusサーバからはPushgatewayに対してデータをPULLする

exporterPushgateway

Prometheusサーバに対して直接メトリックスをPUSHできない

監視対象
HTTP PUSH

バッチジョブ

サーバはメトリックスをPullするだけ→ 安定性に貢献

Copyright © 2019 SRA OSS, Inc. Japan All rights reserved.

10

WEB UI と PromQL
PrometheusサーバがWEB UIを提供しているが1度きりのグラフ作成

Prometheusサーバ
discovery

ダッシュボードとしてはGrafanaを利用

evaluation
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 APIAWS EC2

Azure

DNS

GCP GCE

Kubernetes

OpenStack

監視対象の自動登録

File

定期的に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評価と通知Scraping処理とは別処理でメトリックスの評価をおこなう

Prometheusサーバ

scraping

discovery

PromQLによりメトリックに対して計算式を定義し新たなメトリックスを定義することもできる

evaluation

閾値を定義してAlertmanagerにHTTPでPush

WEB APIHTTP
Push

Alertmanager
Alertmanagerが受け取ったデータはラベルが定義されており、ラベル別に整理、集約ができる
ラベル“service”:”database”があるアラートは管理者に通知
ラベル“env”:”staging”は通知を行わない
ラベル“alertname”:”httpd_down”のアラートは5分ごとにまとめてWEB管理者へ通知
Copyright © 2019 SRA OSS, Inc. Japan All rights reserved.

通知13

２．Zabbix 4.2 Prometheusとの連携

X
Copyright © 2019 SRA OSS, Inc. Japan All rights reserved.

14

exporter から metrics を取得

exporterHTTP

メトリクス名{ラベル名=“ラベル値”,…} メトリクス値
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 パターンの実例１

Copyright © 2019 SRA OSS, Inc. Japan All rights reserved.

17

Prometheus パターンの実例２

1 つのメトリクスを特定できるようなパラメータ設定が必須
Copyright © 2019 SRA OSS, Inc. Japan All rights reserved.

18

Prometheus パターンの実例３＜ラベル名＞=~”＜ラベル値の正規表現＞”も可能
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 の実例１

Copyright © 2019 SRA OSS, Inc. Japan All rights reserved.

21

Prometheus から JSON の実例２[{

"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として機能
PrometheusPrometheus

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
Zabbixのマクロを利用[{"labels":{EVENT.IDを渡すことで"alertname":"{EVENT.NAME}",labelsがユニークになる"hostname":"{HOST.NAME}","severity":"{EVENT.SEVERITY}",“evnetid":"{EVENT.ID}",
ITEM.VALUEなど変動する値"itemkey":"{ITEM.KEY}",
はannotaionsに入れる},"annotations":{ "lastvalue":"{ITEM.VALUE}“ },"generatorURL":"http://ZabbixURL/zabbix/tr_events.php?triggerid={TRIGGER.ID}&eventid={EVENT.ID}"}]

Copyright © 2019 SRA OSS, Inc. Japan All rights reserved.

30

ZabbixとAlertmanagerの連携 ２[障害復旧] 復旧時のアクションから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:endsAt:というパラメータがあればproxy="-x $proxy"dateコマンドで作った日時を埋め込む
fimessage=${messageorg/:endsAt:/$fixends}
return=$(curl $proxy -H "Content-Type: application/json" -d "${message}" $url)

スクリプトの定義
第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の準備 アクションの定義

未使用

Copyright © 2019 SRA OSS, Inc. Japan All rights reserved.

POST されるデータ

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
route:
receiver: mailtousergroup_wait: 30s
group_interval: 5m
repeat_interval: 4hgroup_by: [alertname,hostname]routes:- match:severity: Disastergroup_wait: 5s
receivers:- name: mailtouser
email_configs:- to: ‘someone@sraoss.co.jp'
send_resolved: true

グローバル設定 SMTPの設定など

デフォルト
設定

ルーティングの設定
どういう条件で誰に通知するか？

通知先の設定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

Zabbixからは「ステップ」を利用して定期的にAMにデータを送る
障害アクション

• 障害が発生しPrometheusサーバがAMに通知データをPOSTしたあとは、同じラベルをもったデータをPrometheusが定期的にAMにデータを送る• resolve_timeout時間(default:5m)
データが届かないと回復したとみなす
resolve_timeoutの時間を増やして、Zabbixのステップ実行間隔も増やすした方がよい

Alertmanager

ステップ復旧アクション
時間

Copyright © 2019 SRA OSS, Inc. Japan All rights reserved.

38

Alertmanagerの設定 route
route:
receiver: mailtouser
repeat_interval: 4hgroup_wait: 30s
group_interval: 5m
group_by: [alertname,hostname]routes:- match:severity: Disastergroup_wait: 5s

子ルートの定義
Zabbixの重要度[致命的な障害]のケースでは、group_waitを30秒から5秒に上書きしている例

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の設定 receiverreceivers:- name: mailtouser
email_configs:- to: ‘someone@sraoss.co.jp'

send_resolved: true

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通目

２通目
X＝1

メール送信された内容

X＝2

X＝1

Copyright © 2019 SRA OSS, Inc. Japan All rights reserved.

X＝2

X＝3

X＝4

41

Labels{“alertname”:“DBエラー","hostname":”server1“,”eventid”: “X”}

Zabbixから発行された通知

障害

X＝4

X＝3

復旧
X＝5

X＝1

時間

Alertmanager
group_intervalgroup_interval
3通目

２通目
X＝1

X＝2

メール送信された内容

X＝3

X＝4

X＝1

X＝2

Copyright © 2019 SRA OSS, Inc. Japan All rights reserved.

X＝3

X＝4

X＝542

Labels{“alertname”:“DBエラー","hostname":”server1“,”eventid”: “X”}
障害

Zabbixから発行された通知
X＝1

復旧

X＝5

X＝2

X＝3

X＝4

X＝5時間

Alertmanager
3通目
X＝1

group_interval
X＝2

X＝3

メール送信された内容

X＝4

4通目
X＝5

group_interval

X＝2

Copyright © 2019 SRA OSS, Inc. Japan All rights reserved.

X＝3

X＝4

X＝543

実際のメール内容

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