exec.Command
などで外部コマンドを呼び出す際に環境変数を用いてW3C TraceContext形式でトレースコンテキストを伝搬させる例
# jaegerを起動し、cmd/otel-parentを実行してトレースを送信する
docker compose up -d
# jaegerを開く
open http://localhost:16686/search
まずPropagatorを以下のように登録しておきます。
otel.SetTextMapPropagator(
propagation.NewCompositeTextMapPropagator(
propagation.TraceContext{},
propagation.Baggage{},
),
)
親コマンドotel-parent
において以下のようにトレースを開始します。
otel.Tracer(instrumentationName).Start(context.Background(), "parent")
otel-parent
は子コマンドotel-child
を呼び出します。
この際、otel-parent
のトレースコンテキストをW3C TraceContext形式で環境変数に指定することでコマンドotel-child
を伝搬します。
W3C TraceContext形式への変換はpropagation.TraceContext
に任せます。
子コマンドへの環境変数の指定は以下のように行います。
// Propagatorに指定されているpropagation.TraceContextを用いてトレースコンテキストをenvCarrierに書き出し
envCarrier := propagation.MapCarrier{}
otel.GetTextMapPropagator().Inject(ctx, envCarrier)
// 書き出したトレースコンテキストを環境変数に設定
for _, key := range envCarrier.Keys() {
cmd.Env = append(cmd.Env, key+"="+envCarrier.Get(key))
}
子コマンドotel-child
側では環境変数からトレースコンテキストを取得します。
envCarrier := propagation.MapCarrier{
"traceparent": os.Getenv("traceparent"),
"tracestate": os.Getenv("tracestate"),
}
ctx, span := otel.Tracer(instrumentationName).Start(
otel.GetTextMapPropagator().Extract(context.Background(), envCarrier),
"child",
)
otel-env-context
Copyright (C) 2023 Kazumichi Yamamoto
This project is published under MIT.