SkyWalking を使用してアプリケーションをインストルメントし、トレースデータを Managed Service for OpenTelemetry コンソールにレポートすると、Managed Service for OpenTelemetry はアプリケーションの監視を開始します。その後、アプリケーショントポロジー、トレース、異常トランザクション、低速トランザクション、SQL 分析など、アプリケーションの監視データを表示できます。このトピックでは、Go 用 SkyWalking Agent を使用して Go アプリケーションを自動的にインストルメントし、トレースデータをレポートする方法について説明します。
ARMS は、Go アプリケーション用に商用サポートされている独自開発のエージェントを提供します。このエージェントは、非侵入型のインストルメンテーションを可能にし、より豊富な機能セットと強化された安定性を提供します。
前提条件
エージェントの種類
Go2Sky は、SkyWalking が公式に提供している Go 用の古いエージェントバージョンです。Go2Sky エージェントは多くのユーザーによって使用されていますが、ユーザーコードに侵入します。この問題を解決するために、SkyWalking は公式に skywalking-go エージェントをリリースしました。この新しいエージェントバージョンは、ユーザーコードに侵入しません。このトピックでは、Go2Sky エージェントと skywalking-go エージェントを使用してManaged Service for OpenTelemetry コンソールにデータをレポートする方法について説明します。
Go2Sky
SkyWalking は、skywalking-go エージェントが公式にリリースされた後、Go2Sky エージェントのサポートを終了します。
SkyWalking の公式ウェブサイトでは、Go2Sky エージェントは Retired カテゴリに移動され、もはやメンテナンスされていません。
Go2Sky エージェントはユーザーコードに侵入し、プロジェクトの各プラグインにフックを追加する必要があります。
Go2Sky エージェントは多くのユーザーによって使用されています。
サポートされているインストルメンテーションライブラリ:
skywalking-go
skywalking-go エージェントは、SkyWalking が公式に提供している Go 用の新しいエージェントバージョンです。SkyWalking は skywalking-go エージェントの安定したサポートを提供しています。
skywalking-go エージェントはユーザーコードに侵入しません。
skywalking-go エージェントは使いやすく、Go プロジェクトをコンパイルする際に
-toolexec
パラメータを使用して skywalking-go エージェントを指定するだけで済みます。skywalking-go エージェントのユーザー数は Go2Sky エージェントよりも少なくなっています。
サポートされているインストルメンテーションライブラリ:
推奨エージェント
skywalking-go エージェントを使用することをお勧めします。skywalking-go エージェントには次の利点があります。
使いやすさ: skywalking-go エージェントはより使いやすくなっています。skywalking-go エージェントを統合して自動インストルメンテーションを実装するには、いくつかの簡単な手順を実行するだけで済みます。skywalking-go エージェントはユーザーコードに侵入しませんが、Go2Sky エージェントでは各プラグインにフックを追加する必要があります。
コミュニティサポート: SkyWalking は Go2Sky エージェントのサポートを終了し、Go2Sky エージェントのプルリクエストを受け付けなくなりました。
プラグインエコシステム: SkyWalking は Go2Sky プラグインを skywalking-go エージェントに徐々に移植しています。Go2Sky エージェントと比較して、skywalking-go エージェントは Google Remote Procedure Call (gRPC) フレームワークのインストルメンテーションをサポートしています。
サンプルコード
サンプルコードリポジトリの詳細については、GitHub の skywalking-demo を参照してください。
skywalking-go エージェントを使用してトレースデータをレポートする
skywalking-go エージェントをダウンロードします。
skywalking-go エージェントをビルドします。
cd skywalking-go && make build
skywalking-go/bin ディレクトリに実行可能ファイルを生成します。
実行可能ファイルは、オペレーティングシステムによって異なります。たとえば、macOS オペレーティングシステムの場合は skywalking-go-agent--darwin-amd64 を使用します。
Go プロジェクトを開き、SkyWalking モジュールをメインパッケージにインポートします。
方法 1
package main import ( _ "github.com/apache/skywalking-go" ) // ...残りのコード
方法 2
skywalking-go/bin/skywalking-go-agent--darwin-amd64 -inject path/to/your-project
config.yaml ファイルを設定します。
サンプルコードの skywalking-go/tools/go-agent/config/config.default.yaml ファイルを参照して、config.yaml ファイルを設定できます。
パラメータを設定するには、2 つの方法があります。たとえば、service_name パラメータを設定するには、次のいずれかの方法を使用します。
方法 1 (推奨): config.yaml ファイルに service_name パラメータを追加する
agent: service_name: ${SW_AGENT_NAME:<your_service_name>}
方法 2: システム環境変数を設定する
export SW_AGENT_NAME=<your_service_name>
skywalking-go エージェントを Managed Service for OpenTelemetry コンソールに接続するには、次のパラメータを設定する必要があります。
service_name: ${SW_AGENT_NAME:Your_ApplicationName}
: Go アプリケーションの名前。backend_service: ${SW_AGENT_REPORTER_GRPC_BACKEND_SERVICE:127.0.0.1:11800}
: サーバーのエンドポイント。authentication: ${SW_AGENT_REPORTER_GRPC_AUTHENTICATION:}
: サーバーにアクセスするための認証トークン。
デフォルトでは、skywalking-go エージェントはすべてのプラグインを自動的にインストルメントします。特定のプラグインの自動インストルメンテーションを無効にするには、excluded パラメータを指定します。例:
# SQL プラグインの自動インストルメンテーションを無効にします。 plugin: excluded: ${SW_AGENT_PLUGIN_EXCLUDES:sql} # 複数のプラグインの自動インストルメンテーションを無効にします。プラグインはコンマ (,) で区切ります。 plugin: excluded: ${SW_AGENT_PLUGIN_EXCLUDES:sql,gorm}
プロジェクトをリビルドします。
# -toolexec パラメータを指定します。 sudo go build -toolexec "path/to/skywalking-go-agent -config path/to/config.yaml" -a
path/to/skywalking-go-agent
: 「skywalking-go エージェントを使用してトレースデータをレポートする」セクションの手順 3 で生成された実行可能ファイルへの絶対パス。path/to/config.yaml
: skywalking-go エージェントの config.yaml ファイルへの絶対パス。
プロジェクトを開始します。その後、SkyWalking はデータを Managed Service for OpenTelemetry コンソールにレポートします。
付録
次の表に、skywalking-go エージェントのいくつかの環境変数を示します。NULL の値は、デフォルト値が指定されていないことを示します。
環境変数 | 説明 | デフォルト値 |
SW_AGENT_NAME | Go アプリケーションの名前。 | NULL |
SW_AGENT_INSTANCE_NAME | アプリケーションインスタンスの名前。 | システムによって名前が自動的に生成されます。 |
SW_AGENT_SAMPLE | サンプルレート。有効な値: 0 から 1。 | 1 |
SW_AGENT_REPORTER_GRPC_BACKEND_SERVICE | skywalking-go エージェントが gRPC 経由でトレースデータをレポートするサーバーのエンドポイント。 | 127.0.0.1:11800 |
SW_AGENT_REPORTER_GRPC_AUTHENTICATION | skywalking-go エージェントが gRPC 経由でトレースデータをレポートするサーバーにアクセスするための認証トークン。 | NULL |
SW_AGENT_PLUGIN_EXCLUDES | 自動インストルメンテーションを無効にするプラグイン。 | NULL |
Go2Sky エージェントを使用してトレースデータをレポートする
Go2Sky エージェントでは、パラメータをプロジェクトにハードコーディングするか、環境変数を使用してパラメータを設定できます。
パラメータをプロジェクトにハードコーディングする
### reporter.WithParameter() メソッドを使用してパラメータをインポートします。 report, err := reporter.NewGRPCReporter( <your-backend-server-address>, reporter.WithAuthentication(<your-auth-token>))
環境変数を使用してパラメータを設定する
### Go2Sky エージェントは、環境変数から次のパラメータの値を取得できます。 SW_AGENT_AUTHENTICATION SW_AGENT_LAYER SW_AGENT_COLLECTOR_HEARTBEAT_PERIOD SW_AGENT_COLLECTOR_GET_AGENT_DYNAMIC_CONFIG_INTERVAL SW_AGENT_COLLECTOR_BACKEND_SERVICES SW_AGENT_COLLECTOR_MAX_SEND_QUEUE_SIZE SW_AGENT_PROCESS_STATUS_HOOK_ENABLE SW_AGENT_PROCESS_LABELS ### 環境変数を設定します。この例では、macOS を使用しています。 # 方法 1: 環境変数設定ファイルを記述します。この方法で設定された環境変数は永続的に有効です。 vim ~/.bash_profile export SW_AGENT_COLLECTOR_BACKEND_SERVICES=<your-collector-address> source ~/.bash_profile # 方法 2: ターミナルを開き、コマンドラインで環境変数を設定します。この方法で設定された環境変数は一時的に有効であり、別のターミナルを開くと無効になります。 export SW_AGENT_COLLECTOR_BACKEND_SERVICES=<your-collector-address>
ServiceName パラメータを設定してアプリケーションを指定します。
ServiceName := <your-service-name> tracer, err := go2sky.NewTracer(ServiceName, go2sky.WithReporter(report))
Go2Sky プラグインのフックを追加します。
Go2Sky エージェントは、多くのライブラリ用のプラグインを提供しています。これらのプラグインのフックをプロジェクトのソースコードに追加する必要があります。フックを追加する方法の詳細については、GitHub の go2sky-plugins リポジトリを参照してください。各プラグインの plugin フォルダには、プラグインの使用方法を説明する README.md ファイルが用意されています。
この例では、gin フレームワークを使用しています。
/gin フォルダに移動し、/gin/v3/README.md ファイルを表示します。
ミドルウェアのフック v3.Middleware(r, tracer) を追加します。
package main import ( "log" "github.com/SkyAPM/go2sky" v3 "github.com/SkyAPM/go2sky-plugins/gin/v3" "github.com/SkyAPM/go2sky/reporter" "github.com/gin-gonic/gin" ) func main() { // 本番環境では gRPC レポーターを使用します。 re, err := reporter.NewLogReporter() if err != nil { log.Fatalf("新しいレポーターエラー %v \n", err) } defer re.Close() tracer, err := go2sky.NewTracer("gin-server", go2sky.WithReporter(re)) if err != nil { log.Fatalf("トレーサーの作成エラー %v \n", err) } gin.SetMode(gin.ReleaseMode) r := gin.New() // トレースを使用して go2sky ミドルウェアを使用します r.Use(v3.Middleware(r, tracer)) // 何かを実行します }
アプリケーションを再起動します。
付録
次の表に、Go2Sky エージェントの環境変数を示します。NULL の値は、デフォルト値が指定されていないことを示します。
環境変数 | 説明 | デフォルト値 |
SW_AGENT_NAME | Go アプリケーションの名前。 | NULL |
SW_AGENT_LAYER | Instance belong layer name which define in the backend Go アプリケーションインスタンスが属するレイヤーの名前。 | NULL |
SW_AGENT_INSTANCE_NAME | Go アプリケーションインスタンスの名前。 | システムはランダムな名前を生成します。 |
SW_AGENT_SAMPLE | サンプルレート。値 1 は、すべてのデータがサンプリングされることを指定します。 | 1 |
SW_AGENT_COLLECTOR_BACKEND_SERVICES | Go2Sky エージェントがトレースデータをレポートするサーバーのエンドポイント。 | NULL |
SW_AGENT_AUTHENTICATION | Go2Sky エージェントがトレースデータをレポートするサーバーにアクセスするための認証トークン。 | NULL |
SW_AGENT_COLLECTOR_HEARTBEAT_PERIOD | Go2Sky エージェントのハートビート間隔。単位: 秒。 | 20 |
SW_AGENT_COLLECTOR_GET_AGENT_DYNAMIC_CONFIG_INTERVAL | Go2Sky エージェントの設定が動的に取得される間隔。単位: 秒。 | 20 |
SW_AGENT_COLLECTOR_MAX_SEND_QUEUE_SIZE | スパンを送信するためのキューバッファのサイズ。 | 30000 |
SW_AGENT_PROCESS_STATUS_HOOK_ENABLE | プロセスステータスフック機能を有効にするかどうかを指定します。 | False |
SW_AGENT_PROCESS_LABELS | プロセスラベル。複数のプロセスラベルはコンマ (,) で区切ります。 | NULL |
FAQ
skywalking-go エージェントを使用しているときに、次の図に示すエラーメッセージが表示された場合はどうすればよいですか?
inject メソッドが失敗した場合は、import メソッドを使用して SkyWalking モジュールをメインパッケージにインポートできます。
Go2Sky エージェントを使用してトレースデータをレポートするときに、Managed Service for OpenTelemetry コンソールにクロスプロセスサービス呼び出しの正しいトレースデータが表示されないのはなぜですか?
Managed Service for OpenTelemetry は、トレース ID に基づいてトレースを接続します。トレース ID は、HTTP リクエストによって伝送されます。無効なトレースデータが表示される場合は、トレース ID が正しく伝送されていません。この場合は、インストルメンテーションに適切なスパンを設定する必要があります。
クロスプロセスサービス呼び出しのトレースを接続するには、次の 2 つの重要な操作を呼び出すことができます。
CreateEntrySpan: エントリスパンを作成します。この操作を呼び出して、トレース ID を含むトレース分析コンテキストを HTTP リクエストから抽出できます。
CreateExitSpan: 出力スパンを作成します。この操作を呼び出して、トレース ID を含むトレース分析コンテキストを HTTP リクエストに挿入できます。
// CreateLocalSpan 操作を呼び出して、プロセス内にスパンを作成します。 span, ctx, err := tracer.CreateLocalSpan(context.Background()) subSpan, newCtx, err := tracer.CreateLocalSpan(ctx) // クロスプロセスサービス呼び出しの場合は、CreateEntrySpan 操作を呼び出して HTTP リクエストからトレース分析コンテキストを抽出し、CreateExitSpan 操作を呼び出してトレース分析コンテキストを HTTP リクエストに挿入します。 span, ctx, err := tracer.CreateEntrySpan(r.Context(), "/api/login", func(key string) (string, error) { return r.Header.Get(key), nil }) span, err := tracer.CreateExitSpan(req.Context(), "/service/validate", "tomcat-service:8080", func(key, value string) error { req.Header.Set(key, value) return nil })
クロスプロセスサービス呼び出しでは、トレースを接続するために、トレース ID をプロセス間で伝送する必要があります。したがって、前述の操作を呼び出して、プロセス間で伝送される HTTP リクエストにトレース分析コンテキストを挿入する必要があります。