1. 程式人生 > >zabbix 自定義腳本

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 自定義腳本