What's This
こちらの記事で、ロググループのメトリクスフィルターで検知した文字列をDatadogに流してログ監視する
流れを作ったものの、不都合が生じる場面がありました。
問題点
以下の例で考えてみます。
ロググループがあり、その下にふたつログストリームを作成しています。
例
AWS側
ロググループ:EC2-LogGroup
ログストリーム:
ec2-ichigouki
ec2-nigouki
メトリクスフィルター:Error
Datadog側
上記ロググループで設定されたメトリクスフィルターを通して、
流れてきたError文字列を監視するモニターを作成する。
前回の方法では、ログストリーム単位ではなく、ロググループ単位でモニターを作成していました。
なので、ec2-ichigouki、ec2-nigouki どちらか一方のログストリームで監視文字列"Error"が生成された場合、
どちらのログストリームでErrorが発生したのかを区別することができません。
ロググループ単位でしか検知できないためです。
なので、ログストリーム単位でモニターを作成しました。メモです。
あくまでメモなので、参考にされる場合は、公式ドキュメント等の副読的な感じで読まれると幸いです。
イメージ
1.CFn実行
Datadog Forwarder Lambda 関数をデプロイする。
https://docs.datadoghq.com/ja/serverless/forwarder/
2.インストールされた Forwarder へ、Cloud watch logsトリガーを設定。
https://docs.datadoghq.com/ja/logs/guide/send-aws-services-logs-with-the-datadog-lambda-function/?tabs=awsconsole
3.フィルターパターンを設定する。
2で設定した文字列がログストリーム内で発生したら、CL watch logsのトリガーが実行されて、DDに飛んでいく。
※ただ、トリガーではロググループ単位でしか設定できない。
Datadog logs側で、ログストリーム単位でモニターを作成するために、以下を実施する。
※一度トリガーを発生させて、DD logsへログを転送させないと、
Datadog GUI上で任意のログストリームのメトリクスは発見できませんでした。
なので次の手順を行います。
4.各ログストリーム単位で、ERROR文字列をログイベントでテスト発行し、一度datadog logsに流す。
流れてきたログ内容から、ログストリームの箇所を押下し、add facetでログストリーム単位でメトリクスを生成。
(Event Attributes > i:log streamの箇所)
4.(Terraformで作成する場合)
基本的には、一度トリガーを発生させてdatadog Logsへログデータを送信しないと、
ログストリームのメトリクスを監視するモニターは作成できないと認識しています。
しかし、以下の方法で、トリガーを発生させずにモニターを作成することができました。
すでに本番運用していたり、トリガーを発生させずにモニターを作成したい場合などは、こちらで解決できるのではないかと思います。
備考
ちなみに、検知したい文字列が複数ある場合を想定します。
そうなると、手順2.で、Cloud watch logsトリガーを設定する際に、複数のサブスクリプションフィルターを設定するかと思いますが、
サブスクリプションフィルターは1つのロググループあたり、2つしか作成できません(2022/07/21時点)
なので、複数設定したい場合は、以下のように設定すると良いかと思います。
サブスクリプションフィルターで、フィルターパターンに以下のように入れる
フィルターパターン: ?error ?alert ?Error ?Alert
Datadog Monitorのクエリに以下のように、検知したい文字列を入れる
こうすることで、1つのモニターにつき、1つの文字列を検知するように設定可能。
logs("@aws.awslogs.logStream:ログストリーム名 error")
logs("@aws.awslogs.logStream:ログストリーム名 alert")
logs("@aws.awslogs.logStream:ログストリーム名 Error")
logs("@aws.awslogs.logStream:ログストリーム名 Alert")
Reference
・https://docs.datadoghq.com/ja/serverless/forwarder/
・https://docs.datadoghq.com/ja/logs/guide/send-aws-services-logs-with-the-datadog-lambda-function/?tab=awsconsole
・https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html
・https://github.com/DataDog/datadog-serverless-functions/blob/master/aws/README.md
・https://htnosm.hatenablog.com/entry/2021/12/06/090000