首页 > 代码库 > 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 自定义脚本