Edited at
Z LabDay 6

Prometheus のアラートを Sentry で管理する

More than 1 year has passed since last update.

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 として登録されます。

Sentry Project

Issue には同じアラートが時系列で紐付けられるので、後からいつアラートが発生したのかを確認できます。また Prometheus のラベルが Sentry の Tag として記録されるので、Tag で絞り込んだり集計したりすることもできます。

Sentry Issue

また、Sentry の Issue Tracker 連携機能を使えば、アラートから Issue を作成したり、既存の Issue にコメントを投稿できたりするので便利です。

Screen Shot 2017-12-03 at 11.37.10.png


まとめ

Prometheus のアラートを Sentry に転送しておけば、Alertmanager で不満に感じていたアラートの管理が柔軟にできることが分かりました。Sentry には他にも Release を登録しておくことでバージョンごとのイベント管理ができるようなので、そのあたりの機能もうまく使い込んでアラートの管理をより効率化していきたいと思います。