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
相关文章:
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]…...
技术分享:直播平台如何开发并接入美颜SDK
本篇文章,笔者将分享直播平台如何开发并接入美颜SDK的技术细节与步骤。 一、选择合适的美颜SDK 首先,选择一款适合的美颜SDK非常重要。市面上有很多优秀的美颜SDK供应商,选择时应考虑以下因素: 功能丰富性:支持美白…...
左耳听风_114_113_Go编程模式修饰器
你好,我是陈浩,我名多尔多house.之前呢我写过一篇文章叫做python修饰器的函数式编程。 那这种模式呢可以很轻松的把一些函数啊装配到另外一些函数上。 让你的代码呢更加简单,也可以让一些小功能性的代码复用性更高。 让代码中的函数呢可以…...
Java实习手册(小白也看得懂)
秃狼说 距离俺发布的学习路线已经六个月了,那我给小伙伴的学习周期是四五个月左右,我相信大多的小伙伴已经学习的差不多了。正好赶上暑期实习的阶段,在暑期找到实习就成为暑期的头等大事。 实习经验在校招的起到决定性的作用,所…...
Elasticsearch 分析器(Analyzer)的作用和配置
在Elasticsearch中,分析器(Analyzer)是文本处理的核心组件,它负责将输入的文本转换为可用于搜索和索引的词项(tokens)。这一过程涉及多个步骤,包括字符过滤、分词和标记过滤,共同决定…...
SpringBoot(一)创建一个简单的SpringBoot工程
Spring框架常用注解简单介绍 SpringMVC常用注解简单介绍 SpringBoot(一)创建一个简单的SpringBoot工程 SpringBoot(二)SpringBoot多环境配置 SpringBoot(三)SpringBoot整合MyBatis SpringBoot(四…...
简述Vue中的数据双向绑定原理
Vue中的数据双向绑定原理是Vue框架的核心特性之一,它通过数据劫持结合发布者-订阅者模式来实现。下面将详细阐述Vue中数据双向绑定的原理,并尽量按照清晰的结构进行归纳: 一、数据劫持 使用Object.defineProperty(): Vue在组件…...
C++STL函数对象的应用
STL函数对象 文章目录 STL函数对象1.基本概念2.使用方法1. 简单函数对象示例2. 函数对象作为算法参数3. Lambda表达式作为函数对象 2.一元谓词和二元谓词1.一元谓词2.二元谓词3.总结 3.算术仿函数1.使用示例2.Lambda表达式的替代 4.关系仿函数5.逻辑仿函数 C中的函数对象&#…...
AJAX-day1:
注:文件布局: 一、AJAX的概念: AJAX是浏览器与服务器进行数据通信的技术 >把数据变活 二、AJAX的使用: 使用axios库,与服务器进行数据通信 基于XMLHttpRequest封装,代码简单 Vue,React项目使用 学习…...
昆虫学(书籍学习资料)
包括昆虫分类(上下册)、昆虫生态大图鉴等书籍资料。...
springboot + mybatis 多数据源切换
参考的b站博主写的 配置文件: spring:datasource:db1:jdbc-url: jdbc:mysql://localhost:3306/interview_database?useUnicodetrue&characterEncodingutf-8&useSSLfalseusername: rootpassword: 12345driver-class-name: com.mysql.cj.jdbc.Driverdb2:jdbc-url: jdbc…...
windows电脑网络重置后wifi列表消失怎么办?
我们的电脑网络偶尔会出现异常,我们通常会下意识选择网络诊断,运行完诊断后一般会让我们选择重置网络,然而,重置后wifi列表突然消失,无法愉快地上网了,找了一圈,都说是更改适配器选项࿰…...
Python + 在线 + 文生音,音转文(中文文本转为英文语音,语音转为中文文本)
开源模型 平台:https://huggingface.co/ars-语言转文本: pipeline("automatic-speech-recognition", model"openai/whisper-large-v3", device0 ) hf: https://huggingface.co/openai/whisper-large-v3 github: https://github.com/openai/wh…...
哏号分治,CF103D - Time to Raid Cowavans
一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 103D - Time to Raid Cowavans 二、解题报告 1、思路分析 想了半天数据结构最终选择根号分治 我们考虑 大于 550 的公差直接暴力 小于550 的公差的所有询问,我们直接计算该公差后缀和…...
基于深度学习的图像背景剔除
在过去几年的机器学习领域,我一直想打造真正的机器学习产品。 几个月前,在参加了精彩的 Fast.AI 深度学习课程后,似乎一切皆有可能,我有机会:深度学习技术的进步使许多以前不可能实现的事情成为可能,而且开…...
Python使用(...)连接字符串
Python 字符串连接的灵活性。 使用括号来组织多行字符串时的自动拼接。 e e var_str g*3connect_str (fa{e}bcvar_strh )print(connect_str) print(type(connect_str)) 运行结果: aebcgggh <class str> 解释: 定义变量: e e:…...
鸿蒙:1.入门
概述 简介 鸿蒙操作系统(HarmonyOS)是华为公司发布的一款智能终端系统,是基于微内核的面向全场景的分布式操作系统。它致力于提供更加安全、高效、低延迟、低功耗的操作体验,可通过技术手段对应用程序和设备进行智能协同…...
【matlab】智能优化算法——求解目标函数
智能优化算法在求解目标函数方面发挥着重要作用,它通过迭代、筛选等方法来寻找目标函数的最优值(极值)。以下是关于智能优化算法求解目标函数的详细介绍: 一、智能优化算法概述 智能优化算法是一种搜索算法,旨在通过…...
不改代码,实现web.config或app.config的连接字符串加密解密
目的:加密字符串,防止明文显示。 好处:不用修改代码,微软自带功能,自动解密。 web.config 参考相关文章: Walkthrough: Encrypting Configuration Information Using Protected Configuration | Microso…...
Python创建MySQL数据库
一、使用Docker部署本地MySQL数据库 docker run --restartalways -p 3307:3306 --name mysql -e MYSOL_ROOT_PASSWORDlms123456 -d mysql:8.0.25 参数解析: 用户名:root 密码:lms123456 端口:3307 二、在Pycharm开发工具中配置连接MySQL数据库 三、安装zdppy_mysql pip inst…...
如何通过Windows Cleaner实现C盘空间释放:提升系统性能的完整指南
如何通过Windows Cleaner实现C盘空间释放:提升系统性能的完整指南 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否经常遇到C盘爆红的困扰&#…...
嵌入式设备参数存储方案设计与优化
嵌入式设备参数存储方案设计与实现1. 项目概述在嵌入式系统开发中,参数存储是一个基础但至关重要的功能模块。合理的参数存储方案直接影响产品的可靠性、可维护性和升级扩展能力。本文将深入分析嵌入式设备中常见的参数存储方案,重点解决结构体存储方式存…...
终极Vorpal错误恢复指南:7个关键策略构建健壮CLI应用
终极Vorpal错误恢复指南:7个关键策略构建健壮CLI应用 【免费下载链接】vorpal Nodes framework for interactive CLIs 项目地址: https://gitcode.com/gh_mirrors/vo/vorpal Vorpal是Node.js生态系统中构建交互式命令行应用的首选框架,提供了强大…...
函数信号发生器电路仿真、原理图及PCB设计
函数信号发生器电路仿真,原理图,PCB拆开手头的旧音响翻出几颗运放,突然想搞个函数信号发生器玩玩。这玩意儿说难不难,关键得让方波、三角波、正弦波乖乖听话。咱们今天直接从电路仿真干起,免得焊板子时炸电容。先上LTs…...
Unity3D物体缩放避坑指南:为什么你的Transform.localScale总是不生效?
Unity3D物体缩放避坑指南:为什么你的Transform.localScale总是不生效? 在Unity3D开发中,Transform.localScale属性看似简单,却隐藏着许多让开发者头疼的陷阱。不少开发者都遇到过这样的场景:明明代码里设置了localScal…...
5分钟掌握MPC Video Renderer:解锁专业级HDR视频渲染的完整解决方案
5分钟掌握MPC Video Renderer:解锁专业级HDR视频渲染的完整解决方案 【免费下载链接】VideoRenderer RTX HDR modded into MPC-VideoRenderer. 项目地址: https://gitcode.com/gh_mirrors/vid/VideoRenderer MPC Video Renderer是一款功能强大的开源DirectSh…...
原神帧率解锁技术突破:从性能瓶颈到效能释放的全流程优化指南
原神帧率解锁技术突破:从性能瓶颈到效能释放的全流程优化指南 【免费下载链接】genshin-fps-unlock unlocks the 60 fps cap 项目地址: https://gitcode.com/gh_mirrors/ge/genshin-fps-unlock 诊断性能瓶颈:揭开帧率限制的技术根源 识别帧率锁定…...
突破3大资源壁垒:UABEA工具实战指南
突破3大资源壁垒:UABEA工具实战指南 【免费下载链接】UABEA UABEA: 这是一个用于新版本Unity的C# Asset Bundle Extractor(资源包提取器),用于提取游戏中的资源。 项目地址: https://gitcode.com/gh_mirrors/ua/UABEA 当你…...
Unity LineRenderer不只是画线:5个实战案例教你做激光、轨迹与魔法特效
Unity LineRenderer实战进阶:从激光瞄准到魔法光束的5种创意实现 在Unity游戏开发中,LineRenderer常被简单地视为"画线工具",但它的潜力远不止于此。当我们将这个组件与物理系统、着色器技术和游戏逻辑相结合时,它能创造…...
DoubletFinder实战指南:精准识别单细胞测序中的双细胞干扰
1. 双细胞干扰:单细胞测序中的"隐形杀手" 做单细胞测序分析的朋友们应该都遇到过这种情况:明明细胞分群很清晰,但总有几个"奇怪"的cluster既表达A细胞标志物又表达B细胞特征。这种情况很可能就是遇到了双细胞干扰——两个…...
