💥

Cloud Run エラーの通知方法まとめ

2024/11/04に公開

概要

Cloud Run サービスでエラーが発生したらSlack通知するための方法を調査、比較した。
比較した結果、「ログベースの指標」と「指標ベースのアラートポリシー」を組み合わせる方法が良さそうだったので、その使い方をまとめた。

前提

調査対象は Google Cloud 内で完結できる方法とした。
Sentry や Datadog などを使うとより良い方法がありそうだが、今回は調査対象外とした。

比較表

手法 最大通知数 使い方 メリット デメリット
Slack API Slack APIの制限に則る(超えると制限超過エラーが通知される) アプリケーションコードで通知処理を書く 簡単 Slack APIの制限に引っかかると、通知ができなくなる。
コンテナ起動エラーなどのインフラ系エラーに関しては別の仕組みで通知する必要がある
Error Reporting 5回/60 分[1] エラーログのフォーマットを指定の形式に変更する[2] 簡単
エラーのグルーピングが便利
制限を許容できない場合、制限を超えてエラーログが出力されたら通知する仕組みを構築する必要がある[3]
ログベースのアラートポリシー 20件/ 日[4] ログベースのアラートポリシーを作成し、通知条件を設定する 簡単
シンプル
制限を許容できない場合、制限を超えてエラーログが出力されたら通知する仕組みを構築する必要がある
ログベースの指標 + 指標ベースのアラートポリシー なし ログベースの指標を作成する
指標ベースのアラートポリシーを作成する
通知制限が無い エラーログ発生から通知まで1~2minの遅延がある[5]

最大通知数の制限が無いのは「ログベースの指標 + 指標ベースのアラートポリシー」のみ。
これはエラー検知が Pull 型であることに起因していると思われる。他の形式はエラーが発生したら通知する Push型であり、最大通知数の制限が設けられている。

また、「ログベースの指標 + 指標ベースのアラートポリシー」を作れば、アプリケーションのエラーもインフラのエラーもこれ一本でカバーできる。

以降は、「ログベースの指標 + 指標ベースのアラートポリシー」の使い方を見ていく。

ログベースの指標の作成

ログベースの指標は、ログを指標(メトリクス)に変換するもの。
Google Cloud コンソールから作成するには、「Monitoring」> 左メニュー「ログベースの指標」に移動し、「指標を作成」をクリックする。

そして、次のように指標タイプやフィルタなどの項目を入力して作成する。

ポイントは次の2つ。

  • 指標タイプを Counter に設定する
  • フィルタで Cloud Run エラーログを検索する条件を設定する

指標ベースのアラートポリシーの作成

先ほど作成したログベースの指標に対し、閾値を超えたら通知するための設定を行う。
Google Cloud コンソールから作成するには、「Monitoring」> 左メニュー「ログベースの指標」に移動し、先ほど作成したログベースの指標でその他の操作から「指標に基づいて通知を作成する」をクリックする。

そして次のように必要な項目を入力する。

アラート条件

Select a metric:先ほど作成したログベースの指標がデフォルトで設定されている。
Transform data:ローリングウィンドウ(アラート条件が満たされているかどうかを判定する期間)に10min、ローリングウィンドウ関数に count を設定する。これで設定した metric が10min間で出力した値をカウントできる。

トリガーの設定

Condition Types:Threshold(しきい値)を選択し、しきい値を0より大きい値に設定する

通知と名前

通知チャンネルには通知したいチャンネルを指定する。ここでは便宜上、slack通知チャンネルではなくメール通知用のチャンネルを指定した。
インシデントの自動クローズ期間は、インシデントがオープン状態のまま指定した期間が経過すると、自動でインシデントがクローズされる期間。

アラートの確認

入力した内容を確認して問題なければ「ポリシーを作成」をクリックする。
作成したポリシーは、Monitoring の左メニュー「アラート」の画面から確認できる。

動作確認

まず、Cloud Run でエラーログを出力させる。

すると、アラート通知とインシデント作成が行われる。

料金

ログベースの指標

取り込んだデータ量に応じて料金が決まる(参考

  • $0.2580/MiB: 最初の150~100,000 MiB
  • $0.1510/MiB: 次の100,000~250,000 MiB
  • $0.0610/MiB: 250,000MiB超

月初からの取り込み量はコンソール画面で確認できる。

アラートポリシー

  • アラート ポリシーの条件ごとに月額 $1.50
  • 指標アラートポリシー条件のクエリによって返される 1,000,000 時系列あたり$0.35
    • デフォルトではクエリが30s間隔で実行され1つの時系列を返すため、1時系列/30s * 2回/min * 60min/h 24h/day * 30day/month = 86,400時系列
    • $0.35 * 86,400時系列 / 1,000,000 時系列 = $0.03024

今回の設定では、1つのアラートポリシーで約 $1.53/月と推定(参考:アラートの料金)。

参考

ログベースの指標の概要
カウンタ指標を構成する

脚注
  1. これを超えると6時間通知されない(参考ドキュメント↩︎

  2. jsonPayloadで出力し、@typeフィールドに固定文字列をセットする(参考ドキュメント↩︎

  3. 例:Error Reportingの未解決のレポート数を定期的にチェックし、Slackチャンネルに残数を通知する。 ↩︎

  4. これを超えると通知が停止する(参考ドキュメント1, 参考ドキュメント2↩︎

  5. エラーログが発生してログベースの指標に反映されるのは数秒程度だが、アラートポリシーの条件判定に1min程度かかっていそう。 ↩︎

Discussion