当前位置: 首页 > news >正文

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.lryc.cn/news/392286.html

相关文章:

  • 技术分享:直播平台如何开发并接入美颜SDK
  • 左耳听风_114_113_Go编程模式修饰器
  • Java实习手册(小白也看得懂)
  • Elasticsearch 分析器(Analyzer)的作用和配置
  • SpringBoot(一)创建一个简单的SpringBoot工程
  • 简述Vue中的数据双向绑定原理
  • C++STL函数对象的应用
  • AJAX-day1:
  • 昆虫学(书籍学习资料)
  • springboot + mybatis 多数据源切换
  • windows电脑网络重置后wifi列表消失怎么办?
  • Python + 在线 + 文生音,音转文(中文文本转为英文语音,语音转为中文文本)
  • 哏号分治,CF103D - Time to Raid Cowavans
  • 基于深度学习的图像背景剔除
  • Python使用(...)连接字符串
  • 鸿蒙:1.入门
  • 【matlab】智能优化算法——求解目标函数
  • 不改代码,实现web.config或app.config的连接字符串加密解密
  • Python创建MySQL数据库
  • 【C++】unordered系列容器的封装
  • matlab 超越椭圆函数图像绘制
  • 本地文件同步上传到Gitee远程仓库
  • RESTful Web 服务详解
  • 【ARMv8/v9 GIC 系列 5.3 -- 系统寄存器对中断的处理】
  • MUNIK解读ISO26262--系统架构
  • STM32第十五课:LCD屏幕及应用
  • Java--继承
  • Github与本地仓库建立链接、Git命令(或使用Github桌面应用)
  • c++之旅第十一弹——顺序表
  • 深入了解 PXE:定义、架构、原理、应用场景及常见命令体系