首頁  >  文章  >  後端開發  >  從使用 golang otelmux 檢測的 OTEL 追蹤獲取trace_id

從使用 golang otelmux 檢測的 OTEL 追蹤獲取trace_id

WBOY
WBOY轉載
2024-02-11 12:51:07604瀏覽

从使用 golang otelmux 检测的 OTEL 跟踪获取trace_id

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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除