添加端口和进程的监控,一种方案是可以通过模板来定义一组机器需要监控的端口和进程,优点是方案简单且监控准确,缺点是需要维护多套模板,比较适合小规模的团队。当监控规模较大时,需要考虑一种支持自助修改监控项的方案。本文记录一种通过自动发现(Low-Level Discovery)功能来实现自动添加端口进程监控以及支持自助修改的方案。
概述
Zabbix 的 Low-Level Discovery 功能可以通过一个自定义脚本,返回一个特定格式的 JSON 数据:
{
data: [
{"{#NAME}": "value"},
{"{#NAME}": "value"},
...
]
}
然后将脚本添加为 UserParameter。
UserParameter=lld_proc[*],/usr/local/etc/script/proc.sh
UserParameter=lld_port[*],/usr/local/etc/script/port.sh
然后在模板中配置自动发现。
端口自动发现
端口自动发现是通过 ss
命令来做,核心命令是:
ss -ltpn |awk '{print $4,$6}' |sed 's/::ffff://g' |perl -pe 's/.*?:(\d)/\1/' |sed 's/users:((\"//g'|sed 's/\".*$//' |grep -vE "127.0.0.1|172.17.|Local" |sort -u |grep -v ":" |tr ' ' ':' | grep -v ":$"
输出格式如下:
1080:goproxy
2222:gitea
22:sshd
25:master
3000:gitea
然后将其输出为 Zabbix 自动发现要求的 JSON 格式:
{
"data":[
{"{#PROCNAME}":"goproxy", "{#PORT}":"1080"},
{"{#PROCNAME}":"gitea", "{#PORT}":"2222"},
{"{#PROCNAME}":"sshd", "{#PORT}":"22"},
{"{#PROCNAME}":"master", "{#PORT}":"25"},
{"{#PROCNAME}":"gitea", "{#PORT}":"3000"}
]
}
为了支持用户自动配置,可以读取一个配置文件,允许用户在配置文件中自定义监控的端口,完整代码如下:
#!/bin/bash
exclude="zabbix_agentd|monit|snmpd|sendmail|moxi|[0-9]{4,5}:java|ceph-osd"
conf="/etc/lld_port.conf"
common="22:sshd|53:dnsmasq|10040:agentd_zx"
kubecommon="$common|10248:kubelet|10249:kube-proxy|10250:kubelet|10256:kube-proxy|179:bird|9099:calico-node"
hostname | grep "k8s-master" &>/dev/null && r=0 || r=1
[ $r -eq 0 ] && include="$kubecommon|10251:kube-scheduler|10252:kube-controller|2379:etcd|2380:etcd|443:kube-apiserver"
hostname | grep "k8s-etcd" &>/dev/null && r=0 || r=1
[ $r -eq 0 ] && include="$kubecommon|2379:etcd|2380:etcd"
hostname | grep "k8s-router" &>/dev/null && r=0 || r=1
[ $r -eq 0 ] && include="$kubecommon|80:nginx|443:nginx"
hostname | grep "k8s-node" &>/dev/null && r=0 || r=1
[ $r -eq 0 ] && include="$kubecommon"
if [ -f $conf ];then
source $conf
fi
str='{\n\t"data":['
confstr=""
function ntlp()
{
sudo timeout 5 ss -ltpn |awk '{print $4,$6}' |sed 's/::ffff://g' |perl -pe 's/.*?:(\d)/\1/' |sed 's/users:((\"//g'|sed 's/\".*$//' |grep -vE "127.0.0.1|172.17.|Local" |sort -u |grep -v ":" |tr ' ' ':' | grep -v ":$"
}
if [ "$include"x != ""x ];then
for id in `echo $include |tr '|' ' '`;do
proc=`echo $id | cut -f2 -d':'`
port=`echo $id | cut -f1 -d':'`
str="$str\n\t\t{\"{#PROCNAME}\":\"$proc\", \"{#PORT}\":\"$port\"},"
confstr="$confstr|$port:$proc"
done
else
for id in `ntlp |grep -vEw "$exclude"`;do
proc=`echo $id | cut -f2 -d':'`
port=`echo $id | cut -f1 -d':'`
str="$str\n\t\t{\"{#PROCNAME}\":\"$proc\", \"{#PORT}\":\"$port\"},"
confstr="$confstr|$port:$proc"
done
fi
str="$str]\n}"
str=`echo $str |sed 's/,]/\\\\n\\\\t]/g'`
[ $# -lt 1 ] && echo -e $str || echo $confstr |sed 's/^|//g'
然后用户可以在 /etc/lld_port.conf
文件中修改 include
和 exclude
配置,比如,使用自定义的 include
,只监控 22 和 53 端口:
include="22:sshd|53:dnsmasq"
进程自动发现
和端口自动发现的思路一样。
#!/bin/bash
include="rcgroupchat_ser|codis-proxy|codis-server|codis-config|haproxy|gateway-server|turnserver|comet-server|rpc-server|videocall-server|consul|consul-replicate|telegraf|kapacitord|influxd|^docker$|ares|mesos-slave|crond|rabbitmq-server|show_count.py|dds|dns.py|dispatcher.py|qpsservice.py|filebeat|notification|pre-ark-adapter|rsyslog|adfz2_engine|ssp_engine|dispatcher_serv|afp|ssp|delivery|freq|bigdatacollecti|adx_tracking|kube-proxy|kube-controller|kube-scheduler|kube-apiserver|kubelet|calico-node|etcd|nginx-ingress-c|ceph-osd"
conf="/etc/lld_proc.conf"
hostname | grep -E "k8s-" &>/dev/null && r=0 || r=1
[ $r -eq 0 ] && include="crond|kube-proxy|kube-controller|kube-scheduler|kube-apiserver|kubelet|calico-node|etcd|nginx-ingress-c"
[ -f $conf ] && source $conf
str='{\n\t"data":['
for id in `ps -A |awk '{print $NF}' |sort -u |grep -Ew "$include"`;do
str="$str\n\t\t{\"{#PROCNAME}\":\"$id\"},"
done
str="$str]\n}"
str=`echo $str |sed 's/,]/\\\\n\\\\t]/g'`
echo -e $str
输出示例:
{
"data":[
{"{#PROCNAME}":"crond"},
{"{#PROCNAME}":"nginx"},
{"{#PROCNAME}":"supervisord"}
]
}
后记
这种方案要求用户自己去修改 /etc/lld_port.conf
和 /etc/lld_proc.conf
文件来实现自定义,当机器比较多时是很繁琐的,对用户并不友好。如果用户不去维护,就可能导致自动添加了一些并不需要的端口和进程,带来一些无关紧要的报警。一个可能的解决方案是,通过 iTop CMDB 之类的工具来降低维护成本,将监控项也管理起来,允许用户在 CMDB 中配置监控项,对一组机器或者单台机器配置端口进程自动发现规则,机器上跑定时任务去更新 /etc/lld_port.conf
和 /etc/lld_proc.conf
,类似 登录时显示服务器信息 里的方式。
发表回复