Datadog enhanced AWS Lambda metrics を試してみる

# enhanced AWS Lambda metrics とは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31262/4d43700c-9d73-44b8-e3ae-c48d05e6837d.png)
DatadogにてAWSを連携すると出てくるデフォルトダッシュボードの中に存在する謎なやつ（図の下側）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31262/50f42a20-7ee5-0bab-e3ff-1fa8ec3c56b5.png)

とりあえず開いてみても情報なし、下側のInvocationsの値は入ってるのに、上側のInvocationsには値が入ってない :thinking: 

参照元メトリクスを見てみると別物参照してますね
上側: `aws.lambda.enhanced.invocations`
下側: `aws.lambda.invocations`

enhanced はどこから取得するのか

# Lambda の enhanced 情報の取得の仕方
ダッシュボードのトップに[拡張Lambdaメトリクス](https://docs.datadoghq.com/integrations/amazon_lambda/?tab=awsconsole#real-time-enhanced-lambda-metrics)を設定してとかかれてるので、設定方法がかかれたページへ移動します。

有効方法がかかれてますね（英語わからん）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31262/a5627499-a08a-dc68-67d4-a8a182456ad2.png)

英語わからんなりに読み解くと
1. [Datadog Forwarder](https://github.com/DataDog/datadog-serverless-functions/tree/master/aws/logs_monitoring#installation) を設定する
2. メトリクスを取得したいLambdaのLambda Layerに[Datadog Lambda Layer](https://docs.datadoghq.com/integrations/amazon_lambda/?tab=awsconsole#installing-and-using-the-datadog-lambda-layer)を入れる
3. LambdaのタグをDatadogのメトリクスに流用したければ Datadog Forwarder 側に `DdFetchLambdaTags`:`true` の変数を付与する
4. [サンプルコード](https://docs.datadoghq.com/integrations/amazon_lambda/?tab=awsconsole#custom-metrics-sample-code)のようにDatadogのLibraryでラップする（pythonだとデコレータ付与するだけで良さそう）
5. ブラウザでさっきのダッシュボードを確認する

なのかな試してみます。

## Datadog Forwarder を設定する
[Datadog Forwarder](https://github.com/DataDog/datadog-serverless-functions/tree/master/aws/logs_monitoring#installation) を見に行くと、[CloudFormationのテンプレート](https://console.aws.amazon.com/cloudformation/home#/stacks/create/review?stackName=datadog-forwarder&templateURL=https://datadog-cloudformation-template.s3.amazonaws.com/aws/forwarder/latest.yaml) があったので利用します。

テンプレートには下記を設定（設定したもの以外はデフォルト値)

- `DdFetchLambdaTags` : `true` 
- `DdApiKey` : `自身のDatadogのAPIキー`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31262/9839c010-7c7b-cba2-8655-5a79dfb8613b.png)
IAMとかのリソース作ってよいか聞かれるので、チェックして `Create Stack` 

## Datadog Layerを使ったサンプルコード作成
何でも良いかと思い、Python3のhello-worldのBlueprintを利用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31262/267036b1-8e31-1c28-4e56-53655eba7d3d.png)

function名だけ指定してCreate（今回はtestって名前)

### Datadog Lambda Layer を作成したコードに追加
[Datadog Lambda Layer]https://docs.datadoghq.com/integrations/amazon_lambda/?tab=awsconsole#installing-and-using-the-datadog-lambda-layer
現時点のpython3.7用は `arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Python37:11`

これを使っていきます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31262/6eb01551-2938-a1be-0d99-d31fbf7e7dba.png)
サンプルのLambdaの `Layers` を選択すると `Add a Layer` があるのでクリック
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31262/d6118a65-40b2-0506-e863-399acad178ff.png)
先程のDatadog Layerを入力する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31262/3bf8b02d-c787-68fb-884b-c938fce21cf2.png)

追加されました。

### Datadog ライブラリでサンプルコードをラップ
コードにこの2行を追加
`from datadog_lambda.wrapper import datadog_lambda_wrapper`
`@datadog_lambda_wrapper`

全体像

```python:lambda_function.py
import json
from datadog_lambda.wrapper import datadog_lambda_wrapper

print('Loading function')


@datadog_lambda_wrapper
def lambda_handler(event, context):
    #print("Received event: " + json.dumps(event, indent=2))
    print("value1 = " + event['key1'])
    print("value2 = " + event['key2'])
    print("value3 = " + event['key3'])
    return event['key1']  # Echo back the first key value
    #raise Exception('Something went wrong')
```

### サンプルコードに環境変数を追加
前段の状態でテスト実行してもエラーになるので下記環境変数を追加

- `DD_API_KEY` : `自分のDatadogのAPIキー`

一応これだけで動くようになるのですが、結果これだけではやりたいことに足らなかったので以下の環境変数も追加します。

- `DD_ENHANCED_METRICS` : `true`
    - Enhanced メトリクスを有効化
- `DD_FLUSH_TO_LOG` : `true`
    - 設定されていないと有効化されたEnhanced メトリクスがCloudWatch Logsにながれない

### CloudWatch LogsにEnhancedメトリクス用のデータが流れる

サンプルコードの設定が終わりテスト実行すると、以下のようなログが流れるようになる。
```
{
    "m": "aws.lambda.enhanced.invocations",
    "v": 1,
    "e": 1590216872,
    "t": [
        "region:us-east-1",
        "account_id:xxxxxxxx",
        "functionname:test",
        "cold_start:true",
        "memorysize:128",
        "runtime:python3.7",
        "dd_lambda_layer:datadog-python37_0.11.0"
    ]
}
```

# Datadog Forwarder に サンプルコードの Logs を紐付ける
とりあえず、前段の状態でテスト実行しても、`aws.lambda.invocations`の値は増えるが
`aws.lambda.enhanced.invocations` に変化は見られない。

Datadog ForwarderのReadmeを見ると
`Set up triggers to the installed Forwarder either automatically or manually.`
って書いてあるのでサンプルコードのLogsを紐付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31262/e5089036-fba2-dd4f-af73-012a1749531e.png)


# 動作確認

サンプルコード(test)を試しに3回連続で実行してみた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31262/989c6cc5-9680-8e1a-ced8-bb9725088c8c.png)

Invocationｓ等に値が入るようになった、３連続のためか、`Invocations`は3で`Cold Starts`が１となった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31262/f61d4d93-970b-579e-bb08-3a2591004b0c.png)

メモリの消費状況等も見れるようだ

# まとめ
Datadog の enhanced AWS Lambda metrics を利用できるようにしてみました。
通常のLambdaのダッシュボードとは異なりCold_startの状況や、メモリの消費状況などが確認できるのでLambdaのスペックなどをチューニングする際などにやくだちそうです。