Z Lab では様々なシステムの監視に Prometheus を使用しています。Prometheus からのアラート通知には Alertmanager を使用していますが、障害対応などをしていくうちに、チーム内で以下のような不満が出てきました。
- アラートの履歴が時間が経つとで消えてしまい、何が起きていたのか分かりにくい
- どのアラートが多く発生しているかなどの集計がしにくい
- アラートの情報をもとに GitHub に Issue を簡単に作成したい
そこで、Alertmanager の機能についてもう少し詳しく調べてみたところ、そもそも Alertmanager はアラートの通知に特化した設計になっており、永続的にアラートの情報を管理する場合は、Webhook による通知機能を利用して別のシステムにアラート情報を転送して管理するのが良いことが分かりました。
新たにアラート情報を収集して管理するシステムを作ることも検討しましたが、あまりそこにコストをかけたくなかったため、以前から使ってみたいと思っていた Sentry に Prometheus のアラートを転送して管理してみることにしました。
Sentry とは?
Sentry はモバイルアプリケーションのクラッシュや Rails などのエラーログといったイベントを収集して、閲覧や管理ができるサービスです。様々なプログラミング言語用にライブラリが提供されており、簡単にイベントの収集機能を組み込むことができます。
Sentry でアラートを管理することは、サービスの本来の用途に適していないように見えるかもしれませんが、以下のようなポイントが今回の要件にマッチしていたので、ひとまずやってみることにします。
- イベントを時系列で管理できる
- イベントに付与したタグで柔軟に集計ができる
- Issue Tracker との連携が充実しており、Issue の作成などができる
- ライブラリが充実しており、アラートを Sentry に転送する仕組みの実装が容易
- Sentry 自体が OSS で公開されており、オンプレミス環境での運用も可能
alertmanager-sentry-gateway で Sentry にアラートを送信する
Alertmanager から Sentry にはアラートを転送する機能がなかったため、今回は Alertmanager から Webhook を受信して、その情報を Sentry に転送するための alertmanager-sentry-gateway を実装しました。
alertmanager-sentry-gateway は GitHub の Release ページからバイナリーをダウンロードして、以下のように起動します。起動には Sentry にイベントを送信するための DSN が必要なので、事前に Sentry の画面上で取得しておきます。
$ sentry-gateway --dsn ${SENTRY_DSN}
Alertmanager 側には以下のように alertmanager-sentry-gateway に Webhook を送信するようにします。
receivers:
- name: infra-team
webhook_configs:
- url: http://${SENTRY_GATEWAY_HOST}:9096
send_resolved: false
Alertmanager から Sentry へのアラートの転送がうまくいくと、以下のように Sentry のプロジェクトにアラート情報が Issue として登録されます。
Issue には同じアラートが時系列で紐付けられるので、後からいつアラートが発生したのかを確認できます。また Prometheus のラベルが Sentry の Tag として記録されるので、Tag で絞り込んだり集計したりすることもできます。
また、Sentry の Issue Tracker 連携機能を使えば、アラートから Issue を作成したり、既存の Issue にコメントを投稿できたりするので便利です。
まとめ
Prometheus のアラートを Sentry に転送しておけば、Alertmanager で不満に感じていたアラートの管理が柔軟にできることが分かりました。Sentry には他にも Release を登録しておくことでバージョンごとのイベント管理ができるようなので、そのあたりの機能もうまく使い込んでアラートの管理をより効率化していきたいと思います。