python脚本调用iftop 统计业务应用流量

因公司服务器上部署应用较多,在有大并发访问、业务逻辑有问题的情况下反复互相调用或者有异常流量访问的时候,需要对业务应用进行故障定位,所以利用python调用iftop命令来获取应用进程流量,结合zabbix,可帮助定位分析问题。,以下是脚本内容,大概思路是:

  1. 利用iftop命令 iftop -t -P -N -n -s 2 来获取流量信息
  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]为接收流量
        print key + "|" + flow_li[0]  + "|" +  flow_li[1]

get_flow()

原文地址:https://blog.51cto.com/zdhyw/2440716

时间: 2024-10-13 05:19:25

python脚本调用iftop 统计业务应用流量的相关文章

Python脚本调用C#代码数据交互示例(hello world)

原地址: http://www.djangochina.cn/forum.php?mod=viewthread&tid=247 随着项目的逐渐收尾, 对IronPython脚本也越来越熟悉,这里为IronPython脚本感兴趣但不入门的朋友写几篇使用心得,这是第一个:最简单的hello world程序.        首先,我们必须有一个IronPython脚本引擎库(IronPython.dll),我用的版本是V1.0,你可以在网上直接下到相关源码,编译后即生成IronPython.dll.1

ubuntu下python脚本调用有道词典API实现命令行查词

#!/usr/bin/env python #coding=utf-8 '''   python使用有道词典的API来实现命令行查词 ''' import urllib2 import json import sys  reload(sys) sys.setdefaultencoding('utf-8') key = '1096888977' keyfrom = 'bloketest' doctype = 'json' u = 'http://fanyi.youdao.com/openapi.d

python脚本: 双向统计文件字符、单词数、行数

#!/usr/bin/python import sys import os if len(sys.argv) == 1: data = sys.stdin.read() else: try: fn = sys.argv[1] except IndexError: print "please follow a argument at %s" %__file__ sys.exit() if not os.path.exists(fn): print "%s is not exi

IronPython脚本调用C#dll示例

上篇Python脚本调用C#代码数据交互示例(hello world)介绍了与C#紧密结合的示例,这里还将提供一个与C#结合更紧密的示例,直接调用C#编写的DLL.      我们还是沿用了上篇文章的代码(其实这里可以直接使用IronPython调试器进行联调了,没有必要再嵌入到C#了) 注意:scriptEngine.AddToPath(Application.StartupPath); 这句代码比较关键,设定dll文件所在的目录. using System; using System.Col

PHP 调用Python脚本

上次做用户反馈自动翻译,写了个python脚本,将日文的用户反馈翻译成中文,效果虽然可以,但其它不懂python的童鞋就没法使用了,所以搭了个web服务,让其他人可以通过网页访问查询.使用的是apache服务,具体环境(LAMP)搭建就不细说,主要分享php调用python脚本后台运行的处理. 1. PHP如何调用外部程序 首先要解决的问题就是php如何调用python脚本,在PHP中调用外部程序主要有两个函数,system和exec. system()原型:string system(stri

用 Python 脚本实现对 Linux 服务器的网卡流量监控

*这篇文章网上已经有相关代码,为了加深印象,我做了相关注释,希望对朋友们有帮助 工作原理:基于/proc文件系统 Linux 系统为管理员提供了非常好的方法,使其可以在系统运行时更改内核,而不需要重新引导内核系统,这是通过/proc 虚拟文件系统实现的./proc 文件虚拟系统是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做"/proc"),这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中(on the fly)改变设置(通过改变内核参

Python 远程调用脚本之 RPC

最近有个监控需求,需要远程执行集群每个节点上的脚本,并获取脚本执行结果,为了安全起见不需要账号密码登陆主机,要求只需要调用远程脚本模块的方法就能实现. 总结下python进行远程调用脚本方法: 登陆主机执行脚本,python模块支持如 pssh.pexpect.paramiko 以远程方法调用(不需要登陆主机),python模块 rpyc,支持分布式 socket 方式,稍显复杂,需要熟悉网络协议,起点比较高 rpyc支持远程调用.分布式计算,以较少代码量实现需复杂socket编程,本文主要介绍

C 语言调用python 脚本函数

刚好几个月前做过,C++ 函数里面先加载python 脚本,再调用 里面的 def 函数,我把代码贴出来,你在main 函数里面,调用getDataByScript 函数,另外相同目录下放一个 fuckTest.py ,我是centos6.7   编译 g++ -o test test.cpp -lpython2.7      callPython.h #include<Python.h> #include<string> using namespace std;   char*

Crontab里调用python脚本不成功的解决方案

crontab里经常会调用一些程序,但是很多时候调用python是不成功的,但是手动则是OK的,在看日志(/var/log/cron)的时候,却是显示正常,这种情况怎么破呢?其实主要就是这么几个地方: 1)轻易不要用if __name__ == "__main__": 很多主管都习惯让自己手下人把脚本写成模块化,然后潇洒的走一个整合,但是crontab对这个方法似乎不是很灵光,因为python运行的时候是从if __name__ == "__main__"开始执行,