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…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
