使用AWS SDK for Java 2.x 从长时间运行的应用程序发布 SDK 指标 - AWS SDK for Java 2.x

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

使用AWS SDK for Java 2.x 从长时间运行的应用程序发布 SDK 指标

由于 CloudWatchMetricPublisher 实施会聚合指标并定期将指标上传到 Amazon CloudWatch,但存在延迟,因此该实施的使用非常适合长时间运行的应用程序。

指标发布者的默认设置可以更大限度地减少内存使用量和 CloudWatch 成本,同时仍能为指标数据提供一定数量的有用洞察。

设置

先完成以下步骤,然后才能使用 CloudWatchMetricPublisher 来启用和使用指标。

步骤 1:添加所需的依赖项

将项目依赖项(例如,在您的 pom.xmlbuild.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</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:配置所需的权限

为指标发布者使用的 IAM 身份启用 cloudwatch:PutMetricData 权限,以允许适用于 Java 的 SDK 编写指标。

为特定请求启用指标

以下类演示如何为向 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 实例上调用 close。否则可能会导致线程泄漏或文件描述符泄漏。

为特定服务客户端启用摘要指标

以下代码段演示如何为服务客户端启用采用默认设置的 CloudWatch 指标发布者。

MetricPublisher metricsPub = CloudWatchMetricPublisher.create(); DynamoDbClient ddb = DynamoDbClient.builder() .overrideConfiguration(c -> c.addMetricPublisher(metricsPub)) .build();

自定义 CloudWatch 指标发布者

以下类演示如何为特定服务客户端的指标发布者设置自定义配置。自定义设置包括加载特定的配置文件、指定指标发布者发送请求时所在的 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 中进行查询。详细指标对于延迟指标(例如,用于衡量 SDK 客户端请求的端到端延迟的 APICallDuration)特别有用。您可以使用 CoreMetric 类的字段来指定其他常用 SDK 指标。

后续步骤:如果您也在使用 Lambda 函数,请参阅为 AWS Lambda 函数发布 SDK 指标,了解基于 EMF 的指标发布。