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创建和使用字典实例详解
Nov 01 Python
python实现zencart产品数据导入到magento(python导入数据)
Apr 03 Python
python使用win32com库播放mp3文件的方法
May 30 Python
python实现Adapter模式实例代码
Feb 09 Python
TensorFlow的权值更新方法
Jun 14 Python
浅析python中的迭代与迭代对象
Oct 08 Python
matplotlib实现热成像图colorbar和极坐标图的方法
Dec 13 Python
python统计中文字符数量的两种方法
Jan 31 Python
Python使用修饰器进行异常日志记录操作示例
Mar 19 Python
python 并发编程 多路复用IO模型详解
Aug 20 Python
python3.8下载及安装步骤详解
Jan 15 Python
Python爬虫UA伪装爬取的实例讲解
Feb 19 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 include加载文件两种方式效率比较
2010/08/08 PHP
PHP字符过滤函数去除字符串最后一个逗号(rtrim)
2013/03/26 PHP
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
Laravel5.1 框架路由基础详解
2020/01/04 PHP
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
JavaScript设置首页和收藏页面的小例子
2013/11/11 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
jquery插件锦集【推荐】
2016/12/16 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
JavaScript数据类型和变量_动力节点Java学院整理
2017/06/26 Javascript
js下拉菜单生成器dropMenu使用方法详解
2017/08/01 Javascript
mockjs,json-server一起搭建前端通用的数据模拟框架教程
2017/12/18 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
2020/08/12 Javascript
JavaScript快速调试的两个技巧
2020/11/04 Javascript
vue3.0中友好使用antdv示例详解
2021/01/05 Vue.js
[05:43]VG.R战队教练Mikasa专访:为目标从未停止战斗
2016/08/02 DOTA
深入理解Django自定义信号(signals)
2018/10/15 Python
使用python3构建文件传输的方法
2019/02/13 Python
20行python代码实现人脸识别
2019/05/05 Python
python利用opencv实现SIFT特征提取与匹配
2020/03/05 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
新手常见Python错误及异常解决处理方案
2020/06/18 Python
全球度假村:Club Med
2017/11/27 全球购物
钳工实习自我鉴定
2013/09/19 职场文书
数控技术应届生求职信
2013/11/13 职场文书
cf战队收人广告词
2014/03/14 职场文书
市场拓展计划书
2014/05/03 职场文书
群众路线专项整治工作情况报告
2014/10/28 职场文书
好员工观后感
2015/06/17 职场文书
感恩教师节主题班会
2015/08/12 职场文书
2016元旦晚会主持人开场白和结束语
2015/12/03 职场文书
Python手拉手教你爬取贝壳房源数据的实战教程
2021/05/21 Python
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android