python指令碼呼叫iftop 統計業務應用流量

2021-10-01 20:24:31 字數 3117 閱讀 6346

因公司伺服器上部署應用較多,在有大併發訪問、業務邏輯有問題的情況下反覆互相呼叫或者有異常流量訪問的時候,需要對業務應用進行故障定位,所以利用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:

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呼叫iftop命令來獲取應用程序流量,結合zabbix,可幫助定位分析問題。以下是指令碼內容,大概思路是 利用iftop命令 iftop t p n...

Python 呼叫shell指令碼

python呼叫shell指令碼,有兩種方法 os.system cmd 或os.popen cmd 前者返回值是指令碼的退出狀態碼,後者的返回值是指令碼執行過程中的輸出內容。實際使用時視需求情況而選擇。現假定有乙個shell指令碼test.sh bin bash 1.echo hello worl...

Python呼叫MATLAB指令碼

可以通過python的介面呼叫多種語言,這非常適合於同時使用多種工具 多個平台的深度學習任務。python呼叫matlab的指令碼或函式,可以參考matlab官方說明文件get started with matlab engine api for python。簡言之,首先在matlab中安裝pyt...