python脚本调用iftop 统计业务应用流量的思路详解


Posted in Python onOctober 11, 2019

因公司服务器上部署应用较多,在有大并发访问、业务逻辑有问题的情况下反复互相调用或者有异常流量访问的时候,需要对业务应用进行故障定位,所以利用python调用iftop命令来获取应用进程流量,结合zabbix,可帮助定位分析问题。,以下是脚本内容,大概思路是:

  • 利用iftop命令 iftop -t -P -N -n -s 2 来获取流量信息
  • 对获取的流量信息进行处理,单位换算,同一个应用程序的所有链接流量进行合计(因为一个应用会有很多链接,每一个链接都有流量,全部相加即可得出这个应用的总流量)
#!/usr/bin/python
#coding=utf-8
#针对业务监听的端口流量进行统计,忽略对随机端口流量统计
#若针对突然流量增大,找到其进程进行告警,可以不做统计,获取到流量进行判断,若大于多少阀值,则输出
import os
def 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 flow
def 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 统计业务应用流量的思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python中精确输出JSON浮点数的方法
Apr 18 Python
python实现查询苹果手机维修进度
Mar 16 Python
python实现网站的模拟登录
Jan 04 Python
JPype实现在python中调用JAVA的实例
Jul 19 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
python多线程使用方法实例详解
Dec 30 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
Feb 16 Python
python分别打包出32位和64位应用程序
Feb 18 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
May 11 Python
keras小技巧——获取某一个网络层的输出方式
May 23 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
python用字节处理文件实例讲解
Apr 13 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 #Python
python二进制读写及特殊码同步实现详解
Oct 11 #Python
Python+Tensorflow+CNN实现车牌识别的示例代码
Oct 11 #Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 #Python
python中对_init_的理解及实例解析
Oct 11 #Python
pandas数据处理进阶详解
Oct 11 #Python
结合OpenCV与TensorFlow进行人脸识别的实现
Oct 10 #Python
You might like
通达OA公共代码 php常用检测函数
2011/12/14 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
几行代码轻松实现PHP文件打包下载zip
2017/03/01 PHP
js对象的构造和继承实现代码
2010/12/05 Javascript
鼠标事件延时切换插件
2011/03/12 Javascript
FusionCharts图表显示双Y轴双(多)曲线
2012/11/22 Javascript
通过JQuery将DIV的滚动条滚动到指定的位置方便自动定位
2014/05/05 Javascript
JavaScript lastIndexOf方法入门实例(计算指定字符在字符串中最后一次出现的位置)
2014/10/17 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
实现JavaScript的组成----BOM和DOM详解
2016/05/18 Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
2017/05/19 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
bootstrap table支持高度百分比的实例代码
2018/02/28 Javascript
用vue-cli开发vue时的代理设置方法
2018/09/20 Javascript
inquirer.js一个用户与命令行交互的工具详解
2019/05/18 Javascript
layer 关闭指定弹出层的例子
2019/09/25 Javascript
Python实现把xml或xsl转换为html格式
2015/04/08 Python
Swift中的协议(protocol)学习教程
2016/07/08 Python
Python探索之静态方法和类方法的区别详解
2017/10/27 Python
Python机器学习算法库scikit-learn学习之决策树实现方法详解
2019/07/04 Python
Python 过滤错误log并导出的实例
2019/12/26 Python
python map比for循环快在哪
2020/09/21 Python
20行代码教你用python给证件照换底色的方法示例
2021/02/05 Python
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
Nike比利时官网:Nike.com (BE)
2019/02/07 全球购物
Linux机考试题
2015/10/16 面试题
优秀中学生事迹材料
2014/01/31 职场文书
参赛口号
2014/06/16 职场文书
学生打架检讨书
2014/10/20 职场文书
艺术节开幕词
2015/01/28 职场文书
九寨沟导游词
2015/02/02 职场文书
2015政治思想表现评语
2015/03/25 职场文书
2020年个人安全保证书参考模板
2020/01/08 职场文书
读《儒林外史》有感:少一些功利,多一些真诚
2020/01/19 职场文书
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python
Python类方法总结讲解
2021/07/26 Python