ご利用の Go アプリケーションに SkyWalking エージェントをイベントトラッキングし、分散トレースを Managed Service for OpenTelemetry コンソールに送信します。トレースが到着すると、アプリケーションのトポロジー、トレース、低速トランザクション、エラー分析、SQL 分析を探索できます。
Go をサポートする SkyWalking エージェントは 2 種類あります。
| エージェント | 計装スタイル | ステータス |
|---|---|---|
| skywalking-go (推奨) | 非侵入型 -- -toolexec | 活発にメンテナンス中 |
| Go2Sky (レガシ) | 侵入型 -- ソースコード内にプラグインごとのフックが必要 | 廃止、メンテナンス終了 |
ご利用のプロジェクトがすでに Go2Sky に依存している場合を除き、skywalking-go から開始してください。SkyWalking は Go2Sky プラグインを skywalking-go エージェントに徐々に移植しており、gRPC フレームワークのサポートも追加しています。
ARMS は、より豊富な機能セットと強化された安定性を備えた非侵入型イベントトラッキングを可能にする、商用サポートされた自社開発の Go 用エージェントも提供しています。
skywalking-go エージェントを使用したトレースのレポート
以下の手順では、skywalking-go エージェントのビルド、Managed Service for OpenTelemetry 用の設定、およびコンパイル時イベントトラッキングを使用した Go プロジェクトの再ビルドについて説明します。
ステップ 1: SkyWalking エンドポイントの取得
左側のナビゲーションウィンドウで、[クラスタ設定] をクリックします。表示されるページで、[エンドポイント情報] タブをクリックします。
上部ナビゲーションバーでリージョンを選択します。[クラスター情報] セクションで、[トークンを表示] をオンにします。
[クライアント] パラメーターを [SkyWalking] に設定します。
エンドポイントを、[関連情報] 列からコピーします。

ご利用のアプリケーションが Alibaba Cloud 本番環境で実行されている場合は、VPC エンドポイントを使用します。それ以外の場合は、パブリックエンドポイントを使用します。
ステップ 2: エージェントバイナリのビルド
skywalking-go エージェントをクローンしてビルドします。
git clone https://github.com/apache/skywalking-go.git
cd skywalking-go && make buildビルドにより、skywalking-go/bin/ ディレクトリに実行可能ファイルが生成されます。ファイル名は OS によって異なります -- たとえば、macOS では skywalking-go-agent--darwin-amd64 です。

