はじめに
みなさん、CloudWatch Logs Insightsを利用されているでしょうか?
CloudWatch Logs Insightsを使用すると、Amazon CloudWatch Logsのログデータをインタラクティブに検索し分析することが可能になります。
今回は、Lambdaのログを想定して、便利なクエリ言語 stats
でいろいろ可視化してみました。
便利なクエリ構文 stats
stats
を使用すると、ログデータを棒グラフ、折れ線グラフ、積み上げ面グラフなどで視覚化できます。
ログデータのパターンを効率的に可視化できます。
1つ以上の集計関数を使用します。
公式ドキュメント クエリ構文 – stats
集計して可視化してみた
複数のコマンドを含むクエリを作成するときは、コマンドをパイプ文字 (|) で区切ります
例) ログメッセージに特定の文字列を含むログデータ数を集計する
filter
構文で条件によってログデータを絞り込み、その数をカウントします
1 2 | filter @message like /Exception/ | stats count (*) |
例) ログメッセージに特定の文字列を含むログデータの一定時間あたりの数を集計する
bin
関数を利用して1時間ごとの特定の文字列を含むログデータ数を集計します
1 2 | 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
で連結できる
1 2 | filter (@message like /Exception/ and @message not like /AccessDenied/) | stats count (*) by bin(1h) |
tips2: filterを使わない方法もある
1 | stats sum (@message like /Exception/ and @message not like /AccessDenied/) by bin(1h) |
tips3: bin(xx)をJST基準にする
bin(xx)はUTC基準で集計されています。
JST基準で集計するにはdateFloor
を使用して以下のようにします。
1 2 | filter @message like /Exception/ stats count (*) by dateFloor(@ timestamp + 9 * 60 * 60 * 1000, 1h) |
例) 特定のキーの値でグルーピングして集計する
ログデータがJSON形式で出力されていることが前提です。
例として、ログデータにstatus
というキーがあるとすると、status
の値単位でグルーピングして集計できます。
1 2 3 4 5 | { "status" : "200" } { "status" : "200" } { "status" : "401" } { "status" : "200" } ..... |
以下のクエリでstatus
の値単位でグルーピングして集計できます。
1 | stats count (*) by status |
結果
status | count(*) |
---|---|
200 | 18 |
401 | 2 |
例) 表示結果をきれいにしたい
表のヘッダー名や並べ方を調整したい場合は、display
、 as
などを使用します。
以下は、公式ドキュメントにあるLambda ログのクエリ を少し変えて、1時間ごとの値を集計するようにしました。
as
で集計結果の項目に任意で名前をつけることができますdisplay
で指定した項目だけ出力されます。また、左から順の表示になりますstats
は,
区切りで複数設定できます
1 2 3 4 5 6 7 | 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
で集計して可視化してみました。
今後のログ調査や運用で役に立ちそうだなと思いました!