用 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 将数据进行实时监控和分析。你可以根据自己的需求和喜好,进一步完善和扩展这些代码。希望本文可以帮助您实现您的监控需求!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/140319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app——項目day01

配置uni-app開發環境 uni-app快速上手 | uni-app官网 创建项目 图中四个划线就是要配置的地方. 选择vue2还是vue3看个人选择。 目录结构 但是现在新版本创建的项目已经没有components目录了&#xff0c;需要自己创建。 项目运行到微信开发者工具 使用git管理项目 node-mod…

10 个拿来就用的 Shell 脚本实例!

脚本 1&#xff1a;该脚本用于读取Linux系统/etc/passwd文件中的所有/bin/bash作为登录默认Shell的用户列表&#xff0c;并提取每个用户的用户名。对于这些用户名进行检查&#xff0c;是否不等于root和tidb。如果用户名不等于root和tidb&#xff0c;则使用usermod命令对该用户的…

nodejs之 crypto-js模块,浏览器端加解密算法库

一、简介 CryptoJS是一个JavaScript加密算法库&#xff0c;用于实现各种加密算法和哈希函数。它提供了一种简单而强大的方式来执行加密操作&#xff0c;包括对称加密算法、非对称加密算法和哈希函数等。 CryptoJS支持的主要功能包括&#xff1a; 1.对称加密&#xff1a;Crypto…

async/await

异步的终极解决方案&#xff1a;async/await 1. 背景 在深入讨论 async/await 之前&#xff0c;我们需要了解一下 JavaScript 的单线程和非阻塞的特性。JavaScript 是单线程的&#xff0c;也就是说在任何给定的时间点&#xff0c;只能执行一个操作。然而&#xff0c;对于需要…

Unity 使用INI文件存储数据或配置参数预设

法1&#xff1a;调用外部Capi库 具体使用&#xff1a; public class Ini{//读取INI文件需要调用C的APP[System.Runtime.InteropServices.DllImport("kernel32")]private static extern long WritePrivateProfileString(string section, string key, string val, st…

强大好用的shell:shell命令

命令名称&#xff1a;就是语法中的“动词”&#xff0c;表达的是想要做的事情&#xff0c;例如创建用户、查看文件、重启系统等操作。 命令参数&#xff1a;用于对命令进行调整让“修&#xff0c;改”过的命令能更好地贴合工作需求&#xff0c;达到事半功倍的效果。 命令对象&a…

Linux各种版本安装详细步骤和root密码破解

文章目录 VMware新建虚拟机硬件设置设置虚拟网络挂载ISO文件 root密码破解 VMware新建虚拟机 硬件设置 设置虚拟网络 编辑>虚拟网络编辑器>VMnet8(NAT模式) 挂载ISO文件 加电>开启次虚拟机 第二项可以检查挂载上来的iso文件是否完整没有破坏 磁盘分区 选自定义分…

k8s的Init Containers容器实现代码版本升级发布和deployment版本回退:实战操作版

Pod中的初始化容器&#xff1a;Init Containers initContainers实现理论前提:同一个Pod内的容器共享 网络、volume等资源 Init Containers 在Kubernetes中&#xff0c;init容器是在同一个Pod中的其他容器之前启动和执行的容器。它的目的是为Pod上托管的主应用程序执行初始化…

Linux yum,vim详解

yum是什么 yum是一个Linux系统预装的指令&#xff0c;yum的功能是可以对app进行搜索&#xff0c;下载&#xff0c;相当于Linux下的应用商店。 yum是读取Linux中镜像文件中的网页地址&#xff0c;下载用户所输入的命令。 如何使用yum下载软件 yum install -y(所有选项都yes) …

IntelliJ Idea 撤回git已经push的操作

最初的样子 现在的样子 解决方案 第一步&#xff0c;commit到本地撤回&#xff1a; 打开提交历史记录&#xff0c;选中回退的版本右键&#xff0c;点击“Reset Current Branch to Here…”,然后选中“Mixed”&#xff0c;点击Reset后&#xff0c;之前commit的代码会在本地显…

