Datadog Forwarder を使用した Java サーバーレスアプリケーションのインスツルメンテーション

概要

Datadog Serverless の新規ユーザーの場合、代わりに Datadog Lambda Extension を使用して Lambda 関数をインスツルメントする手順に従ってください。Lambda がすぐに使える機能を提供する前に、Datadog Forwarder で Datadog Serverless をセットアップした場合は、このガイドを使用してインスタンスを維持してください。
datadog-lambda-java の一部の古いバージョンでは、推移的依存関係として log4j <=2.14.0 をインポートします。アップグレードの手順は以下の通りです。

前提条件

Datadog Forwarder Lambda 関数は、AWS Lambda トレース、拡張メトリクス、カスタムメトリクス、ログの取り込みに必要です。

分散型トレーシングでサーバーレスアプリケーションを完全にインスツルメントするには、Java Lambda 関数が Java 8 Corretto (java8.al2)、Java 11 (java11) または Java 17 (java17) ランタイムを使用している必要があります。

構成

インストール

以下のコードブロックのいずれかを pom.xml (Maven) または build.gradle (Gradle) に追加し、Datadog Lambda Library をローカルにインストールします。以下の VERSION を最新のリリースに置き換えてください (直前の v は省略): Maven Cental

pom.xml に以下の依存関係を含めます。

<dependency>
  <groupId>com.datadoghq</groupId>
  <artifactId>datadog-lambda-java</artifactId>
  <version>VERSION</version>
</dependency>

build.gradle に以下を含めます。

dependencies {
  implementation 'com.datadoghq:datadog-lambda-java:VERSION'
}

インスツルメントする

  1. 関数に Datadog Lambda レイヤーをインストールします。最新の VERSION15 です。

    arn:aws:lambda:<AWS_REGION>:464622532012:layer:dd-trace-java:<VERSION>
    
  2. 関数に以下の環境変数を構成します。

    JAVA_TOOL_OPTIONS: -javaagent:"/opt/java/lib/dd-java-agent.jar" -XX:+TieredCompilation -XX:TieredStopAtLevel=1
    DD_LOGS_INJECTION: true
    DD_JMXFETCH_ENABLED: false
    DD_TRACE_ENABLED: true
    
  3. Datadog Lambda ライブラリが提供するラッパーを使用して、Lambda ハンドラー関数をラップします。

    public class Handler implements RequestHandler<APIGatewayV2ProxyRequestEvent, APIGatewayV2ProxyResponseEvent> {
        public Integer handleRequest(APIGatewayV2ProxyRequestEvent request, Context context){
            DDLambda ddl = new DDLambda(request, context); //Required to initialize the trace
    
            do_some_stuff();
            make_some_http_requests();
    
            ddl.finish(); //Required to finish the active span.
            return new ApiGatewayResponse();
        }
    }
    

サブスクライブ

関数の各ロググループに Datadog Forwarder Lambda 関数をサブスクライブします。これにより、メトリクス、トレース、ログを Datadog へ送信できるようになります。

  1. まだの場合は、Datadog Forwarder をインストールします
  2. Datadog Forwarder を関数のロググループにサブスクライブします

Java Lambda 関数のコールドスタートの監視

コールドスタートは、関数が以前に非アクティブだったときや比較的一定数のリクエストを受信していたときなどを含め、サーバーレスアプリケーションで受信するトラフィックが突然増加したときに発生します。ユーザーには、コールドスタートは遅い応答時間または遅延として認識されることがあります。Datadog では、モニターに Java Lambda 関数コールドスタートを構成し、Datadog Serverless Insights を使用してコールドスタートを最低限に保つことをおすすめしています。

Java Lambda 関数コールドスタートの監視

Java Lambda 関数コールドスタートに Datadog モニターを作成するには、以下の条件を使用してモニター作成手順を実行します。

  • メトリクス名: aws.lambda.enhanced.invocations
  • ソース: runtime:java* および cold_start:true
  • アラートグループ: 各 function_arn に対し個別のアラートをトリガーするマルチアラート

タグ

オプションではありますが、Datadog ではサーバーレスアプリケーションに予約タグ envserviceversion を付けることを推奨しています。予約タグの詳細については、統合サービスタグ付けのドキュメントを参照してください。

確認

以上の方法で関数を構成すると、Serverless Homepage でメトリクス、ログ、トレースを確認できるようになります。

カスタムビジネスロジックの監視

カスタムメトリクスを送信するには、以下のコード例をご参照ください。

public class Handler implements RequestHandler<APIGatewayV2ProxyRequestEvent, APIGatewayV2ProxyResponseEvent> {
    public Integer handleRequest(APIGatewayV2ProxyRequestEvent request, Context context){
        DDLambda ddl = new DDLambda(request, context);

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

        // カスタムメトリクスを送信
        ddl.metric(
            "coffee_house.order_value", // メトリクス名
            12.45,                      // メトリクス値
            myTags);                    // 関連タグ

        URL url = new URL("https://example.com");
        HttpURLConnection hc = (HttpURLConnection)url.openConnection();
        hc.connect();

        ddl.finish();
    }
}

カスタムメトリクスの送信について、詳しくはカスタムメトリクスのドキュメントを参照してください。

ログとトレースの接続

Java Lambda 関数ログとトレースを自動接続する方法については、Java ログとトレースの接続を参照してください。

正しい Java ランタイムを使用しないと、Error opening zip file or JAR manifest missing : /opt/java/lib/dd-java-agent.jar (zip ファイルを開くときのエラーまたは JAR マニフェストがありません : /opt/java/lib/dd-java-agent.jar) などのエラーが発生する可能性があります。上記のとおり、ランタイムとして java8.al2 または java11 を使用してください。

アップグレード

Apache Foundation は、一般的な Java のログ記録ライブラリである log4j に リモートでコードが実行される脆弱性 があることを発表しました。 datadog-lambda-java の一部のバージョンには、log4j への推移的な依存関係があり、脆弱性が存在する可能性があります。脆弱性のあるバージョンは以下の通りです。

  • <=0.3.3
  • 1.4.0

datadog-lambda-java の最新バージョンは Maven Cental です。以下のアップグレード手順を実行する場合は、このバージョンを使用してください (直前の v は省略)。

1.4.x へのアップグレードを希望しない場合、 0.3.x には最新の log4j セキュリティパッチも適用されています。 最新版の 0.3.xdatadog-lambda-java リポジトリ にあります。

Lambda 関数の依存関係である datadog-lambda-java のバージョンは pom.xml (Maven) または build.gradle (Gradle) で設定されます。

pom.xml ファイルには、次のようなセクションが含まれています。

<dependency>
  <groupId>com.datadoghq</groupId>
  <artifactId>datadog-lambda-java</artifactId>
  <version>VERSION</version>
</dependency>

VERSION を最新バージョンの datadog-lambda-java (上記で入手可能) に置き換えます。 その後、Lambda 関数を再デプロイしてください。

build.gradle ファイルには、次のようなセクションが含まれています。

dependencies {
  implementation 'com.datadoghq:datadog-lambda-java:VERSION'
}

VERSION を最新バージョンの datadog-lambda-java (上記で入手可能) に置き換えます。 その後、Lambda 関数を再デプロイしてください。

0.3.x から 1.4.x へのアップグレードで、dd-trace-java トレーサーを使用したい場合は、dd-trace-java Lambda レイヤーへの参照を見つけ、次のように変更してください。

arn:aws:lambda:<AWS_REGION>:464622532012:layer:dd-trace-java:4
PREVIEWING: may/unit-testing