#!/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
}
}
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。