添加端口和进程的监控,一种方案是可以通过模板来定义一组机器需要监控的端口和进程,优点是方案简单且监控准确,缺点是需要维护多套模板,比较适合小规模的团队。当监控规模较大时,需要考虑一种支持自助修改监控项的方案。本文记录一种通过自动发现(Low-Level Discovery)功能来实现自动添加端口进程监控以及支持自助修改的方案。
概述
Zabbix 的 Low-Level Discovery 功能可以通过一个自定义脚本,返回一个特定格式的 JSON 数据:
1 2 3 4 5 6 7 |
{ data: [ {"{#NAME}": "value"}, {"{#NAME}": "value"}, ... ] } |
然后将脚本添加为 UserParameter。
1 2 |
UserParameter=lld_proc[*],/usr/local/etc/script/proc.sh UserParameter=lld_port[*],/usr/local/etc/script/port.sh |
然后在模板中配置自动发现。
端口自动发现
端口自动发现是通过 ss
命令来做,核心命令是:
1 |
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 ":$" |
输出格式如下:
1 2 3 4 5 |
1080:goproxy 2222:gitea 22:sshd 25:master 3000:gitea |
然后将其输出为 Zabbix 自动发现要求的 JSON 格式:
1 2 3 4 5 6 7 8 9 |
{ "data":[ {"{#PROCNAME}":"goproxy", "{#PORT}":"1080"}, {"{#PROCNAME}":"gitea", "{#PORT}":"2222"}, {"{#PROCNAME}":"sshd", "{#PORT}":"22"}, {"{#PROCNAME}":"master", "{#PORT}":"25"}, {"{#PROCNAME}":"gitea", "{#PORT}":"3000"} ] } |
为了支持用户自动配置,可以读取一个配置文件,允许用户在配置文件中自定义监控的端口,完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#!/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 端口:
1 |
include="22:sshd|53:dnsmasq" |
进程自动发现
和端口自动发现的思路一样。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#!/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 |
输出示例:
1 2 3 4 5 6 7 |
{ "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
,类似 登录时显示服务器信息 里的方式。
发表回复