在实际生产运维过程中,我们会经常遇到,不是所有的研发人员都会去思考"我开发的这个应用该如何优雅的被监控系统所监控?"这样一个问题。都是需求一出,排期开始撸代码,最后是异常场景未考虑周全(bug那是不可能没有滴),日志定义不规范(研发自己定位日志都难找到问题,还要在线发包调试),焦头烂额,哪有功夫考虑运维人员如何去监控呢!但面对这样一堆应用,运维人员仍然需要想方设法做全方位监控(运维不想做背锅侠)。
站在运维的角度上看,要监控到一个应用是否正常,除了系统、网络层级的监控外,需要对应用的进程、端口、HTTP响应状态、日志、资源的使用率(cpu、内存)等多个层面来监控。而当一个应用只有进程可以用来被监控时,那监控应用的进程就显得非常有必要,可及时甩锅(你看,不是我不监控,目前应用只能监控到进程和日志),本篇文章将介绍使用Zabbix的key "proc.num[,,,,]"来实现进程的监控,返回的值是进程的个数,如返回1,则表示进程数为1,返回0则表示进程不存在。官方文档(https://www.zabbix.com/documentation/current/manual/config/items/itemtypes/zabbix_agent)对proc.num中各字段解释如下。
表示进程名,默认是所有进程名,配置时留空即可
表示进程所属用户,默认为所有用户,可以改为进程所属用户,比如root
表示进程运行状态,默认为所有状态,按默认即可。
表示过滤进程的正则表达式或命令行,需根据进程启动的实际路径来写正则表达式匹配
该参数只在Solaris系统上有效,Linux上直接忽略。详细见如下图所示。
![dd7d4ec6801668902ecff9aa6d7e8fb4.png](https://i-blog.csdnimg.cn/blog_migrate/1f1a47cec1581e2b313e0cd5c2d2abfb.jpeg)
接下来,将描述如何在Zabbix上添加进程监控,具体操作步骤如下:
1、为应用进程创建一个模板,此处以node_exporter进程为例。
在Zabbix控制台,选择 "Configuration" --> "Templates" ,然后点击右上角的"Create template",创建一个名为"Template node_exporters"的模板,如下图所示。
![b3a79927947e41f1212615a9072d2309.png](https://i-blog.csdnimg.cn/blog_migrate/60722597fdc950a20963e3bab5eb53ab.jpeg)
2、为应用创建Application,在上在创建好的"Template node_exporters"模板上点击"Applications",如下图所示。
![ffdd8e40e968b7e823a6b4ea7b85e0ea.png](https://i-blog.csdnimg.cn/blog_migrate/e17bde914b39fa5e2fd9f509c64370f7.jpeg)
创建建一个名为"node_exporters"的Applications,点击"Add"完成创建。
![94a7f04c87bd5af4c83a8d4cebf4a2a1.png](https://i-blog.csdnimg.cn/blog_migrate/980b9b1203ed91d75eb0da34890b3924.jpeg)
3、在名为"node_exporters"Applications下创建对应的进程item和trigger,如下图所示,点击"Create item"。
![d5d874a4bf97b0e13e02edf35d0e6ee5.png](https://i-blog.csdnimg.cn/blog_migrate/fce66f4450b2e1eacb0a00368c6fe542.jpeg)
注意key的写法:proc.num[,root,all,/usr/local/node_exporter/node_exporter]
![a15b265d6a6c857d815ab599ba1b5d9e.png](https://i-blog.csdnimg.cn/blog_migrate/f4f167c7ca10e6f8616bfb92ba6e3343.jpeg)
proc.num中的通常是先在系统上执行ps -ef|grep 命令后过滤得出,如下图所示
![fa13987984ca1856714de5c666b28be2.png](https://i-blog.csdnimg.cn/blog_migrate/8a2ab2fbe3e625726d1d6bb62d046b70.jpeg)
完成item添加后,接下来是创建触发器,触发器表达式应定义为所监控的进程数目与我们期望值不符时即告警,我们上面要监控的node_exporter进程数为1,所以触发器不等于1就要告警(进程个数为0,或者超出1个,多启动了进程等情况)。
{Template node_exporters:proc.num[,root,all,/usr/local/node_exporter/node_exporter].last()}<>1
![fac66b6f50cc4956473931c80ad61594.png](https://i-blog.csdnimg.cn/blog_migrate/3c0daabd09b5b039765fee2ac1d81633.jpeg)
4、最后将模板应用到主机。因为像node_exporter这种采集应用通常是部署在每台机器上的,有了模板就可以快速应用到多台主机上。
如下图所示,将模板添加到需要的主机上
![096123ec59e4ee9de1303083bdda538c.png](https://i-blog.csdnimg.cn/blog_migrate/ef7aa18929f6ffe5efc86c72bfc75806.jpeg)
最后,我们在Latest data中查看监控进程的状态是否符合预期。
![7a4da4998640db2d82658eedf54807d0.png](https://i-blog.csdnimg.cn/blog_migrate/3d160cd72a1c0fdad842739a7cc7cca8.jpeg)
总结:应用全方位的监控并非运维人员独立完成,需要有研发人员的鼎立配合才行,这样技术背锅的可能性就变小了,产品也会变得更加成熟稳定bug少。