カスタム Ylang アナライザーを作成して Go プログラムを動的にトレースする(OpenResty XRay を使用)
このチュートリアルでは、OpenResty XRay で任意の Go プログラムを動的にトレースするための簡単な Y language アナライザーの作成方法を紹介します。このカスタムアナライザーは、指定された Go 関数のエントリーポイントに動的プローブを追加し、Go 変数の値を出力します。動的トレース技術により、これらのアナライザーは真に非侵襲的な方法で動作します。これにより、パフォーマンスのオーバーヘッドを最小限に抑えつつ、対象の Go プログラムやプロセスを一切変更することなく動作させることができます。
Go 変数に 2 つのキーと値のペアを挿入
Go 言語で書かれた animal
プログラムがあります。
Vim エディタを使用してこのプログラムのソースコードを確認します。
このプログラムでは、Animal
が構造体であることがわかります。
この Animal
構造体には 2 つのメンバーがあります。food
フィールドの型は string
で、age
フィールドの型は float32
です。
showAnimals
関数は map
変数の値を表示します。
この関数は map[string]Animal
型のパラメータ animals
を持っています。
map[string]Animal
は map
のアグリゲーション型です。キーの型は string
で、値の型は Animal
です。
main
関数では、animals
という map
変数に 2 つのキーと値のペアを挿入しています。
Linux ディストリビューションに付属の未修正の Go コンパイラを使用しています。
このプログラムをコンパイルします。特別なオプションを追加する必要がないことがわかります。
これがプログラムの出力です。
このプログラムの実行は非常に高速で、わずか 1 ミリ秒しかかかりません。
この Go プログラムの実行を動的にトレースするためのカスタム Y language アナライザーを作成しましょう。
カスタム Ylang アナライザーを作成して Go プログラムを動的にトレース
OpenResty XRayの Web コンソールに切り替えます。
「Analyzers」ページに移動します。
「Add new analyzer」をクリックします。
「Analyzer name」テキストボックスにアナライザーの名前を入力します。
言語タイプとして 「YLang」 を選択します。
デフォルトで提供されている Y language プログラムの例を削除します。
ここでは、main
パッケージ内の Go 関数 showAnimals
のエントリーポイントに動的プローブを追加します。
このパラメータの型は、キーが string
、値の型が main.Animal
の map
です。
このパラメータの名前は animals
です。
_dump_go_val
を呼び出して animals
変数の値を出力します。
_exit()
を呼び出して、このプローブハンドラの実行後にアナライザーを終了させます。
コードを保存します。
これは短命のプログラムなので、「By Executables」モードを選択します。
前のターミナルウィンドウに戻ります。readlink -f
コマンドを実行して実行可能ファイルのパスを見つけます。それをコピーします。
実行可能ファイルのパスを貼り付けます。
「Run」をクリックして実行を開始します。
アナライザーがトレースを開始しました。
トレース結果のテスト
ターミナルに戻ります。
Go プログラムを実行します。プログラムは通常通り動作します。
このプログラムの実行時間は以前と同じで、わずか 1 ミリ秒です。
Web コンソールに戻ります。XRay アナライザーが animals
パラメータ変数の値を正確に出力していることがわかります。map
には 2 つのキーと値のペアが含まれています。
cow
キーが指す値の型は main.Animal
です。
main.Animal
には food
と age
の 2 つのメンバーがあります。
メンバー food
の型は文字列で、その値は 「grass」です。
この文字列の長さは 5 です。
main.Animal
の 2 番目のフィールドは age
です。
age
の型は float32
です。
「bird」のキーと値のペアは「cow」と同様です。
必要に応じて「By Processes」モードを選択することもできます。
または「By Applications」モードを選択することもできます。
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(マイクロサービスおよび分散トラフィックに最適化された多機能
翻訳
英文版 の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!