Application Real-Time Monitoring Service (ARMS) の Go エージェントは、カスタム拡張機能を提供します。これらの拡張機能を使用すると、元のコードを変更することなくカスタム機能を追加でき、リクエストパラメーターとリクエストボディに基づいて問題を特定するのに役立ちます。このトピックでは、Go エージェントのカスタム拡張機能を使用して OpenTelemetry スパンを作成する方法について説明します。
前提条件
アプリケーションが Go 1.18 以降で実行されていることを確認してください。
Go アプリケーションを ARMS に接続済みであること。
重要リンク先のドキュメントで説明されているように、コンパイルコマンドが
./instgo go build xxxに変更されていることを確認してください。opentelemetry-plugin を有効化済みであること。
カスタムコードを使用して拡張機能を挿入できます。詳細については、「Go エージェントのカスタム拡張機能を使用する」をご参照ください。
手順
現在のプロジェクトディレクトリの外に hook という名前のフォルダを作成します。
go mod init hookコマンドを実行してフォルダを初期化します。次に、hook フォルダに、次のコードを含む hook.go ファイルを作成します。このコードは、挿入されるカスタム拡張機能を定義します。
package hook import ( "context" "encoding/json" "fmt" "github.com/alibaba/loongsuite-go-agent/go-sdk/otel" "github.com/alibaba/loongsuite-go-agent/go-sdk/otel/attribute" "github.com/alibaba/loongsuite-go-agent/pkg/api" "net/http" _ "unsafe" ) // 注: 挿入されるコードの最初のパラメーターは api.CallContext である必要があります。 // 後続のパラメーターは、目的関数のパラメーターと一致している必要があります。 //go:linkname httpClientEnterHook net/http.httpClientEnterHook func httpClientEnterHook(call api.CallContext, t *http.Transport, req *http.Request) { header, _ := json.Marshal(req.Header) fmt.Println("request header is ", string(header)) tracer := otel.GetTracerProvider().Tracer("") _, span := tracer.Start(context.Background(), "Client/User defined span") span.SetAttributes(attribute.String("client", "client-with-ot")) span.SetAttributes(attribute.Bool("user.defined", true)) span.End() } // 注: 挿入されるコードの最初のパラメーターは api.CallContext である必要があります。 // 後続のパラメーターは、目的関数の戻り値と一致している必要があります。 //go:linkname httpClientExitHook net/http.httpClientExitHook func httpClientExitHook(call api.CallContext, res *http.Response, err error) { header, _ := json.Marshal(res.Header) fmt.Println("response header is ", string(header)) }上記のコードでスパンを作成する部分は次のとおりです。
tracer := otel.GetTracerProvider().Tracer("") _, span := tracer.Start(context.Background(), "Client/User defined span") span.SetAttributes(attribute.String("client", "client-with-ot")) span.SetAttributes(attribute.Bool("user.defined", true)) span.End()テスト用のデモを作成します。
hook フォルダとは異なるディレクトリに、デモアプリケーション用のフォルダを作成します。
go mod init demoコマンドを実行してフォルダを初期化します。次に、demo フォルダに、次のコードを含む main.go ファイルを作成します。説明プロジェクトにすでに OpenTelemetry への依存関係がある場合は、main.go ファイルに
_ "go.opentelemetry.io/otel"を追加する必要はありません。そうでない場合は、追加する必要があります。package main import ( "context" "fmt" "io/ioutil" "log" "net/http" _ "go.opentelemetry.io/otel" ) func main() { // リクエスト URL を定義します。 req, _ := http.NewRequestWithContext(context.Background(), "GET", "http://www.aliyun.com", nil) req.Header.Set("otelbuild", "true") client := &http.Client{} resp, _ := client.Do(req) // 関数が終了するときにレスポンスボディを必ず閉じます。 defer resp.Body.Close() }demo フォルダに、次のコードを含む conf.json 構成ファイルを作成します。
次のコードは、Go エージェントにカスタムフックコードを
database/sql::(*DB).Query()関数に挿入するように指示します。[{ "ImportPath":"net/http", "Function":"RoundTrip", "OnEnter":"httpClientEnterHook", "ReceiverType": "*Transport", "OnExit": "httpClientExitHook", "Path": "/path/to/hook" # Path をフックコードのローカルパスに変更します。 }]demo ディレクトリに切り替えます。instgo ツールを使用してプログラムをコンパイルおよび実行し、カスタム拡張機能を検証します。
$ ./instgo set --rule=./conf.json $ ./instgo go buildデモプログラムを開始します。
プログラムをローカルで開始するには、環境変数を宣言します。コンテナーにデモプログラムをデプロイすることもできます。
環境変数を宣言します。
export ARMS_ENABLE=true export ARMS_APP_NAME=xxx # アプリケーション名。 export ARMS_REGION_ID=xxx # Alibaba Cloud アカウントのリージョン ID。 export ARMS_LICENSE_KEY=xxx # ステップ 1 で取得したライセンスキー。デモプログラムを開始します。
./demo
ARMS コンソールで、 に移動して、アプリケーションのモニタリングデータを表示します。
参考
詳細については、「ARMS Agent for Go のカスタム拡張機能を使用する」をご参照ください。