Datadog enhanced AWS Lambda metrics を試してみる


enhanced AWS Lambda metrics とは


DatadogにてAWSを連携すると出てくるデフォルトダッシュボードの中に存在する謎なやつ(図の下側)

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

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

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

Lambda の enhanced 情報の取得の仕方

ダッシュボードのトップに拡張Lambdaメトリクスを設定してとかかれてるので、設定方法がかかれたページへ移動します。

有効方法がかかれてますね(英語わからん)

英語わからんなりに読み解くと
1. Datadog Forwarder を設定する
2. メトリクスを取得したいLambdaのLambda LayerにDatadog Lambda Layerを入れる
3. LambdaのタグをDatadogのメトリクスに流用したければ Datadog Forwarder 側に DdFetchLambdaTags:true の変数を付与する
4. サンプルコードのようにDatadogのLibraryでラップする(pythonだとデコレータ付与するだけで良さそう)
5. ブラウザでさっきのダッシュボードを確認する

なのかな試してみます。

Datadog Forwarder を設定する

Datadog Forwarder を見に行くと、CloudFormationのテンプレート があったので利用します。

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

  • DdFetchLambdaTags : true
  • DdApiKey : 自身のDatadogのAPIキー


IAMとかのリソース作ってよいか聞かれるので、チェックして Create Stack

Datadog Layerを使ったサンプルコード作成

何でも良いかと思い、Python3のhello-worldのBlueprintを利用します。

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

これを使っていきます


サンプルのLambdaの Layers を選択すると Add a Layer があるのでクリック


先程のDatadog Layerを入力する

追加されました。

Datadog ライブラリでサンプルコードをラップ

コードにこの2行を追加
from datadog_lambda.wrapper import datadog_lambda_wrapper
@datadog_lambda_wrapper

全体像

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を紐付ける

動作確認

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

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

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

まとめ

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