Prometheus监控进程状态(Process-Exporte
Prometheus有众多的Exporter可供使用,如在Prometheus+Grafana监控系统搭建一文中提到的Node Exporter就可以用来采集机器的各项指标,从而监控机器的状态。
如果机器上运行了一些小脚本,想要对其进行监控但又不想用上一些在代码里做信息采集的SDK那么重,比如只是单纯想要监控该脚本是否一直在运行,那么Process-Exporter会是一个现成的好选择。
如名所示,Process-Exporter就是用来监控进程的,其中一项能力,便是监控进程的状态。使用起来也简单。
在安装好了Prometheus的前提下,打开Process-Exporter的Github release版本列表,下载最新发布版本的适合你机器的那一项,这里我选择的是process-exporter-0.5.0.linux-amd64.tar.gz,下载好后rz到你的服务器上去(如果你的服务器可以连接外网,那么也可以直接用wget命令下载到服务器上),然后解压即可使用:
$ wget https://github.com/ncabatoff/process-exporter/releases/download/v0.5.0/process-exporter-0.5.0.linux-amd64.tar.gz
$ tar -xvf process-exporter-0.5.0.linux-amd64.tar.gz
进入解压出的目录,我们开始设置我们需要监控的进程。Process-Exporter的做法是配置需要监控的进程的名称,他会去搜索该进程从而得到其需要的监控信息,其实也就是我们常做的“ps -efl | grep xxx”命令来查看对应的进程。配置文件一开始是不存在的,需要我们创建,名字可以自定义:
$ vim process-name.yaml
process_names:
- name: "{{.Matches}}"
cmdline:
- 'alertToRobot.js'
- name: "{{.Matches}}"
cmdline:
- 'prometheus'
这里,在配置文件(process-name.yaml)中,我们添加了两个要监控的进程名“alertToRobot.js”和“prometheus”,一个process_names就定义了要监控的一组进程,{{.Matches}}模板表示映射包含应用命令行所产生的所有匹配项,还有其他模板如下:
模板变量:
- {{.Comm}} contains the basename of the original executable, i.e. 2nd field in /proc/<pid>/stat
- {{.ExeBase}} contains the basename of the executable
- {{.ExeFull}} contains the fully qualified path of the executable
- {{.Username}} contains the username of the effective user
- {{.Matches}} map contains all the matches resulting from applying cmdline regexps
配置好后,我们依据此配置文件来运行process-exporter:
$ nohup ./process-exporter -config.path process-name.yaml & # 后台运行,日志落nohup文件中
如果运行不成功,可以先不后台运行,直接命令“./process-exporter -config.path process-name.yaml”看看报什么错,大概率是配置文件格式错误导致。
process-exporter默认在端口9256下提供http服务供prometheus采集,因此可以直接尝试查看状态:
$ curl http://localhost:9256/metrics
会看到一堆输出,不太适合查看,但你如果能找到一堆“namedprocess_namegroup_states”,那就是进程状态信息了:
从这里也能看出来,process-exporter会给出你设置要观察的进程关键词搜索到的在不同状态下的所有进程的数量,比如这里我观察的两个进程均在“state="Sleeping"”状态下才有数值,说明都处于睡眠状态下,在等待唤醒,是正常的。对于Linux下进程的各种状态说明,可以查看这篇文章。
现在,我们需要去配置Prometheus来采集这份数据了,和其他配置一样,就是给Prometheus添加一份数据源:
$ vim prometheus.yml
……
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus_server'
static_configs:
- targets: ['localhost:9100']
- job_name: 'process'
static_configs:
- targets: ['localhost:9256']
……
我的prometheus配置文件名为prometheus.yml,其中名为prometheus_server的job是之前配置的noe-exporter数据源,这里我们新增“process”数据源。然后重启Prometheus就可以在其网站上看到数据了,在搜索框输入“namedprocess_namegroup_states”就可以查看到上面状态值同样的数据,也可以做出筛选来查看某一个进程,当然也可以添加到Grafana中,这些方法都大同小异,就不细说了。
这里提一嘴,怎么通过命令查看某个进程的状态呢?输入命令:ps -efl | grep xxx,就可以看到了,比如:
[root@localhost test6]# ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 17398 17394 0 75 0 - 16543 wait pts/0 00:00:00 bash
4 R 0 17469 17398 0 77 0 - 15877 - pts/0 00:00:00 ps
这里的第二列就表示进程状态:
- D 不可中断 uninterruptible sleep (usually IO)
- R 运行 runnable (on run queue)
- S 中断 sleeping
- T 停止 traced or stopped
- Z 僵死 a defunct (”zombie”) process
更多ps命令的具体说明可以查看这篇文章。
注意,如果你kill了观察的进程,或者被其他什么原因kill掉了,那么这里采集到的数据每个状态下都会变成0,所以如果要监控告警的话,判断某些状态都为0,就可以视为进程挂掉了。
除了进程状态,Process-Exporter其实还能查看很多别的指标,其Github介绍中有详细描述,有需要的可以了解一下。