zabbix企业应用之如何快速查看异常流量

最近机房总流量总是异常,然后我是不断的接到短信与电话报警,收到后通过cacti查看还是十分的麻烦与浪费时间,为了解决这个问题,我自己写了一个脚本,从数据库里获取所有主机监控数据,然后打印出流量超过10m的主机信息,这样能快速帮我判断异常流量主机。

脚本是使用python编写,使用MySQLdb从zabbix数据库里获取流量数据,经过流量判断后在把数据写入到excel里。

使用前需要安装MySQLdb、xlwt模块,可以使用easy_install安装。

下面是脚本内容

#!/usr/bin/env python
#-*- coding: utf-8 -*-
#author:Deng Lei
#email: [email protected]
import MySQLdb
import time
import sys
import xlwt
reload(sys)
sys.setdefaultencoding(‘utf8‘)

if __name__ == "__main__":
    now_hour=int(time.strftime(‘%H‘))
    old_hour=now_hour-1
    now_time=time.strftime(‘%Y-%m-%d‘)
    mysql_conn=MySQLdb.connect(host=‘10.10.14.11‘,user=‘zabbix‘,passwd=‘zabbix‘,port=3306,charset="utf8")
    mysql_cur=mysql_conn.cursor()
    mysql_conn.select_db(‘zabbix‘)
    last_results=[]
    in_results=[]
    out_results=[]
    network_device=[‘em2‘,‘eth1‘,‘eth0‘]
    try:
        room=sys.argv[1]
    except IndexError:
	room=‘all‘
    try:
	old_hour=sys.argv[2]
    except IndexError:
	old_hour=now_hour-1
    try:
        now_hour=sys.argv[3]
    except IndexError:
        now_hour=int(time.strftime(‘%H‘))
    if room == ‘all‘:
        #search network in traffic
        for i in network_device:
            search_sql="select from_unixtime(hi.clock,‘%%Y-%%m-%%d %%T‘) as Date,g.name as Group_Name,h.host as Host,round(max(hi.value_max)/1000,0) as Network  from hosts_groups hg join groups g on g.groupid = hg.groupid join items i on hg.hostid = i.hostid join hosts h on h.hostid=i.hostid join trends_uint hi on  i.itemid = hi.itemid  where  i.key_=‘net.if.in[%s]‘ and  hi.clock >= UNIX_TIMESTAMP(‘%s %s:00:00‘) and  hi.clock < UNIX_TIMESTAMP(‘%s %s:00:00‘) group by h.host;"%(i,now_time,old_hour,now_time,now_hour)
            n=mysql_cur.execute(search_sql)
            result=mysql_cur.fetchall()
            for ii in result:
	        msg1={‘Group_Name‘:ii[1],‘Host‘:ii[2],‘Network_device‘:i,‘Source‘:‘In‘}
	        if msg1 not in in_results:
		    in_results.append(msg1)
	            msg={‘Date‘:ii[0],‘Group_Name‘:ii[1],‘Host‘:ii[2],‘Network‘:float(ii[3]),‘Network_device‘:i,‘Source‘:‘In‘}
	            last_results.append(msg)
        #search network out traffic
        for i in network_device:
            search_sql="select from_unixtime(hi.clock,‘%%Y-%%m-%%d %%T‘) as Date,g.name as Group_Name,h.host as Host,round(max(hi.value_max)/1000,0) as Network  from hosts_groups hg join groups g on g.groupid = hg.groupid join items i on hg.hostid = i.hostid join hosts h on h.hostid=i.hostid join trends_uint hi on  i.itemid = hi.itemid  where  i.key_=‘net.if.out[%s]‘ and  hi.clock >= UNIX_TIMESTAMP(‘%s %s:00:00‘) and  hi.clock < UNIX_TIMESTAMP(‘%s %s:00:00‘) group by h.host;"%(i,now_time,old_hour,now_time,now_hour)
            n=mysql_cur.execute(search_sql)
            result=mysql_cur.fetchall()
            for ii in result:
                msg1={‘Group_Name‘:ii[1],‘Host‘:ii[2],‘Network_device‘:i,‘Source‘:‘out‘}
                if msg1 not in out_results:
                    out_results.append(msg1)
                    msg={‘Date‘:ii[0],‘Group_Name‘:ii[1],‘Host‘:ii[2],‘Network‘:float(ii[3]),‘Network_device‘:i,‘Source‘:‘out‘}
                    last_results.append(msg)
    else:
        #search network in traffic
        for i in network_device:
            search_sql="select from_unixtime(hi.clock,‘%%Y-%%m-%%d %%T‘) as Date,g.name as Group_Name,h.host as Host,round(max(hi.value_max)/1000,0) as Network  from hosts_groups hg join groups g on g.groupid = hg.groupid join items i on hg.hostid = i.hostid join hosts h on h.hostid=i.hostid join trends_uint hi on  i.itemid = hi.itemid  where  i.key_=‘net.if.in[%s]‘ and g.name like ‘%s‘ and hi.clock >= UNIX_TIMESTAMP(‘%s %s:00:00‘) and  hi.clock < UNIX_TIMESTAMP(‘%s %s:00:00‘) group by h.host;"%(i,room+"%",now_time,old_hour,now_time,now_hour)
            n=mysql_cur.execute(search_sql)
            result=mysql_cur.fetchall()
            for ii in result:
                msg1={‘Group_Name‘:ii[1],‘Host‘:ii[2],‘Network_device‘:i,‘Source‘:‘In‘}
                if msg1 not in in_results:
                    in_results.append(msg1)
                    msg={‘Date‘:ii[0],‘Group_Name‘:ii[1],‘Host‘:ii[2],‘Network‘:float(ii[3]),‘Network_device‘:i,‘Source‘:‘In‘}
                    last_results.append(msg)
        #search network out traffic
        for i in network_device:
            search_sql="select from_unixtime(hi.clock,‘%%Y-%%m-%%d %%T‘) as Date,g.name as Group_Name,h.host as Host,round(max(hi.value_max)/1000,0) as Network  from hosts_groups hg join groups g on g.groupid = hg.groupid join items i on hg.hostid = i.hostid join hosts h on h.hostid=i.hostid join trends_uint hi on  i.itemid = hi.itemid  where  i.key_=‘net.if.out[%s]‘ and g.name like ‘%s‘ and hi.clock >= UNIX_TIMESTAMP(‘%s %s:00:00‘) and  hi.clock < UNIX_TIMESTAMP(‘%s %s:00:00‘) group by h.host;"%(i,room+"%",now_time,old_hour,now_time,now_hour)
            n=mysql_cur.execute(search_sql)
            result=mysql_cur.fetchall()
            for ii in result:
                msg1={‘Group_Name‘:ii[1],‘Host‘:ii[2],‘Network_device‘:i,‘Source‘:‘out‘}
                if msg1 not in out_results:
                    out_results.append(msg1)
                    msg={‘Date‘:ii[0],‘Group_Name‘:ii[1],‘Host‘:ii[2],‘Network‘:float(ii[3]),‘Network_device‘:i,‘Source‘:‘out‘}
                    last_results.append(msg)
    time="%s-[%s-%s]"%(now_time,old_hour,now_hour)
    a=[]
    for i in last_results:
	if i[‘Network‘] >=10000:
	    msg=(i[‘Group_Name‘],i[‘Host‘],i[‘Network‘]/1000,i[‘Network_device‘],i[‘Source‘])
	    a.append(msg)
    sort_list=sorted(a,key=lambda d:d[2],reverse = True)
    wb = xlwt.Workbook()
    ws = wb.add_sheet(‘zabbix‘, cell_overwrite_ok=True)
    ws.write(0,0,‘报警组‘.decode("utf-8"))
    ws.write(0,1,‘主机‘.decode("utf-8"))
    ws.write(0,2,‘流量(Mbps)‘.decode("utf-8"))
    ws.write(0,3,‘网卡名‘.decode("utf-8"))
    ws.write(0,4,‘方向‘.decode("utf-8"))
    for i in range(1,len(sort_list)+1):
        for ii in range(0,len(sort_list[i-1])):
            ws.write(i,ii,sort_list[i-1][ii])
    ws.col(0).width = 3333*3
    ws.col(1).width = 3333
    wb.save(‘/tmp/zabbix_network_traffic-%s.xls‘%time)
    mysql_cur.close()
    mysql_conn.close()

