首页 > 代码库 > zabbix 自定义脚本
zabbix 自定义脚本
这个脚本的思路,自定义一个key,然后就是通过查看文件 /proc/net/dev 里面的数值,来计算实时网卡流量,其实我算的是一个平均值。分为进和出。如果这个脚本每隔1分钟执行一次,那么算出来的流量值就是1分钟的平均值。最终得到网卡流量趋势图。
客户端操作
# vim /etc/zabbix/zabbix_agentd.conf
# UnsafeUserParameters=0 取消注释并修改为1,在下面增加一行
UserParameter=my.net.if[*],/usr/local/sbin/zabbix/net.sh $1 $2
my.net.if[相当于命令名字,他是key
其中UserParameter用来自定义键值,(类似于net.if.in),自己写的脚本往往会有参数,[*] 表示他有自己的参数,所以需要加[*],这是固定写法,如果脚本压根就没有什么参数,那么这个就省了。逗号后面就是我们写的脚本的路径了,再后面就是要用到的参数,有几个就写几。如果没有参数,后面的 $1 $2 还有前面的 [*] 就都可以省略。
不足之处:
脚本需要工作中不断的进行改进。
并没有针对每个网卡设定单独的文件,所有网卡使用同一个日志文件
# vim /usr/local/sbin/zabbix/net.sh
#!/bin/bash
eth=$1
io=$2
net_file="/proc/net/dev"
if [ $2 == "in" ]
then
n_new=`grep "$eth" $net_file|awk ‘{print $2}‘`
n_old=`tail -1 /tmp/neti.log`
n=`echo "$n_new-$n_old"|bc`
d_new=`date +%s`
d_old=`tail -2 /tmp/neti.log|head -1`
d=`echo "$d_new-$d_old"|bc`
if_net=`echo "$n/$d"|bc`
echo $if_net
date +%s>>/tmp/neti.log
grep "$eth" $net_file|awk ‘{print $2}‘>>/tmp/neti.log
elif [ $2 == "out" ]
then
n_new=`grep "$eth" $net_file|awk ‘{print $10}‘`
n_old=`tail -1 /tmp/neto.log`
n=`echo "$n_new-$n_old"|bc`
d_new=`date +%s`
d_old=`tail -2 /tmp/neto.log|head -1`
d=`echo "$d_new-$d_old"|bc`
if_net=`echo "$n/$d"|bc`
echo $if_net
date +%s>>/tmp/neto.log
grep "$eth" $net_file|awk ‘{print $10}‘>>/tmp/neto.log
else
echo 0
fi
----------------------------------------------------------------------------------------------------------------------------
详解
eth=$1 # 第一个参数,网卡名字,脚本并不针对特定的网卡,可以监控很多网卡,监控进和出
io=$2 # 第二个参数,并非io,而是in or out 的简写
net_file="/proc/net/dev" # 最关键文件,网卡流量就是从这个文件获得的。这个脚本的思路,就是通过查看文件 /proc/net/dev 里面的数值,来计算实时网卡流量,其实我算的是一个平均值。分为进和出。如果这个脚本每隔1分钟执行一次,那么算出来的流量值就是1分钟的平均值。
n_new=`grep "$eth" $net_file|awk ‘{print $2}‘` # 通过上面的文件,获得最新的一个数值
n_old=`tail -1 /tmp/neti.log` # 查看上一次网卡流量多少
n=`echo "$n_new-$n_old"|bc` # n 是两者的差值(上面二个新老网卡流量做减法)
d_new=`date +%s` # 记录当前的时间戳
d_old=`tail -2 /tmp/neti.log|head -1` # 查找上一次的时间戳
d=`echo "$d_new-$d_old"|bc` # d 是两个时间间隔
if_net=`echo "$n/$d"|bc` # 求平均值
echo $if_net # 输出平均值
date +%s>>/tmp/neti.log # 当前时间戳输入到日志中
grep "$eth" $net_file|awk ‘{print $2}‘>>/tmp/neti.log # 当前流量输入到日志中
----------------------------------------------------------------------------------------------------------------------------
值与上一次减一下然后除一下,求一个平均值
# chmod a+x /usr/local/sbin/zabbix/net.sh # 更改权限
执行操作执行,先创建脚本里面要使用的目录和文件
# touch /tmp/net[io].log
# date +%s >>/tmp/neti.log
# grep eth0 /proc/net/dev |awk ‘{print $2}‘ >>/tmp/neti.log
# date +%s >>/tmp/neto.log
# grep eth0 /proc/net/dev |awk ‘{print $10}‘ >>/tmp/neto.log
# chown zabbix /tmp/net[io].log
执行脚本检测:
# /usr/local/sbin/zabbix/net.sh eth0 in
# /usr/local/sbin/zabbix/net.sh eth0 out
此时检测 eth1 或者其他网卡的流量会报错,因为执行脚本之前,grep 过滤出来的是 eth0 的流量,这里直接使用 eth1 得出的数字肯定是错误的。所以,如果是想检测 eth1 的流量,那么在 grep 和 touch 的时候,就应该使用 eth1。
# /etc/init.d/zabbix-agent restart
服务端
# zabbix_get -s 192.168.32.150 -p10050 -k "my.net.if[eth0,out]"查看out网卡流量,单位字节
395
# zabbix_get -s 192.168.32.150 -p10050 -k "my.net.if[eth0,in]" 查看in网卡流量,单位字节
308
WEB端
下图的 key 只能手写,并不能选择。
创建eth0_net_in和eth0_net_out
查看是否添加成功
需求:统计每分钟的在线人数,通过数据库获得在线人数。
思路:
1、客户端增加 key
UserParameter=my.online,/usr/local/sbin/zabbix/online.sh
#因为这个需求没有参数,所以去掉参数选项
2、编写脚本
从数据库里面获得每分钟的在线人数
3、测试
服务端进行操作
# zabbix_get -s 192.168.32.150 -p10050 -k "my.online"
如果返回了参数,那么就代表成功。
zabbix 自定义脚本