前言:
前文Linux|centos7下部署安装alertmanager并实现邮箱和微信告警(二)_实现了告警系统模块的部署和测试,主要的告警范围是服务器节点的操作系统内存,磁盘空间的使用率这些方面,并没有涵盖系统的主要服务,例如docker,nginx,tomcat,MySQL等等由systemd管理的服务的监控。因此,本文将就如何扩展node_exporter来监测一些常用的由systemd进程管理的主要服务以及CPU使用率监测的实现做一个讲解。
一,
node_exporter的扩展
首先,我们看看node_exporter的帮助:
--collector.arp Enable the arp collector (default: enabled). --collector.bcache Enable the bcache collector (default: enabled). --collector.bonding Enable the bonding collector (default: enabled). --collector.btrfs Enable the btrfs collector (default: enabled). --collector.buddyinfo Enable the buddyinfo collector (default: disabled). --collector.cgroups Enable the cgroups collector (default: disabled). --collector.conntrack Enable the conntrack collector (default: enabled). --collector.cpu Enable the cpu collector (default: enabled). --collector.cpufreq Enable the cpufreq collector (default: enabled). --collector.diskstats Enable the diskstats collector (default: enabled). --collector.dmi Enable the dmi collector (default: enabled). --collector.drbd Enable the drbd collector (default: disabled). --collector.drm Enable the drm collector (default: disabled). --collector.edac Enable the edac collector (default: enabled). --collector.entropy Enable the entropy collector (default: enabled). --collector.ethtool Enable the ethtool collector (default: disabled). --collector.fibrechannel Enable the fibrechannel collector (default: enabled). --collector.filefd Enable the filefd collector (default: enabled). --collector.filesystem Enable the filesystem collector (default: enabled). --collector.hwmon Enable the hwmon collector (default: enabled). --collector.infiniband Enable the infiniband collector (default: enabled). --collector.interrupts Enable the interrupts collector (default: disabled). --collector.ipvs Enable the ipvs collector (default: enabled). --collector.ksmd Enable the ksmd collector (default: disabled). --collector.lnstat Enable the lnstat collector (default: disabled). --collector.loadavg Enable the loadavg collector (default: enabled). --collector.logind Enable the logind collector (default: disabled). --collector.mdadm Enable the mdadm collector (default: enabled). --collector.meminfo Enable the meminfo collector (default: enabled). --collector.meminfo_numa Enable the meminfo_numa collector (default: disabled). --collector.mountstats Enable the mountstats collector (default: disabled). --collector.netclass Enable the netclass collector (default: enabled). --collector.netdev Enable the netdev collector (default: enabled). --collector.netstat Enable the netstat collector (default: enabled). --collector.network_route Enable the network_route collector (default: disabled). --collector.nfs Enable the nfs collector (default: enabled). --collector.nfsd Enable the nfsd collector (default: enabled). --collector.ntp Enable the ntp collector (default: disabled). --collector.nvme Enable the nvme collector (default: enabled). --collector.os Enable the os collector (default: enabled). --collector.perf Enable the perf collector (default: disabled). --collector.powersupplyclass Enable the powersupplyclass collector (default: enabled). --collector.pressure Enable the pressure collector (default: enabled). --collector.processes Enable the processes collector (default: disabled). --collector.qdisc Enable the qdisc collector (default: disabled). --collector.rapl Enable the rapl collector (default: enabled). --collector.runit Enable the runit collector (default: disabled). --collector.schedstat Enable the schedstat collector (default: enabled). --collector.selinux Enable the selinux collector (default: enabled). --collector.slabinfo Enable the slabinfo collector (default: disabled). --collector.sockstat Enable the sockstat collector (default: enabled). --collector.softnet Enable the softnet collector (default: enabled). --collector.stat Enable the stat collector (default: enabled). --collector.supervisord Enable the supervisord collector (default: disabled). --collector.sysctl Enable the sysctl collector (default: disabled). --collector.systemd Enable the systemd collector (default: disabled). --collector.tapestats Enable the tapestats collector (default: enabled). --collector.tcpstat Enable the tcpstat collector (default: disabled). --collector.textfile Enable the textfile collector (default: enabled). --collector.thermal_zone Enable the thermal_zone collector (default: enabled). --collector.time Enable the time collector (default: enabled). --collector.timex Enable the timex collector (default: enabled). --collector.udp_queues Enable the udp_queues collector (default: enabled). --collector.uname Enable the uname collector (default: enabled). --collector.vmstat Enable the vmstat collector (default: enabled). --collector.wifi Enable the wifi collector (default: disabled). --collector.xfs Enable the xfs collector (default: enabled). --collector.zfs Enable the zfs collector (default: enabled). --collector.zoneinfo Enable the zoneinfo collector (default: disabled).
可以看到--collector.systemd是默认不采集的,但有一个问题,如果开启了,那么所有的systemd管理的启停脚本都将要采集,有一些无关紧要的服务是不需要的,因此,需要先开启--collector.systemd 然后设置一个白名单。具体做法如下:
修改node_exporter的启停脚本,内容如下:
[Unit] Descriptinotallow=node_exporter Monitoring System Documentatinotallow=node_exporter Monitoring System [Service] ExecStart=/usr/local/bin/node_exporter --web.listen-address=:9100 --collector.systemd --collector.systemd.unit-whitelist=(nginx|docker|sshd).service [Install] WantedBy=multi-user.target
重启node_exporter服务:
systemctl daemon-reload && systemctl restart node_exporter
打开浏览器,登录Prometheus的管理界面,输入PromeQL语句 node_systemd_unit_state{job="server",name="sshd.service"} :
(job的名称是在Prometheus 的主配置文件内设定的,必须要有设定才可以用哦)
可以看到查询到了sshd服务,同样的将name="sshd.service"替换成name="docker.service" 也可以查询到规则匹配的范围
下图表示sshd服务的四种状态,
同样的,查询docker服务:
OK,可以看到只有192.168.217.23 五种服务状态,state="inactive"表示docker服务挂掉了,24服务器确实没有安装docker环境,因此,这些采集是准确无误的。
二,
编写报警规则
groups: - name: systemd.rules rules: - alert: docker_systemd_down # 告警聚合的名称依据 expr: node_systemd_unit_state{job="server", name="docker.service", state="inactive"} ==1 for: 1m labels: severity: 灾难 # 告警级别 annotations: summary: "Instance {{ $labels.name }} 停止工作" description: "{{ $labels.instance }}的{{ $labels.name }} 已经停止1分钟以上"
这个文件随便命名吧,后缀必须是yml即可,放置在/usr/local/prometheus/rules/目录下,然后重启Prometheus server:
systemctl restart prometheus
继续查询:
三,
测试环节
在23服务器上手动停止docker,模拟故障:
systemctl stop docker
查看Prometheus server的管理界面的Alert,可以看到成功触发报警
稍等片刻后,邮件也收到了,告警级别也会变成firing:
四,
增加CPU负载告警规则:
groups: - name: systemd.rules rules: - alert: docker_systemd_down # 告警聚合的名称依据 expr: node_systemd_unit_state{job="server", name="docker.service", state="inactive"} ==1 for: 1m labels: severity: 灾难 # 告警级别 annotations: summary: "Instance {{ $labels.name }} 停止工作" description: "{{ $labels.instance }}的{{ $labels.name }} 已经停止1分钟以上" - alert: NodeCPUUsage expr: 100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100) > 80 for: 2m labels: severity: 危险 annotations: summary: "{{$labels.instance}}: CPU使用过高" description: "{{$labels.instance}}: CPU使用大于 80% (当前值: {{ $value }})"
同样的,重启Prometheus server服务:
systemctl restart prometheus
同样的查询规则范围和准确度:
测试环节:
使用stress 模拟CPU负载超过80(在23服务器上执行):
#创建8个stress进程,持续时间600秒,模拟CPU在用户态使用率达到100%的场景。 stress --cpu 8 --timeout 600 #或者创建8个stress进程和100个io进程,持续时间600秒,模拟CPU在用户态和内核态总使用率达到100%的场景。 stress -c 8 -i 100 --verbose --timeout 600
在Prometheus server管理界面,可以看到CPU负载达到了百分百:
在alert页面可以看到确实是百分百了,当然,邮件也发送了:
基本的告警流程大概就这样了,告警等级可以使用中文是比较好的一个设定。