Nginx や OpenResty が処理するリクエスト数を動的に統計する方法をお知りになりたいですか?ログや API に依存せず、実行中のプロセスを直接読み取り専用データベースとして扱い、クエリを実行できる簡単かつ強力なツールが欲しいですか?これらの質問に対する答えが「はい」であれば、OpenResty XRay とそれに付属する run-ysql コマンドラインツールをきっと気に入っていただけるでしょう。

OpenResty XRay は革新的な製品で、YSQL を使用してプロセスの動的トレーシングを行うことができます。YSQL は SQL に似た言語で、様々なデータソースと操作をサポートしています。YSQL がアクセスできるデータソースの1つに 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 ソフトウェアをインストールする必要があります。これにより、システムに適切なソフトウェアリポジトリが自動的に有効化されます。Agent ソフトウェアは OpenResty の公式ウェブサイトからダウンロードし、指示に従ってインストールできます。

以下は、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 サーバーに関する最も基本的な指標の 1 つは、一定期間内に処理したリクエスト数です。この情報を取得するには、以下の YSQL クエリを使用できます:

select count(*) from ngx.reqs

このクエリは ngx.reqs テーブルの行数を返します。この行数は nginx が処理したリクエスト数に対応します。run-ysql コマンドラインツールを使用してこのクエリを実行できます。クエリ文を 1 つの引数として、nginx ワーカープロセスのプロセス ID(PID)を別の引数として受け取ります。例えば、nginx ワーカープロセスの 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 ワーカープロセスが 106512 件のリクエストを処理したことを示しています。なんと素晴らしいことでしょう!

特定のリクエストのフィルタリング

では、特定の URI プレフィックスを持つリクエスト数をどのように統計するのでしょうか? nginx サーバーに関するもう1つの有用な指標は、特定の 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 ワーカープロセスが URI プレフィックス /css/ を持つ 47026 件のリクエストを処理したことを示しています。かなりの数ですね!

Web コンソールでの YSQL の使用

プロセス上でデータをクエリおよび分析するために YSQL を使用するもう1つの方法は、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/en/xray/ysql/">YSQL</a> 代码

OpenResty XRay の Web コンソールで YSQL を使用することで、コードを書いたりコマンドラインツールを使用したりすることなく、プロセスのデータを簡単に探索できます。

真の非侵襲的トレーシング

OpenResty XRay とその YSQL ツールチェーンの最も魅力的な特徴の1つは、ターゲットの 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 ユーザーマニュアルをご覧ください。

著者について

章亦春(Zhang Yichun)は、オープンソースの OpenResty® プロジェクトの創始者であり、OpenResty Inc. の CEO および創業者です。

章亦春(GitHub ID: agentzh)は中国江蘇省生まれで、現在は米国ベイエリアに在住しております。彼は中国における初期のオープンソース技術と文化の提唱者およびリーダーの一人であり、Cloudflare、Yahoo!、Alibaba など、国際的に有名なハイテク企業に勤務した経験があります。「エッジコンピューティング」、「動的トレーシング」、「機械プログラミング」 の先駆者であり、22 年以上のプログラミング経験と 16 年以上のオープンソース経験を持っております。世界中で 4000 万以上のドメイン名を持つユーザーを抱えるオープンソースプロジェクトのリーダーとして、彼は OpenResty® オープンソースプロジェクトをベースに、米国シリコンバレーの中心部にハイテク企業 OpenResty Inc. を設立いたしました。同社の主力製品である OpenResty XRay動的トレーシング技術を利用した非侵襲的な障害分析および排除ツール)と OpenResty XRay(マイクロサービスおよび分散トラフィックに最適化された多機能ゲートウェイソフトウェア)は、世界中の多くの上場企業および大企業から高い評価を得ております。OpenResty 以外にも、章亦春は Linux カーネル、Nginx、LuaJITGDBSystemTapLLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!