カスタムメトリクス
Dash が新機能を発表!インシデントマネジメント、Continuous Profiler など多数の機能が追加されました! Dash イベントで発表された新機能!

カスタムメトリクス

Datadog Lambda ライブラリをインストールして、カスタムメトリクスを収集して送信します。Datadog Lambda ライブラリから送信されたメトリクスは、自動的にディストリビューションに集計されるため、avgsummaxmincount をグラフ化できます。また、ディストリビューションメトリクスページで、50、75、95、99 パーセンタイル値のタグセットの集計を計算できます。

ディストリビューションメトリクスは、基底のホストとは無関係に、サービスなどの論理オブジェクトをインスツルメントするように設計されています。したがって、Agent を使用してローカルにメトリクスを集計するのではなく、サーバー側のメトリクスを集計するため、サーバーレスインフラストラクチャーに適しています。

同期カスタムメトリクスと非同期カスタムメトリクス

Datadog Lambda ライブラリは、Lambda で同期および非同期の両方によるカスタムメトリクスの送信をサポートしています。

同期: デフォルトの動作。このメソッドは、定期的(10 秒ごと)および Lambda 呼び出しの終了時に HTTP 経由でカスタムメトリクスを Datadog に送信します。呼び出しの継続時間が 10 秒未満の場合、カスタムメトリクスは呼び出しの終了時に送信されます。

非同期(推奨): レイテンシーオーバーヘッドなしでカスタムメトリクスを送信し、かつそれらをほぼリアルタイムで Datadog に表示することができます。これを実現するために、Lambda ライブラリはカスタムメトリクスを特別にフォーマットされたログとして出力し、これを Datadog Forwarder が解析して Datadog に送信します。AWS Lambda でのロギングは 100% 非同期であるため、このメソッドにより、関数へのレイテンシーオーバーヘッドがゼロになります。

非同期カスタムメトリクスの有効化

  1. Lambda 関数で環境変数 DD_FLUSH_TO_LOGTrue に設定します。
  2. Datadog Forwarder をバージョン 1.4.0 以上に更新します。

Datadog ログを使用していない場合でも、非同期のカスタムメトリクス送信を使用できます。Datadog ログコレクション AWS Lambda 関数で環境変数 DD_FORWARD_LOGFalse に設定します。これにより、カスタムメトリクスのみが Datadog にインテリジェントに転送され、通常のログは転送されません。

カスタムメトリクスのコード例

関数コードで、Lambda ライブラリから必要なメソッドをインポートし、関数ハンドラーのラッパーを追加します。ヘルパー関数をラップする必要はありません。

注: カスタムメトリクスを報告するメソッドの引数には次の要件があります。

  • <METRIC_NAME> は、メトリクス命名ポリシーに従ってメトリクスを一意に識別します。
  • <METRIC_VALUE> は、数値 (整数または浮動小数点数) でなければなりません。
  • <TAG_LIST> はオプションです。['owner:Datadog', 'env:demo', 'cooltag'] のように書式設定されます。
from datadog_lambda.metric import lambda_metric
from datadog_lambda.wrapper import datadog_lambda_wrapper

# ラップする必要があるのは関数ハンドラーだけです(ヘルパー関数ではありません)。 
@datadog_lambda_wrapper
def lambda_handler(event, context):
    lambda_metric(
        "coffee_house.order_value",             # メトリクス名
        12.45,                                  # メトリクス値
        tags=['product:latte', 'order:online']  # 関連付けられたタグ
    )
const { datadog, sendDistributionMetric } = require('datadog-lambda-js');

async function myHandler(event, context) {
    sendDistributionMetric(
        'coffee_house.order_value', // メトリクス名
        12.45, // メトリクス値
        'product:latte',
        'order:online' // 関連付けられたタグ
    );
    return {
        statusCode: 200,
        body: 'hello, dog!'
    };
}
// ラップする必要があるのは関数ハンドラーだけです(ヘルパー関数ではありません)。
module.exports.myHandler = datadog(myHandler);

/* または、手動構成オプションを使用します
module.exports.myHandler = datadog(myHandler, {
    apiKey: "my-api-key"
});
*/
package main

import (
  "github.com/aws/aws-lambda-go/lambda"
  "github.com/DataDog/datadog-lambda-go"
)

func main() {
  // ラップする必要があるのは関数ハンドラーだけです(ヘルパー関数ではありません)。
  lambda.Start(ddlambda.WrapHandler(myHandler, nil))
  /* または、手動構成オプションを使用します
  lambda.Start(ddlambda.WrapHandler(myHandler, &ddlambda.Config{
    BatchInterval: time.Second * 15
    APIKey: "my-api-key",
  }))
  */
}

func myHandler(ctx context.Context, event MyEvent) (string, error) {
  ddlambda.Distribution(
    "coffee_house.order_value",     // メトリクス名
    12.45,                          // メトリクス値
    "product:latte", "order:online" // 関連付けられたタグ
  )
  // ...
}
require 'datadog/lambda'

def handler(event:, context:)
    # ラップする必要があるのは関数ハンドラーだけです(ヘルパー関数ではありません)。
    Datadog::Lambda.wrap(event, context) do
        Datadog::Lambda.metric(
          'coffee_house.order_value',         # メトリクス名
          12.45,                              # メトリクス値
          "product":"latte", "order":"online" # 関連付けられたタグ
        )
        return { statusCode: 200, body: 'Hello World' }
    end
