Heim  >  Artikel  >  Backend-Entwicklung  >  Holen Sie sich die Trace_ID vom OTEL-Trace, der mit Golang OtelMux instrumentiert wurde

Holen Sie sich die Trace_ID vom OTEL-Trace, der mit Golang OtelMux instrumentiert wurde

WBOY
WBOYnach vorne
2024-02-11 12:51:07604Durchsuche

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

php-Editor Yuzai stellt Ihnen die Methode zum Erhalten von Trace_ID mithilfe der von Golang Otelmux erkannten OTEL-Verfolgung vor. OTEL (OpenTelemetry) ist ein Open-Source-Beobachtungstool, das Entwicklern hilft, verteilte Anwendungen zu überwachen und zu debuggen. Durch die Verwendung von golang otelmux können wir die OTEL-Tracing-Funktionalität einfach in die Anwendung integrieren und die Trace_ID erhalten, um die Leistung der Anwendung besser zu analysieren und zu optimieren. Als Nächstes stellen wir detailliert vor, wie man Golang Otelmux für die OTEL-Ablaufverfolgung verwendet und wie man die Trace_ID erhält.

Frageninhalt

In meiner Golang-Anwendung verwende ich otelmux 中间件和 ddotel Tracker-Anbieter, um OTEL-Tracking-Middleware zu erkennen:

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))
}

Immer wenn ein Trace an eine Anfrage angehängt wird (unter Berücksichtigung der Abtastrate), möchte ich die Trace-ID aus dem Root-Span extrahieren, damit ich sie in die Protokollierungs-API einfügen kann, um die Protokolle dieser Anfrage mit der zu korrelieren Trace aus derselben Anfrage.

Bisher habe ich keine Möglichkeit gefunden, die Tracking-ID direkt aus dem Anfragekontext abzurufen.

Wie extrahiere ich die Tracking-ID?

Lösung

Danke an @hamed-n für den Kommentar zur besten Lösung:

Im Trace-Paket gibt es eine Funktion, die die Trace-ID aus dem Span-Kontext extrahiert: „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 ""
}

Da in meinem Fall der von mir verwendete Anbieter DataDog ist, muss ich die Tracking-ID in uint64 Big Endian konvertieren:

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
}

Das obige ist der detaillierte Inhalt vonHolen Sie sich die Trace_ID vom OTEL-Trace, der mit Golang OtelMux instrumentiert wurde. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen