CloudWatch 监控基础

Amazon CloudWatch 是 AWS 的统一监控和可观测性服务。

核心概念

可观测性三大支柱

┌─────────────────────────────────────┐
│         可观测性                     │
├──────────┬──────────┬───────────────┤
│   指标   │   日志   │    追踪       │
│(Metrics) │ (Logs)   │  (Traces)     │
└──────────┴──────────┴───────────────┘
     │          │            │
     ▼          ▼            ▼
CloudWatch  CloudWatch   X-Ray
 Metrics      Logs

指标(Metrics):

  • 时间序列数据
  • 数值类型
  • 用于趋势分析和告警
  • 示例:CPU 使用率、请求数

日志(Logs):

  • 文本记录
  • 详细的事件信息
  • 用于故障排查
  • 示例:应用日志、错误堆栈

追踪(Traces):

  • 请求路径
  • 性能瓶颈分析
  • 分布式系统调试
  • 示例:API 调用链

CloudWatch Metrics

指标类型

标准指标(Standard Metrics):

AWS 服务自动发布
├─ EC2:
│   ├─ CPUUtilization
│   ├─ NetworkIn/Out
│   ├─ DiskReadOps/WriteOps
│   └─ StatusCheckFailed
├─ RDS:
│   ├─ DatabaseConnections
│   ├─ CPUUtilization
│   ├─ FreeableMemory
│   └─ ReadLatency/WriteLatency
└─ Lambda:
    ├─ Invocations
    ├─ Duration
    ├─ Errors
    └─ Throttles

特点:
├─ 免费(大部分)
├─ 5 分钟粒度(标准)
├─ 1 分钟粒度(详细监控,收费)
└─ 保留 15 个月

自定义指标(Custom Metrics):

应用程序发布
├─ 业务指标:
│   ├─ 订单数量
│   ├─ 用户注册
│   ├─ 支付成功率
│   └─ 转化率
├─ 性能指标:
│   ├─ 响应时间
│   ├─ 队列长度
│   ├─ 缓存命中率
│   └─ 数据库查询时间
└─ 自定义粒度:
    ├─ 标准:60 秒
    ├─ 高分辨率:1 秒
    └─ 按需发布

指标维度

多维度指标:

指标名称:NetworkIn
维度:
├─ InstanceId: i-1234567890abcdef0
├─ InstanceType: t3.medium
└─ AvailabilityZone: us-east-1a

查询方式:
1. 单个实例的网络流量
2. 某类型实例的平均流量
3. 某可用区的总流量

优势:
├─ 灵活聚合
├─ 多角度分析
└─ 细粒度监控

统计类型

基本统计:

Minimum(最小值)
├─ 时间段内最低值
└─ 示例:最低 CPU 使用率

Maximum(最大值)
├─ 时间段内最高值
└─ 示例:峰值响应时间

Sum(总和)
├─ 时间段内累计值
└─ 示例:总请求数

Average(平均值)
├─ 时间段内平均值
└─ 示例:平均延迟

SampleCount(样本数)
├─ 时间段内数据点数
└─ 示例:采样次数

百分位数:

p50(中位数)
├─ 50% 的值低于此值
└─ 反映典型性能

p90(90分位)
├─ 90% 的值低于此值
└─ 高性能用户体验

p99(99分位)
├─ 99% 的值低于此值
└─ 尾部延迟分析

使用场景:
├─ SLA 定义(如 p95 < 200ms)
├─ 性能分析
└─ 异常检测

CloudWatch Alarms

告警工作原理

监控流程:
┌──────────┐
│  指标    │ → 定期采样
└────┬─────┘
     │
┌────▼──────────────┐
│  告警评估         │
│  ├─ 阈值比较      │
│  ├─ 数据点数量    │
│  └─ 评估周期      │
└────┬──────────────┘
     │
┌────▼──────────────┐
│  告警状态         │
│  ├─ OK(正常)    │
│  ├─ ALARM(告警) │
│  └─ INSUFFICIENT  │
│     DATA(数据不足)│
└────┬──────────────┘
     │
┌────▼──────────────┐
│  触发动作         │
│  ├─ SNS 通知      │
│  ├─ Auto Scaling  │
│  ├─ EC2 Action    │
│  └─ Systems Mgr   │
└───────────────────┘

告警配置

静态阈值告警:

示例:CPU 使用率告警
┌─────────────────────────────────┐
│ 指标:CPUUtilization           │
│ 统计:Average                  │
│ 周期:5 分钟                   │
│ 阈值:> 80%                    │
│ 评估周期:2 个数据点中的 2 个  │
│                                │
│ 含义:连续两个 5 分钟周期      │
│       CPU > 80% 才告警         │
└─────────────────────────────────┘

