您想知道如何动态统计 Nginx 或 OpenResty 处理的请求的数量吗?您是否想拥有一个简单而强大的工具,直接把正在运行的进程当作只读数据库进行查询,而不依赖于日志或者 API?如果上述问题的答案是肯定的,您一定会喜欢 OpenResty XRay 和它自带的 run-ysql 命令行工具。

OpenResty XRay 是一个革命性的产品,它允许您使用 YSQL 对进程进行动态跟踪。YSQL 是一种类似 SQL 的语言,它支持各种数据源和操作。YSQL 可以访问的数据源之一是 ngx.reqs,后者包含了 nginx 请求的信息。在底层实现上,OpenResty XRay 由我们的 Y 语言驱动,可以在不同环境下支持多种不同的运行时,如 Stap+, eBPF+, GDB 和 ODB。

在本文中,我们将向您展示如何使用 run-ysql 命令行工具在 nginx 进程上运行 YSQL 查询,以深入了解进程的性能和行为。通过演示一些简单的例子,您将会体验到 YSQLOpenResty XRay 的强大和简单。

如何安装 run-ysql 工具

在可以使用 run-ysql 工具之前,您需要在您的 Linux 系统上安装 openresty-xray-cli 包。openresty-xray-cli 包包含了 run-ysql 命令和其他用来与 OpenResty XRay 交互的工具。

安装方式取决于您使用哪个 Linux 发行版。不过无论您使用的是什么发行版,您都需要先安装 OpenResty XRay 的 Agent 软件。它会自动为您的系统启用正确的软件包仓库。您可以从 OpenResty 官网下载 Agent 软件并按照说明进行安装。

下面是几个在安装了 Agent 软件后再安装 openresty-xray-cli 包的常见示例:

Fedora/CentOS/RHEL/Rocky/Oracle

如果您使用的是 Fedora、CentOS 或 RHEL,您可以使用 dnf 或 yum 命令来安装 openresty-xray-cli 包。例如:

$ sudo dnf install openresty-xray-cli

在这些发行版的旧版本上,可以使用 yum 命令:

$ sudo yum install openresty-xray-cli

Debian/Ubuntu

如果您使用的是 Debian 或者 Ubuntu,您可以使用 apt 命令来安装 openresty-xray-cli 包。例如:

$ sudo apt-get update
$ sudo apt-get install openresty-xray-cli

安装了 openresty-xray-cli 包之后,您可以通过运行下面的命令来验证 run-ysql 工具是否能正常工作:

$ which run-ysql

您应该看到类似这样的内容:

/usr/bin/run-ysql

现在,您已经可以使用 run-ysql 工具在进程上运行 YSQL 查询了。

统计实时总请求数

如何统计 nginx 处理的总请求数? 有关 nginx 服务器的一个最基本的指标?就是统计它在一段时间内处理了多少个请求。要获取这个信息,您可以使用以下 YSQL 查询:

select count(*) from ngx.reqs

这个查询将返回 ngx.reqs 表的行数,这个行数对应 nginx 处理的请求数。您可以使用 run-ysql 命令行工具来运行这个查询。它接受查询语句作为一个参数,以及 nginx worker 进程的进程 ID(PID)作为另一个参数。例如,如果 nginx worker 进程的 PID 是 9708,您可以运行:

$ run-ysql -e 'select count(*) from ngx.reqs' -p 9708
...
Goto https://8pu4z6.xray.openresty.com.cn/targets/1355/history/4378702043 for charts

run-ysql 命令会在目标进程上执行查询,并输出一个 URL。这个 URL 包含表格格式的查询结果。您可以在浏览器中打开该 URL,看到类似这样的内容:

row count
1 106512

这个表显示,在 3 秒钟(run-ysql 默认的持续时间)内,nginx worker 进程处理了 106512 个请求。多么神奇!

筛选出特定的请求

那么如何统计具有特定 URI 前缀的请求数呢?有关 nginx 服务器的另一个有用的指标是有多少请求具有某个 URI 前缀。例如,您可能想要知道有多少请求的目标是 “/css/” 目录下的静态文件。要获取这个信息,您可以使用以下 YSQL 查询:

select count(*) from ngx.reqs where uri prefix '/css/'

这个查询会通过检查 ngx.reqs 表的 uri 列是否以 /css/ 开头来过滤 ngx.reqs 表的行,然后计算匹配行的数量。您可以使用与之前相同的 run-ysql 命令来运行这个查询,但是要使用不同的查询参数。例如:

