golang實現網卡流量監控

獲取當前時刻一分鐘前的網卡流量排序

package mainimport ("fmt""github.com/mackerelio/go-osstat/network""log""net/http""sort""strconv""time"
)var arr []map[string]int
var arr2 []map[string]intfunc get(w http.ResponseWriter, r *http.Request) {w.Header().Set("Content-Type", "text/plain;charset=UTF-8")//獲取一分鐘前數據var m = make(map[string]int)var m2 = make(map[string]int)for mp := range arr[0:len(arr)] {for key, value := range arr[mp] {m[key] += value}}for mp := range arr[0:len(arr2)] {for key, value := range arr2[mp] {m2[key] += value}}//按值排序keys := make([]string, 0, len(m))for key, _ := range m {keys = append(keys, key)}sort.Slice(keys, func(i, j int) bool {return m[keys[i]]+m2[keys[i]] > m[keys[j]]+m2[keys[j]]})for _, key := range keys {fmt.Fprintf(w, key+" 接收流量"+strconv.Itoa(m[key]/60)+"B/s"+" 發送流量"+strconv.Itoa(m2[key]/60)+
"B/S"+"\n")}
}func fun() {var mp = make(map[string]int)var mp2 = make(map[string]int)for {beforeStats, _ := network.Get()// 等待1秒鐘time.Sleep(1 * time.Second)afterStats, _ := network.Get()for _, item := range beforeStats {mp[item.Name] -= int(item.RxBytes)mp2[item.Name] -= int(item.TxBytes)}for _, item := range afterStats {mp[item.Name] += int(item.RxBytes)mp2[item.Name] += int(item.TxBytes)//fmt.Println(item.Name, item.RxBytes, mp[item.Name])}arr = append(arr, mp)arr2 = append(arr2, mp2)if len(arr) == 61 {arr = arr[1:61]}if len(arr2) == 61 {arr2 = arr2[1:61]}}}
func main() {go fun()http.HandleFunc("/hello", get)if err := http.ListenAndServe(":8080", nil); err != nil {log.Fatal(err)}}

獲取指定網卡在某時刻前一分鐘的網卡流量

package mainimport ("fmt""github.com/mackerelio/go-osstat/network""log""net/http""strconv""sync""time"
)type Record struct {arr         map[string]map[string]intarr2        map[string]map[string]intrecord_Time intmutex       sync.Mutex
}var record = Record{arr:         make(map[string]map[string]int),arr2:        make(map[string]map[string]int),record_Time: 1000,mutex:       sync.Mutex{},
}func get(w http.ResponseWriter, r *http.Request) {record.mutex.Lock()defer record.mutex.Unlock()w.Header().Set("Content-Type", "text/plain;charset=UTF-8")queryParams := r.URL.Query()queryTime := queryParams.Get("time")queryInterface := queryParams.Get("interface")//獲取指定時間一秒前的流量in_Speed := record.arr[queryTime][queryInterface]out_Speed := record.arr2[queryTime][queryInterface]fmt.Fprintf(w, queryTime+"入口流量"+strconv.Itoa(in_Speed)+" B/s 出口流量"+strconv.Itoa(out_Speed)+"B/s\n")
}func fun() {for {var mp = make(map[string]int)var mp2 = make(map[string]int)record.mutex.Lock()beforeStats, _ := network.Get()// 等待1秒鐘time.Sleep(1 * time.Second)afterStats, _ := network.Get()//獲取一秒內的流量for _, item := range beforeStats {mp[item.Name] -= int(item.RxBytes)mp2[item.Name] -= int(item.TxBytes)}for _, item := range afterStats {mp[item.Name] += int(item.RxBytes)mp2[item.Name] += int(item.TxBytes)}//記錄每個時間點的流量now := time.Now().String()[0:19]record.arr[now] = mprecord.arr2[now] = mp2fmt.Println(now)record.mutex.Unlock()}
}
func main() {go fun()http.HandleFunc("/get", get)if err := http.ListenAndServe(":8080", nil); err != nil {log.Fatal(err)}
}

改進版:定時任務

package mainimport ("fmt""github.com/mackerelio/go-osstat/network""github.com/spf13/viper""log""net/http""os""strconv""sync""time"
)type Record struct {arr      map[string]map[string]intarr2     map[string]map[string]intmutex    sync.MutexstopChan chan boolticker   time.Ticker
}var record = Record{arr:      make(map[string]map[string]int),arr2:     make(map[string]map[string]int),mutex:    sync.Mutex{},stopChan: make(chan bool, 3),ticker:   *time.NewTicker(time.Second),
}func get(w http.ResponseWriter, r *http.Request) {//加互斥鎖record.mutex.Lock()defer record.mutex.Unlock()w.Header().Set("Content-Type", "text/plain;charset=UTF-8")queryParams := r.URL.Query()queryTime := queryParams.Get("time")queryInterface := queryParams.Get("name")//獲取指定時間一秒前的流量in_Speed := record.arr[queryTime][queryInterface]out_Speed := record.arr2[queryTime][queryInterface]fmt.Fprintf(w, queryTime+"入口流量"+strconv.Itoa(in_Speed)+" B/s 出口流量"+strconv.Itoa(out_Speed)+"B/s\n")
}func fun() {//讀取配置viper.SetConfigName("config")viper.SetConfigType("yml")viper.AddConfigPath(".")viper.ReadInConfig()//日志輸出位置f, err := os.OpenFile("log.log", os.O_CREATE|os.O_APPEND|os.O_RDWR, os.ModePerm)if err != nil {return}defer func() {f.Close()}()log.SetOutput(f)beforeStats, _ := network.Get()for {//非阻塞通道讀取select {case <-record.stopChan:log.Println("停止記錄網卡流量")returncase <-record.ticker.C:var mp = make(map[string]int)var mp2 = make(map[string]int)//互斥鎖record.mutex.Lock()afterStats, _ := network.Get()for _, item := range beforeStats {mp[item.Name] -= int(item.RxBytes)mp2[item.Name] -= int(item.TxBytes)}for _, item := range afterStats {mp[item.Name] += int(item.RxBytes)mp2[item.Name] += int(item.TxBytes)}beforeStats = afterStatsnow := time.Now().String()[0:19]//超出后刪除最久的元素if len(record.arr) > viper.GetInt("record.time") {lastTime, _ := time.Parse("2006-01-02 15:04:05", now)last := lastTime.Add(-time.Second * time.Duration(viper.GetInt("record.time"))).String()[0:19]delete(record.arr, last)log.Println("刪除時間點:" + last)}record.arr[now] = mprecord.arr2[now] = mp2log.Println("已記錄時間點:" + now + "入口流量:" + strconv.Itoa(mp["en0"]) + "出口流量:" + strconv.Itoa(mp2["en0"]))record.mutex.Unlock()}}
}
func main() {//多線程go fun()http.HandleFunc("/get", get)//開啟服務器if err := http.ListenAndServe(viper.GetString("server.port"), nil); err != nil {log.Fatal(err)}
}

客戶端測試代碼

package main_testimport ("fmt""github.com/spf13/viper""io""net/http""net/url""testing"
)func Test(t *testing.T) {//配置日志viper.SetConfigName("config")viper.SetConfigType("yml")viper.AddConfigPath(".")viper.ReadInConfig()//拼接urltargetUrl := "http://" +viper.GetString("server.host") +viper.GetString("server.port") + "/get"u, _ := url.ParseRequestURI(targetUrl)data := url.Values{}data.Set("name", viper.GetString("test.name"))data.Set("time", viper.GetString("test.time")[0:19])u.RawQuery = data.Encode()req, _ := http.NewRequest("GET", u.String(), nil)//設置user-agentreq.Header.Set("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36")client := &http.Client{}resp, _ := client.Do(req)defer resp.Body.Close()//獲取返回結果body, _ := io.ReadAll(resp.Body)fmt.Println(string(body))
}

config.yml

server:port::8080host:localhost
record:time:100
test:name:en0time:2024-07-04 10:17:51

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/39357.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/39357.shtml
英文地址,請注明出處:http://en.pswp.cn/web/39357.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2024最新PyCharm安裝教程(附激活碼)

今天講解的是PyCharm安裝教程 一、軟件簡介 PyCharm是一款Python IDE&#xff0c;其帶有一整套可以幫助用戶在使用Python語言開發時提高其效率的工具&#xff0c;比如&#xff0c; 調試、語法高亮、Project管理、代碼跳轉、智能提示、自動完成、單元測試、版本控制等等。此外…

字符串和正則表達式踩坑

// 中石化加油卡號格式&#xff1a;以 100011 開頭共19位public static final String ZHONGSHIYOU_OIL_CARD_PATTERN "^100011\\d{13}$";// 中石油加油卡號格式&#xff1a;以90、95、70開頭共16位public static final String ZHONGYOU_OIL_CARD_PATTERN "^(9…

使用 urllib OpenSSL 時遇到的問題及解決

題意&#xff1a; ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1, currently the ssl module is compiled with LibreSSL 2.8.3 當前使用的 urllib3 版本&#xff08;v2.0&#xff09;僅支持 OpenSSL 1.1.1 或更高版本&#xff0c;但你的 Python 環境中的 ssl 模塊…

安裝opencv-python出錯,怎么辦?

安裝opencv-python出錯 解決方法&#xff1a; 具體版本號&#xff0c;python3.6對應的就是4.3.0.38 pip install opencv-python4.3.0.38 -i https://pypi.tuna.tsinghua.edu.cn/simple

《夢醒蝶飛:釋放Excel函數與公式的力量》8.5 COUNTIFS函數

8.5 COUNTIFS函數 COUNTIFS函數是Excel中的一種多條件計數函數&#xff0c;用于統計同時滿足多個條件的單元格數量。它是COUNTIF函數的增強版&#xff0c;允許在一個函數中使用多個條件。 8.5.1 函數簡介 COUNTIFS函數用于統計符合多個條件的單元格數量。它在數據分析中非常…

opencv學習總結

Mat類學習 Opencv中的數據類型與我們常用的數據類型的一一對應關系:Mat_<uchar>->CV_8U;Mat_<char>->CV_8S;Mat_<short>->CV_16S;Mat_<ushort>->CV_16U;Mat_<int>->CV_32S;Mat_<float>->CV_32F;Mat_<double>-&g…

Sentinel鏈路流控模式失效的解決方法

解決方法 1、在pom.xml中增加sentinel-web-servlet的依賴&#xff0c;我使用的版本是1.7.1 <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-web-servlet</artifactId> </dependency>2、在項目中添加一個FilterCon…

uniapp應用如何實現傳感器數據采集和分析

UniApp是一種跨平臺的應用開發框架&#xff0c;它支持在同一份代碼中同時開發iOS、Android、H5等多個平臺的應用。在UniApp中實現傳感器數據采集和分析的過程可以分為以下幾個步驟&#xff1a; 引入相關插件或庫 UniApp通過插件或庫的形式擴展功能。對于傳感器數據采集和分析&…

1679. K 和數對的最大數目

1679. K 和數對的最大數目 題目鏈接&#xff1a;1679. K 和數對的最大數目 代碼如下&#xff1a; class Solution { public://雙指針法int maxOperations(vector<int>& nums, int k) {if(nums.size()<1) return 0;sort(nums.begin(),nums.end());int res0;int…

MySQL 9.0 GA 來了!

2024 年 7 月 2 日&#xff0c;MySQL 9.0 GA 版本正式發布。還記得 MySQL 8.0 版本正式發布于 2018 年 4 月 19 日&#xff0c;中間經過了 6 年之久&#xff0c;MySQL 官方終于發布了大版本號變更得 9.0 版本&#xff0c;接下來由我給大家介紹 MySQL 在 9.0 版本中有哪些新的變…

C++學習筆記---POCO庫

在Windows系統中安裝POCO 1&#xff09;安裝OpenSSL POCO編譯安裝依賴OpenSSL&#xff0c;如果未安裝OpenSSL則應該先安裝OpenSSL。 假設將OpenSSL安裝在C:\OpenSSL-Win64&#xff0c;將C:\OpenSSL-Win64、C:\OpenSSL-Win64\lib添加到PATH環境變量中2&#xff09;安裝POCO 將p…

C++11新特性【下】{lambda表達式、可變模板參數、包裝器}

一、lambda表達式 在C98中&#xff0c;如果想要對一個數據集合中的元素進行排序&#xff0c;可以使用std::sort方法。如果待排序元素為自定義類型&#xff0c;需要用戶定義排序時的比較規則&#xff0c;隨著C語法的發展&#xff0c;人們開始覺得上面的寫法太復雜了&#xff0c…

深入理解Git:checkout的本質與原理深度解析

在Git的版本控制世界中&#xff0c;checkout是一個極其重要且功能豐富的命令&#xff0c;它貫穿于日常開發的各個環節。然而&#xff0c;隨著Git版本的更新迭代&#xff0c;checkout的功能逐漸被新的命令如switch和restore所分解&#xff0c;但這并不妨礙我們深入理解其本質與原…

#練習 #綜合 LinuxC高級

一、選擇題 1.常見的Linux發行版本有很多&#xff0c;下面不是Linux發行版本的是( ) A. Red Hat Linux B. Ubuntu Linux C.X Window D.SuSE Linux 答案 2.下面不是對Linux操作系統特點描述的是( ) A.良好的可移植性 B.單用戶 C.多用戶 D.多任務 答案…

1-訊飛星火大模型API調用示例解析

1官網鏈接 比賽官網&#xff1a;2024 iFLYTEK A.I.開發者大賽-訊飛開放平臺 (xfyun.cn)&#xff1b;控制臺官網&#xff1a;控制臺-訊飛開放平臺 (xfyun.cn)&#xff1b; 2星火模型python調用示例 示例鏈接&#xff1a;https://xfyun-doc.xfyun.cn/lc-sp-PythonDemo-17163704…

了解MySQL【事務】的功能:確保數據完整性的關鍵技術

在數據庫管理中&#xff0c;事務是確保數據完整性和一致性的核心機制。特別是對MySQL這樣廣泛應用的開源數據庫系統&#xff0c;掌握事務的使用至關重要。在這篇文章中&#xff0c;我們將全面探討MySQL事務的工作原理、ACID屬性、隔離級別以及最佳實踐&#xff0c;從而幫助開發…

寶塔Linux面板配置環境 + 創建站點

一、安裝 &#xff08;1&#xff09;進入寶塔官網 https://www.bt.cn/new/index.html &#xff08;2&#xff09;點擊“ 立即免費安裝 ”&#xff0c;選擇 Centos安裝腳本 &#xff08;3&#xff09;進入 ssh 輸入以下命令安裝寶塔 yum install -y wget && wget -O …

實驗三 SQL Server SSMS工具添加數據

1、打開ecommerce數據庫&#xff0c;向表中分別錄入以下數據信息 &#xff08;1&#xff09;商品類別表category catno catname describe 101 手機 各種品牌、型號手機 201 激光打印機 各種激光打印機 202 噴墨打印機 各種噴墨打印機 301 平板電腦 各種平板電腦…

Python后端面試題

1. 文件操作w和r的區別 在Python中&#xff0c;文件操作模式中的w和r都表示對文件的讀寫操作&#xff0c;但它們在打開文件時的行為有所不同&#xff1a; r模式&#xff1a; 讀寫&#xff1a;這種模式允許你同時讀取和寫入文件。文件必須已經存在&#xff0c;否則會拋出一個Fi…

思看科技募資額驟降:對賭壓力下巨額分紅,還購買 7項商業房產

《港灣商業觀察》施子夫 6月11日&#xff0c;證監會網站披露思看科技&#xff08;杭州&#xff09;股份有限公司&#xff08;以下簡稱&#xff0c;思看科技&#xff09;的首輪審核問詢函回復意見并更新2023年財務數據&#xff0c;繼續推進上市進程。 公開信息顯示&#xff0c…