监控方法论
Google 的四个黄金指标
Google 的四个黄金指标重点聚焦于服务监控,涵盖以下四个方面:
- 延迟:指服务请求所耗费的时间。例如用户获取商品列表页面时调用的某个接口,花费了 30 毫秒。需注意区分成功请求和失败请求对应的延迟情况,因为失败请求可能会迅速返回,延迟极小,易干扰正常请求的延迟数据统计。
- 流量:对于 HTTP 服务而言,通常以每秒 HTTP 请求数来衡量;RPC 服务则用每秒 RPCCall 的数量作为指标;若是数据库,可采用数据库系统的事务量当作流量指标。
- 错误:即请求失败的速率,也就是每秒失败请求的数量。比如 HTTP 请求返回了 500 错误码,显然该请求是失败的;或者即便返回的状态码是 200,但返回内容不符合预期,同样认定此请求失败。
- 饱和度:用于描述应用程序的饱和程度或者受限资源情况。比如对于 CPU 密集型应用,CPU 使用率就可作为饱和度指标。
RED 方法
RED 方法包含以下要素:
- (Request)Rate(请求速率):指每秒的请求数量,以此衡量请求的频率情况。
- (Request)Errors(错误):表示每秒错误请求的数量,用于体现请求失败的频次。
- (Request)Duration(延迟):关注每个请求的延迟分布情况,呈现请求延迟的具体状况。
USE 方法 —— 使用率(Utilization)、饱和度(Saturation)、错误(Error)
- 使用率:这是大家比较熟悉的指标,像内存使用率、CPU 使用率等,以百分比的形式呈现,直观反映资源的使用程度。
- 饱和度:是体现资源排队工作的指标,意味着资源已无法处理额外工作,一般用队列长度来表示,例如在 iostat 里看到的 aqu-sz 就是队列长度。
- 错误:对资源错误事件进行计数,比如 malloc () 失败次数、通过 ifconfig 看到的 errors、dropped 包量等。有些错误是以系统错误日志的形式呈现,难以直接获取统计指标,此时可通过日志关键字监控来解决。
监控分类
- 业务监控:主要关注交易量、在线人数等指标,从业务层面把握整体运行情况。
- 应用监控:聚焦于延迟、流量、错误、饱和度、进程数等方面,对应用程序的各项关键指标进行监控。
- 组件监控:针对 MySQL、Redis、rabbitMQ、kubernetes 等组件开展监控工作,保障各组件稳定运行。
- 资源监控:涉及服务器(如 CPU、内存、磁盘)、网络设备(像电源电压、风扇转速、主板环境温度 —— 通过 ipmi 协议获取)以及基础网络(包含连通性监控、质量监控、流量监控)等资源的监控。
监控数据采集方法及原理
1. 读取 /proc 目录
/proc 属于位于内存中的伪文件系统,其目录下存放的并非真实文件和目录,而是一些 “运行时” 信息。Linux 操作系统层面众多监控数据,例如内存数据、网卡流量、机器负载等,均是从 /proc 中获取的信息。
比如通过 “cat /proc/meminfo” 命令,能轻易获取内存总量、剩余量、可用量、Buffer、Cached 等数据。不过,/proc/meminfo 并不包含使用率、可用率这类百分比指标,此类指标需要二次计算,可在客户端采集器中完成,也可以在服务端查询时即时计算。另外,像 “head -n3 /proc/net/dev” 这样的命令也能获取相关网络信息。
2. 执行命令行工具
可以通过执行各类命令行工具来采集数据,例如 “ss -tln | grep 9090”“df -Th” 等命令,借助这些工具获取相应的系统运行状态信息。
3. 远程黑盒探测
典型的探测手段有三类,分别为 ICMP、TCP 和 HTTP:
- 通过 “ping -c 3 www.baidu.com”(ICMP 方式)可探测网络连通性等情况。
- 利用 “telnet 127.0.0.1 22”(针对 ssh 服务)可检测相关服务是否可达等信息,以此实现远程黑盒探测获取监控数据。
4. 拉取特定协议的数据
目标对象会将需要监控的数据直接通过接口暴露出来,监控采集器只需把数据拉取到本地后做格式转换即可,以此完成数据采集工作。
5. 连接到目标对象执行命令
以常用的数据库 MySQL 和 Redis 为例:
- MySQL:
- 经常需要获取一些连接相关指标数据,比如当前连接数、总共拒绝的连接数、总共接收的连接数等。登录 MySQL 命令行后,使用 “show global status like '% onn%'” 命令可获取相关数据,像 “Threads_connected” 表示当前有多少连接,“Max_used_connections” 表示曾经最多有多少连接,“Connections” 表示总计接收过多少连接。此外,通过 “show global status” 命令还能获取众多其他用于表示 MySQL 运行状态的指标,且这些数据会随实例运行动态变化。
- 通过 “show global variables” 命令可以获取一些全局变量信息,例如获取 MySQL 最大连接数等。在生产环境中,像最大连接数这类指标,若数值不合理需及时告警,MySQL 监控的原理就是连接上 MySQL 后执行各类 SQL 语句,解析结果并转换为监控时序数据。
- 除上述命令外,像 “show slave status” 还能获取 Slave 节点的信息等,可用于更全面地监控 MySQL 运行情况。
- Redis:同样可以通过连接到 Redis 后执行相应命令来获取各种指标数据,实现对 Redis 的监控。
6. 代码埋点
代码埋点方式指在应用程序内部嵌入一些与监控相关的 SDK,在请求的关键链路上调用 SDK 的方法,告知 SDK 当前请求的具体情况,如是什么请求、耗时多久、是否成功等信息,SDK 会汇总这些数据并进行二次计算,最终推送给监控服务端。不过,对于外采的程序,因无法修改其源代码,这时可采用日志解析的方式。一般程序都会打印日志,可编写日志解析程序,从日志中提取如业务日志中 Exception 关键字出现的次数、接入层日志中某个接口的访问次数等关键信息,以此实现监控数据的采集。