このチュートリアルでは、OpenResty XRay で任意の Go プログラムを動的にトレースするための簡単な Y language アナライザーの作成方法を紹介します。このカスタムアナライザーは、指定された Go 関数のエントリーポイントに動的プローブを追加し、Go 変数の値を出力します。動的トレース技術により、これらのアナライザーは真に非侵襲的な方法で動作します。これにより、パフォーマンスのオーバーヘッドを最小限に抑えつつ、対象の Go プログラムやプロセスを一切変更することなく動作させることができます。

Go 変数に 2 つのキーと値のペアを挿入

Go 言語で書かれた animal プログラムがあります。

スクリーンショット

Vim エディタを使用してこのプログラムのソースコードを確認します。

スクリーンショット

このプログラムでは、Animal が構造体であることがわかります。

スクリーンショット

この Animal 構造体には 2 つのメンバーがあります。food フィールドの型は string で、age フィールドの型は float32 です。

スクリーンショット

showAnimals 関数は map 変数の値を表示します。

Screenshot

この関数は map[string]Animal 型のパラメータ animals を持っています。

Screenshot

map[string]Animalmap のアグリゲーション型です。キーの型は string で、値の型は Animal です。

Screenshot

main 関数では、animals という map 変数に 2 つのキーと値のペアを挿入しています。

Screenshot

Linux ディストリビューションに付属の未修正の Go コンパイラを使用しています。

Screenshot

このプログラムをコンパイルします。特別なオプションを追加する必要がないことがわかります。

Screenshot

これがプログラムの出力です。

Screenshot

このプログラムの実行は非常に高速で、わずか 1 ミリ秒しかかかりません。

Screenshot

この Go プログラムの実行を動的にトレースするためのカスタム Y language アナライザーを作成しましょう。

Screenshot

カスタム Ylang アナライザーを作成して Go プログラムを動的にトレース

OpenResty XRayの Web コンソールに切り替えます。

スクリーンショット

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

スクリーンショット

「Add new analyzer」をクリックします。

スクリーンショット

「Analyzer name」テキストボックスにアナライザーの名前を入力します。

Screenshot

言語タイプとして 「YLang」 を選択します。

スクリーンショット

デフォルトで提供されている Y language プログラムの例を削除します。

Screenshot

ここでは、main パッケージ内の Go 関数 showAnimals のエントリーポイントに動的プローブを追加します。

Screenshot

このパラメータの型は、キーが string、値の型が main.Animalmap です。

スクリーンショット

このパラメータの名前は animals です。

スクリーンショット

_dump_go_val を呼び出して animals 変数の値を出力します。

Screenshot

_exit() を呼び出して、このプローブハンドラの実行後にアナライザーを終了させます。

スクリーンショット

コードを保存します。

Screenshot

これは短命のプログラムなので、「By Executables」モードを選択します。

スクリーンショット

前のターミナルウィンドウに戻ります。readlink -f コマンドを実行して実行可能ファイルのパスを見つけます。それをコピーします。

スクリーンショット

実行可能ファイルのパスを貼り付けます。

スクリーンショット

「Run」をクリックして実行を開始します。

スクリーンショット

アナライザーがトレースを開始しました。

Screenshot

トレース結果のテスト

ターミナルに戻ります。

スクリーンショット

Go プログラムを実行します。プログラムは通常通り動作します。

スクリーンショット

このプログラムの実行時間は以前と同じで、わずか 1 ミリ秒です。

Screenshot

Web コンソールに戻ります。XRay アナライザーが animals パラメータ変数の値を正確に出力していることがわかります。map には 2 つのキーと値のペアが含まれています。

Screenshot

cow キーが指す値の型は main.Animal です。

スクリーンショット

main.Animal には foodage の 2 つのメンバーがあります。

Screenshot

メンバー food の型は文字列で、その値は 「grass」です。

Screenshot

この文字列の長さは 5 です。

スクリーンショット

main.Animal の 2 番目のフィールドは age です。

スクリーンショット

age の型は float32 です。

スクリーンショット

「bird」のキーと値のペアは「cow」と同様です。

Screenshot

必要に応じて「By Processes」モードを選択することもできます。

スクリーンショット

または「By Applications」モードを選択することもできます。

Screenshot

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(マイクロサービスおよび分散トラフィックに最適化された多機能ゲートウェイソフトウェア)は、世界中の多くの上場企業および大企業から高い評価を得ております。OpenResty 以外にも、章亦春は Linux カーネル、Nginx、LuaJITGDBSystemTapLLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

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