はじめに

みなさん、CloudWatch Logs Insightsを利用されているでしょうか?
CloudWatch Logs Insightsを使用すると、Amazon CloudWatch Logsのログデータをインタラクティブに検索し分析することが可能になります。
今回は、Lambdaのログを想定して、便利なクエリ言語 stats でいろいろ可視化してみました。

便利なクエリ構文 stats

stats を使用すると、ログデータを棒グラフ、折れ線グラフ、積み上げ面グラフなどで視覚化できます。
ログデータのパターンを効率的に可視化できます。
1つ以上の集計関数を使用します。
公式ドキュメント クエリ構文 – stats

集計して可視化してみた

複数のコマンドを含むクエリを作成するときは、コマンドをパイプ文字 (|) で区切ります

例) ログメッセージに特定の文字列を含むログデータ数を集計する

filter構文で条件によってログデータを絞り込み、その数をカウントします

filter @message like /Exception/ 
| stats count(*)

例) ログメッセージに特定の文字列を含むログデータの一定時間あたりの数を集計する

bin関数を利用して1時間ごとの特定の文字列を含むログデータ数を集計します

filter @message like /Exception/ 
| stats count(*) by bin(1h)

結果

bin(1h) count(*)
2023-09-14T13:00:00.000+09:00 10
2023-09-14T12:00:00.000+09:00 16
2023-09-14T11:00:00.000+09:00 0
tips1: filterは複数条件も設定できる

フィルターする条件は and or で連結できる

filter (@message like /Exception/ and @message not like /AccessDenied/)
| stats count(*) by bin(1h)
tips2: filterを使わない方法もある
stats sum(@message like /Exception/ and @message not like /AccessDenied/) by bin(1h)
tips3: bin(xx)をJST基準にする

bin(xx)はUTC基準で集計されています。
JST基準で集計するにはdateFloorを使用して以下のようにします。

filter @message like /Exception/ 
stats count(*) by dateFloor(@timestamp + 9 * 60 * 60 * 1000, 1h)

例) 特定のキーの値でグルーピングして集計する

ログデータがJSON形式で出力されていることが前提です。
例として、ログデータにstatusというキーがあるとすると、statusの値単位でグルーピングして集計できます。

{"status": "200"}
{"status": "200"}
{"status": "401"}
{"status": "200"}
.....

以下のクエリでstatusの値単位でグルーピングして集計できます。

stats count(*) by status

結果

status count(*)
200 18
401 2

例) 表示結果をきれいにしたい

表のヘッダー名や並べ方を調整したい場合は、displayasなどを使用します。

以下は、公式ドキュメントにあるLambda ログのクエリ を少し変えて、1時間ごとの値を集計するようにしました。

  • as で集計結果の項目に任意で名前をつけることができます
  • display で指定した項目だけ出力されます。また、左から順の表示になります
  • stats,区切りで複数設定できます
filter @type = "REPORT"
    | stats max(@memorySize / 1000 / 1000) as provisonedMemoryMB,
        min(@maxMemoryUsed / 1000 / 1000) as smallestMemoryRequestMB,
        avg(@maxMemoryUsed / 1000 / 1000) as avgMemoryUsedMB,
        max(@maxMemoryUsed / 1000 / 1000) as maxMemoryUsedMB,
        provisonedMemoryMB - maxMemoryUsedMB as overProvisionedMB by bin(1h)
    | display overProvisionedMB, avgMemoryUsedMB, provisonedMemoryMB, maxMemoryUsedMB

結果

overProvisionedMB avgMemoryUsedMB provisonedMemoryMB maxMemoryUsedMB
13 110.4655 128 115
13 110.5456 128 115
13 111.0041 128 115

おわりに

以上、statsで集計して可視化してみました。
今後のログ調査や運用で役に立ちそうだなと思いました!

参考リンク