运行的话,参数信息如下:

第一个参数是机房信息,比如我有2个机房,分别是A与B,我就想查看A机房的,那么第一个参数就写‘A‘;

第二个参数是开始时间,如09;

第三个参数是结束时间,如13;

比如我想查看A机房早上9点到下午13点的超过10m流量,那么可以使用

python check_zabbix_network_traffic.py ‘A‘ 09 13

默认输出目录是/tmp/,文件名格式是zabbix_network_traffic-当天-[开始时间-将结束时间],如zabbix_network_traffic-2015-08-19-[0-13].xls

效果为

报警组是zabbix里的报警组描述,主机就是ip信息,网卡名就是检测的网卡名,方向就是流入或者流出流量。

对于网卡名我在多描述一下,默认脚本里,网卡为em2、eth1、eth0

network_device=[‘em2‘,‘eth1‘,‘eth0‘]

为什么写这个呢,就是因为我这里主机网卡信息很混乱,比如openstack的云平台主机就一个网卡eth0,而centos5的网卡就是eth0于eth1,centos6 与centos7就都是em1与em2,就导致不通平台与不同系统,公网的设备名不一样,所以我这个脚本里做了判断,如果有em2网卡,就不检测eth1与eth0了,依次类推。

我写的目录就是为了快速查看依次流量,大家如果有其他的需求,可以自己根据需求改。

