こんにちは、株式会社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でログの比率によってアラートを発生させる方法でした。