Datadog Forwarderを使用してログストリーム単位でDatadog Monitorを作成する

## What's This
[こちらの記事](https://qiita.com/meta_plankton/items/d626416d42748ad7f38e)で、`ロググループのメトリクスフィルターで検知した文字列をDatadogに流してログ監視する`
流れを作ったものの、不都合が生じる場面がありました。

## 問題点
以下の例で考えてみます。
ロググループがあり、その下にふたつログストリームを作成しています。

```
例
AWS側
ロググループ：EC2-LogGroup
ログストリーム：
ec2-ichigouki
ec2-nigouki
メトリクスフィルター：Error

Datadog側
上記ロググループで設定されたメトリクスフィルターを通して、
流れてきたError文字列を監視するモニターを作成する。
```

前回の方法では、ログストリーム単位ではなく、ロググループ単位でモニターを作成していました。

なので、ec2-ichigouki、ec2-nigouki　どちらか一方のログストリームで監視文字列"Error"が生成された場合、
どちらのログストリームでErrorが発生したのかを区別することができません。
ロググループ単位でしか検知できないためです。

なので、ログストリーム単位でモニターを作成しました。メモです。
あくまでメモなので、参考にされる場合は、公式ドキュメント等の副読的な感じで読まれると幸いです。

## イメージ

![スクリーンショット 2022-07-21 13.37.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/cb808853-bdac-e3d7-73b1-e0ed62fddf69.png)

## 1.CFn実行
Datadog Forwarder Lambda 関数をデプロイする。
https://docs.datadoghq.com/ja/serverless/forwarder/
![スクリーンショット 2022-06-29 12.14.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/4dd4b45a-cf0d-2d15-b8e7-258ad8698503.png)
## 2.インストールされた Forwarder へ、Cloud watch logsトリガーを設定。
https://docs.datadoghq.com/ja/logs/guide/send-aws-services-logs-with-the-datadog-lambda-function/?tabs=awsconsole
![スクリーンショット 2022-06-29 13.21.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/fbcb33d3-96ce-9ac4-164a-7bb469e8069a.png)

![スクリーンショット 2022-06-29 13.42.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/c3911719-adc7-d275-379e-38d522ea1ad3.png)
## 3.フィルターパターンを設定する。
2で設定した文字列がログストリーム内で発生したら、CL watch logsのトリガーが実行されて、DDに飛んでいく。

※ただ、トリガーではロググループ単位でしか設定できない。
Datadog logs側で、ログストリーム単位でモニターを作成するために、以下を実施する。

※一度トリガーを発生させて、DD logsへログを転送させないと、
Datadog GUI上で任意のログストリームのメトリクスは発見できませんでした。
なので次の手順を行います。

## 4.各ログストリーム単位で、ERROR文字列をログイベントでテスト発行し、一度datadog logsに流す。
流れてきたログ内容から、ログストリームの箇所を押下し、add facetでログストリーム単位でメトリクスを生成。
（Event Attributes > i:log streamの箇所）

![スクリーンショット 2022-06-30 17.09.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1740345/c364697a-8308-1e5f-ec95-effa46618438.png)


## 4.(Terraformで作成する場合)

基本的には、一度トリガーを発生させてdatadog Logsへログデータを送信しないと、
ログストリームのメトリクスを監視するモニターは作成できないと認識しています。

しかし、以下の方法で、トリガーを発生させずにモニターを作成することができました。
すでに本番運用していたり、トリガーを発生させずにモニターを作成したい場合などは、こちらで解決できるのではないかと思います。

https://qiita.com/meta_plankton/items/af94e60a65dd0234150e

## 備考

ちなみに、検知したい文字列が複数ある場合を想定します。
そうなると、手順2.で、Cloud watch logsトリガーを設定する際に、複数のサブスクリプションフィルターを設定するかと思いますが、
サブスクリプションフィルターは１つのロググループあたり、２つしか作成できません（2022/07/21時点）

なので、複数設定したい場合は、以下のように設定すると良いかと思います。

### サブスクリプションフィルターで、フィルターパターンに以下のように入れる
```
フィルターパターン: ?error ?alert ?Error ?Alert
```
### Datadog Monitorのクエリに以下のように、検知したい文字列を入れる
こうすることで、１つのモニターにつき、１つの文字列を検知するように設定可能。

```
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