Dapatkan trace_id daripada trace OTEL diperalatkan dengan golang otelmux

WBOY
Lepaskan: 2024-02-11 12:51:07
ke hadapan
633 orang telah melayarinya

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

editor php Yuzai akan memperkenalkan kepada anda kaedah mendapatkan trace_id menggunakan pengesanan OTEL yang dikesan oleh golang otelmux. OTEL (OpenTelemetry) ialah alat pemerhatian sumber terbuka yang membantu pembangun memantau dan menyahpepijat aplikasi yang diedarkan. Dengan menggunakan golang otelmux, kami boleh menyepadukan fungsi pengesanan OTEL dengan mudah dalam aplikasi dan mendapatkan trace_id untuk menganalisis dan mengoptimumkan prestasi aplikasi dengan lebih baik. Seterusnya, kami akan memperkenalkan secara terperinci cara menggunakan golang otelmux untuk pengesanan OTEL dan cara mendapatkan trace_id.

Kandungan soalan

Dalam aplikasi golang saya, saya menggunakan otelmux 中间件和 ddotel pembekal penjejak untuk mengesan perisian tengah penjejakan 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))
}
Salin selepas log masuk

Setiap kali jejak dilampirkan pada permintaan (dengan mengambil kira kadar pensampelan), saya ingin mengekstrak ID jejak daripada rentang akar supaya saya boleh menyuntiknya ke dalam API pengelogan untuk mengaitkan log daripada permintaan itu dengan jejak daripada permintaan yang sama.

Setakat ini saya tidak menemui cara untuk mendapatkan ID penjejakan terus daripada konteks permintaan.

Bagaimana untuk mengekstrak ID penjejakan?

Penyelesaian

Terima kasih kepada @hamed-n kerana mengulas penyelesaian terbaik:

Terdapat fungsi dalam pakej jejak yang mengekstrak ID jejak daripada konteks 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 ""
}
Salin selepas log masuk

Dalam kes saya, memandangkan pembekal yang saya gunakan ialah DataDog, saya perlu menukar ID penjejakan kepada 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
}
Salin selepas log masuk

Atas ialah kandungan terperinci Dapatkan trace_id daripada trace OTEL diperalatkan dengan golang otelmux. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!