ステップ 3: プロジェクトへの SkyWalking モジュールの追加
次のいずれかの方法を選択してください。
オプション A -- コードでのインポート
(メインパッケージに追加):
package main
import (
_ "github.com/apache/skywalking-go"
)オプション B -- エージェントバイナリでのインジェクション
skywalking-go/bin/skywalking-go-agent--darwin-amd64 -inject path/to/your-projectインジェクションメソッドが失敗した場合は、代わりにオプション A を使用してください。
ステップ 4: エージェントの設定
少なくとも以下の3つのパラメーターを含むconfig.yaml ファイルを作成します。
agent:
service_name: ${SW_AGENT_NAME:<your-service-name>}
reporter:
grpc:
backend_service: ${SW_AGENT_REPORTER_GRPC_BACKEND_SERVICE:<your-skywalking-endpoint>}
authentication: ${SW_AGENT_REPORTER_GRPC_AUTHENTICATION:<your-auth-token>}プレースホルダーを実際の値に置き換えます。
| プレースホルダー | 説明 | 例 |
|---|---|---|
<your-service-name> | コンソールでアプリケーションを識別する名前 | my-go-service |
<your-skywalking-endpoint> | ステップ 1 | xxx.api.aliyuncs.com:11800 |
<your-auth-token> | エンドポイントの横に表示される認証トークン | abcdef123456 |
これらの値を config.yaml に直接 (推奨)、または環境変数で設定します:
export SW_AGENT_NAME=my-go-service
export SW_AGENT_REPORTER_GRPC_BACKEND_SERVICE=xxx.api.aliyuncs.com:11800
export SW_AGENT_REPORTER_GRPC_AUTHENTICATION=abcdef123456特定のプラグインの無効化
デフォルトでは、skywalking-go エージェントはサポートされているすべてのプラグインをインストルメント化します。特定のプラグインを除外するには、excluded パラメーターを追加します:
plugin:
# 単一のプラグインを無効にする
excluded: ${SW_AGENT_PLUGIN_EXCLUDES:sql}
# 複数のプラグインを無効にする (カンマ区切り)
# excluded: ${SW_AGENT_PLUGIN_EXCLUDES:sql,gorm}ステップ 5: プロジェクトの再ビルド
-toolexec フラグを使用して、エージェントのバイナリと設定ファイルを指定してコンパイルします:
sudo go build -toolexec "path/to/skywalking-go-agent -config path/to/config.yaml" -aステップ 6: アプリケーションの起動と検証
コンパイルされたバイナリを実行します。エージェントはサポートされているすべてのプラグインを自動的にイベントトラッキングし、gRPC 経由でトレースのレポートを開始します。
プロジェクトを開始した後、SkyWalking はデータを Managed Service for OpenTelemetry コンソールにレポートします。
環境変数リファレンス
| 環境変数 | 説明 | デフォルト |
|---|---|---|
SW_AGENT_NAME | コンソールに表示されるアプリケーション名 | なし |
SW_AGENT_INSTANCE_NAME | インスタンス名 | 自動生成 |
SW_AGENT_SAMPLE | サンプリングレート (0~1、1 は 100% に相当します) | 1 |
SW_AGENT_REPORTER_GRPC_BACKEND_SERVICE | トレースレポート用の gRPC エンドポイント | 127.0.0.1:11800 |
SW_AGENT_REPORTER_GRPC_AUTHENTICATION | 認証トークン | なし |
SW_AGENT_PLUGIN_EXCLUDES | 無効にするプラグインのカンマ区切りリスト | なし |
サポートされているプラグイン
skywalking-go エージェントは、コンパイル時に以下のライブラリを自動的にイベントトラッキングします。ライブラリごとのインストールは不要です。
| ライブラリ |
|---|
| sql |
| dubbo-go |
| gear |
| gin |
| go-restful |
| gorm |
| http |
| go-kratos v2 |
| logrus |
| go-micro v3.5.0 |
| mongo |
| go-resty v2.2.0 |
| zap v1.16.0 |
Go2Sky エージェント (レガシ) を使用したトレースのレポート
SkyWalking は Go2Sky を廃止しました。プルリクエストを受け付けず、アップデートも提供していません。新しいプロジェクトには、skywalking-go エージェントを使用してください。
ステップ 1: レポーターのセットアップ
パラメーターをハードコーディングするか、環境変数を設定して gRPC レポーターを設定します。
オプション A -- プロジェクトでのハードコード
report, err := reporter.NewGRPCReporter(
"<your-backend-server-address>",
reporter.WithAuthentication("<your-auth-token>"))オプション B -- 環境変数の設定
# 永続的 -- シェルプロファイルに追加します
export SW_AGENT_COLLECTOR_BACKEND_SERVICES=<your-collector-address>
export SW_AGENT_AUTHENTICATION=<your-auth-token>
# その後、アプリケーションを起動します (エージェントはこれらの変数を自動的に読み取ります)ステップ 2: トレーサーの作成
ServiceName := "<your-service-name>"
tracer, err := go2sky.NewTracer(ServiceName, go2sky.WithReporter(report))ステップ 3: プラグインフックの追加
Go2Sky は、イベントトラッキングされた各ライブラリにフックを必要とします。GitHub の go2sky-plugins リポジトリをご参照ください。各プラグインフォルダーには、統合手順が記載された README が含まれています。
例 -- gin フレームワーク:
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("new reporter error %v \n", err)
}
defer re.Close()
tracer, err := go2sky.NewTracer("gin-server", go2sky.WithReporter(re))
if err != nil {
log.Fatalf("create tracer error %v \n", err)
}
gin.SetMode(gin.ReleaseMode)
r := gin.New()
// トレース付きの go2sky ミドルウェアを使用します
r.Use(v3.Middleware(r, tracer))
// ここにルートを追加します
}ステップ 4: アプリケーションの再起動
フックを追加した後、アプリケーションを再起動します。トレースが Managed Service for OpenTelemetry コンソールに流れ始めます。
サポートされているプラグインライブラリ
各プラグインには go get による個別のインストールが必要です:
| ライブラリ | インストールコマンド |
|---|---|
| sql | go get -u github.com/SkyAPM/go2sky-plugins/sql |
| dubbo-go | go get -u github.com/SkyAPM/go2sky-plugins/dubbo-go |
| gear | go get -u github.com/SkyAPM/go2sky-plugins/gear |
| gin | go get -u github.com/SkyAPM/go2sky-plugins/gin/v2 または gin/v3 |
| go-restful | go get -u github.com/SkyAPM/go2sky-plugins/go-restful |
| gorm | go get -u github.com/SkyAPM/go2sky-plugins/gorm |
| http | go get -u github.com/SkyAPM/go2sky |
| go-kratos v2 | go get -u github.com/SkyAPM/go2sky-plugins/kratos |
| logrus | go get -u github.com/SkyAPM/go2sky-plugins/logrus |
| go-micro v3.5.0 | go get -u github.com/SkyAPM/go2sky-plugins/micro |
| mongo | go get -u github.com/SkyAPM/go2sky-plugins/mongo |
| go-resty v2.2.0 | go get -u github.com/SkyAPM/go2sky-plugins/resty |
| zap v1.16.0 | go get -u github.com/SkyAPM/go2sky-plugins/zap |
環境変数リファレンス
| 環境変数 | 説明 | デフォルト |
|---|---|---|
SW_AGENT_NAME | アプリケーション名 | なし |
SW_AGENT_LAYER | インスタンスのレイヤー名 | なし |
SW_AGENT_INSTANCE_NAME | インスタンス名 | ランダム |
SW_AGENT_SAMPLE | サンプリングレート (1 = フルサンプリング) | 1 |
SW_AGENT_COLLECTOR_BACKEND_SERVICES | トレースレポート用のサーバーエンドポイント | なし |
SW_AGENT_AUTHENTICATION | 認証トークン | なし |
SW_AGENT_COLLECTOR_HEARTBEAT_PERIOD | ハートビート間隔 (秒単位) | 20 |
SW_AGENT_COLLECTOR_GET_AGENT_DYNAMIC_CONFIG_INTERVAL | 動的構成フェッチ間隔 (秒単位) | 20 |
SW_AGENT_COLLECTOR_MAX_SEND_QUEUE_SIZE | スパンキューバッファーサイズ | 30000 |
SW_AGENT_PROCESS_STATUS_HOOK_ENABLE | プロセスステータスフックを有効にする | false |
SW_AGENT_PROCESS_LABELS | カンマ区切りのプロセスラベル | なし |
よくある質問
skywalking-go のインジェクションコマンドが失敗した場合の対処法

