python腳本調(diào)用iftop 統(tǒng)計(jì)業(yè)務(wù)應(yīng)用流量的思路詳解
因公司服務(wù)器上部署應(yīng)用較多,在有大并發(fā)訪問、業(yè)務(wù)邏輯有問題的情況下反復(fù)互相調(diào)用或者有異常流量訪問的時(shí)候,需要對業(yè)務(wù)應(yīng)用進(jìn)行故障定位,所以利用python調(diào)用iftop命令來獲取應(yīng)用進(jìn)程流量,結(jié)合zabbix,可幫助定位分析問題。,以下是腳本內(nèi)容,大概思路是:
- 利用iftop命令 iftop -t -P -N -n -s 2 來獲取流量信息
- 對獲取的流量信息進(jìn)行處理,單位換算,同一個(gè)應(yīng)用程序的所有鏈接流量進(jìn)行合計(jì)(因?yàn)橐粋€(gè)應(yīng)用會(huì)有很多鏈接,每一個(gè)鏈接都有流量,全部相加即可得出這個(gè)應(yīng)用的總流量)
#!/usr/bin/python #coding=utf-8 #針對業(yè)務(wù)監(jiān)聽的端口流量進(jìn)行統(tǒng)計(jì),忽略對隨機(jī)端口流量統(tǒng)計(jì) #若針對突然流量增大,找到其進(jìn)程進(jìn)行告警,可以不做統(tǒng)計(jì),獲取到流量進(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,并新組裝一個(gè)字典值加入flow_dict字典,如果host_ips存在主機(jī)信息,則把字典值取出來,重新計(jì)算增加流量數(shù)值,再加入字典flow_dict #這里的 count/2 是iftop獲取到的數(shù)據(jù),是進(jìn)出流量為一組,則有count/2 個(gè)流量連接,可執(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àn)楣緲I(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()
總結(jié)
以上所述是小編給大家介紹的python腳本調(diào)用iftop 統(tǒng)計(jì)業(yè)務(wù)應(yīng)用流量的思路詳解,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!
相關(guān)文章
Python Scrapy實(shí)戰(zhàn)之古詩文網(wǎng)的爬取
本文將利用Python中Scrapy框架,實(shí)現(xiàn)爬取古詩文網(wǎng)上的詩詞數(shù)據(jù),具體包括詩詞的標(biāo)題信息。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-05-05Python機(jī)器學(xué)習(xí)NLP自然語言處理基本操作詞袋模型
本文是Python機(jī)器學(xué)習(xí)NLP自然語言處理系列文章,帶大家開啟一段學(xué)習(xí)自然語言處理 (NLP) 的旅程。本篇文章主要學(xué)習(xí)NLP自然語言處理基本操作之詞袋模型2021-09-09Django admin管理工具TabularInline類用法詳解
這篇文章主要介紹了Django admin管理工具TabularInline類用法詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05Python中的函數(shù)式編程:不可變的數(shù)據(jù)結(jié)構(gòu)
今天小編就為大家分享一篇關(guān)于Python中的函數(shù)式編程:不可變的數(shù)據(jù)結(jié)構(gòu),小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-10-10解決Python 遍歷字典時(shí)刪除元素報(bào)異常的問題
下面小編就為大家?guī)硪黄鉀QPython 遍歷字典時(shí)刪除元素報(bào)異常的問題。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-09-09Python一階馬爾科夫鏈生成隨機(jī)DNA序列實(shí)現(xiàn)示例
這篇文章主要為大家介紹了Python實(shí)現(xiàn)一階馬爾科夫鏈生成隨機(jī)DNA序列示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Python函數(shù)參數(shù)分類使用與新特性詳細(xì)分析講解
在聲明函數(shù)的時(shí)候,一般會(huì)根據(jù)函數(shù)所要實(shí)現(xiàn)的功能來決定函數(shù)是否需要參數(shù)。在多數(shù)情況下,我們聲明的函數(shù)都會(huì)使用到參數(shù),這篇文章主要介紹了Python函數(shù)參數(shù)2023-01-01python把列表中的字符串轉(zhuǎn)成整型的3種方法詳解
這篇文章主要介紹了python把列表中的字符串轉(zhuǎn)成整型的3種方法詳解,python中在不同類型數(shù)據(jù)轉(zhuǎn)換方面是有標(biāo)準(zhǔn)庫的,使用非常方便,但是在開發(fā)中,經(jīng)常在list中字符轉(zhuǎn)成整形的數(shù)據(jù)方便遇到問題,需要的朋友可以參考下2023-07-07