python脚本调用iftop 统计业务应用流量的思路详解
Python  /  管理员 发布于 7年前   136
因公司服务器上部署应用较多,在有大并发访问、业务逻辑有问题的情况下反复互相调用或者有异常流量访问的时候,需要对业务应用进行故障定位,所以利用python调用iftop命令来获取应用进程流量,结合zabbix,可帮助定位分析问题。,以下是脚本内容,大概思路是:
#!/usr/bin/python#coding=utf-8#针对业务监听的端口流量进行统计,忽略对随机端口流量统计#若针对突然流量增大,找到其进程进行告警,可以不做统计,获取到流量进行判断,若大于多少阀值,则输出import osdef change_unit(unit): if "Mb" in unit: flow = float(unit.strip("Mb")) * 1024 return flow elif "Kb" in unit: flow = float(unit.strip("Kb")) return flow elif "b" in unit: flow = float(unit.strip("b")) / 1024 return flowdef get_flow(): #iftop参数:-t 使用不带ncurses的文本界面,-P显示主机以及端口信息,-N只显示连接端口号,不显示端口对应的服务名称,-n 将输出的主机信息都通过IP显示,不进行DNS解析,-s num num秒后打印一次文本输出然后退出 mes = os.popen("iftop -t -P -N -n -s 2 2>/dev/null |grep -A 1 -E '^ [0-9]'").read() #以换行符进行分割 iftop_list = mes.split("\n") count = len(iftop_list) #定义字典 存放主机信息和进出流量 flow_dict = {} #定义列表,存放主机信息 host_ips = []# 把主机加入数组,新的主机查询是否在列表里面,没有的话,把主机信息加入host_ips,并新组装一个字典值加入flow_dict字典,如果host_ips存在主机信息,则把字典值取出来,重新计算增加流量数值,再加入字典flow_dict #这里的 count/2 是iftop获取到的数据,是进出流量为一组,则有count/2 个流量连接,可执行os.popen 里面的iftop命令即可明白 for i in range(count/2): flow_msg = "" #获取发送的ip地址(本地ip地址),端口(本地端口),发送的流量,以换行符分割后,数据偶数位为本地发送流量信息 location_li_s = iftop_list[i*2] send_flow_lists = location_li_s.split(" ") #去空元素 while '' in send_flow_lists: send_flow_lists.remove('') host_ip = send_flow_lists[1] send_flow = send_flow_lists[3] send_flow_float = change_unit(send_flow) #print send_flow_lists #获取接收的流量 location_li_r = iftop_list[i*2+1] rec_flow_lists = location_li_r.split(" ") while '' in rec_flow_lists: rec_flow_lists.remove('') rec_flow = rec_flow_lists[3] rec_flow_float = change_unit(rec_flow) #去掉本地linux 大于10000的随机端口,因为公司业务应用无大于10000,也可把这里去掉 port = host_ip.split(":")[1] if int(port) < 10000: #主机信息若不存在列表则加入host_ips,若存在,则字典取值,对进出流量进行相加 if host_ip not in host_ips: host_ips.append(host_ip) flow_msg = str(float('%2.f' % send_flow_float)) + ":" + str(float('%.2f' % rec_flow_float)) flow_dict[host_ip]=flow_msg else: flow_dict_msg = flow_dict[host_ip] flow_dict_msg_li = flow_dict_msg.split(":") #获取字典里的发送接收流量 flow_dict_msg_send = float(flow_dict_msg_li[0]) flow_dict_msg_rec = float(flow_dict_msg_li[1]) #字典里面的发送接收流量和获取到的新流量相加 flow_add_send = flow_dict_msg_send + send_flow_float flow_add_rec = flow_dict_msg_rec + rec_flow_float #把新得出的结果,更新到字典 flow_msg = str(float('%.2f' % flow_add_send)) + ":" + str(float('%.2f' % flow_add_rec)) flow_dict[host_ip]=flow_msg for key in flow_dict: flow_li = flow_dict[key].split(":") #flow_li[0]为发送流量,flow_li[1]为接收流量,单位是Kb print key + "|" + flow_li[0] + "|" + flow_li[1]get_flow()
总结
以上所述是小编给大家介绍的python脚本调用iftop 统计业务应用流量的思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号