ログベースのアラートとSlackを連携して、開発サーバーの問題を迅速に発見しよう

この記事はTech KAYAC Advent Calendar 2023の15日目の記事です。

 

こんにちは、カヤックボンドのサーバーエンジニアの松本です。

今年はカヤックグループ合同のアドベントカレンダーということで、各グループから色んな方が参戦しています。

今回は開発サーバーでの開発体験を高めるためのアラートについて紹介したいと思っています。

なお、今回の記事はGoogle CloudのCloud Loggingにエラーログを送信しているプロジェクトを対象にしています。(50GB/月、保持期間30日まで無料なのでガンガン活用すると良いと思います)

はじめに

Google CloudではError Reportingという自動的にモニタリング/アラートを行えるサービスがあります。

Error Reportingではエラー箇所ごとに発生回数を集計してくれたり、影響ユーザー数も集計してくれたりでGoogle Cloud使うなら絶対活用するべきなのですが、Slack等に送信するメッセージは整形できないので、開発では不便なことがあります。

例えば、こんな情報がSlackで通知されると便利なのではないでしょうか。

  • リクエストURL
  • エラーメッセージ/エラーコード
  • エラー発生箇所(関数名、行数)
  • エラー発生ユーザー

アラートの仕組みがない開発環境ではクライアントさんや企画さんから「エラー出ました」と発信が無いと、サーバー側での事前検知が困難です。

Slackにアラートが発報されて、それを見て直ぐにどの程度深刻か判断できる場合、サーバー側から「エラーっぽいので調査します」だったり、「致命的なのでCloud Runのリビジョンを戻します」等素早い判断が出来、お互い幸せな開発体験を送ることができるでしょう。

最低限の形で動かしてみよう

まずは特定のログが来たらSlackに通知するだけのアラートを作ってみようと思います。

ログベースのアラートは昨年GAになった比較的新しい機能で、公式Docも何故かコンソールからの操作説明を諦めてしまっているのみたいですが、今回はコンソールからの操作で説明します。

 

まずは通知チャンネルの構成を行います。以下のURLより、SlackのAdd newを押すことで、Slackワークスペースとの連携が行います。

https://console.cloud.google.com/monitoring/alerting/notifications

赤い丸より連携を行うことで、登録は完了です。メールやその他アプリへの連携も可能です。

Terraform等やAPI経由で設定を行いたい方は、登録後青い丸から「通知のURL」のコピーが可能です。

 

次に、ログエクスプローラより「アラートを作成」ボタンを選択します。

選択すると、作成画面が出てきます。現時点では日本語対応は部分的のようです。

最低限必要な項目は以下です。

  • Alert Policy Name
  • Choose logs to include in the alert
  • 通知の間隔
  • インシデントの自動クローズ期間
  • 通知チャンネル(複数指定可)

Choose logs to include in the alertにはアラート条件をLoggingのクエリ言語で記載します。PREVIEW LOGSを押下することで、絞り込めているか確認も可能です。

ここまで設定を終えて、slackでログを出してみると以下のようにアラートが発報されます。

このアラートではCloud Runで何かが起きたことは分かるのですが、詳細はURL見ないと分かりません。

そこで、表示されるメッセージのカスタマイズを行ってみようと思います。

アラートメッセージをカスタマイズしよう

ログベースのアラートでは構造化ログの任意のフィールドの値を変数として利用できる機能があります。

今回は、構造化ログからエラー発生箇所を取ってきてSlackに表示させてみようと思います。

アラートの設定から「ADD A LABEL」を押して以下のように指定します。

Documentationには以下のように追記します。

これらの操作で以下のことを実現しています。*1 *2

  • 構造化ログから特定のフィールドを指定して、ラベルを作る
  • 作ったラベルで、アラートのメッセージを作る 

ここまで設定すると、Slackには以下のようなアラートが発報されます。

ここまでくれば、エラーが起きたAPIが何なのか素早く特定できるでしょう。

他にもログに出しているものを出力することで、より良いアラートになると思います。

例えば、アプリケーション側に送信しているエラーコードやメッセージを表示したり、ユーザーIDと管理画面のURLを繋げて管理画面へのリンクを作ったりすることで、サーバー以外の人が見ても役に立つエラーログになると思います。

おわりに

無事にアラートが発報出来たので、めでたしめでたし、と言いたいところですが、もし環境が10環境あって、それら全てに上記の設定を加えてメンテするのは非常に大変です。

社内の勉強会などの各種イベントでは、上記問題などを取り扱った少し広い範囲の紹介を行っているので、ご興味がある方や、一緒に快適な開発体験を行う取り組みを行いたい方、是非↓リンクからご応募いただければと思います。メリークリスマス!

 

カヤックボンドでは一緒に技術力を高め合えるエンジニアを募集しています!