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中xrange用法分析
Apr 15 Python
Python模块搜索概念介绍及模块安装方法介绍
Jun 03 Python
python中如何正确使用正则表达式的详细模式(Verbose mode expression)
Nov 08 Python
python实现批量解析邮件并下载附件
Jun 19 Python
python 随机生成10位数密码的实现代码
Jun 27 Python
springboot配置文件抽离 git管理统 配置中心详解
Sep 02 Python
Python的pygame安装教程详解
Feb 10 Python
安装多个版本的TensorFlow的方法步骤
Apr 21 Python
python下对hsv颜色空间进行量化操作
Jun 04 Python
Python模拟键盘输入自动登录TGP
Nov 27 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
tensorflow+k-means聚类简单实现猫狗图像分类的方法
Apr 28 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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
php 获取mysql数据库信息代码
2009/03/12 PHP
让CodeIgniter的ellipsize()支持中文截断的方法
2014/06/12 PHP
php提示Warning:mysql_fetch_array() expects的解决方法
2014/12/16 PHP
浅谈PHP中output_buffering
2015/07/13 PHP
PHP实现GIF图片验证码
2015/11/04 PHP
表单提交验证类
2006/07/14 Javascript
JS模拟面向对象全解(一、类型及传递)
2011/07/13 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
Jquery Validate 正则表达式实用验证代码大全
2013/08/23 Javascript
关于Javascript作用域链的八点总结
2013/12/06 Javascript
jquery操作checkbox实现全选和取消全选
2014/05/02 Javascript
JS控制HTML元素的显示和隐藏的两种方法
2016/09/27 Javascript
JS创建对象的写法示例
2016/11/04 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
浅谈$_FILES数组为空的原因
2017/02/16 Javascript
JavaScript 函数的定义-调用、注意事项
2017/04/16 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
2017/08/29 jQuery
JavaScript实现简单生成随机颜色的方法
2017/09/21 Javascript
element-ui 设置菜单栏展开的方法
2018/08/22 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
JavaScript ES 模块的使用
2020/11/12 Javascript
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
[33:33]完美世界DOTA2联赛PWL S2 FTD.C vs SZ 第二场 11.27
2020/11/30 DOTA
python开发之tkinter实现图形随鼠标移动的方法
2015/11/11 Python
基于python socketserver框架全面解析
2017/09/21 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
Python的赋值、深拷贝与浅拷贝的区别详解
2020/02/12 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
波兰补充商店:Muscle Power
2018/10/29 全球购物
美体小铺印度官网:The Body Shop印度
2019/10/17 全球购物
电子技术专业中专生的自我评价
2013/12/17 职场文书
大学四年职业生涯规划书范文
2014/01/02 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书