Rumah >pembangunan bahagian belakang >Golang >Dapatkan trace_id daripada trace OTEL diperalatkan dengan golang otelmux
editor php Yuzai akan memperkenalkan kepada anda kaedah mendapatkan trace_id menggunakan pengesanan OTEL yang dikesan oleh golang otelmux. OTEL (OpenTelemetry) ialah alat pemerhatian sumber terbuka yang membantu pembangun memantau dan menyahpepijat aplikasi yang diedarkan. Dengan menggunakan golang otelmux, kami boleh menyepadukan fungsi pengesanan OTEL dengan mudah dalam aplikasi dan mendapatkan trace_id untuk menganalisis dan mengoptimumkan prestasi aplikasi dengan lebih baik. Seterusnya, kami akan memperkenalkan secara terperinci cara menggunakan golang otelmux untuk pengesanan OTEL dan cara mendapatkan trace_id.
Dalam aplikasi golang saya, saya menggunakan otelmux
中间件和 ddotel
pembekal penjejak untuk mengesan perisian tengah penjejakan OTEL:
package tracing import ( "github.com/gorilla/mux" "go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux" ddotel "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/opentelemetry" "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer" ) // Middleware returns a tracing middleware that will add a span for each request. func Middleware(t *TraceProvider) mux.MiddlewareFunc { sampler := tracer.NewRateSampler(0.1) provider := ddotel.NewTracerProvider( tracer.WithSampler(sampler), tracer.WithRuntimeMetrics(), ) return otelmux.Middleware("my-service", otelmux.WithTracerProvider(provider)) }
Setiap kali jejak dilampirkan pada permintaan (dengan mengambil kira kadar pensampelan), saya ingin mengekstrak ID jejak daripada rentang akar supaya saya boleh menyuntiknya ke dalam API pengelogan untuk mengaitkan log daripada permintaan itu dengan jejak daripada permintaan yang sama.
Setakat ini saya tidak menemui cara untuk mendapatkan ID penjejakan terus daripada konteks permintaan.
Bagaimana untuk mengekstrak ID penjejakan?
Terima kasih kepada @hamed-n kerana mengulas penyelesaian terbaik:
Terdapat fungsi dalam pakej jejak yang mengekstrak ID jejak daripada konteks span: "go.opentelemetry.io/otel/trace":
func GetTraceID(ctx context.Context) string { spanCtx := trace.SpanContextFromContext(ctx) if spanCtx.HasTraceID() { traceID := spanCtx.TraceID() return traceID.String() } return "" }
Dalam kes saya, memandangkan pembekal yang saya gunakan ialah DataDog, saya perlu menukar ID penjejakan kepada uint64 big endian:
func GetTraceID(ctx context.Context) string { spanCtx := trace.SpanContextFromContext(ctx) if spanCtx.HasTraceID() { // Since datadog trace provider (ddtrace) uses big endian uint64 for the trace ID, we must first to first convert it back to uint64. traceID := spanCtx.TraceID() traceIDRaw := [16]byte(traceID) traceIDUint64 := byteArrToUint64(traceIDRaw[8:]) traceIDStr := strconv.FormatUint(traceIDUint64, 10) return traceIDStr } return "" } func byteArrToUint64(buf []byte) uint64 { var x uint64 for i, b := range buf { x = x<<8 + uint64(b) if i == 7 { return x } } return x }
Atas ialah kandungan terperinci Dapatkan trace_id daripada trace OTEL diperalatkan dengan golang otelmux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!