0987 发表于 2014-9-30 08:33:30

awk:nagios流量监控插件

#!/bin/awk -f
#function: nagios插件;细定每个网卡的监阀值,指定参数时单位为MB(如果监控周期为1分钟,则指定的参数为1分钟传输的数据大小,非Mbit/s)
#
#Usage:服务器(WAN:em1;LAN:em2),带宽为下行:100Mbit/s,上行:100/3约等于33.3Mbit/s(一般为下行三分之一),报警阀值按80%计算,nagios每分钟监控一次,如下:
#接收(上行):100/8*0.8*60=600(单位MB)
#发送(下行):100/3/8*0.8*60=200(单位MB)
#监控所有网卡,nrpe配置如下:
#command=/usr/local/nagios/libexec/check_netcount.awk em1 200 600 em2 600 200
#注:因为是NAT环境,所以em2网卡报警参数正好和em1相反。如果是单台机器,可直接指定一个网卡,顺序同上:网卡名 接收阀值 发送阀值
#
#Date:20140929 --sndapk

BEGIN {
    #存放上一次数据的临时文件
    last_f="/var/tmp/nagios_bw.tmp"
    run_f="/proc/net/dev"

    #获取当前所有网卡:设备名、接收数据、发送数据到数据
    while (getline runline <run_f) {
      if (runline ~ /:/) {
         sub(/^ +/,"",runline)
         split(runline,runarraytmp,": +|:| +")
         rundata_r]=runarraytmp
         rundata_t]=runarraytmp
      }
    }

    #判断有没有临时文件
    if (system("[ -f "last_f" ]") == 0) {
      #获取上一次的接收、发送数据到数组
      while (getline lastline <last_f) {
            split(lastline,lastarraytmp," ")
            lastdata_r]=lastarraytmp
            lastdata_t]=lastarraytmp
      }

      #在上一步获取旧数据后,用新数据更新临时文件
      printf("") >last_f
      for (i in rundata_r) {
            print i,rundata_r,rundata_t >>last_f
      }
    }
    #未找到临时文件,操作:初始化临时文件、初始化上次接收、发送的数组(一般在第一次运行时执行)
    else {
      if (system("touch "last_f) == 0) {
         for (j in rundata_r) {
               print j,rundata_r,rundata_t >>last_f
               lastdata_r=rundata_r
               lastdata_t=rundata_t
         }
      }
      else {
            print "CRITICAL - cat not create file:",last_f"."
            exit 2
      }
    }

    #获取各网卡及其报警参数
    for (k=1; k<ARGC; k+=3) {
      monitor_r]=ARGV[++k]
      monitor_t]=ARGV
    }

    #根据新数据和旧数据,计算这一检查周期内产生的数据量
    for (l in rundata_r) {
      generate_r=int((rundata_r-lastdata_r)/1024/1024)
      generate_t=int((rundata_t-lastdata_t)/1024/1024)
    }

    #计算指定监控的网卡是否达到报警阀值,分别更新状态数组
    for (m in monitor_r) {
      if (m in generate_r) {
            if (generate_r >= monitor_r ) {
                critical_r
            }

            if (generate_t >= monitor_t ) {
                critical_t
            }

            #原则,只对监控的网卡产生信息和性能数据绘图
            status=status"__"m"("monitor_r","monitor_t"):R="generate_r"M,T="generate_t"M"
            sub(/^__/,"",status)
            performance=performance""l"_r="generate_r";"monitor_r";"l"_t="generate_t";"monitor_t";"
      }
      else {
            print "CRITICAL - wrong parameter."
            exit 2
      }
    }

    #如果状态数组都为0,则正常
    if (length(critical_r)==0 && length(critical_t)==0 ) {
      print "OK - "status"|"performance
      exit 0
    }
    else {
      print "CRITICAL - "status"|"performance
      exit 2
    }
}
页: [1]
查看完整版本: awk:nagios流量监控插件