Maison  >  Article  >  développement back-end  >  Obtenez trace_id de la trace OTEL instrumentée à l'aide de Golang Otelmux

Obtenez trace_id de la trace OTEL instrumentée à l'aide de Golang Otelmux

WBOY
WBOYavant
2024-02-11 12:51:07604parcourir

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

l'éditeur php Yuzai vous présentera la méthode d'obtention de trace_id à l'aide du suivi OTEL détecté par golang otelmux. OTEL (OpenTelemetry) est un outil d'observation open source qui aide les développeurs à surveiller et déboguer les applications distribuées. En utilisant golang otelmux, nous pouvons facilement intégrer la fonctionnalité de traçage OTEL dans l'application et obtenir le trace_id pour mieux analyser et optimiser les performances de l'application. Ensuite, nous présenterons en détail comment utiliser golang otelmux pour le traçage OTEL et comment obtenir trace_id.

Contenu de la question

Dans mon application Golang, j'utilise otelmux 中间件和 ddotel fournisseur de tracker pour détecter le middleware de suivi 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))
}

Chaque fois qu'une trace est attachée à une requête (en tenant compte du taux d'échantillonnage), je souhaite extraire l'ID de trace du span racine afin de pouvoir l'injecter dans l'API de journalisation afin de corréler les logs de cette requête avec le trace de la même requête.

Jusqu'à présent, je n'ai pas trouvé de moyen d'obtenir l'identifiant de suivi directement à partir du contexte de la demande.

Comment extraire l'identifiant de suivi ?

Solution

Merci à @hamed-n d'avoir commenté la meilleure solution :

Il existe une fonction dans le package trace qui extrait l'ID de trace du contexte 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 ""
}

Dans mon cas, puisque le fournisseur que j'utilise est DataDog, je dois convertir l'ID de suivi en 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
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer