すべてのプロダクト
Search
ドキュメントセンター

Application Real-Time Monitoring Service:Go カスタム拡張機能を使用して OpenTelemetry スパンを作成する

最終更新日:Nov 20, 2025

Application Real-Time Monitoring Service (ARMS) の Go エージェントは、カスタム拡張機能を提供します。これらの拡張機能を使用すると、元のコードを変更することなくカスタム機能を追加でき、リクエストパラメーターとリクエストボディに基づいて問題を特定するのに役立ちます。このトピックでは、Go エージェントのカスタム拡張機能を使用して OpenTelemetry スパンを作成する方法について説明します。

前提条件

手順

  1. 現在のプロジェクトディレクトリの外に 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()
  2. テスト用のデモを作成します。

    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()
    }
    
  3. demo フォルダに、次のコードを含む conf.json 構成ファイルを作成します。

    次のコードは、Go エージェントにカスタムフックコードを database/sql::(*DB).Query() 関数に挿入するように指示します。

    [{
      "ImportPath":"net/http",
      "Function":"RoundTrip",
      "OnEnter":"httpClientEnterHook",
      "ReceiverType": "*Transport",
      "OnExit": "httpClientExitHook",
      "Path": "/path/to/hook" # Path をフックコードのローカルパスに変更します。
    }]
  4. demo ディレクトリに切り替えます。instgo ツールを使用してプログラムをコンパイルおよび実行し、カスタム拡張機能を検証します。

    $ ./instgo set --rule=./conf.json
    $ ./instgo go build 
  5. デモプログラムを開始します。

    プログラムをローカルで開始するには、環境変数を宣言します。コンテナーにデモプログラムをデプロイすることもできます。

    1. 環境変数を宣言します。

      export ARMS_ENABLE=true
      export ARMS_APP_NAME=xxx   # アプリケーション名。
      export ARMS_REGION_ID=xxx   # Alibaba Cloud アカウントのリージョン ID。
      export ARMS_LICENSE_KEY=xxx   # ステップ 1 で取得したライセンスキー。
    2. デモプログラムを開始します。

      ./demo
  6. ARMS コンソールで、[アプリケーションモニタリング] > [アプリケーションリスト] に移動して、アプリケーションのモニタリングデータを表示します。

参考

詳細については、「ARMS Agent for Go のカスタム拡張機能を使用する」をご参照ください。