AWS Lambda+pythonからdatadogにカスタムメトリクスを送信


はじめに

AWS Lambdaの関数からdatadogへカスタムメトリクスを送信する方法のメモです。今回の実装にはpythonを利用しました。

参考にした記事

実際にやったこと

関数の作成

まず関数を作成。ランタイムはpython3.8を作成

レイヤーを追加

オンプレサーバからpythonでカスタムメトリクスを送信するときはpipコマンドでdatadogライブラリを追加しますが、Lambdaなのでレイヤーを追加しておいてライブラリを使えるようにします。
datadog自身がレイヤーを用意してくれているので、それを使うことにします。

関数の概要画面の下部にスクロールして「レイヤーの追加」をクリック

中略

レイヤーの追加はARNを指定して追加します。
datadogがレイヤーを公開しているので、ここから最新版を選ぶ必要があります。
https://github.com/DataDog/datadog-lambda-python/releases

今回の関数はpython3.8にて実装するため以下のARNを使います
- arn:aws:lambda::464622532012:layer:Datadog-Python38:42

私は東京リージョン(ap-northeast-1)で関数を実装したため、以下のARNを設定することにします
arn:aws:lambda:ap-northeast-1:464622532012:layer:Datadog-Python38:42

Lambdaにて環境変数を設定する

datadogを利用するためには環境変数の設定も必要なので、設定しておきます。
datadog側でAPIキーを発行しておいて、下記の環境変数を設定します。
- DD_API_KEY:APIキー

関数の実装

あとは関数をpythonで実装するのみです。
以下はlambda.test_metricsという名称にて99.99というメトリクス値を送信するプログラムです

lambda_function.py
import json

from datadog_lambda.metric import lambda_metric
from datadog_lambda.wrapper import datadog_lambda_wrapper

@datadog_lambda_wrapper
def lambda_handler(event, context):
    tags = ['name:testapp']
    metric = "lambda.test_metrics"
    value = 99.99
    lambda_metric(metric, value, tags=tags)
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

結果

datadogのMetrics Explorerで閲覧してみると送信されていることがわかります
datadogに慣れている人ならご存知かと思いますが、メトリクスが反映されるまでに少しかかるので関数実行直後に見に行くとハマります。

課題

公式は非同期メトリクスを有効にすることを推奨(環境変数:DD_FLUSH_TO_LOGを参照)していますが、Datadog Forwarderを使う必要があるようです。ここらへんは試したらまた記事を執筆することにします。