これは TECHSCORE Advent Calendar 2017 の18日目の記事です。
はじめに
こんにちは、小野寺です。
先日 Prometheus 監視をまるっと設定 で取り上げられていた Prometheus の通知部分を担う Alertmanager にフォーカスします。
Alertmanagerの役割 と 今回のお題
Prometheus の監視システムの中で、Alertmanager は以下の役割を担っています。
- アラートクライアント(Prometheus)からのアラート受け付け ← WebAPI
- 受け付けたアラートの
- グループ化(Grouping)
- 抑制(Inhibition)
- 非通知(Silences)
今回はお題として アラートクライアントからのアラート受け付け ← WebAPI を調べてみました。
Alertmanager API
調べ始めてすぐにわかったのですが、Alertmanager のAPIドキュメントがない のです!!
ということで、ソースから読み取ったAPI一覧が以下です。もし、APIに過不足や誤りを見つけた際にはコメントいただければ助かります。
API一覧
APIのPrefix: /api/v1
※ソース上にはレガシーなAPIもありましたが、省略しています。
今回は以下のAPIに絞ってご紹介します。GETメソッドのAPIはポチポチ試してみてください。
- アラート作成
- サイレンス作成
- サイレンス失効
アラート作成
メソッド: POST
パス: /alerts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[ { "labels": { "alertname": "Test_Alert", "instance": "node0" }, "annotations": { "link": "https://example.com", "summary": "This is a testing alert!" }, "startsAt": "2017-08-02T18:31:24Z", "generatorURL": "http://my.testing.script.local" } ] |
リクエストに "endsAt": "2017-08-03T18:31:24Z", を含めると、アラートが終了状態という扱いになり、アラート一覧から表示されなくなります。
1 2 3 |
{ "status": "success" } |
サイレンス作成
メソッド: POST
パス: /silences
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "Matchers": [ { "name": "alertname", "value": "Test_Alert", "isRegex": false } ], "startsAt": "2017-12-01T18:31:24Z", "endsAt": "2017-12-31T18:31:24Z", "comment": "test silence" } |
この時に、「endsAt」によってサイレンスのステータスが変わります。
- endsAt < 現在時刻: 「endsAt」が現在時刻に修正されて「"status": "expired"」になる
- endsAt = 現在時刻: 「endsAt」は現在時刻のまま「"status": "expired"」になる
- endsAt > 現在時刻: 「endsAt」は「endsAt」のまま「"status": "pending"」になる
1 2 3 4 5 6 |
{ "status": "success", "data": { "silenceId": "804d255b-7263-4d91-8c19-e75767db4312" } } |
サイレンス失効
メソッド: DELETE
パス: /silence/:sid ※ :sid には silenceID が入ります。
1 |
なし |
1 2 3 |
{ "status": "success" } |
実際に削除されるのではなく 「"status": "expired"」 になるだけなので、サイレンス一覧から確認できます。
まとめ
リクエストやレスポンスのフィールド内容には触れていませんが、Alertmanager は WebUI も提供しているので、ブラウザからアクセスしつつAPIを試してみていただければと思います。ちなみに、 amtool という Alertmanager のCLIツールも提供されており、アラートの作成やサイレンスの作成などができます。
まだ未実施ですが、サイレンスの作成と失効をデプロイのパイプラインに含めれば、通知停止忘れであわあわしなくて良さそうですね。