gpt4 book ai didi

go - 如何通过 Gin 的上下文传递 context.Context?

转载 作者:行者123 更新时间:2023-12-05 05:39:22 29 4
gpt4 key购买 nike

我正在尝试找出传播 context.Context 的正确方法用于在使用 Gin 时使用 OpenTelemetry 进行跟踪。

我目前有一个 gin调用函数并传递 *gin.Context 的处理程序,像这样:

func (m Handler) doSomething(ginCtx *gin.Context, name string) {
ctx, span := otel.Tracer("mytracer").Start(ginCtx.Request.Context(), "doSomething")
defer span.End()
// ...
}

这实际上会导致不正确的跨度,因为在 doSomething() 之前被称为,我创建一个新的 context.Context在具有父跨度信息的调用函数中(类似于上面的代码片段)。

在我的大部分代码中,我传递一个 context.Context , 但我想我可以利用 Gin 的 Context .否则我必须传递两种类型的上下文:

func (m Handler) doSomething(ctx context.Context, ginCtx *gin.Context, name string) {
ctx, span := otel.Tracer("mytracer").Start(ctx, "doSomething")
defer span.End()
// ...
}

这感觉不对,因为 Request存储在 *gin.Context与我通过 context.Context 作为参数传递的内容不同步.但是,我不敢设置 Request*gin.Context 上有了新的 Request有更新的 Context因为

  1. 它仅用于此功能,我必须取消设置(可能通过 defer() ?)
  2. 它似乎不是线程安全的(尽管我假设我无论如何都需要 Copy() Gin 上下文)

处理这个问题的正确方法是Copy正在 *gin.Context并使用新的 context.Context 修改请求, 然后传递 *gin.Context周围而不是 context.Context

我不知道 Copy 的含义是什么ing gin.Context来自文本:

Copy returns a copy of the current context that can be safely used outside the request's scope. This has to be used when the context has to be passed to a goroutine.

我还可以吗Abort()通过复制 *gin.Context ,旧的复制后还能用吗?我只需要一些表现得像堆栈的东西,就像传递 context.Context 一样。 s around 确实如此,只是从函数返回“弹出”上下文,我只剩下旧的了。

最佳答案

我不太熟悉 gin 包,但我对 labstack/echo 有一些类似的要求,我通过将我需要的东西注入(inject)函数来解决它这样:

type Router struct {
Inner *gin.Gin
}

func (router *Router) Handle(ctx context.Context, method string, route string, handler(context.Context, *gin.Context) gin.IRoutes {
return router.Inner.Handle(method, route, func(gCtx *gin.Context) error {
return handler(ctx, gCtx)
})
}

这通过允许您在声明路由时注入(inject) context.Context 来实现。所以,不要这样做:

g := gin.Default()
g.POST("/some/route", myHandler) // myHandler accepts *gin.Context

您现在可以:

r := Router{Inner: gin.Default()}
r.Handle("POST", "/some/route", myHandlerV2) // myHandlerV2 accepts *gin.Context and context.Context

此模式还允许您注入(inject)其他依赖项,例如数据库连接、记录器等。

关于go - 如何通过 Gin 的上下文传递 context.Context?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72707748/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com