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简单进程锁代码实例
Apr 27 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
Dec 08 Python
Python 中 Meta Classes详解
Feb 13 Python
搭建Python的Django框架环境并建立和运行第一个App的教程
Jul 02 Python
Python中列表和元组的使用方法和区别详解
Dec 30 Python
pandas值替换方法
Jul 10 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
Feb 11 Python
keras实现VGG16方式(预测一张图片)
Jul 07 Python
Python如何实现自带HTTP文件传输服务
Jul 08 Python
python学习笔记之多进程
Aug 06 Python
Appium+Python实现简单的自动化登录测试的实现
Jan 26 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
php下图片文字混合水印与缩略图实现代码
2009/12/11 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
JQuery教学之性能优化
2014/05/14 Javascript
node.js中的fs.symlinkSync方法使用说明
2014/12/15 Javascript
jQuery调用ajax请求的常见方法汇总
2015/03/24 Javascript
创建你的第一个AngularJS应用的方法
2015/06/16 Javascript
JavaScript截取、切割字符串的技巧
2016/01/07 Javascript
Javascript获取background属性中url的值
2016/10/17 Javascript
基于daterangepicker日历插件使用参数注意的问题
2017/08/10 Javascript
seajs中最常用的7个功能、配置示例
2017/10/10 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
JavaScript基于遍历操作实现对象深拷贝功能示例
2019/03/05 Javascript
vue中element 的upload组件发送请求给后端操作
2020/09/07 Javascript
浅析VUE防抖与节流
2020/11/24 Vue.js
跟老齐学Python之集合的关系
2014/09/24 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
python高阶爬虫实战分析
2018/07/29 Python
python三方库之requests的快速上手
2019/03/04 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
Python Django简单实现session登录注销过程详解
2019/08/06 Python
Pytorch 数据加载与数据预处理方式
2019/12/31 Python
python eventlet绿化和patch原理
2020/11/21 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
CSS3 transforms应用于背景图像的解决方法
2019/04/16 HTML / CSS
英国著名音像制品和图书游戏购物网站:Zavvi
2016/08/04 全球购物
美国孩之宝玩具官网:Hasbro Pulse
2019/06/24 全球购物
电大自我鉴定范文
2013/10/01 职场文书
社区活动总结
2015/02/04 职场文书
2015年小学开学寄语
2015/02/27 职场文书
2015年教师节感恩寄语
2015/03/23 职场文书
建议书的格式及范文
2015/09/14 职场文书
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python