はじめに
Lambdaを使ってアプリケーションを作っていると、カスタムメトリクスを取得したくなるケースが発生する。
しかし、FaaSでは統計情報を収集する・定期でメトリクス情報を送る仕組みがないため、コンテナとは異なるアプローチが必要になる(例えばコンテナアプリでは、定期的にPutMetricDataのAPIを呼ぶことでメトリクス情報を送ることが可能)。
Amazon CloudWatch Logsのメトリクスフィルターを使えば、ログの情報をカスタムメトリクスとして送信することができる。
今回は、この方式の統計情報作成をTerraformで自動化する。
アプリケーションのログ情報
例えば、今回のアプリケーションでは、処理中に文字列の修正を行ったかどうかを判定して統計を取りたいとする。
メトリクスを分けるために、以下のようなINFOログを出力するとしよう。
- 修正を行わなかった場合
[2023-05-21T02:15:16.701] [INFO] default - [Metric Filter] CorrectWord: Uncorrected.
- 修正を行った場合
[2023-05-21T02:15:16.701] [INFO] default - [Metric Filter] CorrectWord: Corrected.
メトリクスフィルタの設定
上記のログを統計する場合、以下のようなメトリクスフィルタを作れば良い。
pettern
の部分がフィルタ用文字列、metric_transformation
の部分がメトリクスの設定だ。
今回は件数を計上したいので、1ログ1件として、value = "1"
、unit = "Count"
を設定している。
今回はLambdaでディメンション指定は不要なので、使っていない。EC2やECSで見分けが必要な場合はディメンションを使おう。
resource "aws_cloudwatch_log_group" "lambda" {
name = "/aws/lambda/${local.lambda_function_name}"
}
resource "aws_cloudwatch_log_metric_filter" "example1" {
name = "${local.lambda_function_name}-correctword-corrected"
pattern = "Metric Filter Corrected"
log_group_name = aws_cloudwatch_log_group.lambda.name
metric_transformation {
namespace = "CustomMetrics/xxxxxxxx"
name = "CorrectedCount"
value = "1"
unit = "Count"
}
}
resource "aws_cloudwatch_log_metric_filter" "example2" {
name = "${local.lambda_function_name}-correctword-uncorrected"
pattern = "Metric Filter Uncorrected"
log_group_name = aws_cloudwatch_log_group.lambda.name
metric_transformation {
namespace = "CustomMetrics/xxxxxxxx"
name = "UncorrectedCount"
value = "1"
unit = "Count"
}
}
なお、フィルタを作ってからチェックするのは面倒なので、マネージメントコンソールでは既存のログからパターンをテストをしてから適用する方が良い。
結果確認
上記の設定を入れた後に適当にアプリを動かしてログを出力させてから、CloudWatchメトリクスのコンソールを確認しよう。
自分で作ったフィルタのメトリクス情報が出力されるようになった!