3. CloudWatch指标与告警体系构建

CloudWatch 的指标模型由四个核心概念构成:命名空间(Namespace)、维度(Dimension)、统计周期(Period)与统计量(Statistic)。理解它们之间的组合关系,是构建可靠告警体系的前提。命名空间是指标的顶层隔离容器,AWS 服务各自占用独立命名空间,例如 EC2 使用 AWS/EC2、RDS 使用 AWS/RDS、ELB 使用 AWS/ApplicationELB 或 AWS/NetworkELB。自定义业务指标则通常放在自建命名空间下,如 MyApp/Order。

维度是同一命名空间内区分具体资源实例的键值对。以 EC2 为例,InstanceId=i-0abc123 是区分不同实例的关键维度;RDS 使用 DBInstanceIdentifier;ALB 使用 LoadBalancer 与 TargetGroup。需要特别注意的是,同一指标名在不同维度组合下会被视为不同时间序列。例如 CPUUtilization 在 InstanceId=i-001 与 InstanceId=i-002 下是两条独立曲线,告警必须绑定到具体维度,否则会聚合出无意义的平均值。

统计周期决定数据点的聚合粒度,常见取值为 60 秒、300 秒。周期越短,告警响应越快,但数据点波动也越大;周期越长,曲线越平滑,但可能掩盖短时尖峰。统计量则决定在一个周期内如何把原始采样点压缩为一个值,可选 Average、Sum、Maximum、Minimum、SampleCount。选择原则是:资源利用率类指标(CPU、内存)用 Average;请求量、错误数、流量类指标用 Sum;延迟类指标关注尾部体验时用 Maximum 或 p99。

CloudWatch 指标模型与告警状态机 指标四要素 命名空间 Namespace 维度 Dimension 统计周期 Period 统计量 Statistic 唯一时间序列 = 命名空间 + 指标名 + 维度组合 例:AWS/EC2 · CPUUtilization · InstanceId=i-0abc123 告警状态机 OK ALARM INSUFFICIENT 越阈值 恢复 数据缺失 数据缺失 关键告警配置参数与推荐值 服务 指标 统计量 周期 阈值示例 EC2 CPUUtilization Average 300s > 80% 连续3周期 RDS FreeStorageSpace Average 300s < 10 GB ALB HTTPCode_ELB_5XX_Count Sum 60s > 10 连续2周期 ALB TargetResponseTime p99 60s > 2s

告警状态机是 CloudWatch 告警的核心逻辑。每个告警实例在任意时刻处于三种状态之一:OK、ALARM、INSUFFICIENT_DATA。当指标数据点满足阈值条件时,告警从 OK 切换到 ALARM;当数据恢复正常,再从 ALARM 回到 OK。如果指标在评估窗口内没有足够数据点,则进入 INSUFFICIENT_DATA。这个状态机不是瞬时跳变,而是由“评估周期数(EvaluationPeriods)”和“数据点缺失处理(TreatMissingData)”共同控制。

评估周期数决定需要连续多少个周期满足条件才触发告警。例如设置 EvaluationPeriods=3、Period=300、Threshold=80、ComparisonOperator=GreaterThanThreshold,意味着 CPU 平均值连续 3 个 5 分钟周期都超过 80% 才进入 ALARM。这能有效过滤瞬时尖峰,但也会带来最长 15 分钟的检测延迟。对于错误率这类需要快速响应的指标,通常把 EvaluationPeriods 设为 1 或 2,配合更短的 Period。

下面以 EC2、RDS、ALB 三类资源为例,给出可直接参考的告警配置。EC2 实例的 CPU 告警:命名空间 AWS/EC2,指标 CPUUtilization,维度 InstanceId=i-0abc123,统计量 Average,周期 300 秒,阈值 80%,评估周期 3,缺失数据处理为 notBreaching。RDS 实例的存储空间告警:命名空间 AWS/RDS,指标 FreeStorageSpace,维度 DBInstanceIdentifier=mydb-prod,统计量 Average,周期 300 秒,阈值 10 GB(即 10737418240 字节),评估周期 1,缺失数据 missing。ALB 的 5XX 错误告警:命名空间 AWS/ApplicationELB,指标 HTTPCode_ELB_5XX_Count,维度 LoadBalancer=app/my-alb/50dc6c495c0c9188,统计量 Sum,周期 60 秒,阈值 10,评估周期 2,缺失数据 notBreaching。

配置告警时,TreatMissingData 的选择直接影响误报率。对于持续上报的指标(如 CPU),缺失通常意味着实例已停止或监控代理异常,应设为 breaching 以触发告警;对于按请求产生的指标(如 5XX 计数),无请求时数据点自然缺失,应设为 notBreaching 避免误报。此外,告警动作可以绑定 SNS 主题,实现邮件、短信或 Lambda 自动响应。一个常见的自动化闭环是:ALB 5XX 告警触发 → SNS → Lambda → 检查目标组健康状态 → 若全部不健康则触发回滚或扩容。

实践建议:告警阈值不要照搬默认值。先用 CloudWatch 控制台的指标图表观察 1~2 周的正常基线,取 P95 或 P99 作为参考,再上浮 10%~20% 作为初始阈值。上线后根据实际告警频率持续调整,避免“告警疲劳”。

最后需要区分“指标告警”与“复合告警”。复合告警(Composite Alarm)把多个子告警用 AND/OR 逻辑组合,适合抑制级联告警。例如“ALB 5XX 高 AND 目标组不健康数 > 0”才触发,可以避免单一指标抖动造成的误报。在构建大规模告警体系时,建议按服务分层:基础资源层(EC2/RDS)用简单告警,应用入口层(ALB/API Gateway)用复合告警,业务层用自定义指标告警,形成从基础设施到业务指标的完整覆盖。