

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

# を使用して長時間実行されるアプリケーションから SDK メトリクスを発行する AWS SDK for Java 2.x
<a name="metric-pub-impl-cwmp"></a>

`[CloudWatchMetricPublisher](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/metrics/publishers/cloudwatch/CloudWatchMetricPublisher.html)` 実装はメトリクスを集約し、遅延を伴って定期的に Amazon CloudWatch にアップロードするため、長時間実行されるアプリケーションに最適です。

メトリクスパブリッシャーのデフォルト設定は、メモリ使用量と CloudWatch のコストを最小限に抑えながら、メトリクスデータに関する有益なインサイトを十分に提供することを目的としています。

## セットアップ
<a name="prerequisitesmetrics"></a>

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

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

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

`cloudwatch-metric-publisher`プロジェクトの依存関係にバージョン番号 `2.14.0` 以降の 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>cloudwatch-metric-publisher</artifactId>
   </dependency>
  </dependencies>
</project>
```

### ステップ 2: 必要なアクセス許可を設定する
<a name="cwmp-set-up-perms"></a>

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

## 特定のリクエストのメトリクスを有効にする
<a name="enable-metrics-for-a-specific-request"></a>

次のクラスは、Amazon DynamoDB へのリクエストに対して CloudWatch メトリクスパブリッシャーを有効にする方法を示しています。デフォルトのメトリクスパブリッシャー設定を使用します。

```
import software.amazon.awssdk.metrics.MetricPublisher;
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.ListTablesRequest;

public class DefaultConfigForRequest {
    // Use one MetricPublisher for your application. It can be used with requests or service clients.
    static MetricPublisher metricsPub = CloudWatchMetricPublisher.create();

    public static void main(String[] args) {
        DynamoDbClient ddb = DynamoDbClient.create();
        // Publish metrics the for ListTables operation.
        ddb.listTables(ListTablesRequest.builder()
            .overrideConfiguration(c -> c.addMetricPublisher(metricsPub))
            .build());

        // Perform more work in your application.

        // A MetricsPublisher has its own lifecycle independent of any service client or request that uses it.
        // If you no longer need the publisher, close it to free up resources.
        metricsPub.close();  // All metrics stored in memory are flushed to CloudWatch.

        // Perform more work with the DynamoDbClient instance without publishing metrics.
        // Close the service client when you no longer need it.
        ddb.close();
    }
}
```

**重要**  
サービスクライアントが使用されなくなったときに、アプリケーションが `[MetricPublisher](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/metrics/MetricPublisher.html)` インスタンス`close` を呼び出すことを確認します。呼び出さない場合、スレッドまたはファイル記述子が漏洩する可能性があります。

## 特定のサービスクライアントのためにサマリメートリクスを有効にする
<a name="enable-metrics-for-a-specific-service-client"></a>

次のコードスニペットは、サービスクライアントのデフォルト設定で CloudWatch メトリクスパブリッシャーを有効にする方法を示しています。

```
MetricPublisher metricsPub = CloudWatchMetricPublisher.create();

DynamoDbClient ddb = DynamoDbClient.builder()
          .overrideConfiguration(c -> c.addMetricPublisher(metricsPub))
          .build();
```

## CloudWatch メトリクスパブリッシャーをカスタマイズする
<a name="customize-metrics-publisher"></a>

次のクラスは、特定のサービスクライアント用のメトリクスパブリッシャーのカスタム設定をセットアップする方法を示しています。カスタマイズには、特定のプロファイルのロード、メトリクスパブリッシャーがリクエストを送信する AWS リージョンの指定、パブリッシャーが CloudWatch にメトリクスを送信する頻度のカスタマイズが含まれます。

```
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
import software.amazon.awssdk.core.metrics.CoreMetric;
import software.amazon.awssdk.metrics.MetricPublisher;
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClient;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;

import java.time.Duration;

public class CustomConfigForDDBClient {
    // Use one MetricPublisher for your application. It can be used with requests or service clients.
    static MetricPublisher metricsPub = CloudWatchMetricPublisher.builder()
        .cloudWatchClient(CloudWatchAsyncClient.builder()
            .region(Region.US_WEST_2)
            .credentialsProvider(ProfileCredentialsProvider.create("cloudwatch"))
            .build())
        .uploadFrequency(Duration.ofMinutes(5))
        .maximumCallsPerUpload(100)
        .namespace("ExampleSDKV2Metrics")
        .detailedMetrics(CoreMetric.API_CALL_DURATION)
        .build();

    public static void main(String[] args) {
        DynamoDbClient ddb = DynamoDbClient.builder()
            .overrideConfiguration(c -> c.addMetricPublisher(metricsPub))
            .build();
        // Publish metrics for DynamoDB operations.
        ddb.listTables();
        ddb.describeEndpoints();
        ddb.describeLimits();
        // Perform more work in your application.

        // A MetricsPublisher has its own lifecycle independent of any service client or request that uses it.
        // If you no longer need the publisher, close it to free up resources.
        metricsPub.close();  // All metrics stored in memory are flushed to CloudWatch.


        // Perform more work with the DynamoDbClient instance without publishing metrics.
        // Close the service client when you no longer need it.
        ddb.close();
    }
}
```

前のスニペットで示したカスタマイズには、次の機能があります。
+ `cloudWatchClient` メソッドを使用すると、メトリクスの送信に使用する CloudWatch クライアントをカスタマイズできます。この例では、クライアントがメトリクスを送信する *us-east-1* のデフォルトとは異なるリージョンを使用します。また、CloudWatch へのリクエストを認証するために認証情報が使用される、*cloudWatch* という別の名前のプロファイルも使用します。これらの認証情報は、`cloudwatch:PutMetricData` へのアクセス許可を付与されている必要があります。
+ `uploadFrequency` メソッドを使用すると、メトリクスパブリッシャーが CloudWatch にメトリクスをアップロードする頻度を指定できます。デフォルト値は 1 分に 1 回です。
+ `maximumCallsPerUpload` メソッドは、アップロードごとに行われる呼び出しの数を制限します。デフォルトは無制限です。
+ デフォルトでは、SDK for Java 2.x は `AwsSdk/JavaSdk2` 名前空間の下にメトリクスを公開します。`namespace` を使用して別の値を指定できます。
+ デフォルトでは、SDK はサマリーメトリクスを公開します。概要メトリクスは、平均、最小、最大、合計、サンプル数で構成されます。`detailedMetrics` メソッドで 1 つ以上の SDK メトリクスを指定することで、SDK はメトリクスごとに追加のデータを公開します。この追加データにより、CloudWatch でクエリできる p90 や p99 などのパーセンタイル統計が有効になります。詳細なメトリクスは、DK クライアントリクエストのエンドツーエンドのレイテンシーを測定する `APICallDuration` のようなレイテンシーメトリクスに特に有益です。`[CoreMetric](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/metrics/CoreMetric.html)` クラスのフィールドを使用して、他の一般的な SDK メトリクスを指定できます。

**次のステップ:** Lambda 関数も使用している場合は、「EMF ベースの[メトリクス発行用の AWS Lambda 関数の SDK](metric-pub-impl-emf.md) メトリクスの発行」を参照してください。