CloudWatch Logs Insights で便利な比較機能

# はじめに
台風の動きがまるで牛歩ですね。
災害が起こらないことを願う [@\_\_\_nix___](https://twitter.com/___nix___) です。

# 背景
皆さん CloudWatch Logs Insights は良く活用しているかと思いますが、いつからか「比較（オフ）」のような表記が追加されたなぁと思う位でそれを押してみようとは思ったことが無いままだったのではないでしょうか。

今回ご紹介するのはこの「比較（Compare）」の機能についてです。

# 概要
CloudWatch Logs Insights の 比較（Compare）機能は、ログイベントの時間経過による変化を比較分析するツールです。

主な特徴:

* 最近の期間と直前の期間、または過去の同様の期間を比較可能
* 生のログイベントではなく、パターン分析結果を表示
* 比較期間は元のクエリ期間と同じ長さ
* 前期間、前日、前週、前月との比較オプションあり

使用方法:

* クエリを作成し、比較したい期間を選択
* 結果はパターン、イベント数の差分、変化の説明などを表示
* パターンの詳細検査や関連パターンの確認が可能

この機能により、エラーの新規発生や傾向の把握が容易になり、ログ分析の効率が向上します。

# 実践

「比較（Compare）」に進む前にまず、パターン分析について触れておきます。

## パターン分析

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData_Patterns.html

Insights に遷移すると以下のクエリがデフォルトで設定されています。

```
fields @timestamp, @message, @logStream, @log
| sort @timestamp desc
| limit 10000
```

このクエリを実行すると「ログ」タブにお馴染みの直近1時間のログが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22939/0b72d2bd-c898-8772-9627-e51775a09d57.png)

パターン分析を行う場合、どのフィールドを対象にするかを選ぶだけで分析が可能です。
この例では `@message` のフィールドに対してパターン分析を行います。

```
fields @timestamp, @message, @logStream, @log
| pattern @message
```

上記クエリを実行すると以下のような画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22939/798ef83f-e41c-d684-4b6e-20fdbaca1c00.png)

パターン分析が完了して、いつもと違う「パターン」タブを選択した状態になります。
↑①の部分をクリックすると以下のようにより詳細が確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22939/03de928e-0d53-3474-fdbd-bcce6e2bafc9.png)

今回、ログのパターンは次のように解析してくれました。

```
<トークン 1><トークン 2>	INFO Request: <トークン 3> https:<トークン 4>; ResourceType: <トークン 5>
```

それぞれのトークンの値の具体例は以下のテーブルに示したものになります。

|トークン|トークンの値|
|---|---|
|トークン1|2024-08-28T13:25:32.423Z|
|トークン2|5f62c60c-9b8f-4964-ab79-a370cfe604cf|
|トークン3|GET|
|トークン4|//example.com/|
|トークン5|document|

つまり、パターン分析はどんなパターンのログがどの位登場するかの頻度（イベント数）を算出してくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22939/b0aa73a5-aaf8-d2a7-6e04-7066235f8593.png)

パターン分析を（ザックリ）理解したところで比較（Compare）の機能に進みます。

## （差分) を以前の時間範囲と比較する

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData_Compare.html

先程のクエリに対して今度は`[比較（オフ）]`を押してみると、以下のようにウィンドウが開くので`[前日]`を選択して`[適用]`してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22939/b658dc5b-9049-1369-4432-460ad6e9688e.png)

`[比較（オン）]`に変わり、クエリの内容も勝手に更新されました。この状態で`[クエリの実行]`を押します。
※この例では、直近の1時間と、対象の時間よりも1時間前の比較をしてくれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22939/59305191-c3d2-19fe-f538-1a383358a70c.png)

以下のように少し内容が変わりましたね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22939/3d5060e2-170f-c834-3c00-4d6cfb4ae5c4.png)

結果の詳細を追ってみましょう。
上の「イベント数の差異」をソートした結果が以下です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22939/dbf180be-4221-ef3b-ba18-fb9bffe8a926.png)

この結果から分かることは、2時間前～1時間前のログには `<*> <*> INFO log was deleted` というパターンが1度だけ登場していたが、直近1時間のログにはそれが無くなったということを示しています。

今回の例だと比較に関する情報が少な過ぎるので、別のログの結果も紹介しておきます。

■ 指定範囲の比較で直近の方がパターン登場回数が増加した例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22939/2c1478d8-96e8-cbf2-8f5a-bff775b1ad22.png)

■ 指定範囲の比較で直近の方がパターン登場回数が減少した例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22939/f2460e36-d5c1-4989-d265-a05ac7dee62f.png)

以上が比較（Compare）機能の説明でしたが、クエリを自分で書く場合は次のクエリ記法を利用してください。

|期間|意味|クエリ記法|
|---|---|---|
|前の期間|クエリ期間の直前の期間と比較します。|diff|
|前日|クエリ期間の 1 日前の期間と比較します。|diff previousDay|
|前の週|クエリ期間の 1 週間前の期間と比較します。|diff previousWeek|
|前月|クエリ期間の 1 か月前の期間と比較します。|diff previousMonth|

# 終わりに
以上がいつの間にか追加されていた比較（Compare）機能の紹介でした。
同時にパターン分析についても触れていますので、「この機能を使えば～の調査が出来そう」ということに発展すれば良いですね。
他にも「こんなことができるよ」ということがあればぜひ教えてください♪

# 一言
Xで書くと決めてから短時間で勢いだけで書いたので少し読み難いですね。
画面の説明をし過ぎたことでこれが裏目に...

この記事良かったと少しでも思って頂けたら是非 [@\_\_\_nix___](https://twitter.com/___nix___) をフォローしてあげてください。或いは記事に対してリアクションをお願い致します。