监控简介:
通过shell脚本的方式,实现对进程占cpu百分比和内存大小的监控,通过python脚本方式,实现批量监控服务器端口。
一、监控进程占cpu的百分比和内存的大小
1、在agent端编写脚本
[root@monitor sbin]$ cat /usr/local/zabbix/scripts/processtatus.sh
#!/bin/bash
#date:2020.05.21
nginx(){
ps aux|grep "nginx"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$6}; END{print sum}'
}
nginxcpu(){
ps aux|grep "nginx"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$3}; END{print sum}'
}
redis(){
ps aux|grep "redis"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$6}; END{print sum}'
}
rediscpu(){
ps aux|grep "redis"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$3}; END{print sum}'
}
tomcat_billing(){
ps aux|grep "tomcat_billing"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$6}; END{print sum}'
}
tomcat_billingcpu(){
ps aux|grep "tomcat_billing"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$3}; END{print sum}'
}
tomcat_client(){
ps aux|grep "tomcat_client"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$6}; END{print sum}'
}
tomcat_clientcpu(){
ps aux|grep "tomcat_client"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$3}; END{print sum}'
}
tomcat_ipcboss(){
ps aux|grep "tomcat_ipcboss"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$6}; END{print sum}'
}
tomcat_ipcbosscpu(){
ps aux|grep "tomcat_ipcboss"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$3}; END{print sum}'
}
tomcat_shuanghu(){
ps aux|grep "tomcat_shuanghu"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$6}; END{print sum}'
}
tomcat_shuanghucpu(){
ps aux|grep "tomcat_shuanghu"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$3}; END{print sum}'
}
SBC(){
ps aux|grep "SBC"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$6}; END{print sum}'
}
SBCcpu(){
ps aux|grep "SBC"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$3}; END{print sum}'
}
freeswitch(){
ps aux|grep "freeswitch"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$6}; END{print sum}'
}
freeswitchcpu(){
ps aux|grep "freeswitch"|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$3}; END{print sum}'
}
case "$1" in
nginx)
nginx
;;
nginxcpu)
nginxcpu
;;
redis)
redis
;;
rediscpu)
rediscpu
;;
tomcat_billing)
tomcat_billing
;;
tomcat_billingcpu)
tomcat_billingcpu
;;
tomcat_client)
tomcat_client
;;
tomcat_clientcpu)
tomcat_clientcpu
;;
tomcat_ipcboss)
tomcat_ipcboss
;;
tomcat_ipcbosscpu)
tomcat_ipcbosscpu
;;
tomcat_shuanghu)
tomcat_shuanghu
;;
tomcat_shuanghucpu)
tomcat_shuanghucpu
;;
SBC)
SBC
;;
SBCcpu)
SBCcpu
;;
freeswitch)
freeswitch
;;
freeswitchcpu)
freeswitchcpu
;;
*)
echo "Usage: $0 {nginx|nginxcpu|redis|rediscpu|tomcat_billing|tomcat_billingcpu|tomcat_client|tomcat_clientcpu|tomcat_ipcboss|tomcat_ipcbosscpu|tomcat_shuanghu|tomcat_shuanghucpu|SBC|SBCcpu|freeswitch|freeswitchcpu}"
esac
2、编辑agent配置文件调用脚本
[root@vvh-fs01 scripts]# vim /etc/zabbix/zabbix_agentd.conf
#将UnsafeUserParameters设置为1
UnsafeUserParameters=1
UserParameter=process.nginx.memory,/usr/local/zabbix/scripts/processtatus.sh nginx
UserParameter=process.nginx.cpu,/usr/local/zabbix/scripts/processtatus.sh nginxcpu
UserParameter=process.redis.memory,/usr/local/zabbix/scripts/processtatus.sh redis
UserParameter=process.redis.cpu,/usr/local/zabbix/scripts/processtatus.sh rediscpu
UserParameter=process.tomcat_billing.memory,/usr/local/zabbix/scripts/processtatus.sh tomcat_billing
UserParameter=process.tomcat_billing.cpu,/usr/local/zabbix/scripts/processtatus.sh tomcat_billingcpu
UserParameter=process.tomcat_client.memory,/usr/local/zabbix/scripts/processtatus.sh tomcat_client
UserParameter=process.tomcat_client.cpu,/usr/local/zabbix/scripts/processtatus.sh tomcat_clientcpu
UserParameter=process.tomcat_ipcboss.memory,/usr/local/zabbix/scripts/processtatus.sh tomcat_ipcboss
UserParameter=process.tomcat_ipcboss.cpu,/usr/local/zabbix/scripts/processtatus.sh tomcat_ipcbosscpu
UserParameter=process.tomcat_shuanghu.memory,/usr/local/zabbix/scripts/processtatus.sh tomcat_shuanghu
UserParameter=process.tomcat_shuanghu.cpu,/usr/local/zabbix/scripts/processtatus.sh tomcat_shuanghucpu
UserParameter=process.SBC.memory,/usr/local/zabbix/scripts/processtatus.sh SBC
UserParameter=process.SBC.cpu,/usr/local/zabbix/scripts/processtatus.sh SBCcpu
UserParameter=process.freeswitch.memory,/usr/local/zabbix/scripts/processtatus.sh freeswitch
UserParameter=process.freeswitch.cpu,/usr/local/zabbix/scripts/processtatus.sh freeswitchcpu
3、重启agent
systemctl restart zabbix-agent
4、在zabbix服务端测试
然后在zabbix服务端使用zabbix_get看能否取到相应的数据,像下面这样就是成功获取到了数据。
[root@localhost zabbix]# bin/zabbix_get -s 172.16.1.20 -p 10050 -k process.nginx.memory
184876
5、配置zabbix界面
#创建模板—创建监控项
#CPU配置:
#内存配置:
需要注明的是内存取到的值得单位是KB,所以定义item的时候使用自定义倍数乘以1000,单位改成Byte,另外CPU占用率的值是带有小数点的一个数,所以在定义item的时候需要定义值得类型是浮点型,并且该值是占用逻辑单核的CPU占用率,所以需要定义自定义倍数,我实验中的服务器是1颗CPU,每颗CPU是1核2线程,所以自定义倍数是原来的基础上除以2,单位改成%就好。
名称:freeswitch_process_MEM
键值:process.freeswitch.memory
二、批量监控端口
1、编写监控脚本
[root@vvh-fs01 scripts]# cat /usr/local/zabbix/scripts/check_port.py
#!/usr/bin/env python
#coding:utf-8
import os, json
port_list=[]
port_dict={"data":None}
cmd='''netstat -tnlp|egrep -i "$1"|awk {'print $4'}|awk -F':' '{if ($NF~/^[0-9]*$/) print $NF}'|sort |uniq 2>/dev/null'''
local_ports=os.popen(cmd).readlines()
for port in local_ports:
pdict={}
pdict["{#TCP_PORT}"]=port.replace("\n", "")
port_list.append(pdict)
port_dict["data"]=port_list
jsonStr = json.dumps(port_dict, sort_keys=True, indent=4)
print jsonStr
2、更改netstat命令权限。
chmod +s /bin/netstat
3、修改被监控端的zabbix_agent.conf配置文件
添加如下内容:
UserParameter=tcpportlisten,/usr/lib/zabbix/alertscripts/check_port.sh
4、重启zabbix-agent
systemctl restart zabbix-agent
5、服务端测试
执行命令:zabbix_get -s 192.168.92.9 -p 10050 -k tcpportlisten
6、配置zabbix页面
#添加自动发现规则
#在上新创建的模板中点击-->自动发现规则-->然后选择创建发现规则
注意:上面的key 一定要和配置文件中的key 保持一致。就是我们在zabbix_agent.conf文件中添加的两行代码中的第二行中添加的参数key
7、创建监控项原型
#上面中的键值 中的 {#TCP_PORT} 和我们的脚本 check_port.sh 中的参数一致
8、创建触发器类型
添加按钮进入-->选择原型
#注意这里的表态示count(#3,0,eq) > 1表示最近3次的返回值为0,这个条件触发一次则报警.
至此Python脚本批量监控端口已配置完成。
如需批量监控指定端口,可用下面这个脚本:
#!/usr/bin/env python
import json
port_list = ["80",
"10050",
"3306",
"22",
"8080"]
new_port = []
port_dict = {"data":None}
for port in port_list:
pdict = {}
pdict["{#TCP_PORT}"] = port
new_port.append(pdict)
port_dict["data"] = new_port
jsonStr = json.dumps(port_dict,sort_keys=True,indent=4)
#python3
#print(jsonStr)
#python2
print jsonStr