Publicar métricas do SDK de aplicações de longa execução usando o AWS SDK for Java 2.x
Como a implementação CloudWatchMetricPublisher agrega e carrega periodicamente métricas para o Amazon CloudWatch com atraso, seu uso é mais adequado para aplicações de longa execução.
As configurações padrão do publicador de métricas têm como objetivo minimizar o uso de memória e o custo do CloudWatch, além de fornecer uma quantidade útil de informações sobre os dados das métricas.
Configuração
Antes de ativar e usar as métricas usando CloudWatchMetricPublisher, siga as etapas a seguir.
Etapa 1: adicionar dependência necessária
Configure as dependências do seu projeto (por exemplo, no seu arquivo pom.xml ou build.gradle) para usar a versão 2.14.0 ou posterior do AWS SDK para Java.
Inclua o artifactId cloudwatch-metric-publisher com o número da versão 2.14.0 ou posterior nas dependências do projeto.
Por exemplo:
<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>
Etapa 2: configurar as permissões necessárias
Habilite as permissões cloudwatch:PutMetricData para a identidade do IAM usada pelo publicador de métricas para permitir que o SDK para Java escreva métricas.
Habilitar métricas para uma solicitação específica
A classe a seguir mostra como habilitar o publicador de métricas do CloudWatch para uma solicitação ao Amazon DynamoDB. Ele usa a configuração padrão do publicador de métricas.
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(); } }
Importante
A aplicação deve chamar close na instância MetricPublisher quando o cliente de serviço não estiver mais em uso. Caso isso não seja feito, podem ocorrer vazamentos de threads ou descritores de arquivo.
Habilitar métricas resumidas para um cliente de serviço específico
O trecho de código a seguir mostra como habilitar um publicador de métricas do CloudWatch com configurações padrão para um cliente de serviço.
MetricPublisher metricsPub = CloudWatchMetricPublisher.create(); DynamoDbClient ddb = DynamoDbClient.builder() .overrideConfiguration(c -> c.addMetricPublisher(metricsPub)) .build();
Personalizar um publicador de métricas do CloudWatch
A classe a seguir demonstra como definir uma configuração personalizada para o publicador de métricas de um cliente de serviço específico. As personalizações incluem carregar um perfil específico, especificar uma região da AWS para onde o publicador de métricas envia solicitações, e personalizar a frequência com que o publicador envia métricas para o 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(); } }
As personalizações mostradas no trecho anterior têm os efeitos a seguir.
-
O método
cloudWatchClientpermite personalizar o cliente do CloudWatch usado para enviar métricas. Neste exemplo, usamos uma região diferente do padrão de us-east-1 para onde o cliente envia métricas. Também usamos um perfil nomeado diferente, cloudwatch, cujas credenciais serão usadas para autenticar solicitações ao CloudWatch. Essas credenciais devem ter permissões paracloudwatch:PutMetricData. -
O método
uploadFrequencypermite especificar com que frequência o publicador de métricas carrega métricas no CloudWatch. O padrão é uma vez por minuto. -
O método
maximumCallsPerUploadlimita o número de chamadas feitas por upload. O valor padrão é ilimitado. -
Por padrão, o SDK para Java 2.x publica métricas no namespace
AwsSdk/JavaSdk2. Você pode usar o métodonamespacepara especificar um valor diferente. -
Por padrão, o SDK publica métricas resumidas. As métricas resumidas consistem em média, mínimo, máximo, soma e contagem de amostras. Ao especificar uma ou mais métricas do SDK no método
detailedMetrics, o SDK publica dados adicionais para cada métrica. Esses dados adicionais viabilizam estatísticas percentuais, como p90 e p99, que você pode consultar no CloudWatch. As métricas detalhadas são especialmente úteis para métricas de latência comoAPICallDuration, que mede a latência de ponta a ponta para solicitações de clientes do SDK. É possível usar os campos da classeCoreMetricpara especificar outras métricas comuns do SDK.
Próximas etapas: se você também estiver trabalhando com funções do Lambda, consulte Publicar métricas do SDK para funções do AWS Lambda referente à publicação de métricas baseadas em EMF.