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 meneruskan konteks jejak secara manual 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 struktur 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 bidang ke 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 rentang (span) dan tulis konteksnya ke dalam muatan:
var task asynq.Task
tracer := otel.GetTracerProvider().Tracer("")
opts := append([]tracex.SpanStartOption{}, tracex.WithSpanKind(tracex.SpanKindClient))
// Ini hanya contoh. Tulis informasi jejak dari rentang yang dibuat ke 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 rentang 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 rentang.
Setelah mengompilasi aplikasi, aktifkan pengaturan OpenTelemetry untuk probe aplikasi tersebut, lalu mulai ulang aplikasi agar perubahan diterapkan.
Di Konsol ARMS, buka halaman Probe Settings. Pada bagian Plugin Switch, centang kotak opentelemetry-plugin, lalu klik Save. Mulai ulang aplikasi Anda agar perubahan diterapkan.