当前位置: 首页 > 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;创建 任务描述 …...

基于鲸鱼优化算法改进XGBoost在MATLAB中的时间序列预测性能(迭代次数、最大深度和学习...

基于鲸鱼优化算法优化XGBoost(WOA-XGBoost)的时间序列预测 WOA-XGBoost时间序列 采用交叉验证抑制过拟合问题 优化参数为迭代次数、最大深度和学习率 matlab代码&#xff0c;注&#xff1a;暂无Matlab版本要求 -- 推荐 2016B 版本及以上 注&#xff1a;采用 XGBoost 工具箱&…...

ms-swift多模态训练:图文视频语音混合训练,速度提升100%+

ms-swift多模态训练&#xff1a;图文视频语音混合训练&#xff0c;速度提升100% 1. 多模态训练的新选择 在AI模型开发领域&#xff0c;多模态训练一直是个技术难题。传统方法需要分别处理文本、图像、视频和语音数据&#xff0c;然后手动对齐不同模态的特征表示&#xff0c;整…...

OFA-VE环境部署:Python 3.11+PyTorch+CUDA一站式配置手册

OFA-VE环境部署&#xff1a;Python 3.11PyTorchCUDA一站式配置手册 1. 引言&#xff1a;认识OFA-VE视觉推理系统 OFA-VE是一个基于阿里巴巴达摩院OFA大模型构建的多模态推理平台&#xff0c;专门用于分析图像内容与文本描述之间的逻辑关系。这个系统采用了现代化的赛博朋克视…...

SEO_SEO数据监控与分析的关键指标介绍

SEO数据监控与分析的关键指标介绍 在当今数字营销的世界里&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经成为了每个网站运营者和数字营销人员必不可少的技能。SEO数据监控与分析是SEO工作的重要环节&#xff0c;通过对关键指标的监控和分析&#xff0c;我们可以更好…...

别再用asyncio硬扛高并发了!无GIL环境下Python原生多线程性能翻倍的6个核心调优参数

第一章&#xff1a;Python无锁GIL环境下的并发模型演进全景Python长期以来受全局解释器锁&#xff08;GIL&#xff09;制约&#xff0c;导致多线程无法真正并行执行CPU密集型任务。近年来&#xff0c;随着CPython 3.12正式引入实验性“无GIL构建选项”&#xff08;--without-py…...

3个核心优势让研究者实现智能OCR全场景覆盖:Pix2Text开源替代方案详解

3个核心优势让研究者实现智能OCR全场景覆盖&#xff1a;Pix2Text开源替代方案详解 【免费下载链接】Pix2Text Pix In, Latex & Text Out. Recognize Chinese, English Texts, and Math Formulas from Images. 项目地址: https://gitcode.com/gh_mirrors/pi/Pix2Text …...

长上下文与RAG

读到一篇探讨RAG技术的文章&#xff0c;很受用&#xff0c;遂记录一下。核心结论&#xff1a;RAG不会被无限上下文取代。 原文地址&#xff1a;LLM无限上下文了&#xff0c;RAG&#xff08;Retrieval Augmented Generation&#xff09;还有意义吗&#xff1f; - 今日头条 以下…...

【QT】-- QT操作数据库

前言&#xff1a; Qt是C一个开发框架&#xff0c;具有跨平台特性。这篇是作者大二学习的时候做的笔记&#xff0c;有可能有错误&#xff0c;请各位批评指正。这篇记录QT操作数据库。欢迎大家收藏 关注&#xff0c;作者将会持续更新。 文章目录Qt 操作数据库QSqlDatabase数据库…...

嵌入式C语言状态机编程实践与优化

1. 状态机编程基础概念在嵌入式系统开发中&#xff0c;状态机(State Machine)是一种极其重要的编程范式。它通过定义系统可能处于的状态集合、状态之间的转换条件以及状态转换时执行的动作&#xff0c;来清晰地描述系统的行为逻辑。状态机之所以在嵌入式领域广泛应用&#xff0…...

Android设备指纹采集指南:从get_token协议看短视频SDK如何生成唯一设备ID

Android设备指纹生成机制深度解析&#xff1a;从基础原理到合规实践 在移动应用生态中&#xff0c;设备指纹技术扮演着至关重要的角色。它不仅关系到用户体验的连贯性&#xff0c;更是风控系统的基础支撑。本文将系统性地剖析Android平台下设备指纹的生成逻辑、技术实现方案以及…...