使用 Go 收集 NGINX Plus 监控统计信息

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

在当今时代,拥有可扩展且可靠的基础架构对于网站的成功至关重要。监控 NGINX 性能和负载均衡应用程序的健康状况至关重要。了解您的虚拟服务器接收的流量使您能够在需要时进行扩展,并密切关注错误率使您能够有效地对应用程序进行分类。监控这些指标并根据这些指标采取行动有助于为您的用户提供可靠且令人满意的体验。

NGINX Plus 中的 实时活动监控 功能可以轻松实时获取关键负载和性能指标。关于流经 NGINX Plus 的流量的大量有用数据可以在内置仪表板上获得,也可以通过基于 HTTP 的 API 以易于解析的 JSON 格式获得。

有许多有效的方法可以使用实时活动监控 API 提供的数据。例如,您可能希望使用 NGINX Plus 即时重新配置 API 监控特定虚拟服务器的上游流量和自动缩放 Docker 容器。您可能希望将指标直接转储到标准输出并将它们写入日志文件,以便您可以将指标发送到 ELK 堆栈或 Splunk 集群。或者您可能想要收集 API 数据并将其发送到数据聚合器(如 statsd collectd) 以用于其他图形或日志记录目的。

Go Community 成员编写的大量包可能会提供您正在寻找的功能。作为另一个例子,我还使用了一个名为 go-statsd-client 的 第三方包将我的一些统计数据直接发送到 StatsD。

StatsD 是一个网络守护进程,在 Node.js 平台上运行并监听统计信息,如计数器和计时器,通过 UDP 或 TCP 发送并将聚合发送到一个或多个可插入后端服务。

关于围棋

Go,也称为 golang,是一种由 Google 开发的开源编程语言,可以轻松构建简单、可靠和高效的软件。如果您有兴趣了解有关 Go 的更多信息,请查看 “如何编写 Go 代码” “Go 实例” 。 Go 站点还有关于各种可用 的大量 文档 。本博客的目的是向您展示一些可用于收集 NGINX Plus 实时活动监控 API 指标的基本方法和 Go 包


 $ go version
go version go1.4.2 linux/amd64

$ sudo /usr/sbin/nginx -V nginx version: nginx/1.9.4 (nginx-plus-r7)


我针对 Go 版本 1.4.2 和 NGINX Plus R7(基于开源 NGINX 版本 1.9.4)测试了示例脚本。

导入 Go 包

我们在脚本中定义的第一件事是包名称和我们要在运行或构建时导入的包。


 $ go version
go version go1.4.2 linux/amd64

$ sudo /usr/sbin/nginx -V nginx version: nginx/1.9.4 (nginx-plus-r7)


在我的示例脚本中,我使用了一些在标准 Go 库中可用的包。以下是这些软件包的列表以及它们的用途的简要说明。

定义 JSON 数据结构

在 Go 中,您必须定义 JSON 的数据结构。请注意,Go 会简单地忽略您未在数据结构中定义的任何 JSON 数据。在此示例中,我仅从 NGINX Plus API 获取连接统计信息。


 $ go version
go version go1.4.2 linux/amd64

$ sudo /usr/sbin/nginx -V nginx version: nginx/1.9.4 (nginx-plus-r7)

如果您决定构建此 JSON 数据结构并添加上游和服务器区域值,请记住一些 数据 字段名称对于您的 NGINX Plus 实例和配置将是唯一的。有很多在线工具可以轻松地将 JSON 转储转换为 Go 结构,但是一旦掌握了结构的定义方式,就很容易创建自己的结构。

定义 NginxStatus 和 SendStatsD 函数

我的 Go 脚本包含三个函数: NginxStatus, SendStatsD, main 函数,我将按顺序对其进行讨论。 NginxStatus 函数调用 NGINX Plus 实时活动监控 API。

我首先定义 NGINX Plus 服务器,然后对实时活动监控 API 执行 GET 请求。我验证响应中的状态代码是否为 200 OK ,如果不是,则使用错误包记录问题。我还将关闭连接推迟到我的函数完成,此时它将自动关闭连接。

