Prometheus node_exporter使用

  • A+
所属分类:监控

node_exporter安装非常简单,只要解压后直接后台运行即可,默认端口是9100

安装部署

wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz
tar xvf node_exporter-1.0.1.linux-amd64.tar.gz
mv node_exporter-1.0.1.linux-amd64 /usr/local/node_exporter

创建启动脚本

cat > /usr/lib/systemd/system/node_exporter.service <<EOF
[Unit]
Description=node_exporter

[Service]
ExecStart=/usr/local/node_exporter/node_exporter --web.listen-address=:9100 --collector.systemd --collector.systemd.unit-whitelist="(ssh|docker|rsyslog|redis-server).service" --collector.textfile.directory=/usr/local/node_exporter/textfile.collected
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF

启动服务

systemctl enable node_exporter
systemctl start node_exporter.service
lsof -i:9100

浏览器访问,可以看到当前node节点状态up,其余两台down没部署node_exporter组建

Prometheus node_exporter使用


启动参数说明

1、启用systemd收集器

systemd收集器记录systemd中的服务和系统状态。首先需要通过参数--collector.systemd启用该收集器,同时如果不希望收集所有的服务,只收集部分关键服务,node_exporter在启动时可以使用--collector.systemd.unit-whitelist参数配置指定的服务。

2、指定textfile收集器目录

使用textfile收集器可以让用户添加自定义的度量指标,功能类似pushgateway,同zabbix中自定义的item一样,只要将度量指标和值按照prometheus规范的格式输出到指定位置且以.prom后缀文件保存,textfile收集器会自动读取collector.textfile.directory目录下所有以.prom结尾的文件,并提取所有格式为Prometheus的指标暴露给Prometheus来抓取。


textfile收集器默认是开启的,我们只需要指定--collector.textfile.directory的路径即可。

--collector.textfile.directory=/usr/local/node_exporter/textfile.collected

3、启用或禁用收集器

/usr/local/node_exporter/node_exporter  -h

可以看到默认启用了哪些收集器(default: enabled),若要禁用某个收集器,如

--collector.ntp,可以修改为 --no-collector.ntp,即禁用该收集器。

创建自定义收集目录

mkdir /usr/local/node_exporter/textfile.collected

创建自定义监控项

例如:需要监控系统登录用户数

# echo "node_login_users $(who |wc -l)" > /usr/local/node_exporter/textfile.collected/login_users.prom
# echo "node_processes $(ps -ef |wc -l)" > /usr/local/node_exporter/textfile.collected/node_processes.prom


以crontab定时任务的方式采集

*/1 * * * * echo "login_users $(who |wc -l)" > /usr/local/node_exporter/textfile.collected/login_users.prom
*/1 * * * * echo "login_users $(who |wc -l)" > /usr/local/node_exporter/textfile.collected/node_processes.prom

监控系统资源的方法论

在google sre handbook中提出了评估系统是否存在问题,用户体验是否受影响,用四个黄金信号来判断:Latency(延迟)、Traffic(流量)、Errors(错误数)、Saturation(饱和度)。

但在系统资源监控用得较多的方法是"USE"方法,分别表示为:Utilization(使用率)、Saturation(饱和度)、Errors(错误数)

1、CPU使用率监控

(1- (avg(irate(node_cpu_seconds_total{nodename=~"monitor01",mode="idle"}[5m])))) * 100

或者

100 - (avg(irate(node_cpu_seconds_total{nodename=~"monitor01",mode="idle"}[5m])) * 100)

2、内存使用率监控

(1- (node_memory_MemAvailable_bytes{nodename="node2"})/node_memory_MemTotal_bytes{nodename="node2"} ) * 100

或者

(node_memory_MemTotal_bytes{nodename="node2"} - node_memory_MemAvailable_bytes{nodename="node2"})/node_memory_MemTotal_bytes{nodename="node2"} * 100

如果将Buffers和Cached也作为可用内存,则内存使用率计算公式如下:

