All Products
Search
Document Center

Application Real-Time Monitoring Service:Mempertahankan kontinuitas jejak pada versi Asynq sebelum v0.26.0

Last Updated:Mar 26, 2026

Topik ini menjelaskan cara mempertahankan kontinuitas jejak pada versi Asynq sebelum v0.26.0.

Solusi

Versi Asynq sebelum v0.26.0 tidak menyertakan carrier dalam struct Task untuk menyebarkan SpanContext. Untuk mempertahankan kontinuitas jejak, Anda harus secara manual meneruskan konteks jejak melalui muatan (payload).

// 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
}

Sebagai contoh, jika struct data untuk muatan Task adalah sebagai berikut:

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

Anda dapat menambahkan sebuah field ke dalam struct tersebut untuk membawa konteks, seperti yang ditunjukkan di bawah ini:

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

Sebelum membuat Task, buat sebuah span dan tuliskan konteksnya ke dalam muatan:

var task asynq.Task
tracer := otel.GetTracerProvider().Tracer("")
opts := append([]tracex.SpanStartOption{}, tracex.WithSpanKind(tracex.SpanKindClient))
// Ini adalah contoh demo. Tulis informasi jejak dari span yang dibuat ke dalam body dan kirim ke sisi server. Sesuaikan kode sesuai kebutuhan.
ctx, span := tracer.Start(context.Background(), "Push Task", opts...)
var headerMap propagation.MapCarrier
headerMap = make(map[string]string)
otel.GetTextMapPropagator().Inject(ctx, headerMap)
// Setel konteks span di header.
for k, v := range headerMap {
  task.Header[k] = v
}
defer span.End()
//... dorong task ke server

Konteks tersebut dapat dipulihkan di tempat Task diambil:

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

Metode manual ini menyebarkan konteks span.

Setelah mengompilasi aplikasi, aktifkan pengaturan OpenTelemetry untuk probe aplikasi tersebut, lalu mulai ulang aplikasi agar perubahan diterapkan.