$ run-ysql -e "select count(*) from ngx.reqs where uri prefix '/css/'" -p 9708
...
Goto https://8pu4z6.xray.openresty.com.cn/targets/1355/history/4378707156 for charts
...

run-ysql 命令会运行查询,并输出一个 URL。该 URL 包含表格格式的查询结果。您可以在浏览器中打开这个 URL,看到类似这样的内容:

row count
1 47026

这个表显示,在 3 秒钟内,nginx worker 进程处理了 47026 个具有 URI 前缀 /css/ 的请求。数量相当之多了!

在 Web 控制台中使用 YSQL

使用 YSQL 在进程上查询和分析数据的另一种方法是使用 OpenResty XRay 的 web 控制台。web 控制台是一个允许您创建和管理目标进程、分析器、图表、仪表盘和警报的图形用户界面。

要在 OpenResty XRay 的 web 控制台中使用 YSQL,您需要执行以下步骤:

  1. 登录 OpenResty XRay 的 web 控制台。
  2. 点击“分析器”标签页,然后点击“创建分析器”按钮。分析器是一个在目标进程上运行并且为图表生成数据的 YSQL 查询。
  3. 为您的分析器输入一个名称和一个描述。然后,在“查询”框中输入 YSQL 查询。您可以使用 YSQL 支持的所有语法和数据源。
  4. 点击“保存”按钮保存您的分析器。您也可以点击“立即运行”按钮来立即运行您的分析器。

OpenResty XRay 控制台中的 <a href="https://doc.openresty.com.cn/cn/xray/ysql/">YSQL</a> 代码

通过在 OpenResty XRay 的 web 控制台中使用 YSQL,您可以轻松地探查进程的数据,而无需编写任何代码或使用任何命令行工具。

真正的非侵入式追踪

OpenResty XRay 和它的 YSQL 工具链最神奇的特性之一是它们无需目标 Nginx 或 OpenResty 进程配合就可以工作。这意味着您不需要做以下的事情来使用OpenResty XRayYSQL

  • 您不需要在您的目标进程中安装任何额外的模块或插件。OpenResty XRayYSQL 可以访问和分析进程的数据,无论它们有着怎样的配置或功能。
  • 您不需要在编译您的目标进程时使用任何特殊的构建选项。OpenResty XRayYSQL 可以作用于所有二进制可执行文件,无需修改源代码或重新编译。
  • 您不需要在使用 OpenResty XRayYSQL 时重启您的目标进程。OpenResty XRayYSQL 可以动态地被进程添加或者卸载,而不会干扰进程的正常操作或导致停机。
  • 您不需要担心使用 OpenResty XRayYSQL造成的性能影响。OpenResty XRayYSQL 使用先进的技术,如动态追踪、采样、聚合和过滤,来使数据收集和分析的开销最小化。与使用 OpenResty XRayYSQL的好处相比,开销是微不足道的。而且当您不进行追踪和采样时,您的目标进程绝对 100% 全速运行。

通过使用 OpenResty XRay及其 YSQL 工具链,您可以在不牺牲您目标进程的性能和可靠性的情况下享有动态追踪和分析的便利和强大。

结论

我们向您展示了如何使用 YSQL 语句 和 run-ysql 命令行工具来动态测量 nginx 请求的数量。您已经看到了使用 YSQLOpenResty XRay 访问和分析正在运行的进程的数据,而无需日志或 API 有多么简单和方便。

YSQL 支持的语法和数据源远比我们在这里介绍的要多得多。例如,您可以使用 YSQL 访问 Lua 变量、系统调用、网络包、MySQL 查询、Redis 命令等数据。您还可以使用 YSQL 对数据进行各种操作,如聚合、分组、排序、过滤、连接等。

未来我们也有计划支持把更多的目标应用类型作为 YSQL 查询的“虚拟表“,比如 Envoy、Apache Traffic Server (ATS) 等更多服务器进程,Python、Go、Java 的各种应用框架之类,还有 MySQL、Pg 等数据库进程。无限可能。

要了解更多关于 YSQLOpenResty XRay 的信息,请访问我们的 YSQL 用户手册

关于作者

章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。

章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJITGDBSystemTapLLVM、Perl 等,并编写过 60 多个开源软件库。

关注我们

如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:

我们的微信公众号

翻译

我们提供了英文版原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!