然后,我将响应主体读入一个变量,并使用我在“定义 JSON 数据结构”中定义的结构对 JSON 进行解码。我将数据传回主函数。我还在屏幕上打印出统计数据并将它们传递给我的 SendStatsD 函数。


 $ go version
go version go1.4.2 linux/amd64

$ sudo /usr/sbin/nginx -V nginx version: nginx/1.9.4 (nginx-plus-r7)

在我的 SendStatsD 函数中,我定义了我希望直接发送到 StatsD 的变量和类型。在函数的开头,我定义了我将连接到的 StatsD 服务器和端口,以及客户端名称。然后我建立连接,记录任何意外错误,并再次延迟关闭连接。然后,我将一个变量分配给 StatsD 的刷新间隔,将另一个变量分配给指标名称的一部分。刷新间隔告诉 StatsD 在将数据发送到其后端之前要等待多长时间。最后,在我的 SendStatsD 函数结束时,我使用内置函数 Inc 将所有数据发送到 StatsD。


 $ go version
go version go1.4.2 linux/amd64

$ sudo /usr/sbin/nginx -V nginx version: nginx/1.9.4 (nginx-plus-r7)

正确构建它非常重要,因为它告诉 StatsD 如何组织数据。将指标名称想象成一个文件夹结构,将句点作为每个级别之间的分隔符。您如何命名度量命名空间决定了数据在 Graphite Web UI 中的存储位置和可用位置。存储数据的方式取决于您,但我建议您在定义指标名称时使用以下命名约定。我在这里使用尖括号,以便更容易看到名称的各个部分;它们不用于实际名称。


 $ go version
go version go1.4.2 linux/amd64

$ sudo /usr/sbin/nginx -V nginx version: nginx/1.9.4 (nginx-plus-r7)

例如:


 $ go version
go version go1.4.2 linux/amd64

$ sudo /usr/sbin/nginx -V nginx version: nginx/1.9.4 (nginx-plus-r7)

此示例告诉 StatsD 发送有关名为 my.nginx.server.com 的服务器上当前活动的连接的 NGINX Plus API 数据。请注意,您用下划线字符替换了名称段内的任何句点或空格。

定义主要功能

main 函数中,我创建了一个无限循环,然后简单地调用我上面描述的函数,以便根据需要轻松接收和发送数据。


 $ go version
go version go1.4.2 linux/amd64

$ sudo /usr/sbin/nginx -V nginx version: nginx/1.9.4 (nginx-plus-r7)

在这里,我使用 NginxStatus 函数将一个变量分配给对 NGINX Plus 的 API 调用的结果。然后我使用 fmt 包在屏幕上打印我的一些连接统计信息,并使用我的 SendStatsD 函数将该数据提供给 Graphite。

我还运行 sleep 功能以在每个请求之间插入一秒的延迟。在此博客中,我不会详细介绍如何处理连接或时间管理。创建脚本时,您需要确定要如何处理连接超时或延迟,以及如何计算每个请求之间的时间。

这是运行脚本后的屏幕输出示例。发送到 StatsD 的数据是透明的,可以通过检查您的 Graphite Web UI 来验证。


 $ go version
go version go1.4.2 linux/amd64

$ sudo /usr/sbin/nginx -V nginx version: nginx/1.9.4 (nginx-plus-r7)

完整脚本

这是脚本的完整文本以供参考。 Go 中的间距很重要,因此如果遇到任何错误,请务必检查语法。


 $ go version
go version go1.4.2 linux/amd64

$ sudo /usr/sbin/nginx -V nginx version: nginx/1.9.4 (nginx-plus-r7)

概括

使用 Go 访问 NGINX Plus 实时活动监控 API 可以为您在 NGINX Plus 中已经可用的数据提供一些额外的灵活性。您从 NGINX 中提取的统计数据有助于提供更好的日志记录,围绕实时活动监控创建自动化,并根据 NGINX Plus 的性能历史记录创建图形或图表。

最初由 Kevin Jones 在 NGINX 博客上撰写。