

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用长时间运行的应用程序发布 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>

将项目依赖项（例如，在您的 `pom.xml` 或 `build.gradle` 文件中）配置为使用 适用于 Java 的 AWS SDK版本 `2.14.0` 或更高版本。

在项目的依赖项中包括 artifactId `cloudwatch-metric-publisher`，并使用版本号 `2.14.0` 或更高版本号。

例如：

```
<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 身份启用 `cloudwatch:PutMetricData` 权限，以允许适用于 Java 的 SDK 编写指标。

## 为特定请求启用指标
<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默认为一分钟一次。
+ `maximumCallsPerUpload` 方法限制每次上传的调用次数。默认为无限制。
+ 默认情况下，适用于 Java 的 SDK 2.x 将指标发布在命名空间 `AwsSdk/JavaSdk2` 下。您可以使用 `namespace` 方法来指定不同的值。
+ 默认情况下，SDK 发布摘要指标。摘要指标包括平均值、最小值、最大值、总计和样本数量。通过在 `detailedMetrics` 方法中指定一个或多个 SDK 指标，SDK 会为每个指标发布额外数据。这些附加数据支持百分位数统计信息，例如 p90 和 p99，供您查询。 CloudWatch详细指标对于延迟指标特别有用`APICallDuration`，例如衡量 SDK 客户端请求的 end-to-end延迟。您可以使用 `[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)。