为了账号安全,请及时绑定邮箱和手机立即绑定

如何获取有关 *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 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信