资讯动态

aws-doc-sdk-examples 中的 Amazon CloudWatch Java SDK 2.x 实战指南:从 Hello CloudWatch 到 PromQL 告警

发布时间:2026/9/25 2:32:24 来源:尧图企业网站定制
示例工程教程后端【免费下载链接】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/example_code/cloudwatch/README.md 为骨架系统讲解如何用 AWS SDK for Java 2.x 与 Amazon CloudWatch 交互。你将掌握三类核心能力通过ListMetrics完成服务入门的 Hello 示例、贯穿 18 个步骤的“指标—仪表盘—告警—异常检测”完整基础场景Basics以及面向现代可观测性的 OpenTelemetryOTel指标上报与 PromQL 告警场景。文中的每个操作都可以在仓库源码中找到对应实现与测试可直接克隆运行验证。说明仓库根目录即aws-doc-sdk-examples下文所有路径均以此为起点。运行文中代码会在你的 AWS 账户产生费用请遵循最小权限原则配置 IAM 权限。示例总览与代码组织CloudWatch 示例位于 javav2/example_code/cloudwatch 目录源码结构如下cloudwatch/ ├── src/main/java/com/example/cloudwatch/ │ ├── HelloService.java # Hello CloudWatchListMetrics 入门 │ ├── EnableAlarmActions.java # 启用告警动作 │ ├── DisableAlarmActions.java # 禁用告警动作 │ ├── PutEvents.java / PutRule.java / PutTargets.java / DescribeRule.java # CloudWatch Events 相关 │ ├── scenario/ │ │ ├── CloudWatchScenario.java # 18 步基础场景编排 │ │ └── CloudWatchActions.java # 所有异步 API 调用实现 │ └── otel/ │ └── CloudWatchOTelActions.java # OTel 富化 PromQL 告警 贡献者 静默规则 ├── src/test/java/CloudWatchTest.java # 集成测试 ├── CloudDashboard.json # 更新仪表盘使用的 JSON 模板 ├── jsonWidgets.json # 创建仪表盘使用的 JSON 模板 ├── metric.json / settings.json # 场景运行所需配置 ├── pom.xml # Maven 工程配置Java 21、SDK BOM 2.46.7 ├── Makefile / run_example.sh # 运行脚本 └── metadata.yaml # 示例元数据从目录布局可以看出该模块按“单个 Action → 场景 Scenario → OTel 专项场景”三层组织对应 README 中 Get started、Basics、Single actions、Scenarios 四类内容。前置条件运行这些示例需要满足 javav2 目录的 README 前置要求主要包括JDK 与 Maven 环境本示例pom.xml要求Java 21编译源码与目标版本均为 21配置 AWS 凭证SDK for Java 开发者指南 中描述了标准配置流程CloudWatch 相关 IAM 权限。README 特别提醒最少权限原则仅授予任务所需的最小权限集合。pom.xml通过 SDK BOMBill of Materials 统一管理版本software.amazon.awssdk:bom:2.46.7核心依赖包括software.amazon.awssdk:cloudwatch—— 本文主体服务客户端software.amazon.awssdk:cloudwatchevents/cloudwatchlogs—— 事件与日志Events 示例使用software.amazon.awssdk:netty-nio-client—— 异步 HTTP 客户端异步场景依赖com.fasterxml.jackson.core:jackson-databind与com.google.code.gson:gson—— JSON 解析org.junit.jupiter:junit-jupiter:5.11.4—— 测试框架。Hello CloudWatch用 ListMetrics 快速入门入门示例 HelloService.java 调用ListMetrics按命名空间过滤并打印指标名。其使用分页器paginator优雅地处理潜在的多页数据ListMetricsRequest request ListMetricsRequest.builder() .namespace(namespace) // 例如 AWS/EC2 .build(); ListMetricsIterable listRes cw.listMetricsPaginator(request); listRes.stream() .flatMap(r - r.metrics().stream()) .forEach(metrics - System.out.println( Retrieved metric is: metrics.metricName()));运行方式namespace # 要过滤的命名空间例如 AWS/EC2代码固定使用Region.US_EAST_1构建CloudWatchClient。若传入命名空间无匹配指标分页器返回空集合不会抛出异常真正的服务端错误如凭证无效会以CloudWatchException形式抛出e.awsErrorDetails().errorMessage()可用于诊断。从源码看 ListMetrics 的分页处理在 CloudWatchActions.java 中同名能力被封装为异步版本listMetsAsync使用ListMetricsPublisher订阅式分页并用SetString去重指标名后返回ArrayListListMetricsPublisher metricsPaginator getAsyncClient().listMetricsPaginator(request); SetString metSet new HashSet(); CompletableFutureVoid future metricsPaginator.subscribe(response - { response.metrics().forEach(metric - metSet.add(metric.metricName())); }); return future.thenApply(ignored - new ArrayList(metSet));而listNameSpacesAsync用同样的分页器遍历所有指标提取不重复的命名空间供基础场景第一步选择命名空间使用。这解释了为什么 Hello 示例可以用一个namespace参数打通“服务可用性验证 数据探索”两条路径。Basics18 步 CloudWatch 基础场景CloudWatchScenario.java 是仓库中最完整的单服务场景它把 CloudWatch 的“指标读取、仪表盘、自定义指标、告警、异常检测、资源清理”串成一条可交互执行的主线。README 列出其能力清单列出 CloudWatch 命名空间与指标获取某指标与预估账单的统计信息创建并更新仪表盘创建自定义指标并写入数据创建并触发告警随后查看告警历史添加异常检测器Anomaly Detector获取指标图像最后清理资源。运行参数7 个命令行参数myDate costDateWeek dashboardName dashboardJson dashboardAdd settings metricImage参数含义示例 / 取值myDate获取指标统计的起始时间2023-01-11T18:35:24.00ZISO-8601costDateWeek获取 AWS/Billing 统计的起始时间2023-01-11T18:35:24.00ZdashboardName要创建的仪表盘名称任意字符串dashboardJson创建仪表盘用的 JSON 文件路径jsonWidgets.jsondashboardAdd更新仪表盘用的 JSON 文件路径CloudDashboard.jsonsettings从 JSON 文件读取各项配置值settings.jsonmetricImage保存指标图BMP 图像的路径任意本地文件路径18 步执行流程场景以DASHES分隔日志、通过waitForInputToContinue输入c回车继续控制节奏核心步骤与对应异步方法如下列出至少 5 个命名空间选择其一 ——listNameSpacesAsync()列出所选命名空间下的指标选择其一 ——listMetsAsync()获取所选指标最近一天的统计信息选择统计类型SampleCount / Average / Sum / Minimum / Maximum——getAndDisplayMetricStatisticsAsync()请求中period(86400)即按天聚合获取 AWS/Billing 命名空间EstimatedCharges指标近一周统计——getMetricStatisticsAsync()维度为CurrencyUSD统计项为Statistic.MAXIMUM用dashboardJson文件创建仪表盘——createDashboardWithMetricsAsync()putDashboard返回的dashboardValidationMessages会打印校验消息用分页器列出仪表盘——listDashboardsAsync()ListDashboardsPublisher创建自定义指标命名空间SITE/TRAFFIC、指标PAGES_VISITED、维度UNIQUE_PAGESURLS、值由dataPoint默认 10.0决定 ——createNewCustomMetricAsync()把自定义指标加入仪表盘使用dashboardAdd文件——addMetricToDashboardAsync()为自定义指标创建告警——createAlarmAsync(settings)捕获LimitExceededException告警配额耗尽作为特殊错误路径描述当前 10 条告警过滤AlarmType.METRIC_ALARM——describeAlarmsAsync()获取自定义指标当前数据GetMetricData扫描方式TIMESTAMP_DESCENDING——getCustomMetricDataAsync()写入告警触发数据两个MetricDatum值 1001.00 / 1002.00——addMetricDataForAlarmAsync()用DescribeAlarmsForMetric轮询告警状态——checkForMetricAlarmAsync()内部递归重试最多 10 次、每次间隔 20 秒获取告警历史——getAlarmHistoryAsync()用describeAlarmHistoryPaginator分页并只取HistoryItemType.ACTION类型为自定义指标添加异常检测器SingleMetricAnomalyDetector统计项Maximum——addAnomalyDetectorAsync()描述当前异常检测器——describeAnomalyDetectorsAsync()获取指标图像并保存——downloadAndSaveMetricImageAsync()GetMetricWidgetImage以 JSON 描述 timeSeries 图返回的SdkBytes写入本地文件清理资源依次删除仪表盘、告警、异常检测器 ——deleteDashboardAsync()、deleteCWAlarmAsync()、deleteAnomalyDetectorAsync()。settings.json场景配置中心settings.json 是多个步骤共享的配置来源{ dashboardName: example-new-dashboard2, exampleAlarmName: example-metric-alarm, accountId: 1234567890, region: us-east-1, emailTopic: Default_CloudWatch_Alarms_Topic, customMetricNamespace: example-namespace, customMetricName: example-custom-metric }其中createAlarmAsync从该文件提取 6 个字段并拼装 SNS 告警动作 ARNarn:aws:sns:region:accountId:emailTopic。PutMetricAlarmRequest的完整配置如下可在 CloudWatchActions.java 中对应代码块查看PutMetricAlarmRequest alarmRequest PutMetricAlarmRequest.builder() .alarmActions(alarmActions) // SNS 主题 ARN 列表 .alarmDescription(Example metric alarm) .alarmName(alarmName) .comparisonOperator(ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD) .threshold(100.00) .metricName(customMetricName) .namespace(customMetricNamespace) .evaluationPeriods(1) .period(10) .statistic(Maximum) .datapointsToAlarm(1) .treatMissingData(ignore) .build();含义说明当自定义指标Maximum统计值 ≥ 100 且持续 1 个评估周期10 秒即进入 ALARM缺失数据按ignore处理。这组参数与第 12 步写入的 1001/1002 数据点呼应保证场景可自动触发告警。仪表盘 JSON 模板创建仪表盘使用 jsonWidgets.json包含文本 widgetMarkdown 标题与两个指标 widgetAWS/Billing EstimatedCharges账单图、AWS/Usage CallCount的 CloudWatch API 调用量图含ListMetrics、GetMetricStatistics、GetMetricData、PutDashboard、PutMetricData等指标序列。更新仪表盘使用 CloudDashboard.json核心 widget 配置展示了putDashboard的dashboardBody标准结构type: metric、view: timeSeries、stat、period、yAxis、sparkline、trend等字段。若 JSON 结构非法putDashboard会抛出DashboardInvalidInputErrorException场景中对此有专门捕获。异步客户端CloudWatchAsyncClient 的调优配置Basics 场景全部使用异步 API。CloudWatchActions通过单例getAsyncClient()构建CloudWatchAsyncClientCloudWatchActions.java其配置在源码注释中有明确说明HTTP 层NettyNioAsyncHttpClient最大并发 100连接/读/写超时均为 60 秒覆盖配置API 调用总超时 2 分钟单次尝试超时 90 秒重试策略RetryMode.STANDARD。SdkAsyncHttpClient httpClient NettyNioAsyncHttpClient.builder() .maxConcurrency(100) .connectionTimeout(Duration.ofSeconds(60)) .readTimeout(Duration.ofSeconds(60)) .writeTimeout(Duration.ofSeconds(60)) .build(); ClientOverrideConfiguration overrideConfig ClientOverrideConfiguration.builder() .apiCallTimeout(Duration.ofMinutes(2)) .apiCallAttemptTimeout(Duration.ofSeconds(90)) .retryStrategy(RetryMode.STANDARD) .build();这一配置对真实生产系统有直接借鉴意义批量指标查询如GetMetricData多查询建议保留较高并发SDK 标准重试策略可自动应对 CloudWatch 的限流与瞬时故障。单个 Action 速查清单README 罗列了全部单动作示例及其源码位置下表汇总编号与 README 一致Action源码位置DeleteAlarmMuteRule / GetAlarmMuteRule / ListAlarmMuteRules / PutAlarmMuteRuleCloudWatchOTelActions.javaDeleteAlarms / DescribeAlarms / PutMetricAlarm经典CloudWatchActions.javaDeleteAnomalyDetector / DescribeAnomalyDetectors / PutAnomalyDetector同上DeleteDashboards / ListDashboards / PutDashboard同上DescribeAlarmContributors / GetOTelEnrichment / StartOTelEnrichment / StopOTelEnrichment / PutMetricAlarmPromQLCloudWatchOTelActions.javaDescribeAlarmHistory / DescribeAlarmsForMetricCloudWatchActions.javaEnableAlarmActions / DisableAlarmActionsEnableAlarmActions.java、DisableAlarmActions.javaGetMetricData / GetMetricStatistics / GetMetricWidgetImage / ListMetricsCloudWatchActions.java另有 Events 相关示例PutEvents、PutRule、PutTargets、DescribeRule位于 cloudwatch 包目录对应 CloudWatch Events / EventBridge 场景。场景二OpenTelemetry 指标 PromQL 告警针对现代化容器与 Kubernetes 可观测性仓库提供了 OTel 场景CloudWatchOTelActions.java。README 将其拆为 5 个步骤用 OpenTelemetry Collector 向 CloudWatch 的 OTLP 指标端点发送指标启动 OpenTelemetry enrichment使 CloudWatch 将这些指标与你的资源关联创建基于 PromQL 查询求值的告警对查询返回的每个序列求值检查将告警置为 ALARM 的单个序列contributors贡献者为维护窗口静默告警随后清理。OTLP 指标上报端点源码注释明确OTLP 指标上报并非 SDK 操作而是将 OpenTelemetry Collector 或 AWS Distro for OpenTelemetryADOTSDK 指向 CloudWatch 的 OTLP 端点https://monitoring.region.amazonaws.com/v1/metrics本文件中的 SDK 操作覆盖“指标落地 CloudWatch 之后”的全部动作。Start/Stop OTel EnrichmentstartOTelEnrichment为账户开启富化一旦运行带资源标识维度如 EC2CPUUtilization指标的InstanceId维度的 vended metrics 会被附加资源 ARN 与资源标签标签从而可用 PromQL 查询。前置要求是账户已启用“telemetry 上的资源标签”。getOTelEnrichmentStatus返回Running或Stopped状态stopOTelEnrichment关闭富化已有 PromQL 告警不会被删除但按标签选择的查询将不再命中。创建 PromQL 告警putPromQLMetricAlarm与经典指标告警有显著差异查询可一次匹配多个序列每个序列被单独跟踪为 contributor不再统计“连续违规周期数”而是指定时长contributor 持续违规超过 pending period 后进入 ALARM停止违规超过 recovery period 后回到 OKPromQL 告警初始为 OK 状态而非 INSUFFICIENT_DATAEvaluationCriteria是联合类型与经典metricName/metrics参数互斥使用它时必须同时设置evaluationInterval合法值10、20、30以及任意 60 的倍数直至 3600且不得设置period、statistic、threshold、comparisonOperator、evaluationPeriods、datapointsToAlarm、treatMissingData。方法签名与核心构造public static void putPromQLMetricAlarm(CloudWatchClient cw, String alarmName, String query, int evaluationInterval, int pendingPeriod, int recoveryPeriod) { AlarmPromQLCriteria promQLCriteria AlarmPromQLCriteria.builder() .query(query) // 例如 avg(cpu_utilization_percent) 80比较运算符写在查询内 .pendingPeriod(pendingPeriod) // 持续违规时长秒 .recoveryPeriod(recoveryPeriod) .build(); PutMetricAlarmRequest request PutMetricAlarmRequest.builder() .alarmName(alarmName) .evaluationCriteria(EvaluationCriteria.builder().promQLCriteria(promQLCriteria).build()) .evaluationInterval(evaluationInterval) .build(); cw.putMetricAlarm(request); }贡献者Contributors定位问题根源describeAlarmContributors通过DescribeAlarmContributors分页拉取告警的全部 contributor——即查询匹配的每个序列按标签集标识。它是“从只知道‘有东西在违规’到知道‘是哪些主机/服务/Pod 在违规’”的关键能力。源码使用nextToken循环分页逐条打印 contributor 信息。静默规则Alarm Mute RulesputAlarmMuteRule支持为维护窗口静默告警动作配套操作包括getAlarmMuteRule、listAlarmMuteRules、deleteAlarmMuteRule。典型用法夜间批量发布/维护期间用时间表Schedule定义静默时段避免误报轰炸。如何运行示例仓库提供两种运行方式方式一Maven exec 插件推荐run_example.sh 封装了执行逻辑#!/bin/bash if [[ -z $* ]] ; then echo Supply the name of one of the example classes as an argument. exit 1 fi export CLASSPATHtarget/sdk-cloudwatch-examples-1.0.jar export className$1 shift mvn exec:java -Dexec.mainClasscom.example.cloudwatch.$className -Dexec.args$即先mvn package产出target/sdk-cloudwatch-examples-1.0.jar然后运行./run_example.sh HelloService AWS/EC2 ./run_example.sh CloudWatchScenario 2023-01-11T18:35:24.00Z 2023-01-11T18:35:24.00Z example-new-dashboard2 jsonWidgets.json CloudDashboard.json settings.json mymetric.bmp方式二直接 Mavenmvn compile mvn exec:java -Dexec.mainClasscom.example.cloudwatch.HelloService -Dexec.argsAWS/EC2集成测试测试位于 CloudWatchTest.java是标注Tag(IntegrationTest)、按Order排序的 JUnit 5 集成测试覆盖 Hello、仪表盘、指标、告警、异常检测、清理等全流程。它通过 AWS Secrets ManagergetSecretValues Gson 反序列化读取运行参数客户端固定Region.US_EAST_1。运行测试的方法与要求见 javav2 目录 README 的 Tests 小节。⚠ 运行测试同样可能产生 AWS 费用。实战建议与注意事项费用与权限README 明确提示运行示例与测试均可能产生账户费用代码未在所有 AWS 区域验证建议以us-east-1为主并核对 AWS Regional Services。权限遵循最小权限原则告警动作涉及 SNS 发布权限时需单独授予。账单指标要获取 AWS/Billing 预估账单统计步骤 4需先在账户开启账单告警/账单指标CloudWatch 控制台 Billing 设置否则返回空数据。告警触发验证步骤 12 写入 1001/1002 的数据点配合阈值 100、evaluationPeriods1与datapointsToAlarm1通常几分钟内即可观察到 ALARM步骤 13 的递归轮询最多 10 次 × 20 秒正是为等待指标聚合与告警求值预留的时间。异步最佳实践CloudWatchAsyncClient的并发 100、标准重试、2 分钟总超时配置可平滑应对多指标查询场景所有动作返回CompletableFuture便于用join()同步等待或组合编排。延伸阅读CloudWatch 用户指南CloudWatch API ReferenceSDK for Java 2.x CloudWatch 参考仓库内配套示例javav2 目录总 README、scenarios/basics 中的 CloudWatch 文档赞分享示例工程教程后端【免费下载链接】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点击查看免费下载相关推荐AWS SDK for Go 实战指南Amazon CloudWatch 监控、告警与事件驱动工作流aws-doc-sdk-examples 示例全解AWS SDK for Go 实战指南Amazon CloudWatch 监控、告警与事件驱动工作流aws doc sdk examples 示例全解 本示例工程教程后端aws-doc-sdk-examples基于 AWS SDK for Java 2.x 的 Amazon Neptune 代码示例实战指南aws doc sdk examples基于 AWS SDK for Java 2.x 的 Amazon Neptune 代码示例实战指南 本文以 javav示例工程教程后端AWS SDK for Java 2.x 实战在 aws-doc-sdk-examples 中运行与测试 Amazon MQ 的 Java 示例AWS SDK for Java 2.x 实战在 aws doc sdk examples 中运行与测试 Amazon MQ 的 Java 示例 本文基于 j示例工程教程后端上一篇DeLightingTool 项目常见问题解决方案下一篇Kerberos.NET 项目常见问题解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