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

用 Golang 采集 Nginx 接口流量大小

简介

在开发和运维中,我们经常需要监控和分析服务器的接口流量大小,特别是对于部署了 Nginx 的服务器。本文将介绍如何使用 Golang 采集 Nginx 接口流量大小,并展示如何将这些数据进行实时监控和分析。

步骤一:准备工作

在开始之前,我们需要进行一些准备工作。

  1. 安装 Golang:首先,确保您已经在服务器上安装了 Golang。可以从 Golang 官方网站 下载并按照官方文档进行安装。

  2. 安装 Nginx:如果您的服务器尚未安装 Nginx,请根据您的操作系统文档安装 Nginx。确保 Nginx 正确运行并监听相应的接口。

  3. 安装统计模块:我们将使用 Nginx 的统计模块来采集流量数据。可以在 Nginx 的第三方模块页面 找到相关的统计模块,并按照说明进行安装和配置。

步骤二:编写代码

现在,我们可以开始编写采集 Nginx 接口流量大小的代码了。

1. 获取 Nginx 统计数据

我们首先需要从 Nginx 的统计接口获取数据。可以使用 Golang 的 net/http 包发送 HTTP 请求并获取响应数据。

package mainimport ("fmt""io/ioutil""net/http"
)func main() {resp, err := http.Get("http://localhost/nginx_status")if err != nil {fmt.Println("获取 Nginx 统计数据失败:", err)return}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println("读取 Nginx 统计数据失败:", err)return}fmt.Println(string(body))
}

上述代码中,我们使用 http.Get 方法发送 HTTP GET 请求,并使用 ioutil.ReadAll 方法将响应数据读取到变量 body 中。您需要将 http://localhost/nginx_status 替换为您实际的 Nginx 统计接口地址。

2. 解析流量数据

接下来,我们需要解析 Nginx 统计数据中的流量大小。根据 Nginx 统计模块的文档,我们可以从响应数据中提取我们需要的信息。

package mainimport ("fmt""io/ioutil""net/http""strings"
)func main() {resp, err := http.Get("http://localhost/nginx_status")if err != nil {fmt.Println("获取 Nginx 统计数据失败:", err)return}defer resp.Body.Close()body, err := ioutil.ReadAll(resp.Body)if err != nil {fmt.Println("读取 Nginx 统计数据失败:", err)return}stats := string(body)lines := strings.Split(stats, "\n")for _, line := range lines {if strings.Contains(line, "Active connections") {fmt.Println(line)} else if strings.HasPrefix(line, "server accepts handled") {parts := strings.Fields(line)fmt.Println("接受的连接数:", parts[2])fmt.Println("处理的连接数:", parts[3])fmt.Println("已经完成的请求次数:", parts[4])} else if strings.HasPrefix(line, "Reading: ") {parts := strings.Fields(line)fmt.Println("正在读取的连接数:", parts[1])} else if strings.HasPrefix(line, "Writing: ") {parts := strings.Fields(line)fmt.Println("正在写入的连接数:", parts[1])} else if strings.HasPrefix(line, "Waiting: ") {parts := strings.Fields(line)fmt.Println("等待的连接数:", parts[1])}}
}

上述代码首先将响应数据按行拆分,并进行逐行解析。根据 Nginx 统计模块的文档,我们可以判断每一行的内容是哪些流量数据,并输出相应的信息。

3. 定时采集数据

为了实现实时监控和分析,我们可以使用 Golang 的 time 包定时采集数据,并将数据保存到文件或发送到服务器进行进一步分析。

