亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何獲取有關 *gin.Context.Request.Context() 的詳細信息

如何獲取有關 *gin.Context.Request.Context() 的詳細信息

Go
DIEA 2023-03-15 14:32:34
我正在嘗試使用otelgin來跟蹤我的項目,它是這樣說的where required. It is available from gin.Context.Request.Context(),那么我如何從 gin.context 中獲取詳細信息以查看它是否有效。正式地,他們在初始化跟蹤器提供程序時添加一個標準輸出作為導出器:func initTracer() (*sdktrace.TracerProvider, error) {    // stdout as exporter    exporter, err := stdout.New(stdout.WithPrettyPrint())    if err != nil {        return nil, err    }    tp := sdktrace.NewTracerProvider(        sdktrace.WithSampler(sdktrace.AlwaysSample()),        sdktrace.WithBatcher(exporter),    )    otel.SetTracerProvider(tp) otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))    return tp, nil}這是命令行輸出的一部分:"Name": "/users/:id",    "SpanContext": {        "TraceID": "e7a43d30c0e507b4c59fd65dc3bc6d77",        "SpanID": "636c22201c903573",        "TraceFlags": "01",        "TraceState": "",        "Remote": false    },    "Parent": {        "TraceID": "00000000000000000000000000000000",        "SpanID": "0000000000000000",        "TraceFlags": "00",        "TraceState": "",        "Remote": false    },    "SpanKind": 2,    "StartTime": "2022-11-12T16:02:07.871843+08:00",    "EndTime": "2022-11-12T16:02:07.871843+08:00",但是有什么辦法可以得到這個表單 gin.Context 嗎?或者我可以從 gin.Context 獲取出口商的詳細信息嗎?我試圖添加一個中間件來捕獲它們:func TracerGetMiddleware(c *gin.Context) {    //var tracer oteltrace.Tracer    //tracerInterface, ok := c.Get("otel-go-contrib-tracer")    //if ok {    /// tracer, ok = tracerInterface.(oteltrace.Tracer)    //}    //tracer.Start(c, "test")    fmt.Println(c.Request.Context())}但這是 c.Request.Context() 的輸出(type *http.contextKey, val <not Stringer>).WithValue(type *http.contextKey, val [::1]:8088).WithCancel.WithCancel.WithValue(type trace.traceContextKeyType, val <not Stringer>)
查看完整描述

1 回答

?
慕虎7371278

TA貢獻1802條經驗 獲得超4個贊

目前我明白了我原本想得到的答案,就是獲取gin.context中的traceID、SpanID等數據


import (

    "fmt"

    "github.com/gin-gonic/gin"

    oteltrace "go.opentelemetry.io/otel/trace"

)


func GetIDMiddleware() gin.HandlerFunc {

    return func(c *gin.Context) {

        if oteltrace.SpanFromContext(c.Request.Context()).SpanContext().IsValid() {

            TraceID := oteltrace.SpanFromContext(c.Request.Context()).SpanContext().TraceID().String()

            SpanID := oteltrace.SpanFromContext(c.Request.Context()).SpanContext().SpanID().String()

            fmt.Println(TraceID)

            fmt.Println(SpanID)

        }

    }

}

我最初的想法是通過otelgin在context中傳遞trace信息,然后在gin的中間件中通過context抓取traceID等用于zap logging,但是當時不知道怎么獲取TraceID等信息,當我看到gin-contrib/zap庫找到了正確的方法。


查看完整回答
反對 回復 2023-03-15
  • 1 回答
  • 0 關注
  • 201 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號