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 爬虫之超链接 url中含有中文出错及解决办法
Aug 03 Python
padas 生成excel 增加sheet表的实例
Dec 11 Python
python线程的几种创建方式详解
Aug 29 Python
Python3 使用selenium插件爬取苏宁商家联系电话
Dec 23 Python
Python导入模块包原理及相关注意事项
Mar 25 Python
python简单实现最大似然估计&amp;scipy库的使用详解
Apr 15 Python
Python selenium爬虫实现定时任务过程解析
Jun 08 Python
python更新数据库中某个字段的数据(方法详解)
Nov 18 Python
python 使用paramiko模块进行封装,远程操作linux主机的示例代码
Dec 03 Python
python 机器学习的标准化、归一化、正则化、离散化和白化
Apr 16 Python
利用python调用摄像头的实例分析
Jun 07 Python
Python实现抖音热搜定时爬取功能
Mar 16 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中显示格式化的用户输入
2006/10/09 PHP
MySQL GBK→UTF-8编码转换
2007/05/24 PHP
PHP面向对象概念
2011/11/06 PHP
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
PHP简单实现上一页下一页功能示例
2016/09/14 PHP
PHP数据库处理封装类实例
2016/12/24 PHP
js模拟点击事件实现代码
2012/11/06 Javascript
使用PHP+JQuery+Ajax分页的实现
2013/04/23 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
2014/11/02 Javascript
node.js中的fs.existsSync方法使用说明
2014/12/17 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
AngularJS $http post 传递参数数据的方法
2018/10/09 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
如何搭建一个完整的Vue3.0+ts的项目步骤
2020/10/18 Javascript
[02:25]DOTA2英雄基础教程 生死判决瘟疫法师
2013/12/06 DOTA
[54:30]Liquid vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[55:03]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第二场 11.20
2020/11/20 DOTA
[54:58]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第一场 11.25
2020/11/25 DOTA
python 布尔操作实现代码
2013/03/23 Python
python打开网页和暂停实例
2014/09/30 Python
Python实现合并字典的方法
2015/07/07 Python
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
python的pstuil模块使用方法总结
2019/07/26 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
高考考python编程是真的吗
2020/07/20 Python
CSS实现进度条和订单进度条的示例
2020/11/05 HTML / CSS
包装类的功能、种类、常用方法
2012/01/27 面试题
药学专业大专生的自我评价
2013/12/12 职场文书
统计系教授推荐信
2014/02/28 职场文书
个人批评与自我批评总结
2014/10/17 职场文书
教师先进个人材料
2014/12/17 职场文书