现在主流监控软件和云平台提供的流量监控,监控粒度最小只能设置为1分钟,无法准确定位故障,特别是瞬时突发较大的业务

对比python的snmp库还是更喜欢用subprocess调用snmpwalk命令,脚本如下,前端可以使用脚本采集到的数据进行绘图

snmpwalk版本,系统需要安装 snmp snmp-mibs-downloader

 1 #! /usr/bin/env python
2 #-*-coding:utf-8-*-
3 import time,subprocess,re,signal,os,sys
4 class traffic:
5 def __init__(self,ip,port,community,interval):
6 try:
7 cmd_index = 'snmpwalk -v 2c -c %s %s ifDescr | grep -w %s'%(community,ip,port)
8 print(cmd_index)
9 portindex = subprocess.Popen(cmd_index,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()[0]
10 print(portindex)
11 ret = re.findall('ifDescr.\d+',portindex.decode('utf8'))[0]
12 print(ret)
13 portMIB = int(re.findall('\d+',ret)[0])
14 self.cmd_in='snmpwalk -v 2c -c %s %s ifHCInOctets.%s'%(community,ip,portMIB)
15 self.cmd_out='snmpwalk -v 2c -c %s %s ifHCOutOctets.%s'%(community,ip,portMIB)
16 self.interval = interval
17 except:
18 print('please check snmp and snmp-mibs-downloader')
19 print('-----------------examples-----------------------')
20 print('dpkg -l | grep snmp')
21 print('sudo > /etc/snmp/snmp.conf')
22 sys.exit(0)
23 def form(self,data):
24 ret = re.findall('Counter64:.*',data.decode('utf8'))[0]
25 ret = ret.split(':')[1].strip()
26 ret = round(int(ret)*8/1024/1024,2)
27 return ret
28 def snmp(self):
29 traffic_in = subprocess.Popen(self.cmd_in,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()[0]
30 traffic_out = subprocess.Popen(self.cmd_out,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE).communicate()[0]
31 traffic_in = self.form(traffic_in)
32 traffic_out = self.form(traffic_out)
33 return(traffic_in,traffic_out)
34 def gettraffic(self):
35 befo_in,befo_out = self.snmp()
36 time.sleep(self.interval)
37 after_in,after_out = self.snmp()
38 return ({'in':round((after_in-befo_in)/self.interval,2),'out':round((after_out-befo_out)/self.interval,2)})
39 def signal_handler(*args, **kwargs):
40 try:
41 if count!=0:
42 print('----------------------------end-----------------------------')
43 print(' min max avg')
44 print('incoming %sM %sM %sM'%(traffic_in_min,traffic_in_max,round(traffic_in_sum/count,2)))
45 print('outgoing %sM %sM %sM'%(traffic_out_min,traffic_out_max,round(traffic_out_sum/count,2)))
46 except:
47 os._exit(0)
48 os._exit(0)
49 if __name__ == "__main__":
50 signal.signal(signal.SIGINT, signal_handler)
51 traffic_in_max = 0
52 traffic_out_max = 0
53 traffic_in_min = 999999999999
54 traffic_out_min = 999999999999
55 traffic_in_sum = 0
56 traffic_out_sum = 0
57 count = 0
58 try:
59 host = sys.argv[1]
60 port = sys.argv[2]
61 community = sys.argv[3]
62 interval = int(sys.argv[4])
63 mx =traffic(host,port,community,interval)
64 print('-------------%s %s秒粒度流量监控------------------'%(host,interval))
65 while True:
66 ret = mx.gettraffic()
67 traffic_in = ret['in']
68 traffic_out = ret['out']
69 traffic_in_max = max(traffic_in,traffic_in_max)
70 traffic_out_max = max(traffic_out,traffic_out_max)
71 traffic_in_min = min(traffic_in,traffic_in_min)
72 traffic_out_min = min(traffic_out,traffic_out_min)
73 traffic_in_sum += traffic_in
74 traffic_out_sum += traffic_out
75 count+=1
76 print('traffic_in: %s Mbps'%traffic_in,'traffic_out: %s Mbps'%traffic_out)
77 except:
78 print('usage:')
79 print(' <host> <portMIB> <community> <interval>')
80 print('options:')
81 print(' host: <dest_ip>')
82 print(' portMIB <dest port>')
83 print(' community: <community>')
84 print(' interval: <get data interval>')
85 print('examples:')
86 print(' ./traffic 10.0.0.1 ge-0/0/46 public 5')

pysnmp版本 pip install pysnmp

  1 from pysnmp.hlapi import *
2 import time,os,signal,sys
3 class port_traffic_index:
4 def __init__(self,community,host,port):
5 self.community = community
6 self.host = (host,161)
7 self.port=port
8 #获取接口数量
9 @property
10 def index_count(self):
11 iterator = getCmd(SnmpEngine(),
12 CommunityData(self.community),
13 UdpTransportTarget(self.host),
14 ContextData(),
15 ObjectType(ObjectIdentity('IF-MIB', 'ifNumber', 0)))
16 errorIndication, errorStatus, errorIndex, varBinds = next(iterator)
17 for varBind in varBinds:
18 mib,count=[x.prettyPrint() for x in varBind]
19 return int(count)
20 #获取接口对应的mib index值
21 def port_index(self):
22 port_count = self.index_count
23 N,R=0,1000
24 iterator = bulkCmd(SnmpEngine(),
25 CommunityData(self.community),
26 UdpTransportTarget(self.host),
27 ContextData(),
28 N,R,
29 ObjectType(ObjectIdentity('IF-MIB','ifDescr')))
30 for x in range(port_count):
31 errorIndication, errorStatus, errorIndex, varBinds = next(iterator)
32 if errorIndication: # SNMP engine errors
33 print(errorIndication)
34 else:
35 if errorStatus: # SNMP agent errors
36 print('%s at %s' % (errorStatus.prettyPrint(), varBinds[int(errorIndex)-1] if errorIndex else '?'))
37 else:
38 for varBind in varBinds: # SNMP response contents
39 #接口mib与接口名称做为一个列表,分别赋值给mib,port
40 mib,port=[x.prettyPrint() for x in varBind]
41 if port == self.port:
42 mib1,mib_index=mib.split('.')
43 return int(mib_index)
44 #获取接口流量
45 def port_traffic(self,index):
46 iterator = getCmd(SnmpEngine(),
47 CommunityData(self.community),
48 UdpTransportTarget(self.host),
49 ContextData(),
50 ObjectType(ObjectIdentity('IF-MIB', 'ifHCInOctets', index)),
51 ObjectType(ObjectIdentity('IF-MIB', 'ifHCOutOctets', index)))
52 errorIndication, errorStatus, errorIndex, varBinds = next(iterator)
53 t_in,t_out = varBinds # SNMP response contents,有两个对象分别对应请求的mib
54 key_in,traffic_in=[x.prettyPrint() for x in t_in]
55 key_out,traffic_out=[x.prettyPrint() for x in t_out]
56 return int(traffic_in),int(traffic_out)
57
58 def get_traffic(self,port_index,interval):
59 inittraffic_in,inittraffic_out = self.port_traffic(port_index)
60 time.sleep(interval)
61 aftraffic_in,aftraffic_out = self.port_traffic(port_index)
62 traffic_in = round((aftraffic_in-inittraffic_in)*8/1024/1024/interval,2)
63 traffic_out = round((aftraffic_out-inittraffic_out)*8/1024/1024/interval,2)
64 return traffic_in,traffic_out
65
66 def signal_handler(*args, **kwargs):
67 try:
68 if count!=0:
69 print('----------------------------end-----------------------------')
70 print(' min max avg')
71 print('incoming %sM %sM %sM'%(traffic_in_min,traffic_in_max,round(traffic_in_sum/count,2)))
72 print('outgoing %sM %sM %sM'%(traffic_out_min,traffic_out_max,round(traffic_out_sum/count,2)))
73 except:
74 os._exit(0)
75 os._exit(0)
76
77 if __name__ == '__main__':
78 signal.signal(signal.SIGINT, signal_handler)
79 traffic_in_max = 0
80 traffic_out_max = 0
81 traffic_in_min = 999999999999
82 traffic_out_min = 999999999999
83 traffic_in_sum = 0
84 traffic_out_sum = 0
85 count = 0
86 try:
87 host = sys.argv[1]
88 port = sys.argv[2]
89 community = sys.argv[3]
90 interval = int(sys.argv[4])
91 traffic = port_traffic_index(community, host, port)
92 port_index = traffic.port_index()
93 while True:
94 traffic_in,traffic_out = traffic.get_traffic(port_index, interval)
95 traffic_in_max = max(traffic_in,traffic_in_max)
96 traffic_out_max = max(traffic_out,traffic_out_max)
97 traffic_in_min = min(traffic_in,traffic_in_min)
98 traffic_out_min = min(traffic_out,traffic_out_min)
99 traffic_in_sum += traffic_in
100 traffic_out_sum += traffic_out
101 count+=1
102 print('traffic_in: %s Mbps'%traffic_in,'traffic_out: %s Mbps'%traffic_out)
103 except:
104 print('usage:')
105 print(' <host> <portMIB> <community> <interval>')
106 print('options:')
107 print(' host: <dest_ip>')
108 print(' portMIB <dest port>')
109 print(' community: <community>')
110 print(' interval: <get data interval>')
111 print('examples:')
112 print(' ./pytraffic 10.0.0.1 ge-0/0/46 public 5')
113
114
115

效果如下

 1 $ ./traffic.py
2 usage:
3 <host> <port> <community> <interval>
4 options:
5 host: <dest_ip>
6 port <dest port>
7 community: <community>
8 interval: <get data interval>
9 examples:
10 ./traffic.py 10.0.0.1 ge-0/0/46 public 5
11
12
13 $ ./traffic.py 10.0.0.1 ge-0/0/46 public 5
14 -------------10.0.0.1 5秒粒度流量监控------------------
15 traffic_in: 7.65 Mbps traffic_out: 42.16 Mbps
16 traffic_in: 14.98 Mbps traffic_out: 51.32 Mbps
17 traffic_in: 13.96 Mbps traffic_out: 51.99 Mbps
18 traffic_in: 8.18 Mbps traffic_out: 44.42 Mbps
19 traffic_in: 8.99 Mbps traffic_out: 53.03 Mbps
20 traffic_in: 17.66 Mbps traffic_out: 49.03 Mbps
21 traffic_in: 47.14 Mbps traffic_out: 49.27 Mbps
22 traffic_in: 71.05 Mbps traffic_out: 50.45 Mbps
23 traffic_in: 72.73 Mbps traffic_out: 48.16 Mbps
24 ^C----------------------------end-----------------------------
25 min max avg
26 incoming 7.65M 72.73M 29.15M
27 outgoing 42.16M 53.03M 48.87M

python工具---snmp流量监控,自定义粒度,业务突发可视化的更多相关文章

  1. Linux网络流量监控与分析工具Ntopng

    Ntopng工具 Ntopng是一个功能强大的流量监控.端口监控.服务监控管理系统 能够实现高效地监控多台服务器网络 Ntopng功能介绍 Ntop提供了命令行界面和web界面两种工作方式,通过web ...

  2. 《UNIX/Linux网络日志分析与流量监控》新书发布

    本书从UNIX/Linux系统的原始日志(Raw Log)采集与分析讲起,逐步深入到日志审计与计算机取证环节.书中提供了多个案例,每个案例都以一种生动的记事手法讲述了网络遭到入侵之后,管理人员开展系统 ...

  3. SNMP远程监控进程信息的OID

    最近有个项目需要用snmp远程监控进程信息.于是我查了一下资料. 一.资料 .1.3.6.1.2.1.25.4.2.1.1.iso.org.dod.internet.mgmt.mib-2.host.h ...

  4. 《Unix/Linux日志分析与流量监控》书稿完成

    <Unix/Linux日志分析与流量监控>书稿完成 近日,历时3年创作的75万字书稿已完成,本书紧紧围绕网络安全的主题,对各种Unix/Linux系统及网络服务日志进行了全面系统的讲解,从 ...

  5. linux系统CPU,内存,磁盘,网络流量监控脚本

    前序 1,#cat /proc/stat/ 信息包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累积到当前时刻 2,#vmstat –s 或者#vmstat 虚拟内存统计 3, #cat ...

  6. python 开发练习之 监控

    本节内容 为什么要做监控? 常用监控系统设计讨论 监控系统架构设计 监控表结构设计 为什么要做监控? –熟悉IT监控系统的设计原理 –开发一个简版的类Zabbix监控系统 –掌握自动化开发项目的程序设 ...

  7. linux 网络和流量监控

    1.流量监控 工具iptraf 安装:sudo apt-get install iptraf 运行:sudo iptraf   2.网络监控扫描 参考:https://www.cnblogs.com/ ...

  8. 回忆--RYU流量监控

    RYU流量监控 前言 Ryu book上的一个流量监控的应用,相对比较好看懂 实验代码 github源码 from ryu.app import simple_switch_13 from ryu.c ...

  9. 搭建一个简单的基于web的网络流量监控可视化系统

    本文转载于我的个人博客,转载请标明出处. 初衷 在腾讯云的学生认证申请提交上去n天之后,终于得到了审批,所以迫不及待的想玩玩腾讯云,作为一个搞网络的,自然有一些关于网络应用的小玩意,所以把以前部署过的 ...

随机推荐

  1. List集合工具类之"将list集合按"指定长度"进行切分Lists.partition和ListUtils.partition"

    将list集合按"指定长度"进行切分,返回新的List<List<类型>>集合,如下的:  方法1:List<List<Integer>& ...

  2. 攻防世界PHP2

    PHP2 进入环境就一个英文其他啥都没有,英文也没啥提示信息 我们使用dirsearch扫描一下,一开始确实没扫到什么东西,到最后看了wp发现原来源码是在index.phps中,这里只提供一个思路,不 ...

  3. DASCTF Oct吉林工师web

    迷路的魔法少女 进入环境给出源码 <?php highlight_file('index.php'); extract($_GET); error_reporting(0); function ...

  4. Unity用Input.touches实现手机端多点触控

    多点触控的方法,两边的触控互不干扰: 主要采用Input.touches的相关属性进行操作: 而采用IPointerDrag接口会造成两个drag的相互干扰: 代码如下: using System.C ...

  5. C#编写一个简易的文件管理器

    编写一个简易的文件管理器,通过本次实验,练习 TreeView.ListView 和SplitContainer 控件的使用,同时熟悉 C#文件系统的操作方法以及 File 类和 Directory类 ...

  6. 用Java编写的猜拳小游戏

    学习目标: 熟练掌握各种循环语句 例题: 代码如下: // 综合案例分析,猜拳案例 // isContinue为是否开始游戏时你所输入的值 char isContinue; //y为开始,n为借宿 S ...

  7. mysql数据乱码

    更改数据库安装时的字符编码.打开mysql安装目录,找到my.ini文件,通过使用记事本的方式打开,将这里面的default-character-set=latin1修改成gbk,注意这里面有两处需要 ...

  8. EMS邮箱数据库全局监控设置

    案例任务:监控TestDB01邮箱数据库的所有邮件,监控邮箱为用户"王淑江"的邮箱. 1.EMS全局监控设置 使用PowerShell完成操作:"王淑江"监控T ...

  9. pytest-mark 参数化

    在类前或用例前用pytest.mark.parametrize ,可进行参数化 传参方式比较灵活,有很多种,下面是列出的几种方式,其他的可自行研究 @pytest.mark.parametrize(& ...

  10. SpringBoot注解自动扫描-底层实现

    分析上文Spring Boot快速入门 @SpringBootApplication public class HelloWorldApplication { public static void m ...