AWS SDK for Java 2.x を使用して AWS Lambda 関数の SDK メトリクスを公開する - AWS SDK for Java 2.x

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS SDK for Java 2.x を使用して AWS Lambda 関数の SDK メトリクスを公開する

Lambda 関数は通常ミリ秒から数分の単位で実行されるため、CloudWatchMetricPublisher で発生するメトリクスの送信の遅延により、データが失われる可能性があります。

EmfMetricLoggingPublisher は、CloudWatch 組み込みメトリクス形式 (EMF) で構造化されたログエントリとしてメトリクスをすぐに記述することで、より適切なアプローチを提供します。EmfMetricLoggingPublisher は、AWS Lambda や Amazon Elastic Container Service などの Amazon CloudWatch Logs との統合が組み込まれている実行環境で動作します。

セットアップ

EmfMetricLoggingPublisher を使用してメトリクスを有効にし、使用する前に、次の手順を完了する必要があります。

ステップ 1: 必要な依存関係を追加する

AWS SDK for Java のバージョン 2.30.3 以降を使用するように、プロジェクトの依存関係を (例: pom.xml または build.gradle ファイルで) 設定します。

emf-metric-logging-publisherプロジェクトの依存関係にバージョン番号 2.30.3 以降の artifactId を含めます。

例:

<project> <dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.30.11</version> <!-- Navigate the link to see the latest version. --> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>emf-metric-logging-publisher</artifactId> </dependency> </dependencies> </project>

ステップ 2: 必要なアクセス許可を設定する

メトリクスパブリッシャーによって使用される IAM ID に対して logs:PutLogEvents のアクセス許可を有効にし、SDK for Java が EMF 形式のログを書き込めるようにします。

ステップ 3: ログ記録を設定する

メトリクスを適切に収集するには、INFO レベル以下のコンソール (DEBUG など) に出力するようにログ記録を設定します。log4j2.xml ファイルで、次のように設定します。

<Loggers> <Root level="WARN"> <AppenderRef ref="ConsoleAppender"/> </Root> <Logger name="software.amazon.awssdk.metrics.publishers.emf.EmfMetricLoggingPublisher" level="INFO" /> </Loggers>

log4j2.xml ファイルの設定方法の詳細については、このガイドのログ記録トピックを参照してください。

EmfMetricLoggingPublisher を設定して使用する

次の Lambda 関数クラスは、まず EmfMetricLoggingPublisher インスタンスを作成して設定し、Amazon DynamoDB サービスクライアントで使用します。

public class GameIdHandler implements RequestHandler<Map<String, String>, String> { private final EmfMetricLoggingPublisher emfPublisher; private final DynamoDbClient dynamoDb; public GameIdHandler() { // Build the publisher. this.emfPublisher = EmfMetricLoggingPublisher.builder() .namespace("namespace") .dimensions(CoreMetric.SERVICE_ID, CoreMetric.OPERATION_NAME) .build(); // Add the publisher to the client. this.dynamoDb = DynamoDbClient.builder() .overrideConfiguration(c -> c.addMetricPublisher(emfPublisher)) .region(Region.of(System.getenv("AWS_REGION"))) .build(); } @Override public String handleRequest(Map<String, String> event, Context context) { Map<String, AttributeValue> gameItem = new HashMap<>(); gameItem.put("gameId", AttributeValue.builder().s(event.get("id")).build()); PutItemRequest putItemRequest = PutItemRequest.builder() .tableName("games") .item(gameItem) .build(); dynamoDb.putItem(putItemRequest); return "Request handled"; } }

DynamoDB クライアントが putItemメソッドを実行すると、メトリクスを EMF 形式で CloudWatch ログストリームに自動的に公開します。

たとえば、前述のようにログ記録が設定されている GameHandler Lambda 関数に次のイベントを送信するとします。

{ "id": "23456" }

関数がイベントを処理すると、次の例のような 2 つのログイベントが表示されます。2 番目のイベントの JSON オブジェクトには、DynamoDB への PutItem オペレーションの Java SDK メトリクスデータが含まれています。

CloudWatch が EMF 形式でログイベントを受信すると、構造化された JSON を自動的に解析してメトリクスデータを抽出します。その後、CloudWatch は対応するメトリクスを作成し、元のログエントリを CloudWatch Logs に保存します。

2025-07-11 15:58:30 [main] INFO org.example.GameIdHandler:39 - Received map: {id=23456} 2025-07-11 15:58:34 [main] INFO software.amazon.awssdk.metrics.publishers.emf.EmfMetricLoggingPublisher:43 - { "_aws": { "Timestamp": 1752249513975, "LogGroupName": "/aws/lambda/GameId", "CloudWatchMetrics": [ { "Namespace": "namespace", "Dimensions": [ [ "OperationName", "ServiceId" ] ], "Metrics": [ { "Name": "AvailableConcurrency" }, { "Name": "PendingConcurrencyAcquires" }, { "Name": "ServiceCallDuration", "Unit": "Milliseconds" }, { "Name": "EndpointResolveDuration", "Unit": "Milliseconds" }, { "Name": "MaxConcurrency" }, { "Name": "BackoffDelayDuration", "Unit": "Milliseconds" }, { "Name": "MarshallingDuration", "Unit": "Milliseconds" }, { "Name": "LeasedConcurrency" }, { "Name": "SigningDuration", "Unit": "Milliseconds" }, { "Name": "ConcurrencyAcquireDuration", "Unit": "Milliseconds" }, { "Name": "ApiCallSuccessful" }, { "Name": "RetryCount" }, { "Name": "UnmarshallingDuration", "Unit": "Milliseconds" }, { "Name": "ApiCallDuration", "Unit": "Milliseconds" }, { "Name": "CredentialsFetchDuration", "Unit": "Milliseconds" } ] } ] }, "AvailableConcurrency": 0, "PendingConcurrencyAcquires": 0, "OperationName": "PutItem", "ServiceCallDuration": 1339, "EndpointResolveDuration": 81, "MaxConcurrency": 50, "BackoffDelayDuration": 0, "ServiceId": "DynamoDB", "MarshallingDuration": 181, "LeasedConcurrency": 1, "SigningDuration": 184, "ConcurrencyAcquireDuration": 83, "ApiCallSuccessful": 1, "RetryCount": 0, "UnmarshallingDuration": 85, "ApiCallDuration": 1880, "CredentialsFetchDuration": 138 }

EmfMetricLoggingPublisher.BuilderAPI ドキュメントには、使用できる設定オプションが記載されています。

CloudWatchMetricPublisher に示すように、単一のリクエストに対して EMF メトリクスログ記録を有効にすることもできます。

次のステップ: 長時間実行されるアプリケーションについては、CloudWatch ベースのメトリクス公開に向けた「長時間実行するアプリケーションから SDK メトリクスを公開する」を参照してください。