如何获取有关 *gin.Context.Request.Context() 的详细信息

我正在尝试使用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>)


DIEA
浏览 137回答 1
1回答

慕虎7371278

目前我明白了我原本想得到的答案,就是获取gin.context中的traceID、SpanID等数据import (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "github.com/gin-gonic/gin"&nbsp; &nbsp; oteltrace "go.opentelemetry.io/otel/trace")func GetIDMiddleware() gin.HandlerFunc {&nbsp; &nbsp; return func(c *gin.Context) {&nbsp; &nbsp; &nbsp; &nbsp; if oteltrace.SpanFromContext(c.Request.Context()).SpanContext().IsValid() {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TraceID := oteltrace.SpanFromContext(c.Request.Context()).SpanContext().TraceID().String()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SpanID := oteltrace.SpanFromContext(c.Request.Context()).SpanContext().SpanID().String()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(TraceID)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(SpanID)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}我最初的想法是通过otelgin在context中传递trace信息,然后在gin的中间件中通过context抓取traceID等用于zap logging,但是当时不知道怎么获取TraceID等信息,当我看到gin-contrib/zap库找到了正确的方法。
打开App,查看更多内容
随时随地看视频慕课网APP