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

Application Real-Time Monitoring Service:Asynq v0.26.0 未満のバージョンにおけるトレース継続性の維持

最終更新日:Jun 23, 2026

Asynq v0.26.0 未満のバージョンは、スパンコンテキストの伝播をネイティブにサポートしていません。トレースの継続性を維持するには、タスクペイロードでトレースコンテキストを手動で渡す必要があります。

ソリューション

Asynq v0.26.0 未満のバージョンでは、Task 構造体に SpanContext を伝播するためのキャリアが含まれていません。トレースの継続性を維持するには、トレースコンテキストをタスクペイロードに直接埋め込みます。

// Task は、実行される作業の単位を表します。
type Task struct {
    // typename は、実行されるタスクのタイプを示します。
    typename string

    // payload は、タスクの実行に必要なデータを保持します。
    payload []byte

    // opts は、タスクのオプションを保持します。
    opts []Option

    // w は、タスクの ResultWriter です。
    w *ResultWriter
}

たとえば、Task ペイロードの構造体が次のように定義されているとします。

type WelcomeEmailPayload struct {
	UserID   int    `json:"user_id"`
	Email    string `json:"email"`
	Username string `json:"username"`
}

トレースコンテキストを運ぶために `Header` フィールドを追加します。

type WelcomeEmailPayload struct {
	UserID   int    `json:"user_id"`
	Email    string `json:"email"`
	Username string `json:"username"`
    Header   map[string]string `json:"header"`
}

タスクを作成する前に、スパンを作成し、トレースコンテキストをペイロードにインジェクトします。

var task asynq.Task
tracer := otel.GetTracerProvider().Tracer("")
opts := append([]tracex.SpanStartOption{}, tracex.WithSpanKind(tracex.SpanKindClient))
// これはデモです。作成されたスパンのトレース情報を本文に書き込み、サーバー側に送信します。必要に応じてコードを調整してください。
ctx, span := tracer.Start(context.Background(), "Push Task", opts...)
var headerMap propagation.MapCarrier
headerMap = make(map[string]string)
otel.GetTextMapPropagator().Inject(ctx, headerMap)
// ヘッダーにスパンコンテキストを設定します。
for k, v := range headerMap {
  task.Header[k] = v
}
defer span.End()
//... タスクをサーバーにプッシュします

タスクが取得されたら、トレースコンテキストを抽出して復元します。

var headerMap propagation.MapCarrier
headerMap = make(map[string]string)
ctxRequest := context.Background()
// タスクヘッダーを取得します。
var task asynq.Task
for k, v := range task.Header {
  headerMap[k] = v
}
xxCtx := otel.GetTextMapPropagator().Extract(ctxRequest, headerMap)
tracer := otel.GetTracerProvider().Tracer("")
opts := append([]trace.SpanStartOption{}, trace.WithSpanKind(trace.SpanKindServer))
_, span := tracer.Start(xxCtx, "Recv Task", opts...)
defer span
//... その他

これにより、タスクプロデューサーとタスクコンシューマーの間でスパンコンテキストが確実に伝播されます。

アプリケーションをコンパイルした後、アプリケーションプローブに対して OpenTelemetry を有効にし、アプリケーションを再起動します。

ARMS コンソールで、[プローブ設定] ページに移動します。[プラグインスイッチ] セクションで、[opentelemetry-plugin] チェックボックスを選択し、[保存] をクリックします。変更を有効にするには、アプリケーションを再起動してください。