python脚本调用iftop 统计业务应用流量
admin
2023-03-06 06:43:02
0

因公司服务器上部署应用较多,在有大并发访问、业务逻辑有问题的情况下反复互相调用或者有异常流量访问的时候,需要对业务应用进行故障定位,所以利用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]为接收流量,单位是Kb
        print key + "|" + flow_li[0]  + "|" +  flow_li[1]

get_flow()

相关内容

热门资讯

全球科技巨头谷歌入驻广州 5月8日,据广州发布消息,近日全球科技巨头谷歌(Google)正式签订合同,入驻位于天河CBD珠江新...
首届“泉城杯”国际人形机器人全... 济南广电·天下泉城客户端5月8日讯一场跨越国界的智能体育盛宴即将燃爆泉城。2026年首届“泉城杯”国...
切尔诺贝利核禁区发生大火,过火... 新华社基辅5月8日电(记者李东旭)乌克兰国家紧急情况局8日说,切尔诺贝利核禁区发生大火,并受大风天气...
伊朗大使:不接受任何军事威胁下... 据凤凰卫视报道,5月8日,伊朗驻华大使馆召开记者会,大使法兹里在回应近期海湾局势时表示,伊朗日前向美...
国民党痛批赖清德:把司法当东厂... 据凤凰卫视报道,国民党和民众党联手否决了赖清德提名的检察机构负责人选,但赖清德并未重新提名新人选,而...
男子给婚外情对象转账22万余元... 男子谭某和妻子梁某在1991年结婚,婚后育有两女。2020年时,谭某结识女子贺某后,二人发生婚外情关...
钧正平:为什么说东京审判还没有... 今年是东京审判开庭80周年,我们在此回顾三个故事。东京审判现场。被偷走的骨灰1948年12月23日午...
国乒男团3比0韩国,晋级世乒赛... 北京时间5月8日,2026伦敦世乒赛男团1/4决赛,国乒男团以总比分3比0战胜韩国队,晋级半决赛。本...
美国公布首批UFO相关政府文件... 美国国防部5月8日公布了首批“与外星人、地外生命、不明空中现象(UAP)以及不明飞行物(UFO)相关...
外交部:日本军国主义侵略罪行罄... 在东京审判开庭80周年之际,《远东国际军事法庭庭审记录·全译本》日前在中国首发。外交部发言人林剑5月...