配置参数:
├─ Datapoints to Alarm(告警数据点)
├─ Evaluation Periods(评估周期)
└─ 比例:M of N
    ├─ 2 of 2:严格(减少误报)
    ├─ 2 of 3:容忍一次偶然波动
    └─ 3 of 3:最严格

异常检测告警:

机器学习驱动
├─ 自动学习正常模式
├─ 检测异常偏离
├─ 无需手动设置阈值
└─ 适应业务变化

工作原理:
1. 分析历史数据(2 周)
2. 建立预期值和置信区间
3. 实时对比实际值
4. 超出区间触发告警

使用场景:
├─ 业务指标(订单量、用户数)
├─ 周期性波动(工作日 vs 周末)
└─ 难以设定固定阈值的指标

告警动作

SNS 通知:

通知渠道:
├─ 邮件
├─ SMS
├─ HTTP/HTTPS 端点
├─ Lambda 函数
└─ SQS 队列

通知内容:
├─ 告警名称
├─ 告警描述
├─ 触发时间
├─ 当前值
├─ 阈值
└─ 区域信息

Auto Scaling:

  • 自动扩展/缩减实例
  • 基于负载调整容量
  • 成本优化

EC2 操作:

实例操作:
├─ Stop(停止)
├─ Terminate(终止)
├─ Reboot(重启)
└─ Recover(恢复)

使用场景:
├─ 故障自动恢复
├─ 成本节约(停止空闲实例)
└─ 安全响应(隔离异常实例)

CloudWatch Logs

日志概念

层次结构:

Log Group(日志组)
    ├─ 日志流的容器
    ├─ 设置保留期
    ├─ 配置权限
    └─ 订阅过滤器
    │
    ├─ Log Stream(日志流)
    │    ├─ 日志事件序列
    │    ├─ 来自同一源
    │    └─ 时间排序
    │    │
    │    └─ Log Event(日志事件)
    │         ├─ 时间戳
    │         └─ 消息内容

日志来源:

AWS 服务:
├─ Lambda 函数日志
├─ API Gateway 访问日志
├─ VPC Flow Logs
├─ CloudTrail 日志
└─ RDS 错误日志

自定义日志:
├─ EC2 应用日志
├─ 容器日志
├─ 本地服务器日志
└─ IoT 设备日志

日志查询

Logs Insights:

强大的查询语言
├─ 类 SQL 语法
├─ 自动发现字段
├─ 可视化结果
└─ 保存查询

示例查询:
# 查找错误日志
fields @timestamp, @message
| filter @message like /ERROR/
| sort @timestamp desc
| limit 20

# 统计 HTTP 状态码
fields @timestamp, status
| stats count() by status
| sort count desc

# 计算平均响应时间
fields @timestamp, duration
| filter duration > 0
| stats avg(duration) as avg_duration
  by bin(5m)

过滤模式:

语法:
[字段1, 字段2, ...]

示例:
[time, request_id, level, message]

匹配:
2024-01-10T10:00:00Z abc123 ERROR Database connection failed

提取:
├─ time: 2024-01-10T10:00:00Z
├─ request_id: abc123
├─ level: ERROR
└─ message: Database connection failed

日志订阅

实时处理:

Log Group → Subscription Filter → 目标
    │
    ├─ Lambda(实时处理)
    │   └─ 告警、转换、路由
    │
    ├─ Kinesis Data Streams
    │   └─ 大规模实时分析
    │
    └─ Kinesis Data Firehose
        └─ S3/Elasticsearch 存储

跨账户日志聚合:

多账户架构:
┌──────────┐   ┌──────────┐   ┌──────────┐
│ 账户 A   │   │ 账户 B   │   │ 账户 C   │
│ 日志     │   │ 日志     │   │ 日志     │
└────┬─────┘   └────┬─────┘   └────┬─────┘
     │              │              │
     └──────────────┼──────────────┘
                    │
            ┌───────▼────────┐
            │  中央日志账户  │
            │  ├─ 聚合分析   │
            │  ├─ 长期存储   │
            │  └─ 合规审计   │
            └────────────────┘

CloudWatch Dashboards

可视化

仪表板组件:

图表类型:
├─ 线图(Line)
│   └─ 趋势分析
├─ 堆叠面积图(Stacked Area)
│   └─ 组成分析
├─ 数字(Number)
│   └─ 当前值显示
├─ 仪表盘(Gauge)
│   └─ 百分比展示
└─ 日志表(Log Table)
    └─ 日志查询结果

自动刷新:

  • 10 秒、1 分钟、5 分钟
  • 实时监控
  • 大屏展示

模板化:

