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 serverKonteks 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
//... lainnyaMetode manual ini menyebarkan konteks span.
Setelah mengompilasi aplikasi, aktifkan pengaturan OpenTelemetry untuk probe aplikasi tersebut, lalu mulai ulang aplikasi agar perubahan diterapkan.