您好,登錄后才能下訂單哦!
#!/bin/awk -f #function: nagios插件,針對每個網卡單獨設定監控閥值,腳本傳遞參數閥值時單位為Mbps。 #example: # NAT服務器(WAN:em1, LAN:em2)帶寬:下行100Mbps上行約33.3Mbps(假設上行為下行的三分之一),報警閥值按90%計算,nagios每分鐘監控一次,如下: #接收(上行):100/3*0.9約等于30Mbps #發送(下行):100*0.9*等于90Mbps #監控所有網卡,nrpe配置如下: #command[check_netcount]=/usr/local/nagios/libexec/check_netcount.awk em1 30 90 em2 90 30 #注:如果是普通單臺機器,只指定一個網卡監控即可:網卡名 接收閥值 發送閥值 # #Date:20150129 by yangjy BEGIN { #存放上一次數據的臨時文件 last_f="/var/tmp/nagios_net.tmp" run_f="/proc/net/dev" #獲取當前所有網卡:設備名、接收數據、發送數據 while (getline runline <run_f) { if (runline ~ /:/) { sub(/^ +/,"",runline) split(runline,runarraytmp,": +|:| +") rundata_r[runarraytmp[1]]=runarraytmp[2] rundata_t[runarraytmp[1]]=runarraytmp[10] } } #判斷有沒有臨時文件 if (system("[ -f "last_f" ]") == 0) { #獲取上一次的接收、發送數據到數組 while (getline lastline <last_f) { split(lastline,lastarraytmp," ") lastdata_r[lastarraytmp[1]]=lastarraytmp[2] lastdata_t[lastarraytmp[1]]=lastarraytmp[3] } #在上一步獲取舊數據后,用新數據更新臨時文件 printf("") >last_f for (i in rundata_r) { print i,rundata_r[i],rundata_t[i] >>last_f } } #未找到臨時文件,使用本次獲取的各網卡接收和發送數據初始化臨時文件(一般在第一次運行時執行) else { if (system("touch "last_f) == 0) { for (j in rundata_r) { print j,rundata_r[j],rundata_t[j] >>last_f lastdata_r[j]=rundata_r[j] lastdata_t[j]=rundata_t[j] } } else { print "CRITICAL - cat not create file:",last_f"." exit 2 } } #獲取各網卡及其報警閥值 for (k=1; k<ARGC; k+=3) { monitor_r[ARGV[--k]]=ARGV[++k] monitor_t[ARGV[k-=2]]=ARGV[k+=2] } #根據新數據和舊數據,計算這一檢查周期內所有網卡產生的數據量 for (l in rundata_r) { generate_r[l]=int((rundata_r[l]-lastdata_r[l])/1024/1024/60*8) generate_t[l]=int((rundata_t[l]-lastdata_t[l])/1024/1024/60*8) } #計算指定監控的網卡是否達到報警閥值,分別更新狀態數組 for (m in monitor_r) { if (m in generate_r) { if (generate_r[m] >= monitor_r[m] ) { critical_r[m] } if (generate_t[m] >= monitor_t[m] ) { critical_t[m] } #原則,只對監控的網卡產生信息和性能數據繪圖 status=status"__"m"("monitor_r[m]","monitor_t[m]"):R="generate_r[m]"Mbps,T="generate_t[m]"Mbps" sub(/^__/,"",status) performance=performance""m"_r="generate_r[m]";"monitor_r[m]"; "m"_t="generate_t[m]";"monitor_t[m]"; " } else { print "CRITICAL - wrong dev name." exit 2 } } #如果狀態數組都為0,則正常 if (length(critical_r)==0 && length(critical_t)==0 ) { print " OK - "status" | "performance exit 0 } else { #快速確認哪個網卡哪個方向傳輸報警,收集狀態數組信息 for (n in critical_r) { problem_r=problem_r" "n sub(/^ /,"",problem_r) } for (o in critical_t) { problem_t=problem_t" "o sub(/^ /,"",problem_t) } print " CRITICAL - Problem(R:"problem_r", T:"problem_t") - "status" | "performance exit 2 } }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。