ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

使用 AWS SDK for Java v2 监控 DynamoDB 应用性能:客户端指标、CloudWatch 告警与 Contributor Insights 实战

使用 AWS SDK for Java v2 监控 DynamoDB 应用性能:客户端指标、CloudWatch 告警与 Contributor Insights 实战 示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载本指南基于 javav2/usecases/monitor_dynamodb 示例项目讲解如何在 Java 应用中使用 AWS SDK for Java 2.x 对 DynamoDB 调用进行端到端性能监控。你将学会配置客户端侧 SDK 指标发布、在 CloudWatch 中同时查看服务端与客户端延迟、为关键指标设置告警以及利用 CloudWatch Contributor Insights 定位热点分区键从而系统化地发现与定位性能瓶颈。教程概述适用对象与能力要求项目说明说明通过 AWS SDK for Java (v2) 配置应用对 DynamoDB 的使用方式以实现性能监控受众开发者初级必备技能Java、Maven在依赖 DynamoDB 的应用中理解并监控 DynamoDB 对整体应用性能的贡献至关重要。本教程将围绕以下四条监控路径展开配置客户端侧性能指标Client-side performance metrics。在 Amazon CloudWatch 中查看 DynamoDB 服务端指标与 SDK 客户端指标。为这些指标设置告警Alarms。为 DynamoDB 开启 CloudWatch Contributor Insights深入分析具体的使用模式问题。需要说明的是本教程不覆盖 DynamoDB 的一般性最佳实践如分区键设计、容量规划等而是聚焦监控这一主题。示例代码基于 DynamoDB 增强客户端DynamoDB Enhanced Client构建使用DynamoDbBean注解的数据模型完成对象与表数据的映射。本教程会创建并运行一个实际调用 DynamoDB 的示例应用涉及的 AWS 服务为Amazon DynamoDBAmazon CloudWatch前提条件完成本教程需要准备AWS 服务访问权限。Java IDE本教程使用 IntelliJ 2023.3.6。Java 8 或更高版本的 SDK示例的 pom.xml 编译目标为 Java 17。[!IMPORTANT]本教程使用的 AWS 服务包含在 AWS Free Tier 免费额度内。相关代码并未在所有 AWS 区域测试过部分 AWS 服务仅在特定区域可用。运行此代码可能会在你的 AWS 账户中产生费用。务必删除教程期间创建的所有资源以免产生持续费用。开发环境准备确保已经正确配置 AWS SDK for Java 2.x 的开发环境凭证、区域等可参考官方Set up the AWS SDK for Java 2.x文档完成环境搭建。创建示例应用创建 IntelliJ 项目首先创建一个 IntelliJ 项目在 IntelliJ IDE 菜单中选择File→New→Project ...。填写项目名称本教程使用monitor_ddb你也可以另取名称。在New Project对话框中选择Java和Maven并选择 Java JDK 版本。打开Advanced Settings在GroupId中输入org.example。在ArtifactId中输入monitor_ddb。点击Create。[!NOTE] 作为替代方案你可以直接参考本仓库javav2/usecases/monitor_dynamodb目录下的现成源码pom.xml、Greeting.java、GreetingsSender.java、DynamoDbMetricsExample.java或通过克隆本仓库来获取完整工程而不必手动搭建。在 Maven pom.xml 中添加 SDK 依赖确保项目的pom.xml与下面内容一致。其中关键依赖包括dynamodb-enhancedDynamoDB 增强客户端提供 Bean 映射、DynamoDbTable等高级 API。dynamodbDynamoDB 基础客户端。cloudwatch-metric-publisherSDK 内置的指标发布器负责把客户端指标聚合后异步上传到 CloudWatch。cloudwatchCloudWatch 客户端异步变体CloudWatchAsyncClient被示例用于上传指标。sso/ssooidc用于支持 IAM Identity Center 等 SSO 凭证流程。log4j-slf4j-impl把 SLF4J 日志桥接到 Log4j2配合教程中的 log4j2 配置输出日志。junit-jupiter测试依赖仅用于运行集成测试。依赖版本由 BOMsoftware.amazon.awssdk:bom:2.25.39统一管理日志组件版本由log4j-bom:2.23.1统一管理因此在dependencies中无需为 AWS SDK 各模块单独写版本号。如果你只想简单运行应用可以忽略 JUnit 和 Checkstyle 依赖。?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion groupIdorg.example/groupId artifactIdmonitor_dynamodb/artifactId version1.0/version packagingjar/packaging descriptionExample for DynamoDB performance monitoring./description properties project.build.sourceEncodingUTF-8/project.build.sourceEncoding java.version17/java.version maven.compiler.target17/maven.compiler.target maven.compiler.source17/maven.compiler.source /properties dependencyManagement dependencies dependency groupIdsoftware.amazon.awssdk/groupId artifactIdbom/artifactId version2.25.39/version typepom/type scopeimport/scope /dependency dependency groupIdorg.apache.logging.log4j/groupId artifactIdlog4j-bom/artifactId version2.23.1/version typepom/type scopeimport/scope /dependency /dependencies /dependencyManagement dependencies dependency groupIdsoftware.amazon.awssdk/groupId artifactIddynamodb-enhanced/artifactId /dependency dependency groupIdsoftware.amazon.awssdk/groupId artifactIddynamodb/artifactId /dependency dependency groupIdsoftware.amazon.awssdk/groupId artifactIdcloudwatch-metric-publisher/artifactId /dependency dependency groupIdsoftware.amazon.awssdk/groupId artifactIdcloudwatch/artifactId /dependency dependency groupIdsoftware.amazon.awssdk/groupId artifactIdsso/artifactId /dependency dependency groupIdsoftware.amazon.awssdk/groupId artifactIdssooidc/artifactId /dependency dependency groupIdorg.apache.logging.log4j/groupId artifactIdlog4j-slf4j-impl/artifactId /dependency dependency groupIdorg.junit.jupiter/groupId artifactIdjunit-jupiter/artifactId version5.8.1/version scopetest/scope /dependency /dependencies build plugins plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-checkstyle-plugin/artifactId version3.3.1/version configuration configLocationcheckstyle.xml/configLocation /configuration dependencies dependency groupIdcom.puppycrawl.tools/groupId artifactIdcheckstyle/artifactId version10.15.0/version /dependency /dependencies /plugin /plugins /build /project仓库中的 pom.xml 与上述内容一致还配套提供了 checkstyle.xml包含AvoidStarImport、UnusedImports、DeclarationOrder等静态检查规则用于保证示例代码风格统一。创建 Java 包在src/main/java目录下创建名为org.example的 Java 包所有 Java 文件都放入该包中。本示例共包含三个 Java 类DynamoDbMetricsExample.java示例应用的入口类负责组装对象、建表、驱动读写循环、清理资源。Greeting.java数据模型类是一个DynamoDbBean注解的 DynamoDB Bean用于在对象与 DynamoDB 表之间映射数据。GreetingsSender.java应用的核心逻辑类负责创建各类服务客户端、执行写入/读取、建表与删表。核心代码实现解析Greeting 数据模型类Greeting类带有DynamoDbBean注解标识它是一个可被 SDK 用来生成表结构TableSchema的 Bean。Bean 的 getter/setter 名称会成为 DynamoDB 的属性名DynamoDbPartitionKey注解把id字段标记为表的分区键。package org.example; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbBean; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbPartitionKey; DynamoDbBean public class Greeting { private String id; private String name; public String getId() { return id; } DynamoDbPartitionKey public void setId(String id) { this.id id; } public String getName() { return name; } public void setName(String name) { this.name name; } Override public String toString() { return String.format( %s[id%s, name%s], getClass().getSimpleName(), id, name ); } }完整源码见 Greeting.java。在实际应用中你可以在同一个 Bean 里声明更多属性如数值、集合、嵌套对象并配合DynamoDbSortKey、DynamoDbSecondaryPartitionKey等注解构建更复杂的数据模型。GreetingsSender 核心逻辑类GreetingsSender是示例应用的核心。从源码结构GreetingsSender.java可以看出其构造函数依次实例化以下服务客户端CloudWatchAsyncClient向 CloudWatch 发送指标数据。CloudWatchMetricPublisher聚合客户端指标数据并按配置的频率批量上传。DynamoDbClient被 DynamoDB 增强客户端用来与 DynamoDB 服务交互。DynamoDbEnhancedClient客户端侧对象映射的入口类。构造函数最后一行通过enhancedClient.table(TABLE_NAME, TableSchema.fromBean(Greeting.class))创建了一个DynamoDbTable实例即greetingsTable。DynamoDbTable是对物理 DynamoDB 表的客户端侧表示后续putItem、getItem、createTable、deleteTable等操作都经由它完成。public GreetingsSender(final Region region, Duration uploadFrequency, String namespace) { cloudWatchAsyncClient CloudWatchAsyncClient.builder() .region(region) .build(); metricPublisher CloudWatchMetricPublisher.builder() .cloudWatchClient(cloudWatchAsyncClient) .uploadFrequency(uploadFrequency) .namespace(namespace) .detailedMetrics( CoreMetric.API_CALL_DURATION) .build(); dynamoDbClient DynamoDbClient.builder() .region(region) .overrideConfiguration(c - c.addMetricPublisher(metricPublisher)) .build(); DynamoDbEnhancedClient enhancedClient DynamoDbEnhancedClient.builder() .dynamoDbClient(dynamoDbClient) .build(); greetingsTable enhancedClient.table(TABLE_NAME, TableSchema.fromBean(Greeting.class)); }这里有几个值得注意的设计要点客户端复用是性能最佳实践。服务客户端在应用启动时实例化、在应用关闭时释放。通过跨请求复用同一批客户端可以复用DynamoDbClient到 DynamoDB、CloudWatchAsyncClient到 CloudWatch 的连接。如果每个请求都新建客户端每次请求都要付出建立连接的性能代价。指标发布器的接入方式。CloudWatchMetricPublisher通过DynamoDbClient的overrideConfiguration(c - c.addMetricPublisher(metricPublisher))注入所有经由该客户端发出的 DynamoDB API 调用都会自动产生并上报指标。uploadFrequency控制聚合数据上传 CloudWatch 的周期示例入口传入了 1 分钟namespace决定指标在 CloudWatch 中归属的自定义命名空间detailedMetrics指定需要发布详细统计含百分位的指标。读写循环sendGreetingssendGreetings方法运行一个循环每轮创建一条新问候记录写入 DynamoDB再读回它。为了让指标覆盖更长的观测时间窗每轮循环之间通过Thread.sleep(timeBetweenSendsInMillis)暂停。public void sendGreetings(Integer numberOfGreetings, Long timeBetweenSendsInMillis) throws InterruptedException { final String greetingZeroId greeting-00; final Greeting greetingZero new Greeting(); greetingZero.setId(greetingZeroId); greetingZero.setName(greetingZeroId); for (int i 0; i numberOfGreetings; i) { LOGGER.info(Sending greeting #{}, i 1); final String greetingId String.format(greeting-%2d, i); final Greeting greeting new Greeting(); greeting.setId(greetingId); greeting.setName(greetingId); putGreeting(greeting); putGreeting(greetingZero); getGreeting(greetingId); getGreeting(greetingZeroId); // Briefly pause the loop to extend the requests over a longer period to generate metrics // for this example. Thread.sleep(timeBetweenSendsInMillis); } }注意每轮循环都会额外写入并读取 id 为greeting-00的第一条记录。这是有意制造的分区键使用不均衡所有请求都反复命中同一个分区键从而在启用 CloudWatch Contributor Insights 时能明显看出热点分区。在真实应用中读写应当尽量均匀分布在表的所有分区键上。异常处理与请求 ID 记录putGreeting与getGreeting方法负责发送与获取数据同时演示了在服务端出问题时如何取得请求 IDRequest ID。请求 ID 在排查问题、联系 AWS 支持时非常有用。private void putGreeting(final Greeting greeting) { if (Objects.isNull(greeting)) { throw new NullPointerException(Attempted to put a null greeting.); } LOGGER.debug(Persisting the following greeting to DynamoDB. {}., greeting); try { greetingsTable.putItem(greeting); } catch (SdkException exception) { // The SDK exception will be an SdkServiceException in the case that the exception returned from the // service, in this case DynamoDB. Otherwise, e.g. in the case of connection timeouts, there will not be // a request ID. String requestId NONE; if (exception instanceof SdkServiceException) { requestId ((SdkServiceException) exception).requestId(); } LOGGER.error( Encountered an exception with DynamoDB when attempting to put the following greeting. {}. Request ID: {}., greeting, requestId, exception ); throw exception; } }从源码注释可以确认当异常是从服务DynamoDB返回的SdkServiceException时可以取得requestId()而像连接超时这类本地异常则没有请求 ID此时记录为NONE。getGreeting的异常处理逻辑与之对称并通过OptionalGreeting包装返回值。建表、删表与资源关闭createTable()与deleteTable()分别通过增强客户端的greetingsTable.createTable()/deleteTable()完成表生命周期管理并使用DynamoDbWaiter等待表状态收敛waitUntilTableExists/waitUntilTableNotExists避免在表尚未就绪时进行读写。close()方法按逆序关闭metricPublisher、cloudWatchAsyncClient、dynamoDbClient保证异步指标上传等资源被正确释放。public void createTable() { LOGGER.info(Creating {} table., TABLE_NAME); greetingsTable.createTable(); try (DynamoDbWaiter waiter DynamoDbWaiter.builder().client(dynamoDbClient).build()) { waiter.waitUntilTableExists(b - b.tableName(TABLE_NAME)); } LOGGER.info({} table created., TABLE_NAME); } public void deleteTable() { LOGGER.info(Deleting {} table., TABLE_NAME); greetingsTable.deleteTable(); try (DynamoDbWaiter waiter DynamoDbWaiter.builder().client(dynamoDbClient).build()) { waiter.waitUntilTableNotExists(b - b.tableName(TABLE_NAME)); } LOGGER.info({} table deleted., TABLE_NAME); } Override public void close() { metricPublisher.close(); cloudWatchAsyncClient.close(); dynamoDbClient.close(); }DynamoDbMetricsExample 入口类DynamoDbMetricsExample是应用入口DynamoDbMetricsExample.java执行以下步骤配置核心GreetingsSender实例指定区域、上传频率、命名空间。创建 DynamoDB 表。启动写入/读取循环。删除 DynamoDB 表。如果你打算查看 CloudWatch Contributor Insights请注释掉greetingsSender.deleteTable();这一行并在之后记得手动删除表。调用close()关闭全部服务客户端。public class DynamoDbMetricsExample { private static final Logger LOGGER LoggerFactory.getLogger(DynamoDbMetricsExample.class); public static void main(String[] args) { String namespace DynamoDBMetricsExample; GreetingsSender greetingsSender new GreetingsSender(Region.US_EAST_1, Duration.ofMinutes(1L), namespace); // Create the DynamoDB table, if it doesnt already exist. greetingsSender.createTable(); try { greetingsSender.sendGreetings(999, 10000L); } catch (InterruptedException | SdkException e) { LOGGER.error(Error, e); } finally { // Comment out the following statement if you intend to review CloudWatch Contributor Insights. greetingsSender.deleteTable(); greetingsSender.close(); } } }关键参数说明Region.US_EAST_1客户端所在区域应与 DynamoDB 表所在区域一致。Duration.ofMinutes(1L)CloudWatchMetricPublisher的指标上传频率即每隔 1 分钟聚合上传一次指标。sendGreetings(999, 10000L)循环 999 次每次间隔 10 秒。合计运行约 2.5 小时以上足以在 CloudWatch 中沉淀出有意义的指标序列。运行示例应用在 IntelliJ IDE 中运行在 Project 窗口中右键单击DynamoDbMetricsExample类文件选择Run ...。如果你按照后文配置了 log4j2.xml 日志文件应用启动后控制台会立即输出日志语句。应用配置为循环 1000 次sendGreetings(999, 10000L)实际循环 999 次每次间隔 10 秒因此会持续运行并产生超过 2.5 小时的指标数据。应用至少运行 15 分钟后即可按下一节的方法查看指标。在 CloudWatch 中监控 DynamoDB查看指标DynamoDB 服务端指标所有 DynamoDB 表都会自动向 CloudWatch 发布指标包括延迟指标。查看方法在控制台导航到包含 DynamoDB 表的区域选择CloudWatch→ 左侧导航Metrics → All metrics在Browse选项卡的AWS namespaces标题下找到DynamoDB磁贴运行本示例应用后即可看到。查看 DynamoDB 生成的延迟指标示例应用运行约 15 分钟后进入 CloudWatch 控制台在导航面板选择Metrics → All metrics并进入Browse选项卡。确保你处于包含Greetings表的同一区域。在AWS namespaces标题下选择DynamoDB磁贴见上图。选择Table Operation Metrics磁贴。滚动列表勾选表名为Greetings、操作为GetItem、指标为SuccessfulRequestLatency的行。同时勾选表名为Greetings、操作为PutItem、指标为SuccessfulRequestLatency的行。选择Graphed metrics (2)选项卡在表头把Statistic设为Average。根据应用已运行的时间长短你可能需要调整图表顶部的 time range 以显示更多数据点。你的图表与下图不会完全一致但应能看到针对Greetings表的PutItem与GetItem两条曲线它们分别代表 DynamoDB 上报的每次操作平均延迟。重要这些是 DynamoDB 服务端指标。因为是服务端指标延迟并不反映客户端的完整体验——例如网络传输耗时和 SDK/客户端侧活动耗时都未包含在内。此外服务端指标只提供汇总统计量最小值、最大值、总和、平均值、样本数目前不提供百分位指标如 p99。更多可用指标可参阅 DynamoDB 官方Monitoring metrics with Amazon CloudWatch文档。SDK 客户端指标通过在客户端开启 SDK 指标发布metrics publishing特别是配置详细指标detailed metrics可以获取包含网络传输时间、并支持百分位的指标。在本示例中我们把指标发布器配置为针对每个请求向 CloudWatch 发送ApiCallDuration指标见GreetingsSender构造函数。ApiCallDuration表示完成一个请求所花费的总时间包含所有重试。metricPublisher CloudWatchMetricPublisher.builder() .cloudWatchClient(cloudWatchAsyncClient) .uploadFrequency(uploadFrequency) .namespace(fullNamespace) .detailedMetrics( CoreMetric.API_CALL_DURATION) .build();AWS SDK for Java 2.x 开发者指南的指标章节列出了所有可以发布的 SDK 指标如CoreMetric.API_CALL_DURATION之外还有MARSHALLING_DURATION、HTTP_CLIENT_EXECUTION_DURATION等可在应用中按需加入detailedMetrics列表。查看 SDK 生成的延迟指标SDK 生成的指标位于 CloudWatch 控制台的Custom namespaces标题下。本教程配置的命名空间为DynamoDBMetricsExample如果你不指定命名空间SDK 会默认使用AwsSdk/JavaSdk2。示例应用运行约 15 分钟后进入 CloudWatch 控制台在导航面板选择Metrics → All metrics进入Browse选项卡。选择DynamoDBMetricsExample磁贴。选择显示OperationName, ServiceId的磁贴。滚动操作/指标组合列表找到GetItem与ApiCallDuration勾选对应复选框。同时勾选PutItem与ApiCallDuration。选择Graphed metrics (2)选项卡在表头把Statistic设为p99。同样可按需调整 time range 以获得更多数据点。下图展示的是应用运行约 20 分钟后的p99 ApiCallDuration指标。创建 DynamoDB 仪表盘与告警前面介绍的指标能帮你理解 DynamoDB服务端和 SDK客户端对应用性能各自的贡献。为了充分发挥这些指标的价值建议将客户端侧 DynamoDB 延迟与错误指标加入CloudWatch 仪表盘Dashboard形成可随时查看的性能看板。在客户端侧 DynamoDB 延迟和错误指标上创建告警Alarm以便在某个服务导致性能劣化时第一时间感知例如对延迟突增、异常数上升设置告警阈值。这两种做法都属于生产环境中的良好实践告警能够把被动排查变为主动告警。日志与错误信息记录SDK 日志作为最佳实践应对 DynamoDB 抛出的异常进行记录。本教程演示了如何为抛异常的请求记录 AWS 请求 ID当你需要联系 AWS 支持排查 DynamoDB 性能问题时请求 ID 非常关键。以下是生成应用日志输出的 Log4j 配置文件Configuration statusWARN Appenders Console nameConsoleAppender targetSYSTEM_OUT PatternLayout pattern%d{YYYY-MM-dd HH:mm:ss} [%t] %-5p %c:%L - %m%n / /Console /Appenders Loggers Root levelWARN AppenderRef refConsoleAppender/ /Root Logger nameorg.example levelINFO/ Logger namesoftware.amazon.awssdk.request levelDEBUG / Logger namesoftware.amazon.awssdk.metrics.publishers.cloudwatch levelTRACE/ /Loggers /Configuration各 Logger 的作用org.exampleINFO输出应用自身的运行信息例如Sending greeting #1、建表/删表状态等。software.amazon.awssdk.requestDEBUG输出请求/响应的概要信息其中包含请求 ID。software.amazon.awssdk.metrics.publishers.cloudwatchTRACE显示发送到 CloudWatch 的指标数据明细便于本地核对发布内容。日志输出与源码中的LOGGER.info(...)、LOGGER.error(...)调用一一对应putGreeting/getGreeting中的错误日志会在发生SdkServiceException时携带请求 ID。AWS CloudTrail 日志此外你还可以考虑配置AWS CloudTrail自动记录对 DynamoDB 的所有访问用于审计与事后分析。使用 CloudWatch Contributor Insights 分析分区键使用DynamoDB 应用在读写在表的分区键上分布得越均匀性能表现越好。因此为了优化应用的 DynamoDB 性能有必要了解表中是否存在热点频繁被访问的分区。CloudWatch Contributor Insights可以展示你的访问量最高的分区键。启用方式在 DynamoDB 控制台的Greetings表的Monitoring选项卡中开启 CloudWatch Contributor Insights。开启后重新运行本示例程序即可看到类似下图的曲线——访问量最高的分区键及其消耗的吞吐量单位一目了然。在真实应用中不均匀访问往往难以追踪可能源于不断演变的客户使用模式和表设计。而本教程的示例应用是故意制造这种不均匀访问的sendGreetings每轮循环都额外读写greeting-00这一固定分区键使其访问量远高于其他键从而在 Contributor Insights 图表中清晰可见。[!NOTE] 如果你在DynamoDbMetricsExample类中注释掉了删除Greetings表的语句请记得在 DynamoDB 控制台中手动删除该表以免持续产生费用。测试与验证GreetingsSenderTest仓库中还提供了集成测试 GreetingsSenderTest.java用于端到端验证指标确实被发布到了 CloudWatch这一关键链路class GreetingsSenderTest { private final static Logger LOGGER LoggerFactory.getLogger(GreetingsSenderTest.class); private final static Region REGION Region.US_EAST_1; private final static CloudWatchClient cloudWatchClient CloudWatchClient.builder().region(REGION).build(); Test Tag(IntegrationTest) void sendGreetings() { String namespace DynamoDBMetricsExample Text new Random(1000); GreetingsSender greetingsSender new GreetingsSender(REGION, Duration.ofSeconds(15L), namespace); greetingsSender.createTable(); try { greetingsSender.sendGreetings(5, 2500L); Thread.sleep(Duration.ofSeconds(30L).toMillis()); ListMetricsResponse listMetricsResponse cloudWatchClient.listMetrics(b - b .namespace(namespace) .metricName(CoreMetric.API_CALL_DURATION.name())); Assertions.assertFalse(listMetricsResponse.metrics().isEmpty(), No ApiCallDuration metric received by CloudWatch); } catch (InterruptedException | SdkException e) { LOGGER.error(e.getMessage(), e); } finally { greetingsSender.deleteTable(); greetingsSender.close(); } } }该测试标记为IntegrationTest需要真实 AWS 凭证使用独立的随机命名空间避免与手动运行的数据冲突将上传频率缩短为 15 秒、循环 5 次然后通过CloudWatchClient.listMetrics查询该命名空间下是否存在ApiCallDuration指标从而验证 SDK 指标发布链路工作正常。这也印证了CoreMetric.API_CALL_DURATION.name()作为指标名被实际写入 CloudWatch。清理资源完成监控实验后请务必清理本教程创建的资源避免产生持续费用删除GreetingsDynamoDB 表若已注释掉自动删除语句需在 DynamoDB 控制台手动删除。删除或关闭测试过程中创建的指标命名空间、仪表盘与告警视你的配置而定。确认 CloudWatch Contributor Insights 已关闭或确认表已删除以免贡献者分析持续计费。总结通过本教程你完成了从客户端指标采集到CloudWatch 可视化与告警再到热点分区键定位的完整 DynamoDB 性能监控闭环客户端侧CloudWatchMetricPublisherdetailedMetrics(CoreMetric.API_CALL_DURATION)提供了含百分位如 p99的完整端到端延迟视图弥补了服务端指标不含网络与 SDK 耗时、无百分位的不足。服务端侧DynamoDB 自动发布的SuccessfulRequestLatency等指标提供操作级基准两者结合可定位延迟到底发生在 DynamoDB 服务端还是客户端/网络。告警与日志为关键指标设置告警实现主动感知记录请求 ID 便于申请 AWS 支持时快速定位。Contributor Insights帮助你发现分区键热点为表设计与读写分布优化提供数据支撑。示例中的全部代码均可在仓库 javav2/usecases/monitor_dynamodb 目录下找到你可以直接参考 pom.xml、Greeting.java、GreetingsSender.java 与 DynamoDbMetricsExample.java 快速搭建自己的监控示例。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐基于视觉Transformer与卷积细化网络的AI绿幕抠像架构CorridorKey技术深度解析基于视觉Transformer与卷积细化网络的AI绿幕抠像架构CorridorKey技术深度解析 在影视制作与视觉特效领域绿幕抠像技术长期以来面临着半透明物人工智能计算机视觉图像处理视频处理AWS SDK for Java v2 增强客户端 DynamoDB Document API 设计与实战指南AWS SDK for Java v2 增强客户端 DynamoDB Document API 设计与实战指南 本指南以 docs/design/service后端AWS SDK for Python 实战CloudWatch 监控与告警全解析AWS SDK for Python 实战CloudWatch 监控与告警全解析 前言 在云计算环境中监控系统资源和服务状态是运维工作的核心。Amazon示例工程教程后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表