

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

# を使用して AWS Lambda 関数の SDK メトリクスを発行する AWS SDK for Java 2.x
<a name="metric-pub-impl-emf"></a>

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

`[EmfMetricLoggingPublisher](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/metrics/publishers/emf/EmfMetricLoggingPublisher.html)` は、[CloudWatch 組み込みメトリクス形式 (EMF)](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format.html) で構造化されたログエントリとしてメトリクスをすぐに記述することで、より適切なアプローチを提供します。`EmfMetricLoggingPublisher` は、 AWS Lambda や Amazon Elastic Container Service などの Amazon CloudWatch Logs との統合が組み込まれている実行環境で動作します。

## セットアップ
<a name="metric-pub-impl-emf-set-up"></a>

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

### ステップ 1: 必要な依存関係を追加する
<a name="metric-pub-impl-emf-set-up-deps"></a>

 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](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)</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: 必要なアクセス許可を設定する
<a name="metric-pub-impl-emf-set-up-perm"></a>

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

### ステップ 3: ログ記録を設定する
<a name="metric-pub-impl-emf-set-up-logger"></a>

メトリクスを適切に収集するには、`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` ファイルの設定方法の詳細については、このガイドの[ログ記録トピック](logging-slf4j.md)を参照してください。

## `EmfMetricLoggingPublisher` を設定して使用する
<a name="metric-pub-impl-emf-use"></a>

次の 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 ログストリームに自動的に公開します。

### EMF ログイベントの例
<a name="emf-logged-output"></a>

たとえば、前述のようにログ記録が設定されている 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.Builder` の [API ドキュメント](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/metrics/publishers/emf/EmfMetricLoggingPublisher.Builder.html)には、使用できる設定オプションが記載されています。

[CloudWatchMetricPublisher に示すように](metric-pub-impl-cwmp.md#enable-metrics-for-a-specific-request)、単一のリクエストに対して EMF メトリクスログ記録を有効にすることもできます。

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