本番環境で Rust の Panic をトレースする方法(再起動不要)
OpenResty XRay は、プロセスを再起動・変更することなく、本番環境で稼働中の Rust アプリケーションの panic をトレースします。プロセスをクラッシュさせる panic だけでなく、アプリケーション自身に捕捉されてクラッシュに至らない panic も検出対象です。Rust 言語レベルの例外フレームグラフを自動的に解釈し、panic を引き起こした正確なコードパスを特定しつつ、遅延に敏感な本番環境に適した最小限のパフォーマンスオーバーヘッドを実現します。
本チュートリアルでは、XRay の Guided Analysis 機能を使って実際の Rust アプリケーションで panic をトレースする手順を、分析の開始から自動生成レポートの確認まで解説します。
XRay の Guided Analysis で Rust の Panic をトレースする
Rust Panic の Guided Analysis を設定して実行する
本文では、実行中の任意の Rust アプリケーションにおけるプログラム例外、つまり panic の分析をオンラインで行う方法をご紹介いたします。OpenResty XRay の Web コンソールに移動します。
現在分析中のマシンが正しいことを確認します。
正しくない場合は、リストから再選択することができます。
「Guided Analysis」ページに移動します。
ここでは、システムが分析可能な様々な種類の問題を確認できます。
「Errors & exceptions」を選択します。
「Next」をクリックします。
先ほどの Rust アプリケーションを選択します。
「Whole application」を選択します。
アプリケーションのタイプが正しいことを確認します。通常、デフォルト値が正しいです。
ここでの言語レベルは「Rust」のみとなっています。
最長分析時間を設定することもできます。ここではデフォルトの 300 秒のままにします。
分析を開始します。
システムは複回数の分析を継続的に実行します。現在、初回の分析を実行中です。
初回の分析が完了し、現在 2 回目のラウンドに入っております。この例では、1 回の分析で十分です。
分析を停止します。
Panic のレポートとホットコードパスを確認する
自動生成された分析レポートをご確認しましょう。
分析対象の問題タイプは「Errors & exceptions」です。
レポートには、Rust プログラムの例外を最も多くスローするコードパスを表示します。
internal_constructor 関数は PanicInfo 構造体を構築するために使用されます。この構造体にはプログラムの異常に関する位置などの関連情報が含まれています。
panic_fmt 関数は、プログラムの異常をフォーマットし、トリガーするための低レベル関数です。
配列やスライスの境界チェックが失敗した場合、panic_bounds_check 関数が例外を投げます。これは Rust の保護メカニズムであり、実行時のメモリ境界外アクセスを防ぐことができます。
stat_client_usage 関数は対象アプリケーションのビジネスレベルのコードに属します。
詳細を表示するにはクリックしてください。
このホットコードパスは、Rust 言語レベルの例外フレームグラフから自動的に推論されたものです。
以下は問題に関するより詳細な説明と提案です。先ほど見た PanicInfo 構造体について言及しています。
また、プログラムの異常が範囲境界アクセスの失敗によって引き起こされたことも説明しています。
ホットコードパスから具体的な Rust のソース行を特定する
先ほどのホットコードパスへ戻ります。この関数の緑色の枠にマウスを合わせてください。ツールチップにこの関数のソースファイル名と完全なパスが表示されます。
このソースコードの行番号は 7 です。
このアイコンをクリックして、この関数のソースファイルパスをコピーします。
vim エディタを使用してソースファイルを開きます。先ほどコピーしたファイルパスを貼り付けます。お好みのエディタを使用していただいて構いません。
OpenResty XRayが提案したように、7 行目にジャンプします。
配列のサブスクリプト client_id が配列 CLIENTS のサイズを超える可能性があります。先ほど見た panic_bounds_check 関数から、ここに明らかにデータサブスクリプトの範囲外アクセスが存在することがわかります。
レポートに示されているように、この行は stat_client_usage 関数内にあります。この Rust の例外は実際には Rust アプリケーション自体によってキャッチされており、Rust アプリケーションのクラッシュを引き起こすことはありません。それでも、OpenResty XRay はリアルタイムでこれを検出し、追跡することができます。
Guided Analysis 不要:Rust Panic の自動レポート
OpenResty XRay はオンラインプロセスを自動的に監視し、分析レポートを生成することもできます。「Insights」ページに切り替えます。
「Insights」ページで、日次および週次の自動レポートを見つけることができます。そのため、「Guided Analysis」機能を使用する必要はありません。
もちろん、「Guided Analysis」はアプリケーションの開発とデモンストレーションに非常に有用です。
よくある質問
Q: OpenResty XRay はアプリケーションを再起動せずにどうやって Rust の Panic を検出するのですか? A: XRay は非侵襲的な動的トレーシングを使用します——内部では Y 言語が Stap+、eBPF+、GDB といった複数のランタイムをターゲットに駆動しており、稼働中の Rust プロセスを外部から観測することで、プロセス自体のコードやライフサイクルに触れることなく panic を捕捉します。
Q: アプリケーションがすでに処理してしまった Rust の panic も、XRay は検出できますか? A: はい。panic がアプリケーション自身に捕捉されてクラッシュに至らない場合でも、XRay はリアルタイムでその背後のコードパスを検出・追跡します。ログベースの手法の多くはこれを見逃します。
Q: panic_bounds_check 関数は何を示しているのですか?
A: panic_bounds_check は配列やスライスの境界チェックが失敗した際に panic を投げる関数で、実行時のメモリ境界外アクセスを防ぐ Rust の保護メカニズムです。例外フレームグラフでこれを見つけたら、データのサブスクリプトが範囲外になっているバグだとほぼ断定できます。
Q: Guided Analysis を実行せずに Rust の panic レポートを確認するには? A: XRay コンソールの「Insights」ページが日次・週次のレポートを自動生成するため、新しい panic を確認するたびに Guided Analysis を実行する必要はありません。
OpenResty XRay について
OpenResty XRay は動的トレーシング製品であり、実行中のアプリケーションを自動的に分析して、パフォーマンスの問題、動作の問題、セキュリティの脆弱性を解決し、実行可能な提案を提供いたします。基盤となる実装において、OpenResty XRay は弊社の Y 言語によって駆動され、Stap+、eBPF+、GDB、ODB など、様々な環境下で複数の異なるランタイムをサポートしております。
著者について
章亦春(Zhang Yichun)は、オープンソースの OpenResty® プロジェクトの創始者であり、OpenResty Inc. の CEO および創業者です。
章亦春(GitHub ID: agentzh)は中国江蘇省生まれで、現在は米国ベイエリアに在住しております。彼は中国における初期のオープンソース技術と文化の提唱者およびリーダーの一人であり、Cloudflare、Yahoo!、Alibaba など、国際的に有名なハイテク企業に勤務した経験があります。「エッジコンピューティング」、「動的トレーシング」、「機械プログラミング」 の先駆者であり、22 年以上のプログラミング経験と 16 年以上のオープンソース経験を持っております。世界中で 4000 万以上のドメイン名を持つユーザーを抱えるオープンソースプロジェクトのリーダーとして、彼は OpenResty® オープンソースプロジェクトをベースに、米国シリコンバレーの中心部にハイテク企業 OpenResty Inc. を設立いたしました。同社の主力製品である OpenResty XRay動的トレーシング技術を利用した非侵襲的な障害分析および排除ツール)と OpenResty XRay(マイクロサービスおよび分散トラフィックに最適化された多機能
翻訳
英語版 の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!






















































