您想知道如何動態統計 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. 公司的部落格網站 。也歡迎掃碼關注我們的微信公眾號:

我們的微信公眾號

翻譯

我們提供了英文版原文和中譯版(本文)。我們也歡迎讀者提供其他語言的翻譯版本,只要是全文翻譯不帶省略,我們都將會考慮採用,非常感謝!