您好,登錄后才能下訂單哦!
因公司服務(wù)器上部署應(yīng)用較多,在有大并發(fā)訪問、業(yè)務(wù)邏輯有問題的情況下反復(fù)互相調(diào)用或者有異常流量訪問的時候,需要對業(yè)務(wù)應(yīng)用進(jìn)行故障定位,所以利用python調(diào)用iftop命令來獲取應(yīng)用進(jìn)程流量,結(jié)合zabbix,可幫助定位分析問題。,以下是腳本內(nèi)容,大概思路是:
#!/usr/bin/python
#coding=utf-8
#針對業(yè)務(wù)監(jiān)聽的端口流量進(jìn)行統(tǒng)計,忽略對隨機(jī)端口流量統(tǒng)計
#若針對突然流量增大,找到其進(jìn)程進(jìn)行告警,可以不做統(tǒng)計,獲取到流量進(jìn)行判斷,若大于多少閥值,則輸出
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參數(shù):-t 使用不帶ncurses的文本界面,-P顯示主機(jī)以及端口信息,-N只顯示連接端口號,不顯示端口對應(yīng)的服務(wù)名稱,-n 將輸出的主機(jī)信息都通過IP顯示,不進(jìn)行DNS解析,-s num num秒后打印一次文本輸出然后退出
mes = os.popen("iftop -t -P -N -n -s 2 2>/dev/null |grep -A 1 -E '^ [0-9]'").read()
#以換行符進(jìn)行分割
iftop_list = mes.split("\n")
count = len(iftop_list)
#定義字典 存放主機(jī)信息和進(jìn)出流量
flow_dict = {}
#定義列表,存放主機(jī)信息
host_ips = []
# 把主機(jī)加入數(shù)組,新的主機(jī)查詢是否在列表里面,沒有的話,把主機(jī)信息加入host_ips,并新組裝一個字典值加入flow_dict字典,如果host_ips存在主機(jī)信息,則把字典值取出來,重新計算增加流量數(shù)值,再加入字典flow_dict
#這里的 count/2 是iftop獲取到的數(shù)據(jù),是進(jìn)出流量為一組,則有count/2 個流量連接,可執(zhí)行os.popen 里面的iftop命令即可明白
for i in range(count/2):
flow_msg = ""
#獲取發(fā)送的ip地址(本地ip地址),端口(本地端口),發(fā)送的流量,以換行符分割后,數(shù)據(jù)偶數(shù)位為本地發(fā)送流量信息
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的隨機(jī)端口,因為公司業(yè)務(wù)應(yīng)用無大于10000,也可把這里去掉
port = host_ip.split(":")[1]
if int(port) < 10000:
#主機(jī)信息若不存在列表則加入host_ips,若存在,則字典取值,對進(jìn)出流量進(jìn)行相加
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(":")
#獲取字典里的發(fā)送接收流量
flow_dict_msg_send = float(flow_dict_msg_li[0])
flow_dict_msg_rec = float(flow_dict_msg_li[1])
#字典里面的發(fā)送接收流量和獲取到的新流量相加
flow_add_send = flow_dict_msg_send + send_flow_float
flow_add_rec = flow_dict_msg_rec + rec_flow_float
#把新得出的結(jié)果,更新到字典
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]為發(fā)送流量,flow_li[1]為接收流量,單位是Kb
print key + "|" + flow_li[0] + "|" + flow_li[1]
get_flow()
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。