python脚本调用iftop 统计业务应用流量
因公司服务器上部署应用较多,在有大并发访问、业务逻辑有问题的情况下反复互相调用或者有异常流量访问的时候,需要对业务应用进行故障定位,所以利用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 全栈开发,Day94(Promise,箭头函数,Django REST framework,生成json数据三种方式,serializers,Postman使用,外部python脚本调用django)
昨日内容回顾 1. 内容回顾 1. VueX VueX分三部分 1. state 2. mutations 3. actions 存放数据 修改数据的唯一方式 异步操作 修改state中数据的步骤: ...
- celery 分布式异步任务框架(celery简单使用、celery多任务结构、celery定时任务、celery计划任务、celery在Django项目中使用Python脚本调用Django环境)
一.celery简介: Celery 是一个强大的 分布式任务队列 的 异步处理框架,它可以让任务的执行完全脱离主程序,甚至可以被分配到其他主机上运行.我们通常使用它来实现异步任务(async tas ...
- Python脚本调用C#代码数据交互示例(hello world)
原地址: http://www.djangochina.cn/forum.php?mod=viewthread&tid=247 随着项目的逐渐收尾, 对IronPython脚本也越来越熟悉,这 ...
- Python脚本调用Django内容
一.添加系统的环境变量 1.需要引用os模块中environ关键字,其中'mybbs.settings'表示是django项目下的setings文件 eg: import os os.environ[ ...
- python脚本调用外部程序的若干种方式以及利弊
脚本执行外部程序的常用几种方式: # os.popen(path)# subprocess.run(cmd,shell=True)# subprocess.check_call(cmd,shell = ...
- 外部python脚本调用django 手动清理session
调试orm 在django项目根目录下创建文件test_orm.py,它和manage.py是同级的 import os if __name__ == "__main__": # ...
- java和python互相调用
java和python互相调用 作者:xuaijun 日期:2017.1.1 python作为一种脚本语言,大量用于测试用例和测试代码的编写,尤其适用于交互式业务场景.实际应用中,很多网管系统 ...
- 计算python脚本的运行时间
首先说一下我遇到的坑,生产上遇到的问题,我调度Python脚本执行并监控这个进程,python脚本运行时间远远大于python脚本中自己统计的程序执行时间. 监控python脚本执行的时间是36个小时 ...
- IronPython脚本调用C#dll示例
上篇Python脚本调用C#代码数据交互示例(hello world)介绍了与C#紧密结合的示例,这里还将提供一个与C#结合更紧密的示例,直接调用C#编写的DLL. 我们还是沿用了上篇文章的 ...
随机推荐
- [单片机] ESP8266 开机自动透传
AT+CWMODE=1//设置WiFi工作在透传模式 AT+CWJAP_DEF="XX","YYY"//设置要链接的wifi名称.密码,并进行连接 //设置TC ...
- jquery 相同ID 绑定事件
本文链接:https://blog.csdn.net/lan_13217/article/details/84079441 http://hi.baidu.com/meneye/blog/item/1 ...
- Python实验案例
Python 运算符.内置函数 实验目的: 1.熟练运用 Python 运算符. 2.熟练运用 Python 内置函数.实验内容: 1.编写程序,输入任意大的自然数,输出各位数字之和. 2.编写程序, ...
- iOS 10.3+ 动态修改 App 图标
支持系统: iOS 10.3+ tvOS 10.2+ Apple 官方文档 官方 API: @interface UIApplication (UIAlternateApplicationIcons) ...
- 常用的vi的命令模式下的快捷命令
知识点 在VI命令模式下:y 表示拷贝, d 表示删除,p标识粘贴 1.删除 dw 表示删除从当前光标到光标所在单词结尾的内容. d0 表示删除从当前光标到光标所在行首的内容. d$ 表示删除从当前光 ...
- CF1067C Knights 构造
题目链接:https://codeforc.es/contest/1067/problem/C 题意:有一个无限大的棋盘,棋盘上初始放置了\(n\)个国际象棋马.如果某一个格子没有放马且能够被\(4\ ...
- Laravel 解决在ajax 请求下不能保存session的问题
Laravel 解决在ajax 请求下不能保存session的问题 \Session::put('isLogin',true); // 你要保存的session key \Session::put(' ...
- 关于jsp的action如何调用servlet的自定义方法
一.起因: 希望将同属于某个模块的简单功能整合到一起,不创建太多的servlet 二.问题描述: action或者method属性是否能直接调用自定义方法 三.补充知识点: 查询得知:servelet ...
- 自编C++游戏
背景 周末无聊,于是编了一个类似于cmd的小玩意. 可是越想越不对劲,所以把它改成了一个小游戏. 信息 语言:DEV_C++ 源代码已公布!! 打败GG 版本:1.0(正式版) 版本:1.5(番外) ...
- C#面向对象三大特性:多态
什么是多态 公司最近为了陶冶情操,养了几种动物(Animal),有猫(Cat).狗(Dog).羊(Sheep),这些动物都有共同的特性,会吃(Eat).会叫(Shout),但是它们吃的不同,叫的也不同 ...