动态变量:
├─ 区域选择器
├─ 实例 ID 筛选
├─ 时间范围选择
└─ 自定义参数

优势:
├─ 一个模板多个实例
├─ 快速切换视角
└─ 减少重复工作

CloudWatch Container Insights

容器监控

支持平台:

ECS
├─ 集群、服务、任务级别指标
├─ CPU、内存、网络
└─ 自动发现

EKS
├─ 节点、Pod、容器级别
├─ Kubernetes 原生指标
└─ 与 Prometheus 集成

Fargate
├─ 任务级别指标
└─ 无需配置节点

性能日志:

收集指标:
├─ 容器重启次数
├─ 资源利用率
├─ 网络流量
├─ 存储 I/O
└─ 应用日志

可视化:
├─ 预构建仪表板
├─ 自动映射关系
└─ 异常检测

Application Insights

应用程序监控

自动化监控:

支持的应用:
├─ .NET on IIS
├─ Java on Tomcat
├─ Python/Node.js on EC2
└─ SQL Server
    ├─ RDS
    └─ EC2

自动发现:
├─ 应用组件
├─ 依赖关系
├─ 性能指标
└─ 错误日志

智能告警:

  • 机器学习检测异常
  • 自动创建告警
  • 减少配置工作

Synthetics(合成监控)

主动监控

Canary(金丝雀):

模拟用户行为
├─ HTTP 请求监控
├─ 页面加载时间
├─ API 端点可用性
├─ 多步骤用户流程
└─ 定期执行(1 分钟 - 1 小时)

使用场景:
├─ 网站可用性监控
├─ API 健康检查
├─ 端到端事务测试
└─ 跨区域监控

脚本类型:

心跳监控(Heartbeat)
├─ 简单 URL 检查
└─ GET 请求成功与否

API Canary
├─ REST API 测试
└─ 验证响应

GUI Workflow
├─ 模拟用户操作
├─ 登录、点击、提交表单
└─ 截图验证

断点 API
├─ 多个 API 调用
└─ 验证数据流

成本优化

监控成本

计费维度:

指标:
├─ 标准指标:免费(大部分)
├─ 自定义指标:$0.30/指标/月
├─ 高分辨率:$0.30/指标/月
└─ API 请求:GetMetricStatistics

日志:
├─ 摄入:$0.50/GB
├─ 存储:$0.03/GB/月
├─ 查询:扫描的数据量计费
└─ Logs Insights:$0.005/GB

告警:
├─ 标准:$0.10/告警/月
├─ 高分辨率:$0.30/告警/月
└─ 异常检测:额外收费

仪表板:
├─ 前 3 个:免费
└─ 之后:$3/仪表板/月

优化策略

1. 日志保留策略:

差异化保留:
├─ 调试日志:7 天
├─ 应用日志:30 天
├─ 审计日志:1 年
└─ 合规日志:7 年(S3 归档)

2. 指标聚合:

  • 发布聚合指标而非单个数据点
  • 减少自定义指标数量
  • 使用统计聚合

3. 查询优化:

  • 限制时间范围
  • 使用过滤条件
  • 避免全表扫描

4. 告警合并:

  • 复合告警(多个条件)
  • 减少重复告警
  • 合理设置评估周期

最佳实践

1. 分层监控

基础设施层
├─ 主机指标(CPU、内存、磁盘)
├─ 网络指标
└─ 系统级告警

应用层
├─ 应用性能指标
├─ 业务指标
├─ 错误率
└─ 应用级告警

用户体验层
├─ 端到端延迟
├─ 可用性
├─ Synthetics 监控
└─ 用户满意度

2. 告警疲劳避免

原则:

可操作性
├─ 每个告警必须有明确的响应动作
├─ 避免无法处理的告警
└─ 关注影响业务的问题

合理阈值
├─ 基于历史数据
├─ 考虑正常波动
└─ 避免过于敏感

告警分级
├─ P0:立即响应(系统宕机)
├─ P1:1 小时内(性能下降)
├─ P2:工作时间内(非关键)
└─ P3:计划修复(优化建议)

3. 监控即代码

基础设施即代码(IaC):

  • CloudFormation / Terraform 管理
  • 版本控制
  • 自动化部署
  • 一致性保证

4. 监控覆盖检查

定期审查:

覆盖率检查:
├─ 所有关键资源都有监控?
├─ 告警是否及时触发?
├─ 日志是否完整收集?
└─ 仪表板是否反映真实状况?

盲点识别:
├─ 新服务是否已监控?
├─ 依赖服务是否覆盖?
└─ 跨服务链路是否可见?

CloudWatch 是 AWS 监控的核心,掌握它是运维 AWS 环境的必备技能!