ARTICLE DETAIL

资讯详情

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

AWS SDK for Python(Boto3)CloudWatch 实战指南:自定义指标、告警与 OpenTelemetry/PromQL 集成

AWS SDK for Python(Boto3)CloudWatch 实战指南:自定义指标、告警与 OpenTelemetry/PromQL 集成 示例工程教程后端【免费下载链接】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点击查看免费下载导读本文以 python/example_code/cloudwatch/README.md 为核心骨架系统讲解如何使用 AWS SDK for PythonBoto3操作 Amazon CloudWatch覆盖两大类实战场景一是用资源接口创建自定义指标与经典指标告警cloudwatch_basics.py二是接入 OpenTelemetry 指标并用 PromQL 告警、查看告警 contributors、通过 mute rule 实现维护窗口静默cloudwatch_otel.py。读完本文你将掌握 CloudWatch 指标写入、统计查询、告警生命周期管理以及 OTLP 采集器配置与 PromQL 告警的完整调用链并了解仓库配套测试的组织方式。Amazon CloudWatch 提供可靠、可扩展且灵活的监控解决方案你可以在几分钟内开始使用。本文示例代码位于仓库 python/example_code/cloudwatch 目录。⚠️ 注意运行这些代码可能产生 AWS 账户费用请先了解 AWS 定价 与 免费套餐。运行测试同样可能产生 AWS 账户费用。建议遵循最小权限原则仅授予完成任务所需的最低权限Grant least privilege。这些代码未在所有 AWS 区域逐一测试AWS Regional Services。代码示例总览该目录下的示例分为两类Single actions单个 API 调用展示如何调用 CloudWatch 的单个服务函数。Scenarios场景通过多次调用同一服务内的多个函数完成一个具体任务。目录结构如下cloudwatch_basics.py自定义指标与告警管理场景。cloudwatch_otel.pyOpenTelemetry 指标与 PromQL 告警场景。otlp_collector_config.yamlOpenTelemetry Collector 的 OTLP 指标导出配置。requirements.txt依赖清单。test/基于 botocore Stubber 的单元测试。前置条件示例运行前需要一个 AWS 账户并已按官方指南配置好默认凭证与默认区域详见 python 目录 README 的前置条件说明。Python 3.6 或更高版本。进入示例目录并创建虚拟环境python -m venv .venv激活虚拟环境Windows 使用.venv\Scripts\activateLinux/macOS/Unix 使用source .venv/bin/activate然后安装依赖python -m pip install -r requirements.txtrequirements.txt 中声明的依赖为boto31.26.79与pytest7.2.1。其中boto3提供 CloudWatch 客户端与资源接口pytest用于运行配套单元测试。Single actions单函数调用清单README 列出了以下可单独调用的 CloudWatch API 操作并给出在源码中的精确位置操作源码位置底层 APIDeleteAlarmMuteRulecloudwatch_otel.py#L328delete_alarm_mute_ruleDeleteAlarmscloudwatch_basics.py#L264metric.alarms.delete()DescribeAlarmContributorscloudwatch_otel.py#L180describe_alarm_contributorsDescribeAlarmsForMetriccloudwatch_basics.py#L216metric.alarms.all()DisableAlarmActionscloudwatch_basics.py#L232alarm.disable_actions()EnableAlarmActionscloudwatch_basics.py#L232alarm.enable_actions()GetAlarmMuteRulecloudwatch_otel.py#L270get_alarm_mute_ruleGetMetricStatisticscloudwatch_basics.py#L123metric.get_statisticsGetOTelEnrichmentcloudwatch_otel.py#L79get_o_tel_enrichmentListAlarmMuteRulescloudwatch_otel.py#L292list_alarm_mute_rulesListMetricscloudwatch_basics.py#L37metrics.filter(...)PutAlarmMuteRulecloudwatch_otel.py#L216put_alarm_mute_rulePutMetricAlarmcloudwatch_otel.py#L114put_metric_alarmPutMetricDatacloudwatch_basics.py#L64metric.put_dataStartOTelEnrichmentcloudwatch_otel.py#L57start_o_tel_enrichmentStopOTelEnrichmentcloudwatch_otel.py#L98stop_o_tel_enrichment实现细节StartOTelEnrichment操作在 Boto3 中会被转换为蛇形命名start_o_tel_enrichmentOTel 前缀被拆分这是 cloudwatch_otel.py#L69-L71 注释中特别说明的调用陷阱。场景一管理自定义指标与告警cloudwatch_basics.py该场景展示以下完整流程创建一个监控某个 CloudWatch 指标的告警。通过PutMetricData向指标写入数据触发告警。从告警获取数据。删除告警。运行方式python cloudwatch_basics.py实现原理CloudWatchWrapper 封装cloudwatch_basics.py 以CloudWatchWrapper类封装资源接口基于boto3.resource(cloudwatch)核心方法包括list_metrics(namespace, name, recent)在指定命名空间内按名称过滤指标。若指标无维度则返回单个指标否则返回所有维度组合的指标。recentTrue时只返回最近 3 小时内活跃的指标RecentlyActivePT3H见 L38-L60。put_metric_data(namespace, name, value, unit)向指标写入单个数据点时间戳取当前 UTC 时间见 L65-L85。put_metric_data_set(namespace, name, timestamp, unit, data_set)写入一组数据所有数据共享同一时间戳与单位data_set是包含values列表与counts列表的字典两者长度必须一致见 L89-L120。get_metric_statistics(namespace, name, start, end, period, stat_types)按时间跨度拉取统计值见 L124-L155。create_metric_alarm(...)为指标创建告警见 L159-L213。get_metric_alarms(namespace, name)获取当前监控该指标的所有告警见 L217-L228。enable_alarm_actions(alarm_name, enable)启用或禁用告警动作可用于发送通知或自动响应告警状态变化见 L233-L262。delete_metric_alarms(namespace, name)删除监控指定指标的所有告警见 L265-L284。场景运行流程详解usage_demo()L291-L392的执行步骤写入 20 分钟的历史数据命名空间为doc-example-metric指标名为page_views单位Count。对每分钟生成一组 10 个随机值及其计数通过put_metric_data_set写入。创建告警告警名high_page_views统计类型Maximum周期period60秒eval_periods2阈值100比较操作符GreaterThanThreshold。告警创建后打印其 ARN 与当前状态。触发告警持续写入 100–200 之间的随机值直至告警状态从INSUFFICIENT_DATA变化每轮等待一个周期60 秒再重新加载状态等待数据最终一致。获取统计值对从起始时间到当前 UTC 时间的时间段调用get_metric_statistics统计类型为Average、Minimum、Maximum并以时间戳排序后打印数据点。列出告警遍历监控page_views的告警打印名称与状态。清理删除该指标的所有告警。单元测试验证test/test_cloudwatch_basics.py 通过 botocore Stubber 对上述每个方法做了参数化测试每个方法均覆盖正常路径与ClientError异常路径例如test_list_metrics校验返回的指标迭代器内容与期望一致。test_put_metric_data/test_put_metric_data_set校验写入调用与值/单位参数。test_create_metric_alarm校验告警名称等属性。test_get_metric_alarms/test_delete_metric_alarms校验告警的列出与批量删除。test_enable_alarm_actions分别校验enableTrue与enableFalse两条路径。测试统一从conftest.pytest/conftest.py引入仓库 python/test_tools 的公共 fixtures。场景二发送 OpenTelemetry 指标并用 PromQL 告警cloudwatch_otel.py该场景展示以下完整流程通过 OpenTelemetry Collector 将 OTLP 指标发送到 CloudWatch 指标端点。开启 OpenTelemetry enrichment让 CloudWatch 将这些指标与你的资源关联。创建基于 PromQL 查询的告警告警会对查询返回的每个序列逐一评估。检查导致告警进入ALARM状态的各个序列称为 contributors。为维护窗口静默mute告警然后清理资源。运行方式python cloudwatch_otel.py⚠️ 重要前提OTLP 指标摄取本身不是 AWS SDK 操作。要发送 OpenTelemetry 指标到 CloudWatch需要把 OpenTelemetry Collector 或 AWS Distro for OpenTelemetryADOTSDK 指向 CloudWatch OTLP 指标端点https://monitoring.region.amazonaws.com/v1/metricscloudwatch_otel.py#L13-L18。本场景演示的是这些指标落地 CloudWatch 之后的 SDK 操作。实现原理CloudWatchOTelWrapper 封装cloudwatch_otel.py 以CloudWatchOTelWrapper类封装。与场景一不同这里使用的是client 接口boto3.client(cloudwatch)因为 OpenTelemetry 相关操作只在客户端接口上可用而非高层的资源接口见 L37-L43。通过from_client()工厂方法可直接创建默认客户端包装器。核心方法start_otel_enrichment()为账户开启 OTel enrichment。开启后携带资源标识维度如带InstanceId维度的EC2 CPUUtilization的 vended 指标会被附加资源 ARN 与资源标签标签并可用 PromQL 查询。调用前必须先为账户启用资源标签遥测L58-L75。get_otel_enrichment_status()查询当前 enrichment 状态返回Running或StoppedL80-L96。stop_otel_enrichment()关闭 enrichment。已有 PromQL 告警不会被删除但 vended 指标不再附加资源 ARN 与标签因此按这些标签选择的查询将不再命中L99-L112。create_promql_alarm(...)创建 PromQL 告警详见下文。describe_alarm_contributors(alarm_name)获取告警 contributors详见下文。put_alarm_mute_rule(...)/get_alarm_mute_rule(name)/list_alarm_mute_rules(...)/delete_alarm_mute_rule(name)mute rule 的增查列删L217-L342。delete_alarms(alarm_names)按名称批量删除告警L345-L357。创建 PromQL 告警的关键参数create_promql_alarmL115-L177与经典指标告警有明显差异查询可一次匹配多个序列每个匹配序列被单独跟踪为一个contributor。不再统计“违反周期数”而是指定时长contributor 连续违反pending_period秒后进入ALARM停止违反recovery_period秒后回到OK。PromQL 告警初始状态为OK而非经典告警的INSUFFICIENT_DATA。参数说明参数含义取值约束query要评估的 PromQL 查询如avg(cpu_utilization_percent) 80。比较条件必须写在查询里没有独立的阈值参数。无evaluation_interval查询评估频率秒有效值为 10、20、30 及任何 60 的倍数最大 3600pending_periodcontributor 连续违反多久后进入ALARM秒默认 300recovery_periodcontributor 停止违反多久后回到OK秒默认 120description告警描述可选alarm_actions告警触发时通知的 ARN 列表如 SNS 主题可选实现上PromQL 评估参数位于EvaluationCriteria联合类型中与经典参数MetricName、Metrics互斥。使用EvaluationCriteria时必须同时设置EvaluationInterval且不得设置Period、Statistic、Threshold、ComparisonOperator、EvaluationPeriods、DatapointsToAlarm或TreatMissingDataL135-L140。查看告警 contributorsdescribe_alarm_contributorsL181-L212用于定位“到底是哪个主机/服务/Pod 在违反”而非只知道“有东西违反了”。每个 contributor 包含ContributorIdcontributor 标识。ContributorAttributes标识该序列的标签映射。StateReason状态原因。最近一次状态变更时间。方法内部通过NextToken循环分页拉取直到服务不再返回 tokentest_cloudwatch_otel.py 中的test_describe_alarm_contributors_paginates专门验证了这一分页行为。用 mute rule 实现维护窗口静默put_alarm_mute_ruleL217-L267是在已知维护窗口内抑制告警通知的推荐方式——mute rule 生效期间目标告警继续评估、继续切换状态但配置的动作如通知不会触发。这比“关闭告警动作后忘记重新开启”要可靠得多。参数含义取值约束namemute rule 名称无expression规则激活时间。周期窗口用五字段cron 表达式cron(Minutes Hours Day-of-month Month Day-of-week)如cron(0 2 * * SUN)表示每周日凌晨 2:00。注意是 5 个字段不是 EventBridge 的 6 个字段。一次性窗口用at(yyyy-MM-ddThh:mm)如at(2026-09-05T02:00)无duration激活后静默窗口的持续时长ISO 8601 格式范围PT1M1 分钟到P15D15 天如PT2H2 小时、P2DT12H2 天 12 小时alarm_names要静默的告警名称最多 100 个省略则对账户内全部告警生效可选timezone表达式评估所用时区如America/Los_Angeles可选description规则描述可选get_alarm_mute_rule返回规则完整配置包括调度、目标告警及当前状态SCHEDULED、ACTIVE、EXPIREDlist_alarm_mute_rules支持按AlarmName与Statuses过滤汇总。场景运行流程详解usage_demo()L362-L452假设 OTLP 指标已通过 OpenTelemetry Collector、CloudWatch agent 或 ADOT SDK 流入账户执行步骤为检查并开启 enrichment查询状态若为Stopped则开启并记录“本场景开启的”标记结束时回滚。创建 PromQL 告警查询为avg by (host_name) (cpu_utilization_percent{service_namecheckout}) 80evaluation_interval30、pending_period300、recovery_period120描述为“checkout 服务各主机平均 CPU 超过 80%”。等待并列出 contributors等待 30 秒第一次评估后调用describe_alarm_contributors若没有 contributor说明查询未匹配到任何序列——通常是因为这些标签的 OTel 指标还没到达需要先通过 OTLP 端点发送指标再重跑。创建 mute rule用cron(0 2 * * SUN)PT2H 时区America/Los_Angeles为目标告警建立每周日两小时的维护窗口随后查询其状态。列出相关 mute rules按告警名过滤列出。清理删除 mute rule 与告警若本场景开启了 enrichment 则一并关闭。单元测试验证test/test_cloudwatch_otel.py 覆盖了上述每个操作的成功与异常路径并对describe_alarm_contributors的多页聚合、put_alarm_mute_rule的表达式/时长/时区/目标告警参数组合进行了校验。补充OTLP Collector 配置与端点限制将 OTLP 指标送进 CloudWatch 有三种方式otlp_collector_config.yaml 中按集成度从高到低列出CloudWatch agent推荐AWS 托管的 OpenTelemetry Collector内置 CloudWatch 组件支持实体关联、运行时指标与 Container Insights。上游 OpenTelemetry Collector即该 YAML 配置的对象。自定义 OpenTelemetry Collector 构建。ADOT SDK完全不需要 Collector。前置条件Collector 需包含sigv4authextensioncontrib 发行版包含凭证方面EC2 上给实例角色附加CloudWatchAgentServerPolicy托管策略EKS 上通过 IRSA 将该策略绑定到 Collector 的 service account本地环境则对具备相同策略的 IAM 用户执行aws configure。启动方式otelcol-contrib --config otlp_collector_config.yaml随后把被埋点应用指向http://localhost:4318。关键配置点receiver仅开启 HTTP 协议0.0.0.0:4318因为 CloudWatch OTLP 端点仅支持 HTTP 1.1、不支持 gRPC可以先用 gRPC 接收应用数据再由 Collector 转换但本示例保持与上游一致的 HTTP-only。processorbatch批量处理send_batch_size: 200、timeout: 10s以保持在端点单请求限制未压缩 1 MB、1000 个数据点内留出余量。exporterotlphttp指向https://monitoring.us-east-1.amazonaws.com/v1/metrics压缩方式仅支持gzip与none鉴权使用sigv4auth。extensionSigV4 是推荐鉴权方式service: monitoring对应 metrics 端点签名logs 端点为logstraces 端点为xray。pipelinemetrics流水线 otlp receiver → batch processor → otlphttp exporter。YAML 注释中还记录了按账户与区域计的端点限制设计时值得参考限制项上限最大 TPS500新序列创建速率每 10 分钟窗口 1,000,000最大请求大小1 MB未压缩每请求最大数据点数1,000每序列每数据点最大元数据大小40 KB 标签与值最大标签数150Resource、Scope、Datapoint 属性合计时间戳窗口未来最多 10 分钟过去最多 14 天超出 TPS 或新序列限制返回429超出大小、数量、元数据、标签与时间戳限制返回400部分数据无效的请求返回200并只摄取有效指标。运行测试⚠️ 集成测试会向 AWS 发起真实请求可能产生费用请谨慎操作。单元测试使用 botocore Stubber 模拟响应不发真实请求、不产生费用。在示例目录运行python -m pytest -m not integ集成测试会真实创建与销毁账户内资源运行方式python -m pytest -m integ各示例的测试位于其test目录更多测试约定参见 python 目录 README 的 Tests 小节。参考资料CloudWatch 相关官方文档CloudWatch User Guide、CloudWatch API Reference。SDK for PythonBoto3CloudWatch 参考。仓库内可继续深入阅读的源码 cloudwatch_basics.py、cloudwatch_otel.py、otlp_collector_config.yaml 及其配套测试 test_cloudwatch_basics.py 与 test_cloudwatch_otel.py。Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.SPDX-License-Identifier: Apache-2.0赞分享示例工程教程后端【免费下载链接】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-doc-sdk-examples 中的 Amazon CloudWatch Java SDK 2.x 实战指南从 Hello CloudWatch 到 PromQL 告警aws doc sdk examples 中的 Amazon CloudWatch Java SDK 2.x 实战指南从 Hello CloudWatch 到示例工程教程后端AWS SDK for Python 实战CloudWatch 监控与告警全解析AWS SDK for Python 实战CloudWatch 监控与告警全解析 前言 在云计算环境中监控系统资源和服务状态是运维工作的核心。Amazon示例工程教程后端ffmpeg-android预编译二进制文件使用指南5分钟快速集成到Android项目ffmpeg android预编译二进制文件使用指南5分钟快速集成到Android项目 ffmpeg android是一个专为Android平台构建的FFmp音视频移动开发构建工具上一篇MartyPC WebAssembly版本在浏览器中体验复古PC模拟的终极指南 下一篇forever配置文件导入导出共享配置策略创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表