Heim > Backend-Entwicklung > Golang > 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
Freigeben: 2024-02-11 12:51:07
nach vorne
679 Leute haben es durchsucht

从使用 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))
}
Nach dem Login kopieren

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 ""
}
Nach dem Login kopieren

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
}
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage