OpenResty XRay は、プロセスを再起動・変更することなく、本番環境で稼働中の Perl アプリケーションの例外をトレースします。プロセスをクラッシュさせる例外だけでなく、上位コードに捕捉されてクラッシュに至らない例外も検出対象です。Perl レベルの例外フレームグラフを自動的に解釈し、例外を引き起こした正確なコードパスを特定しつつ、遅延に敏感な本番環境に適した最小限のパフォーマンスオーバーヘッドを実現します。

本チュートリアルでは、XRay の Guided Analysis 機能を使って実際の Perl アプリケーションで例外をトレースする手順を、分析の開始から自動生成レポートの確認まで解説します。

XRay の Guided Analysis で Perl の例外をトレースする

XRay コンソールを開いてマシンを選択する

Screenshot

ブラウザで OpenResty XRay の Web コンソールを開きます。

Screenshot

現在分析中のマシンが正しいことを確認してください。

Screenshot

正しくない場合は、リストから再選択することができます。

Screenshot

Guided Analysis で Perl の例外をスキャンする

「Guided Analysis」ページに移動します。

Screenshot

ここでは、システムが分析可能な様々な種類の問題を確認できます。

Screenshot

「Errors & exceptions」を選択します。

Screenshot

「Next」をクリックします。

Screenshot

先ほどの Perl アプリケーションを選択します。

Screenshot

ここでは「Whole application」を選択します。

Screenshot

アプリケーションのタイプが正しいことを確認します。通常は、デフォルト値のままで問題ありません。

Screenshot

OpenResty XRay は、様々な言語レベルで分析を行うことができます。ここでは Perl と C/C++ の両方を選択したままにします。

Screenshot

最長分析時間を設定することもできます。ここではデフォルトの 300 秒のままにします。

Screenshot

分析を開始します。

Screenshot

システムは複数回の分析を継続的に実行します。現在、初回の分析を実行中です。

Screenshot

初回の分析が完了し、現在 2 回目のラウンドに入っております。この例では、1 回の分析で十分です。

Screenshot

分析を停止します。

Screenshot

例外レポートとホットコードパスを確認する

自動生成された分析レポートが表示されます。

Screenshot

これは分析対象の問題タイプである Errors & exceptions です。

Screenshot

レポートは、最も多くの Perl プログラム例外を発生させているコードパスを示しています。

スクリーンショット

Perl_die は Perl 仮想マシン内部で例外を投げるために使用される関数です。

スクリーンショット

Core モジュール下の download_file は、ビジネスロジックでファイルをダウンロードするための関数です。

スクリーンショット

これらの関数は Dancer 2 ウェブフレームワークに属しています。

スクリーンショット

例えば、Core::Route::execute は一致したルートのハンドラ関数を実行します。

スクリーンショット

_dispatch_route は現在の Web リクエストを対応するルートハンドラにディスパッチするために使用されます。

スクリーンショット

「More」をクリックすると、さらに詳細が表示されます。

スクリーンショット

このホットコードパスは、Perl レベルの例外フレームグラフから自動的に導き出されたものです。

スクリーンショット

以下は、問題に関するより詳細な説明と提案です。

スクリーンショット

ここでは、perl_die 関数がエラーメッセージを通じて Perl スクリプト実行時の例外を検出できることが言及されています。

スクリーンショット

先ほど見た download_file 関数について説明しています。

スクリーンショット

ホットコードパスから具体的な Perl のソース行を特定する

元のホットコードパスに戻りましょう。

スクリーンショット

この関数の緑色のボックスにマウスを合わせてください。

スクリーンショット

ツールチップには Perl 関数のソースファイル名とフルパスが表示されます。

スクリーンショット

この Perl ソースコードの行番号は 100 です。

スクリーンショット

このアイコンをクリックして、関数のソースファイルパスをコピーします。

スクリーンショット

vim エディタでソースファイルを開きます。先ほどコピーしたファイルパスを貼り付けます。お好みのエディタを使用していただいて構いません。

スクリーンショット

OpenResty XRay が提案したように、100 行目にジャンプします。

スクリーンショット

これは、Perl の配列変数参照をハッシュテーブル参照として扱おうとした際に発生する状況です。この例外は実際には上位の Perl コードによってキャッチされるため、アプリケーションが終了することはありません。それでも、OpenResty XRay はこのような例外を正確に検出し、ユーザーに報告することができます。

Screenshot

Guided Analysis 不要:Perl 例外の自動レポート

OpenResty XRay はオンラインプロセスを自動的に監視し、分析レポートを生成することもできます。

Screenshot

「Insights」ページに切り替えます。

Screenshot

「Insights」ページで、日次および週次の自動レポートを見つけることができます。そのため、「Guided Analysis」機能を使用する必要はありません。

Screenshot

もちろん、「Guided Analysis」はアプリケーションの開発とデモンストレーションに非常に有用です。

Screenshot

よくある質問

Q: OpenResty XRay はアプリケーションを再起動せずにどうやって Perl の例外を検出するのですか? A: XRay は非侵襲的な動的トレーシングを使用します——内部では Y 言語が Stap+、eBPF+、GDB といった複数のランタイムをターゲットに駆動しており、稼働中の Perl プロセスを外部から観測することで、プロセス自体のコードやライフサイクルに触れることなく例外を捕捉します。

Q: アプリケーションがすでに処理してしまった Perl の例外も、XRay は検出できますか? A: はい。上位の Perl コードに捕捉されてクラッシュに至らない例外であっても、XRay はその背後のコードパスを検出・報告します。ログベースの手法の多くはこれを見逃します。

Q: Perl_die とは何で、なぜ例外トレースにおいて重要なのですか? A: Perl_die は Perl 仮想マシン内部で例外を投げるための関数です。XRay の例外フレームグラフはこの Perl_die の呼び出しを軸に構築されており、各例外を引き起こしたビジネスコード上の関数まで正確に遡ることができます。

Q: Guided Analysis を実行せずに Perl の例外レポートを確認するには? A: XRay コンソールの「Insights」ページが日次・週次のレポートを自動生成するため、新しい例外を確認するたびに 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 Edge(マイクロサービスおよび分散トラフィックに最適化された多機能ゲートウェイソフトウェア)は、世界中の多くの上場企業および大企業から高い評価を得ております。OpenResty 以外にも、章亦春は Linux カーネル、Nginx、LuaJITGDBSystemTapLLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

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