云监控介绍 - Amazon CloudWatch
作者:张航东
本文主要用于个人学习、总结,欢迎转载,但请务必注明作者和出处,感谢!
Amazon CloudWatch 是一项针对 AWS 云资源和在 AWS 上运行的应用程序进行监控的服务。
以下是官方对其功能的总结:
使用 Amazon CloudWatch 可以收集和跟踪各项指标、收集和监控日志文件、设置警报以及自动应对 AWS 资源的更改。Amazon CloudWatch 可以监控各种 AWS 资源,例如 Amazon EC2 实例、Amazon DynamoDB 表、Amazon RDS 数据库实例、应用程序和服务生成的自定义指标以及应用程序生成的所有日志文件。您可通过使用 Amazon CloudWatch 全面地了解资源使用率、应用程序性能和运行状况。使用这些分析结果,您可以及时做出反应,保证应用程序顺畅运行。
与此同时,官方也给出的 Amazon CloudWatch 特色与优点,总共有7项:
- 监控 Amazon EC2
- 监控其他 AWS 资源
- 监控自定义指标
- 监控和存储日志
- 设置警报
- 查看图表和统计信息
- 监控并应对资源更改
本文将主要针对这7项内容,对 Amazon CloudWatch 进行一个简单的介绍。
Amazon CloudWatch 的工作方式和术语概念
工作方式
首先,我们先来看一下 CloudWatch 的工作方式。
从图上可以看出,CloudWatch 主要就是一个存放指标的数控库。
AWS 服务和用户自定义的数据,可以通过 API 将指标和监控数据存入。
告警模块(Amazon CloudWatch Alarm)用于配置和处理告警,并将告警通知输出到邮件通知、自动伸缩、以及其他服务。
统计模块(Available Statistics)用于计算、统计、检索数据,以便AWS控制台及其他组件访问。
术语概念
Amazon CloudWatch 有以下几个核心术语和概念:
- 命名空间
- 指标
- 维度
- 统计数据
- 百分位数
- 警报
1> 命名空间
记录监控指标的所属,不同命名空间中的指标彼此独立。例如 CPUUtilization 是一个监控指标,表示 CPU使用率,如果单单只靠这个名字,我们很难判断这个是虚拟机、容器、还是物理主机的。
这时候就需要额外的概念(即这里的“命令空间”)来区分它,Amazon约定使用 AWS/service 的方式表示命名空间,例如:AWS/EC2 表示 Amazon EC2 虚拟机, AWS/ECS 表示容器,AWS/ELB 表示负载均衡。。。
2> 指标
和其他监控系统的概念一样,表示监控的内容项目,如:CPU使用率,内存占用率。
指标数据点
是对于每个指标而言,具体某一时间(时间戳)的数据。
指标的所有监控数据,就是由间隔固定的时间段,所采集和记录的一个个数据点组成。
指标保留
每个时间段的指标数据点保存一定时间后,会进行聚合,以来实现长期存储。
- 时间段短于 60 秒的数据点,保持3小时
- 时间段为60 秒(1分钟)的数据点,保持15天
- 时间段为300秒(5分钟)的数据点,保持63天
- 时间段为3600秒(1小时)的数据点,保持455天(15个月)
较短时间段的数据点,在超过保持时间后,会聚合成较长一个时间段的数据点。即:60秒数据过期(超过15天),集合成300秒数据;300秒数据过期(超过63天),聚合成3600秒数据。
CloudWatch 会保留 5 分钟和 1 小时数据。
3> 维度
维度可以理解是给指标追加的 label ,每个指标可以配置10个维度。
可以通过单个维度,或者维度组合来对指标和数据进行筛选。
4> 统计数据
是指定时间段内的指标数据聚合,可用的统计数据有:
- Minimum
- Maximum
- Sum
- Average
- SampleCount,数据点计数 (数量) ,用于统计信息的计算。
- pNN.NN,指定的百分位数的值
5> 百分位数
指示某个值在数据集中的相对位置。例如,第 95 个百分位数表示 95% 的数据低于此值,5% 的数据高于此值。百分位数可帮助您更好地了解指标数据的分布情况。
6> 警报
在指定的时间段内监控单个指标,并根据指标值相对于阈值的变化情况执行一项或多项指定操作。
Amazon CloudWatch 的警报不单单能发出警报通知,还可以执行一定的操作,例如重启/关闭虚拟机。
监控 Amazon EC2
对 EC2 实例的监控,Amazon 主要提供了2种类型的监控:
- 基本监控 - 14个监控指标,免费,频率5分钟
- 详细监控 - 14个监控指标,收费,频率1分钟
监控指标如下:
EC2 监控指标 |
---|
系统状态检查失败 (StatusCheckFailed_System) |
实例状态检查失败 (StatusCheckFailed_Instance) |
状态检查失败 (StatusCheckFailed) |
CPU 使用率 (CPUUtilization) |
CPU 积分数 (CPUCreditUsage) |
CPU 超额积分数 (CPUCreditBalance) |
网络接收数据包数 (NetworkPacketsIn) |
网络发送数据包数 (NetworkPacketsOut) |
网络输入 (NetworkIn) |
网络输出 (NetworkOut) |
磁盘读取操作 (DiskReadOps) |
磁盘写入操作 (DiskWriteOps) |
磁盘读取字节数 (DiskReadBytes) |
磁盘写入字节数 (DiskWriteBytes) |
PS:很奇怪EC2居然没有内存的监控指标,而ECS(容器)是有内存使用率 (MemoryUtilization) 和内存预留比 (MemoryReservation)这两项监控指标。
详细监控(收费)和基本监控(免费)除了频率上的差异,另外详细监控下,还可以通过维度来筛选 EC2 实例的监控数据。
支持的维度如下:
维度 |
---|
AutoScalingGroupName |
ImageId |
InstanceId |
InstanceType |
监控其他 AWS 资源
在不安装任何软件的情况下,Amazon CloudWatch 可以监控 AWS 的大多数服务,如果启用这些服务的话,在 CloudWatch 的控制面板中,便可在“指标”栏内搜索到这些服务的指标项,而且全部都是免费的(监控是免费的,但是这些服务本身可能是收费的)。
可以监控的服务有:
服务/资源 | 说明 |
---|---|
Auto Scaling 组 | 每 1 分钟 7 个预选指标 |
弹性负载均衡器 | 每 1 分钟 13 个预选指标 |
Amazon Route 53 运行状况检查 | 1 个预选指标(频率为 1 分钟) |
Amazon EBS PIOPS (SSD) 卷 | 每 1 分钟 10 个预选指标 |
Amazon EBS 通用型 (SSD) 卷 | 每 5 分钟 10 个预选指标 |
Amazon EBS 磁性介质卷 | 每 5 分钟 8 个预选指标 |
AWS Storage Gateway | 每 5 分钟 11 个预选网关指标和 5 个预选存储卷指标 |
Amazon CloudFront | 每 1 分钟 6 个预选指标 |
Amazon DynamoDB 表 | 每 5 分钟 7 个预选指标 |
Amazon ElastiCache 节点 | 每 1 分钟 39 个预选指标 |
Amazon RDS 数据库实例 | 每 1 分钟 14 个预选指标 |
Amazon Elastic MapReduce 任务流 | 每 5 分钟 26 个预选指标 |
Amazon Redshift | 每 1 分钟 16 个预选指标 |
Amazon SNS 主题 | 每 5 分钟 4 个预选指标 |
Amazon SQS 队列 | 每 5 分钟 8 个预选指标 |
AWS Opsworks | 每 1 分钟 15 个预选指标 |
Amazon CloudWatch Logs | 6 个预选指标(频率为 1 分钟) |
AWS 账单预算费用 | 监控使用 AWS 的费用, 指标的数量根据使用的 AWS 产品和服务而定 |
监控自定义指标
简单来说,监控自定义指标就是指,使用 AWS CLI 或 API 将自己的指标发送到 CloudWatch。
主要会使用到的 CLI 有以下两个:
- put-metric-data,发送指标数据到 CloudWatch
- get-metric-statistics,从 CloudWatch 获取指标数据
示例:
aws cloudwatch put-metric-data --metric-name Buffers --namespace MyNameSpace --unit Bytes --value 231434333 --dimensions InstanceId=1-23456789,InstanceType=m1.small
aws cloudwatch get-metric-statistics --metric-name Buffers --namespace MyNameSpace --dimensions Name=InstanceId,Value=1-23456789 Name=InstanceType,Value=m1.small --start-time 2016-10-15T04:00:00Z --end-time 2016-10-19T07:00:00Z --statistics Average --period 60
Amazon CloudWatch 已经将这些 CLI 封装好,并提供脚本,来帮助使用者快速开启 EC2 实例的监控(目前主要是内存和磁盘)。
脚本下载地址:http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip
脚本主要包含以下几个文件:
- CloudWatchClient.pm – 共享 Perl 模块,以简化从其他脚本调用 Amazon CloudWatch 的过程。
- mon-put-instance-data.pl – 收集 Amazon EC2 实例中的系统指标 (内存、交换、磁盘空间利用率) 并将其发送到 Amazon CloudWatch。
- mon-get-instance-stats.pl – 查询 Amazon CloudWatch 并显示在其上执行此脚本的 EC2 实例的最近利用率统计数据。
- awscreds.template – AWS 凭据的文件模板,储存您的访问密钥 ID 和秘密访问密钥。
- AwsSignatureV4.pm - 加密签名相关。
- LICENSE.txt – 包含 Apache 2.0 许可证的文本文件。
- NOTICE.txt – 版权声明。
使用类似如下命令,便可开启监控:
./mon-put-instance-data.pl --mem-util --mem-used-incl-cache-buff --mem-used --mem-avail
另外,由于脚本是使用 perl 语言编写的,所以在使用时,需要先安装 perl 语言相关的软件包。
监控和存储日志
Amazon CloudWatch Logs 可以监控、存储和访问 EC2 实例相关的日志。个人认为,其有以下2个特点:
- 实时监控
- 归档日志数据
与自定义监控类似,日志的监控也是需要安装代理的,配置文件中可以配置需要监控哪些日志,启动代理后,代理便会实时的将这些日志发送到CloudWatch Logs。
打开 CloudWatch 控制台,我们便可以看到新创建的日志组和日志流。
当然,可以在“操作”栏选择到处这些日志到本地或者 Amazon S3 存储。
设置警报
对于警报,除了传统的设置阈值,发处告警通知以外,个人认为最大的亮点在于告警应对,也就是在警报发出之后,所能采取的应对方法。
目前支持3种方式(可多选):
- 通知(邮件,由SNS服务管理)
- 自动伸缩
- EC2 操作(恢复/停止/终止/重启)
整个操作和配置均在一个界面完成,界面截图如下:
查看图表和统计信息
统一的、一站式的界面管理,包括:自定义控制面板、监控指标、警报、日志、事件,共5个部分。
这个大家可以注册一个Amazon的账号自己体验下,除了扣除1美元的押金的外, 其他基本可以免费体验。
监控并应对资源更改
这个其实指的就是 Amazon CloudWatch Events 对事件的监控以及应对。
目前只要是 AWS 可监控服务(参考“监控其他 AWS 资源”章节),CloudWatch Events 都提供了对应的事件。
应对方面,官网给出的应对服务主要有:
- Amazon EC2 实例
- AWS Lambda 函数
- Amazon Kinesis Streams 中的流
- Amazon Kinesis Firehose 中的传输流
- Amazon ECS 任务
- SSM Run Command
- SSM Automation
- Step Functions 状态机
- AWS CodePipeline 中的管道
- Amazon Inspector 评估模板
- Amazon SNS 主题
- Amazon SQS 队列
- 内置目标
- 另一个 AWS 账户的默认事件总线
身份验证和访问控制
另外,在使用 CloudWatch 时,是会要求通过 IAM (AWS Identity and Access Management) 来进行访问控制,例如警报应对和事件应对,在需要额外的注册一个 IAM 账号来授予应对操作的权限。
小结
总的感觉,Amazon CloudWatch 的功能已经做的非常全的,控制台也简洁易懂,不过由于 AWS 服务太多,要想用好 CloudWatch,也不简单。
另外,我们看到自定义监控和日志监控都是需要在 EC2 实例中安装脚本/代理,对于 AWS 的公有云来说,每个 EC2 实例都有一个“公有IP”,所以不管是安装,还是发送消息到 CloudWatch,都比较方面。但是如果我们构建私有云,有单独的业务网络(VM网络)和管理网络,那么是否可以采用 CloudWatch 的这种方式,就需要进一步考虑了。