こんにちは、株式会社FLINTERSの丸山です。この記事はFLINTERS10周年記念ブログリレーの63日目です。
Google Cloudには、ある条件に達した時にアラートを発生させる仕組みがあります。その仕組みを使って、あるログの数と別のログの数の比率がある割合になった時(例えば失敗ログ数が成功ログ数の10%を超えた時など)アラートを受け取る方法を調べてみました。
ログベースの指標の作成
まずは対象となるログの指標を作ります。 Google Cloudではユーザー定義の指標を使って、独自のログベースの指標を作成できます。
ログベースの指標の画面から特定のメッセージを持つログをフィルタ条件とする指標を作成します。
今回はログの件数の比率を出したいので、指標タイプはCounter、フィルタはtextPayloadというフィールドがsuccessというログとfailureというログをカウントする指標を作りました。
アラートポリシーの作成
次にアラートポリシーを作成します。 アラートポリシーはアラートが発生する条件とその通知方法の設定です。
今回アラートが発生する条件はfailureログ数がsuccessログ数の50%を超えたらアラートを発生させるという条件にします。
アラートポリシーはGoogle Cloudの画面からも作成できますが、今回はgcloudコマンドとJSONファイル使用して作成します。
まず下記のようなJSONファイルを用意します。
{ "displayName": "test policy", "documentation": { "content": "テスト通知", "mimeType": "text/markdown" }, "userLabels": {}, "conditions": [ { "displayName": "New condition", "conditionThreshold": { "aggregations": [ { "alignmentPeriod": "86400s", "crossSeriesReducer": "REDUCE_SUM", "perSeriesAligner": "ALIGN_DELTA" } ], "comparison": "COMPARISON_GT", "denominatorAggregations": [ { "alignmentPeriod": "86400s", "crossSeriesReducer": "REDUCE_SUM", "perSeriesAligner": "ALIGN_DELTA" } ], "denominatorFilter": "resource.type=global AND metric.name=\"logging.googleapis.com/user/success\"", "duration": "0s", "filter": "resource.type=global AND metric.name=\"logging.googleapis.com/user/failure\"", "thresholdValue": 0.5, "trigger": { "count": 1 } } } ], "alertStrategy": { "autoClose": "604800s" }, "combiner": "OR", "enabled": true, "notificationChannels": [] }
ここで大事な部分はdenominatorFilterとfilterです。 分母となる指標をdenominatorFilterに、分子となる指標をfilterに設定することとで、二つの指標の比率を計算することができます。 そしてthresholdValueに閾値となる0.5(50%)を設定します。
JSONファイルが作成できたら、下記のコマンドを実行してアラートポリシーを作成します。
$ gcloud alpha monitoring policies create --policy-from-file="アラートポリシーを記述したJSONファイル名"
アラートの確認
アラートポリシーを作成したので、実際にアラートが飛ぶか確認してみます。 まずアラートの条件となるsuccessとfailureのログを2つずつ作成します。
gcloud logging write my-test-log "success"
gcloud logging write my-test-log "failure"
アラート画面を見ると下記のようにインシデントが発生しています。
インシデントの詳細を見ると比率が100%になり、閾値を超えていることを確認できます。
以上、Google Cloudでログの比率によってアラートを発生させる方法でした。