时间: 2024-10-11 16:19:35

zabbix企业应用之如何快速查看异常流量的相关文章

zabbix企业应用之优化监控CDN带宽

最近介绍了很多ansible的使用案例,这次就回归正轨,介绍如何使用zabbix监控CDN带宽,做到在带宽出现异常的时候及时知晓,访问带宽异常造成的经济损失. 这里以蓝汛CDN为例,监控的方法是通过CDN给与的api接口.备注:目前蓝汛api接口只能查看单独频道的带宽,无法查看所有频道的,并且频道id还需要你自己或者客服帮你查下,十分不方便. 1.api接口信息为: (一) 接口地址: https://api.chinacache.com/reportdata/monitor/query?typ

快速定位异常

net程序调试一:快速定位异常 作为一个程序员,解BUG是我们工作中常做的工作,甚至可以说解决问题能力是一个人工作能力的重要体现.因为这体现了一个程序员的技术水平.技术深度.经验等等. 那么在我们解决BUG的过程中,定位问题是非常重要的.有句话叫"发现问题是解决问题的一半. 本文讲述就快速定位异常(专指.NET程序异常)的方法.包括在本机定位异常,在客户环境定位.net程序异常,在客户环境定位SilverLight异常. 一:定位本机异常 在我们本机定位异常很容易.假设我们都是使用的的Visua

Java 集合快速失败异常

快速失败 在JDK中,查看集合有很多关于快速失败的描述: 注意,此实现不是同步的.如果多个线程同时访问一个哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须 保持外部同步.(结构上的修改是指添加或删除一个或多个映射关系的任何操作:仅改变与实例已经包含的键关联的值不是结构上的修改.)这一般通过对自然封装该映射的对象进行同步操作来完成.如果不存在这样的对象,则应该使用 Collections.synchronizedMap 方法来“包装”该映射.最好在创建时完成这一操作,以防止对映射进行意外

快速查看SQL Server 中各表的数据量以及占用空间大小

快速查看SQL Server 中各表的数据量以及占用空间大小. CREATE TABLE #T (NAME nvarchar(100),ROWS char(20),reserved varchar(18) ,Data varchar(18) ,index_size varchar(18) ,Unused varchar(18) ) GO INSERT #T EXEC SP_MSFOREACHTABLE 'EXEC sp_spaceused "?"' SELECT * FROM #T O

使用Debussy+ModelSim快速查看前仿真波形

引子:ModelSim是HDL仿真软件,Debussy是波形查看软件:搭配使用,相当爽.此处所谓快速查看前仿真波形仅为抛砖引玉,大家不要拘泥于此.两款软件的功能都很强大,请自行研究. 注:本篇博文的软件环境为:Debussy 5.3v9 + Modelsim SE 6.5 配置篇 1 安装.和谐软件.略. 2 拷贝文件..\Novas\Debussy\share\PLI\modelsim_pli\WINNT\novas.dll至文件夹..\modeltech_6.5\win32. 3 取消文件.

如何快速查看EPS,AI等矢量文件

使用Adobe Bridge可以快速查看所有这些格式的资源 查看EPS格式图片: 查看AI格式: ? 某些AI文件则无法预览(此外还有一些CDR的格式) ? 相比之下,ACDSee的效果则不如Adobe Bridge,同样的图片,可以显示预览图的更少. ?

Mac快速查看隐藏文件

使用终端 显示隐藏文件的最简单方法是使用终端.只要打开终端(位于应用程序--实用工具),将以下代码复制进去然后回车 defaults write com.apple.finder AppleShowAllFiles -bool YES Finder需要重启才能应用修改,在终端中接着输入 killall Finder 并回车 恢复隐藏不可见,在终端中输入以下代码并回车 defaults write com.apple.finder AppleShowAllFiles -bool NO 同样Find

Eclipse中如何快速查看jar包中 的class源码

我们查看jar源码时,一般是安装个jd-gui,把jar拷出来,然后从jd-gui中打开jar再查看源码,这个过程不免有些麻烦,当然,本篇所讲的快速查看的方法也没什么高科技手段,只是将jd-gui集成在Eclipse中,然后就可以在Eclipse中直接打开class了,这样会不但操作方便也会节省不少时间,具体步骤: 下载插件:jd-eclipse-site-1.0.0-RC2.zip 打开Eclipse-->Help-->Install New Software: 在Name框中命名,然后点击

MSSql使用SQL语句快速查看表对的就说明,及表字段描述及字段类型

--表描述 SELECT tbs.name 表名,ds.value 描述 FROM sys.extended_properties ds LEFT JOIN sysobjects tbs ON ds.major_id=tbs.id WHERE ds.minor_id=0 and tbs.name='Warrant_BaseInfo';--表名 --快速查看表结构 SELECT CASE WHEN col.colorder = 1 THEN obj.name ELSE '' END AS 表名,