【AWS】CloudWatchメトリクスについて調べてみた

#### はじめに  
※この記事は、[AWS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/aws)の記事です。  
  
最近、仕事で久々にCloudWatchをガッツリ触っております。  
  
ただCloudWatchに触れる際、毎回「メトリクス周りが良くわからん...」となるので、今回メトリクス周りについてしっかり調べてみました。  
  
#### 今回触れる機能  
  
- メトリクス(標準/カスタム)  
- 名前空間
- ディメンジョン  
- メトリクスフィルタ  
  
#### 参考サイト  
  
- [Amazon CloudWatch の概念](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html)
- [フィルターを使用したログイベントからのメトリクスの作成](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/MonitoringLogData.html)
- [[アップデート] CloudWatch Logs メトリクスフィルターでディメンションがサポートされました！](https://dev.classmethod.jp/articles/amazon-cloudwatch-logs-announces-dimension-support-for-metric-filters/)

 
#### そもそも「メトリクス」って？  
メトリクス(=単数形ではmetric)を直訳すると「指標」という意味ですが、CloudWatchでは「計測している項目」みたいな意味合いになります。  
  
例えばメトリクスとして、AWSでは以下のものが用意されています  
  
- Lambdaの実行時間  
- DynaoDBのデータ量  
- S3のファイル数
  
これらのメトリクスの値を監視したり、これに基づいたアラームを作成するのが、CloudWatchでのシステム監視の基本になります。  
  
#### メトリクスの種類について  
メトリクスには、大きく2つの種類が存在します。  
  
##### 標準メトリクス  
これはAWSが初めから用意しているメトリクスになります。  
  
例えば、先ほど挙げた「Lambdaの実行時間」「S3のファイル数」などは標準メトリクスで、特に何もしなくても利用することができます。  
  
##### カスタムメトリクス  
こちらはユーザーが自分で作成したメトリクスになります。  
  
例えばメトリクスフィルタ(後述)を使用して「ログ内の特定の文字列(```ERROR```など)の出現回数を計測する」メトリクスを作成するケースがありますが、このような自分で追加したメトリクスは「カスタムメトリクス」になります。  
  
なおカスタムメトリクスは、1個当たり0.3ドルかかりますので、作成のし過ぎに注意してください。  
  
#### 「名前空間」と「ディメンジョン」  
メトリクスには付属情報として「名前空間」及び「ディメンジョン」を付与できます。  
   
##### 名前空間  
名前空間は主にメトリクスをサービス名、システム名(=アプリ名)、及びAWSリソース名など、比較的大きな区分でグループ化するのに便利です。    
  
例えば標準メトリクスは「AWS/S3」「AWS/Lambda」のように「AWS/リソース名」という名前空間が付与されています。  
  
カスタムメトリクスでも、名前空間にサービス名、システム名、リソース名などを付与することで、メトリクスの種類をグループ化しやすくなります。  
  
#### ディメンジョン  
もう一つが「ディメンジョン」で、これは下記のようになケースで便利です。  
  
- 名前空間より、もっと細かい単位で分割したい  
- メトリクスは同じだけど、細かい単位や内容によって分けたい(=EC2インスタンス、APIリクエスト元など)    
   
例えば、下記のケースが発生したとします。  
  
- 半角スペース区切りのログファイルに対して「項目```statusCode```が400以上であるログをカウントする」というメトリクスフィルタを作成する  
- リクエスト元の都道府県(=項目```pref```)ごとに分けて集計したい  
  
このような場合に、同じ条件(=「項目```statusCode```が400以上」)のメトリクスフィルタ(=カスタムメトリクス)を複数作成しなくても、  
  
- メトリクスフィルタは1つだけ作成する  
- そのカスタムメトリクスのディメンジョンに「pref」を指定する  
  
ようにすれば、実際のprefがとりうる値(=都道府県)毎に個別に計測ができますので、例えば「北海道と福岡のアクセス数を比較する」ということも可能です。(=ディメンジョンは、それ単体で1つのカスタムメトリクスとして扱うことが可能)  
  
##### ディメンジョンの制約・注意点 
  
- ディメンジョンは1メトリクスに対して30個まで  
- ディメンジョンの1つの値につき、1カスタムメトリクスの料金がかかる  
  - ディメンジョンの個数<span style="color: #ff5252">**ではない**</span>  
  - 特に取りうる値が多い項目は注意！(※1)  
  
※1：例えば先程の```pref```の場合、47都道府県すべてからリクエストがあった場合、それだけでカスタムメトリクス47個分の料金がかかります。
  
#### メトリクスフィルタ  
最後に、メトリクスフィルタです。  
  
メトリクスフィルタはCloudWatch Logsのロググループ内のログの検索機能で、下記のようなことができます。  
  
- 特定の文字を含む(or含まない)ログの件数を抽出する
  - 検索の仕方は色々ある。詳細は参考サイトを参照。  
- Key-Value形式(=半角スペース区切り、JSONなど)のログについては、キー値の数値検索(「```fileSize```が1,024以上」など)も可能  
  
抽出した結果(≒件数)をそのままカスタムメトリクスとして出力できるので、CloudWatch上で監視することも可能です。(もちろん名前空間＆ディメンジョンも付与できる)  
  
ちなみに「メトリクスフィルタ」という名前ですが、あくまでもフィルタ対象は「(CloudWatch Logsの)ログ」であり、メトリクスそのものをフィルタするわけではありません。  
  
##### メトリクスフィルタのディメンジョン制約  
メトリクスフィルタで作成するカスタムメトリクスには、ディメンジョン作成時に以下の制約があります。(ディメンジョンの作成そのものは可能です)  
  
- ディメンジョンを作成できるのは、ログファイルがKey-Value形式のもののみ  
  - 半角スペース区切り、またはJSON
  - ログがランダムな文字列の場合は作成不可
- 作成可能なディメンジョンは最大3つまで  
  - 通常のカスタムメトリクスは30個まで  
- 「デフォルト値」を指定した場合、ディメンジョンは作成不可(逆も然り)  
  - ディメンジョンとデフォルト値は、完全に排他な関係
   
#### まとめ  
以上、走り書きになってしまいましたが、CloudWatchメトリクスについて書いてみました。  
  
自分もCloudWatchメトリクスについていまいち理解しきれなかったので、今回しっかりと調べることができた＆しっかり理解ができたので、良かったです。  
  
特にディメンジョンあたりは、うまく使えば便利そうだな、と思ったので、有効活用できないか検討してみようと思いました。  
  
それでは、今回はこの辺で。