-inject メソッドが失敗した場合は、代わりにメインパッケージに SkyWalking のインポートを直接追加します:
import _ "github.com/apache/skywalking-go"次に、手順 5で説明されているように、-toolexec を使用して再構築します。
Go2Sky を使用したプロセス間呼び出しで、コンソールにトレースが切断されて表示されるのはなぜですか?
Managed Service for OpenTelemetry は、HTTP ヘッダーで伝達されるトレース ID によってスパンを関連付けます。サービス間でトレースが切断されて表示される場合、トレースコンテキストが正しく伝播されていません。
これを修正するには、HTTP 境界を越えてトレースコンテキストを伝播するエントリスパンとイグジットスパンを作成します。
// CreateEntrySpan -- 受信 HTTP リクエストからトレースコンテキストを抽出します
span, ctx, err := tracer.CreateEntrySpan(r.Context(), "/api/login", func(key string) (string, error) {
return r.Header.Get(key), nil
})
// CreateExitSpan -- 送信 HTTP リクエストにトレースコンテキストを注入します
span, err := tracer.CreateExitSpan(req.Context(), "/service/validate", "tomcat-service:8080", func(key, value string) error {
req.Header.Set(key, value)
return nil
})インプロセススパン (ネットワーク境界がない場合) には、 CreateLocalSpan を使用します:
span, ctx, err := tracer.CreateLocalSpan(context.Background())
subSpan, newCtx, err := tracer.CreateLocalSpan(ctx)プロセス境界を越えるすべての HTTP 呼び出しは、トレースコンテキストを保持する必要があります。各境界で CreateEntrySpan および CreateExitSpan を使用しない場合、ダウンストリームサービスは新しい切断されたトレースを開始します。
サンプルコード
完全な動作例については、GitHub の skywalking-demo リポジトリをご参照ください。