php小編魚仔將為您介紹使用golang otelmux檢測的OTEL追蹤取得trace_id的方法。 OTEL(OpenTelemetry)是一個開源的觀測性工具,可以幫助開發人員監控和調試分散式應用程式。透過使用golang otelmux,我們可以輕鬆地在應用程式中整合OTEL追蹤功能,並取得trace_id,以便更好地分析和優化應用程式的效能。接下來,我們將詳細介紹如何使用golang otelmux進行OTEL跟踪,並取得trace_id的方法。
在我的golang 應用程式中,我使用otelmux
中間件和ddotel
追蹤器提供者來偵測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)) }
每當追蹤附加到請求時(考慮取樣率),我想從根跨度中提取追蹤ID,這樣我就可以將其註入到日誌記錄API 中,以便關聯來自該請求的日誌具有來自同一請求的跟蹤。
到目前為止,我還沒有找到直接從請求上下文獲取追蹤 ID 的方法。
如何提取追蹤 ID?
感謝 @hamed-n 評論的最佳解決方案:
trace套件中有一個從span上下文提取trace ID的函數:「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 "" }
就我而言,由於我使用的提供者是 DataDog,因此我必須將追蹤 ID 轉換為 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 }
以上是從使用 golang otelmux 檢測的 OTEL 追蹤獲取trace_id的詳細內容。更多資訊請關注PHP中文網其他相關文章!