UnityAI——动物迁徙中的跟随实现实例

大家好&#xff0c;我是七七&#xff0c;今天来给大家介绍的是Unity中用操控行为实现的跟随领队行为。 看本文若是想了解和实现&#xff0c;只看本文即可&#xff0c;若是想彻底弄透&#xff0c;建议从七七的游戏AI专栏开始看。 废话不多说&#xff0c;先上视频&#xff1a; …

SpringBean生命周期

SpringBean的创建过程的生命周期可以分为 通过构造方法创建普通对象对普通对象属性进行依赖注入&#xff08;被Autowired注解修饰的变量&#xff09;执行初始化前的操作&#xff08;被PostConstruct注解修饰的方法&#xff09;执行初始化操作&#xff08;需要实现Initializing…

UDP网络编程

一)熟悉TCP/IP五层协议: 1)封装:就是在数据中添加一些辅助传输的信息&#xff1b; 2)分用:就是解析这些信息 3)发送数据的时候&#xff0c;上层协议要把数据交给下层协议&#xff0c;由下层协议来添加一些信息 4)接收数据的时候&#xff0c;下层协议要把数据交给上层协议&#…

c语言-数据结构-栈和队列的实现和解析

目录 一、栈 1、栈的概念 1.2 栈的结构 2、栈的创建及初始化 3、压栈操作 4、出栈操作 5、显示栈顶元素 6、显示栈空间内元素的总个数 7、释放栈空间 8、测试栈 二、队列 1、队列的概念 1.2 队列的结构 2、队列的创建及初始化 3、入队 4、出队 5、显示队头、队…

番外 1 : Java 环境下的 selenium 搭建

Java 环境下的 selenium 搭建 一 . 下载谷歌浏览器二 . 下载谷歌浏览器驱动2.1 查看谷歌浏览器版本2.2 下载对应版本的谷歌驱动2.3 解压下载好的驱动压缩包 , 将下载好的 chromedriver.exe 放到java 系统环境变量下 三 . 下载 Edge 浏览器的驱动3.1 查看 Edge 浏览器的版本3.2 …

带有密码的Excel只读模式,如何取消?

Excel文件打开之后发现是只读模式&#xff0c;想要退出只读模式&#xff0c;但是只读模式是带有密码的&#xff0c;该如何取消带有密码的excel只读文件呢&#xff1f; 带有密码的只读模式&#xff0c;是设置了excel文件的修改权限&#xff0c;取消修改权限&#xff0c;我们需要…

Go,14周年[译]

国内的双十一购物狂欢已没有了当年的那种热闹与喧嚣&#xff0c;但大洋彼岸的Go团队却始终保持稳中有增的开发和语言演进节奏。今晨Go核心团队的Russ Cox[1]代表Go语言项目团队在Go官博上发表了《Fourteen Years of Go》[2]的博文&#xff0c;纪念Go语言开源14周年[3]&#xff…

FCOS难点记录

FCOS 中有计算 特征图&#xff08;Feature map中的每个特征点到gt_box的左、上、右、下的距离&#xff09; 1、特征点到gt_box框的 左、上、右、下距离计算 x coords[:, 0] # h*w&#xff0c;2 即 第一列y coords[:, 1] l_off x[None, :, None] - gt_boxes[..., 0][:, No…

XXE XML外部实体注入

XXE 外部实体注入 一, 简介 XXE&#xff08;XML External Entity Injection&#xff09;是一种 XML 注入攻击&#xff0c;它利用了 XML 解析器在处理 XML 文档时存在的漏洞。 攻击者通过在 XML 文档中插入外部实体的引用&#xff0c;可以引导 XML 解析器读取攻击者控制的外部…

编程艺术之源:深入了解设计模式和设计原则

深入了解设计模式和设计原则 一、认识设计模式1.1、设计模式是什么&#xff1f;1.2、设计模式是怎么来的&#xff1f;1.3、设计模式解决了什么问题&#xff1f; 二、设计模式的基础2.1、面向对象思想2.2、设计原则 三、如何学习设计模式3.1、明确目的3.2、学习步骤 总结 一、认…