登录
首页 >  Golang >  Go问答

了解如何获取 *gin.Context.Request.Context() 的详情

来源:stackoverflow

时间:2024-02-13 14:36:23 304浏览 收藏

在IT行业这个发展更新速度很快的行业,只有不停止的学习,才不会被行业所淘汰。如果你是Golang学习者,那么本文《了解如何获取 *gin.Context.Request.Context() 的详情》就很适合你!本篇内容主要包括##content_title##,希望对大家的知识积累有所帮助,助力实战开发!

问题内容

我正在尝试使用 otelgin 来跟踪我的项目,它说需要 。它可以从 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 ).WithValue(type *http.contextKey, val [::1]:8088).WithCancel.WithCancel.WithValue(type trace.traceContextKeyType, val )

正确答案


目前我明白了我原本想要得到的答案,就是获取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传递上下文中的trace信息,然后在gin的中间件中通过上下文捕获traceid等信息进行zap日志记录,但当时不知道如何获取traceid等信息,当我看到 gin-contrib/zap 库时找到了正确的方法。

终于介绍完啦!小伙伴们,这篇关于《了解如何获取 *gin.Context.Request.Context() 的详情》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>