end
public class Handler implements RequestHandler<APIGatewayV2ProxyRequestEvent, APIGatewayV2ProxyResponseEvent> {
    public Integer handleRequest(APIGatewayV2ProxyRequestEvent request, Context context){
        DDLambda dd = new DDLambda(request, lambda);

        Map<String,String> myTags = new HashMap<String, String>();
            myTags.put("product", "latte");
            myTags.put("order","online");

        dd.metric(
            "coffee_house.order_value", // メトリクス名
            12.45,                      // メトリクスの値
            myTags);                    // 関連タグ
    }
}

非同期カスタムメトリクスの発行は、任意の言語またはカスタムランタイムで可能です。Datadog Forwarder が識別し、Datadog に送信する Lambda 関数に特別な JSON 形式の文字列を出力することで機能します。これを使用するには:

  1. 非同期カスタムメトリクスを有効にします
  2. 次の形式でカスタムメトリクスをログする再利用可能な関数を作成します。
{
    "m": "メトリクス名",
    "v": "メトリクス値",
    "e": "Unix タイムスタンプ(秒)",
    "t": "タグの配列"
}

例:

{
    "m": "coffee_house.order_value",
    "v": 12.45,
    "e": 1572273854,
    "t": ["product:latte", "order:online"]
}

注: これらのカスタムメトリクスは、ディストリビューションとして送信されます。以前に別の方法でカスタムメトリクスを送信していた場合は、ディストリビューションへのアップグレードの影響に関するドキュメントを参照してください

カスタムメトリクスのタグ付け

Datadog Lambda ライブラリ を使用して送信する場合、カスタムメトリクスにタグを付ける必要があります。ディストリビューションメトリクスページを使用して、カスタムメトリクスに適用されるタグのセットをカスタマイズします。

カスタムメトリクスに Lambda リソースタグを追加するには、Datadog Forwarder CloudFormation Stack でパラメーター DdFetchLambdaTagstrue に設定します。

ディストリビューションメトリクスについて

ディストリビューションメトリクスでは、送信時に指定する代わりにグラフ化または照会するときに、集計を選択します。

以前に Datadog Lambda ライブラリのいずれかを使用せずに Lambda からカスタムメトリクスを送信した場合、それらを Datadog に送信するときに、新しいメトリクス名でカスタムメトリクスのインスツルメントを開始する必要があります。ディストリビューションと非ディストリビューションメトリクスタイプの両方として、同じメトリクス名を同時に存在させることはできません。

ディストリビューションメトリクスのパーセンタイル集計を有効にするには、ディストリビューションメトリクスのページを参照してください。

その他の送信方法

VPC での実行

Datadog Lambda ライブラリは、カスタムメトリクスを同期送信するためにパブリックインターネットへのアクセスを必要とします。Lambda 関数が VPC に関連付けられている場合は、代わりにカスタムメトリクスを非同期送信するか、関数がパブリックインターネットに到達できることを確認してください。

サードパーティライブラリの使用

カスタムメトリクスを Datadog に簡単に送信できるオープンソースライブラリは多数あります。ただし、多くは Lambda 用に最適化されたディストリビューションメトリクスを使用するように更新されていません。ディストリビューションメトリクスは、ホストまたはローカルで実行されるエージェントに依存しないサーバー側の集計を可能にします。エージェントのないサーバーレス環境では、ディストリビューションメトリクスにより柔軟な集計とタグ付けが可能になります。

AWS Lambda 用のサードパーティのメトリクスライブラリを評価する場合は、それがディストリビューションメトリクスをサポートしていることを確認してください。

[非推奨] CloudWatch ログの使用

**このカスタムメトリクスの送信メソッドはもうサポートされておらず、すべての新しいお客様に対しては無効になっています。**Lambda からカスタムメトリクスを送信する場合は、Datadog Lambda ライブラリを使うことが推奨されます。

これには、Datadog IAM ポリシーで次の AWS アクセス許可が必要です。

AWS アクセス許可説明
logs:DescribeLogGroups使用可能なロググループを一覧表示します。
logs:DescribeLogStreamsグループで使用可能なログストリームを一覧表示します。
logs:FilterLogEventsストリームの特定のログイベントを取得してメトリクスを生成します。

[非推奨] Lambda ログから Datadog にカスタムメトリクスを送信するには、次の形式を使用してログ行を出力します。

MONITORING|<UNIX_EPOCH_タイムスタンプ>|<メトリクス値>|<メトリクスタイプ>|<メトリクス名>|#<タグリスト>

ここで、

  • MONITORING は、このログエントリを収集する必要があることを Datadog インテグレーションに通知します。
  • <UNIX_EPOCH_TIMESTAMP> は秒単位です。ミリ秒ではありません。
  • <METRIC_VALUE> は、数値 (整数または浮動小数点数) でなければなりません。
  • <METRIC_TYPE> は、countgaugehistogram、または check です。
  • <METRIC_NAME> は、メトリクス命名ポリシーに従ってメトリクスを一意に識別します。
  • <タグリスト> はオプションです。先頭に # が付いたカンマ区切りリストです。カスタムメトリクスには、自動的にタグ function_name:<関数の名前> が適用されます。

: 各タイムスタンプに対する合計がカウントとして使用され、特定のタイムスタンプの最後の値がゲージとして使用されます。メトリクスをインクリメントするたびにログステートメントを出力することは、ログのパースにかかる時間が増大するため、お勧めしません。コードでメトリクスの値を継続的に更新し、関数が終了する前にメトリクスに 1 つのログステートメントを出力してください。