package mainimport ("fmt""io/ioutil""net/http""strings""time"
)func main() {ticker := time.NewTicker(10 * time.Second)defer ticker.Stop()for range ticker.C {resp, err := http.Get("http://localhost/nginx_status")if err != nil {fmt.Println("获取 Nginx 统计数据失败:", err)continue}body, err := ioutil.ReadAll(resp.Body)resp.Body.Close()if err != nil {fmt.Println("读取 Nginx 统计数据失败:", err)continue}stats := string(body)lines := strings.Split(stats, "\n")for _, line := range lines {// 解析流量数据...}}
}

上述代码使用 time.NewTicker 创建一个定时器,每隔 10 秒钟采集一次数据。在每次定时器触发时,发送 HTTP 请求获取数据,并进行解析和处理。您可以根据需要调整定时器的间隔。

步骤三:数据监控和分析

最后,我们可以将采集到的数据进行实时监控和分析。您可以使用各种工具和库来实现这一点,如 ECharts、Grafana 等。在此处,我们以 ECharts 为例,展示如何实时展示流量数据。

package mainimport ("fmt""io/ioutil""net/http""strings""time""github.com/go-echarts/go-echarts/charts""github.com/go-echarts/go-echarts/opts""github.com/go-echarts/go-echarts/templates"
)var (activeConnections []opts.LineDataaccepts           []opts.LineDatahandled           []opts.LineDatarequests          []opts.LineDatareading           []opts.LineDatawriting           []opts.LineDatawaiting           []opts.LineData
)func main() {http.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {page := charts.NewPage()line := charts.NewLine()line.SetGlobalOptions(charts.InitOpts{PageTitle: "接口流量监控"},charts.ToolboxOpts{Show: true},charts.YAxisOpts{Name: "数量"},charts.XAxisOpts{Name: "时间"},)line.AddXAxis(timeValues())line.AddYAxis("Active Connections", activeConnections)line.AddYAxis("Accepts", accepts)line.AddYAxis("Handled", handled)line.AddYAxis("Requests", requests)line.AddYAxis("Reading", reading)line.AddYAxis("Writing", writing)line.AddYAxis("Waiting", waiting)page.Add(line)w.Header().Set("Content-Type", "text/html; charset=utf-8")page.Render(w)})go func() {ticker := time.NewTicker(10 * time.Second)defer ticker.Stop()for range ticker.C {resp, err := http.Get("http://localhost/nginx_status")if err != nil {fmt.Println("获取 Nginx 统计数据失败:", err)continue}body, err := ioutil.ReadAll(resp.Body)resp.Body.Close()if err != nil {fmt.Println("读取 Nginx 统计数据失败:", err)continue}stats := string(body)lines := strings.Split(stats, "\n")for _, line := range lines {// 解析流量数据...}line := charts.NewLine()line.SetGlobalOptions(charts.InitOpts{PageTitle: "接口流量监控"},charts.ToolboxOpts{Show: true},charts.YAxisOpts{Name: "数量"},charts.XAxisOpts{Name: "时间"},)line.AddXAxis(timeValues())line.AddYAxis("Active Connections", activeConnections)line.AddYAxis("Accepts", accepts)line.AddYAxis("Handled", handled)line.AddYAxis("Requests", requests)line.AddYAxis("Reading", reading)line.AddYAxis("Writing", writing)line.AddYAxis("Waiting", waiting)page := charts.NewPage()page.Add(line)s := templates.MustString(echartsTemplate, page)ioutil.WriteFile("index.html", []byte(s), 0644)}}()http.ListenAndServe(":8080", nil)
}func timeValues() []string {t := time.Now().Format("2006-01-02 15:04:05")return []string{t}
}const echartsTemplate = `
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>{{"{{.PageTitle}}"}}</title>{{ template "asset" . }}
</head>
<body>{{ template "js" . }}
</body>
</html>

上述代码使用了 go-echarts 库来生成 ECharts 实例,并将实时数据传递给相应的 ECharts 实例进行图表展示。在采集到数据后,我们可以将页面输出到一个 HTML 文件中,然后使用浏览器打开该文件以查看实时数据图表。

结论

通过以上步骤,我们成功地使用 Golang 采集了 Nginx 接口流量大小,并使用 ECharts 将数据进行实时监控和分析。你可以根据自己的需求和喜好,进一步完善和扩展这些代码。希望本文可以帮助您实现您的监控需求!

相关文章:

用 Golang 采集 Nginx 接口流量大小

简介 在开发和运维中&#xff0c;我们经常需要监控和分析服务器的接口流量大小&#xff0c;特别是对于部署了 Nginx 的服务器。本文将介绍如何使用 Golang 采集 Nginx 接口流量大小&#xff0c;并展示如何将这些数据进行实时监控和分析。 步骤一&#xff1a;准备工作 在开始…...

Linux java jar启停脚本(合并版)

#包文件路径及名称(目录按照各自配置) APP_NAME=/opt/whkc/gs/app-java.jar#查询进程,并杀掉当前jar/java程序 pid=`ps -ef|grep app-java.jar | grep -v grep | awk {print $2}` kill...

计算机毕业设计选题推荐-公共浴池微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

sqli-labs关卡13(基于post提交的单引号加括号的报错盲注)通关思路

文章目录 前言一、回顾第十二关知识点二、靶场第十三关通关思路1、判断注入点2、爆显位3、爆数据库名4、爆数据库表5、爆数据库列6、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;…...

SparkAi创作系统ChatGPT网站源码+详细搭建部署教程+AI绘画系统+支持GPT4.0+Midjourney绘画

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…...

shiro默认session设置永不超时

Shiro默认情况下session是有超时时间的&#xff0c;而不是永不超时。默认的超时时间是30分钟&#xff0c;可以通过修改Shiro的配置文件来更改超时时间。如果想要让session永不超时&#xff0c;可以将超时时间设置为一个很大的值&#xff0c;例如Integer.MAX_VALUE。 以下是修改…...

前端食堂技术周刊第 104 期:Angular v17、GPTs、Vue vapor mode、Svelte Flow、Bundler 的设计取舍

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;金奖乳鸽 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…...

list复制出新的list后修改元素,也更改了旧的list?

例子 addAll() Testpublic void CopyListTest(){Student student Student.builder().id(1).name("张三").age(23).classId(1).build();Student student2 Student.builder().id(2).name("李四").age(22).classId(1).build();List<Student> student…...

Qt绘制各种图形

重载绘图事件&#xff1a; protected:void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;void Widget::paintEvent(QPaintEvent *event) { 进行绘图操作 } 绘图前操作&#xff1a; //基本绘图QPainter painter(this);//创建QPainter对象painter.setRenderHint(QPa…...

NIO 笔记(二)Netty框架专题

【笔记来自&#xff1a;it白马】 Netty框架 前面我们学习了Java为我们提供的NIO框架&#xff0c;提供使用NIO提供的三大组件&#xff0c;我们就可以编写更加高性能的客户端/服务端网络程序了&#xff0c;甚至还可以自行规定一种通信协议进行通信。 NIO框架存在的问题 但是之…...

HTTP——

HTTP 请求报文的构成 如下图: 第一行:HTTP请求的方法,具体是POST方法还是GET方法,或是其它方法;URI就是你的HTTP请求的路径;后面是HTTP协议的版本; 第二行往下连续多行:这些是请求头部分,也就是请求的首部设置的一些信息,相当于对HTTP请求的一些设置; 空格行:在…...

第13章 Java IO流处理(二) 字节流与字符流

目录 内容说明 章节内容 1、I/O与流 2、输入流和输出流 3、字节流与字符流...

【论文阅读】(CTGAN)Modeling Tabular data using Conditional GAN

论文地址&#xff1a;[1907.00503] Modeling Tabular data using Conditional GAN (arxiv.org) 摘要 对表格数据中行的概率分布进行建模并生成真实的合成数据是一项非常重要的任务&#xff0c;有着许多挑战。本文设计了CTGAN&#xff0c;使用条件生成器解决挑战。为了帮助进行公…...

如何进行iOS技术博客的备案?

​ 如何进行iOS技术博客的备案&#xff1f; 标题&#xff1a;iOS技术博客备案流程及要求解析 摘要&#xff1a; 在本篇问答中&#xff0c;我们将为iOS技术博主介绍如何进行备案。如果你的iOS应用只包含简单的页面&#xff0c;并通过蓝牙进行数据采集和传输&#xff0c;那么你…...

RTSP/Onvif安防平台EasyNVR批量禁用/启用通道接口的详细操作步骤

TSINGSEE青犀视频安防监控平台EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等多种格式。在智慧安防等视频监控场景中&#xff0c;EasyNVR可提供视频实时监控直播、云端…...

2个器件,做1个恒流源

在项目中经常要用到恒流源&#xff0c;查找资料可以使用电压源芯片LM317构造一个电流源芯片。本文将电压源加上一个电阻改为电流源&#xff0c;这种设计思路可以扩展到其他类型的电源芯片上&#xff0c;如开关电源及其他类型的线性电源&#xff0c;关键点在于基准电压VREF的使用…...

SQL INSERT INTO SELECT 语句

SQL INSERT INTO SELECT 语句 使用SQL&#xff0c;您可以将信息从一个表中复制到另一个表中。 INSERT INTO SELECT 语句从表中复制数据&#xff0c;并将数据插入现有的表中。目标表中的任何现有行都不会受到影响。 SQL INSERT INTO SELECT 语法 我们可以将所有列从一个表中复制…...

Elasticsearch 在 Java 开发中的应用

Elasticsearch 在 Java 开发中的应用 Elasticsearch 是一个开源的分布式搜索引擎&#xff0c;广泛应用于全文搜索、日志分析等场景。本文将介绍 Elasticsearch 在 Java 开发中的基本使用和一些实际场景中的应用。 1. 引入 Elasticsearch 依赖 首先&#xff0c;需要在 Maven 或…...

linux 的uart驱动框架分析

文章目录 一、底层串行硬件驱动程序二、Console支持三、锁支持四、核心数据结构1、struct uart_driver2、struct uart_port3、struct uart_ops四、常用API总结五、uart驱动示例剖析1、原厂设计的uart驱动2、8250标准uart驱动六、总结🔺【linux内核系列文章】 👉对一些文章内…...

头歌答案HTML——基础

目录 HTML——基础 第1关&#xff1a;初识HTML&#xff1a;简单的Hello World网页制作 任务描述 第2关&#xff1a;HTML结构&#xff1a;自我简介网页 任务描述 HTML——基本标签 第1关&#xff1a;创建第一个 HTML 标签 任务描述 第2关&#xff1a;创建 任务描述 …...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...