(node_memory_MemTotal_bytes{nodename="node2"} - (node_memory_MemFree_bytes{nodename="node2"} + node_memory_Buffers_bytes{nodename="node2"} + node_memory_Cached_bytes{nodename="node2"}))/node_memory_MemTotal_bytes{nodename="node2"} * 100

上述公式的标签名用nodename来替换了instance,因为在prometheus中配置时,instance和job都按缺省取默认值。

3、磁盘分区使用率监控

(1- (node_filesystem_avail_bytes{nodename="monitor01",mountpoint="/"} / node_filesystem_size_bytes{nodename="monitor01",mountpoint="/"})) * 100

4、磁盘使用预测

predict_linear()函数,根据前一个时间段的值来预测未来某个时间点数据的走势。

predict_linear(node_filesystem_free_bytes{device="rootfs",nodename=~"node2",mountpoint="/"}[1d],24*3600) /(1024*1024*1024)

上面这个表达式含义是根据近1天的磁盘空闲情况,预测在明天的这个时间磁盘还空闲多少。

node2通过下面命令,临时创建文件,模拟磁盘增长

dd if=/dev/zero of=/disktest bs=1024 count=2097152

6、CPU饱和度监控

CPU饱和度通常是按系统的平均负载来衡量,如观察主机CPU数量(通常按逻辑CPU来算)在一段时间内平均运行的队列长度,当平均负载小于vCPU数量则认为是正常的,若负载长时间超出CPU的数量则认为CPU饱和。

我们先来看看如何查看主机的物理CPU个数、每个物理CPU的核数、每个物理CPU有多少个逻辑CPU(购买云主机时的vcpu数或叫线程数)。


通过过滤"physical id"查看物理CPU数

cat /proc/cpuinfo |grep "physical id" | uniq | wc -l

通过过滤"cpu cores"查看每个物理CPU有多个核数

cat /proc/cpuinfo | grep "cpu cores" | uniq

通过过滤"siblings"查看每个物理CPU下有多少个逻辑CPU数

cat /proc/cpuinfo | grep "siblings" |uniq

或者通过过滤"processor"查看所有物理cpu下的逻辑cpu个数

cat /proc/cpuinfo | grep "processor" | wc -l

CPU饱和度监控

avg(node_load1{nodename="node2"}) by (nodename)/count(node_cpu_seconds_total{nodename="node2",mode="system"}) by (nodename)

或者以下这种写法

avg(node_load1{nodename="node2"})/count(node_cpu_seconds_total{nodename="node2",mode="system"})

7、内存饱和度

可以用下面这两个指标来评估内存饱和度。

node_vmstat_pswpin:系统每秒从swap读到内存的字节数,读取的是/proc/vmstat下的pswpin(si),单位是KB/s 。

node_vmstat_pswpout:系统每秒从内存写到swap字节数,读取的是/proc/vmstat下的pswpout(so),单位是KB/s。


内存饱和度计算,个人理解是上面2个指标之和大于0时表示已使用到交换分区,内存达到饱和?但如果交换分区未启用该如何计算饱和度?

8、磁盘IO使用率

avg(irate(node_disk_io_time_seconds_total{nodename="node2"}[1m])) by(nodename) * 100

9、网卡接收/发送流量监控

irate(node_network_receive_bytes_total{nodename=~'node2',device=~"ens33"}[5m])*8
irate(node_network_transmit_bytes_total{nodename=~'node2',device=~"ens33"}[5m])*8


increase()函数,获取区间向量中的第一个和最后一个样本并返回其增长量。如果除以[区间]时间(秒)就可以获取该时间内的平均增长率与rate函数用途相同(注意是rate()不是irate),如下两个图所示。


总结:在使用Prometheus来监控各种系统指标时,要熟悉并记住对应的metric name以及该metric name对应是何种数据类型,然后就是熟悉PromQL的各种函数使用。系统资源饱和度是对使用率的一个补充,能让管理者做出有关系统的最佳决策。



YaLei

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: