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…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...