Todos os produtos
Search
Central de documentação

Application Real-Time Monitoring Service:Manter a continuidade de rastreamento em versões do Asynq anteriores à v0.26.0

Última atualização: Sep 21, 2026

Versões do Asynq anteriores à v0.26.0 não oferecem suporte nativo à propagação de contexto de span. Para manter a continuidade de rastreamento, passe o contexto de rastreamento manualmente no payload da tarefa.

Solução

A struct Task em versões do Asynq anteriores à v0.26.0 não inclui um carrier para propagar o SpanContext. Para manter a continuidade de rastreamento, incorpore o contexto de rastreamento diretamente no payload da tarefa.

// Task represents a unit of work to be performed.
type Task struct {
    // typename indicates the type of task to be performed.
    typename string

    // payload holds data needed to perform the task.
    payload []byte

    // opts holds options for the task.
    opts []Option

    // w is the ResultWriter for the task.
    w *ResultWriter
}

Por exemplo, considere que a struct de payload da Task esteja definida da seguinte forma:

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

Adicione um campo Header para transportar o contexto de rastreamento:

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

Antes de criar uma tarefa, crie um span e injete o contexto de rastreamento no payload:

var task asynq.Task
tracer := otel.GetTracerProvider().Tracer("")
opts := append([]tracex.SpanStartOption{}, tracex.WithSpanKind(tracex.SpanKindClient))
// This is a demo. Write the trace information of the created span to the body and send it to the server-side. Adjust the code as needed.
ctx, span := tracer.Start(context.Background(), "Push Task", opts...)
var headerMap propagation.MapCarrier
headerMap = make(map[string]string)
otel.GetTextMapPropagator().Inject(ctx, headerMap)
// Set the span context in the header.
for k, v := range headerMap {
  task.Header[k] = v
}
defer span.End()
//... push task to server

Ao recuperar a tarefa, extraia e restaure o contexto de rastreamento:

var headerMap propagation.MapCarrier
headerMap = make(map[string]string)
ctxRequest := context.Background()
// Get task header.
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
//... other

Isso garante que o contexto de span se propague entre o produtor e o consumidor da tarefa.

Após compilar a aplicação, ative o OpenTelemetry para o probe da aplicação e reinicie-a.

No console do ARMS, acesse a página Probe Settings. Na seção Plugin Switch, selecione a caixa de seleção opentelemetry-plugin e clique em Save. Reinicie a aplicação para que as alterações entrem em vigor.