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 环境的必备技能!