本文为学习笔记,原文链接为time.geekbang.org/column/arti…
监控数据的采集方法有很多,比如读取 /proc 目录、执行系统调用、执行命令行工具、远程黑盒探测、远程拉取特定协议的数据、连到目标上去执行指令获取输出、代码埋点、日志分析提取等各种各样的方法。
读取 /proc 目录
/proc 是一个位于内存中的伪文件系统,该目录下保存的不是真正的文件和目录,而是一些“运行时”信息,Linux 操作系统层面的很多监控数据,比如内存数据、网卡流量、机器负载等,都是从 /proc 中获取的信息。
比如内存相关指标:
[root@dev01.nj ~]# cat /proc/meminfo
MemTotal: 7954676 kB
MemFree: 211136 kB
MemAvailable: 2486688 kB
Buffers: 115068 kB
Cached: 2309836 kB
...
有些数据从 /proc 下面是拿不到的,比如硬盘使用率。OS 内的数据采集,除了读取 /proc 目录之外,也经常会通过执行命令行工具的方式采集指标
执行命令行工具
这种方式非常简单,就是调用一下系统命令,解析输出就可以了。比如ss命令,不过这会有通用性和性能方面的问题:
通用性问题:以 ss 命令为例,不是所有的机器都安装了这个命令行工具,而且不同的发行版或不同 ss 版本,命令输出内容格式可能不同。
性能问题:调用命令行工具是需要 fork 一个进程的,相比于进程内的逻辑,效率大打折扣。不过一般来说这都是能接受的。
读取本地 /proc 目录或执行命令行工具,都是在目标监控机器上进行的操作。有的时候,我们无法在目标机器上部署客户端程序,这时候就需要黑盒探测手段了。
远程黑盒探测
典型的探测手段有三类,ICMP、TCP 和 HTTP。
但是监控对象的内部指标,从外部其实是无法拿到的,所以白盒监控的指标,需要监控对象自身想办法暴露出来。最典型的暴露方式,就是提供一个 HTTP 接口,在 response body 中返回监控指标的数据。
拉取特定协议的数据
有很多组件都通过 HTTP 接口的方式,暴露了自身的监控指标。比如elasticsearch:
[root@dev01.nj ~]# curl -uelastic:Pass1223 http://10.206.0.7:9200/_cluster/health -s | jq .
{
"cluster_name": "elasticsearch-cluster",
"status": "yellow",
"timed_out": false,
"number_of_nodes": 3,
"number_of_data_nodes": 3,
"active_primary_shards": 430,
"active_shards": 430,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 430,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 50
}
连接到目标对象执行命令
更复杂的方式是需要我们连接到目标对象上执行指令,MySQL、Redis、MongoDB 等都是这种方式
比如可以通过show global status,show global variables,info等命令
代码埋点
所谓的代码埋点方式,是指应用程序内嵌一些监控相关的 SDK,在请求的关键链路上调用 SDK 的方法,告诉 SDK 当前是个什么请求、耗时多少、是否成功之类的,SDK 汇总这些数据并二次计算,最终推给监控服务端。
小结
引用
本文内容来自极客时间《运维监控系统实战笔记》第10讲,原文链接为time.geekbang.org/column/arti…