登录
首页 >  Golang >  Go问答

在两个 Go 微服务之间实现跟踪的方法:使用 Opentelemetry 和 Otelgin

来源:stackoverflow

时间:2024-03-26 16:00:32 120浏览 收藏

在 Go 微服务中集成分布式跟踪对于理解服务间交互至关重要。本文探讨了使用 Opentelemetry 和 Otelgin 在两个 Go 微服务之间实现跟踪的方法。在微服务 1 中,使用 Otelgin 中间件注入跟踪头,并在微服务 2 中提取这些头以创建跨度。通过设置请求上下文,确保跟踪信息在服务之间传递。

问题内容

我正在尝试使用 opentelemetry 和 gin-gonic 在 2 个 go 微服务之间分配跟踪。

请帮忙,我遇到过 otelhttp 示例,但我找不到 otelgin 的示例。

使用“go.opentelemetry.io/otel/sdk/trace”作为tracesdk

微服务1

func tracerprovider() (*tracesdk.tracerprovider, error) {
    otel.settextmappropagator(propagation.newcompositetextmappropagator(propagation.tracecontext{}, propagation.baggage{}))
    exporter, _:= stdouttrace.new(stdouttrace.withprettyprint())
    tp := tracesdk.newtracerprovider(
        tracesdk.withsampler(tracesdk.alwayssample()),
        tracesdk.withbatcher(exporter),
        tracesdk.withresource(resource.newwithattributes(
            semconv.servicenamekey.string("microservice-1"),
            attribute.string("environment", "test"),
        )),
    )

    otel.settracerprovider(tp)
    return tp, nil
}
func main() {
    tracerprovider()
    resty := resty.new()

    router := gin.default()
    router.use(otelgin.middleware("microservice-1"))
    {
        
        router.get("/ping", func(c *gin.context) {
            result := result{}
            req := resty.r().setheader("content-type", "application/json")
            ctx := req.context()
            span := trace.spanfromcontext(ctx)
            defer span.end()
            otel.gettextmappropagator().inject(ctx, propagation.headercarrier(req.header))
            resp, _ := req.get("http://localhost:8088/pong")

        json.unmarshal([]byte(resp.string()), &result)
            c.indentedjson(200, gin.h{
                "message": result.message,
            })
        })
    }
    router.run(":8085")

}

//微服务2

//tracerprovider func与微服务1相同

//主要

TracerProvider()
router := gin.Default()
router.Use(otelgin.Middleware("microservice-2"))
{
    router.GET("/pong", func(c *gin.Context) {
        ctx := c.Request.Context()
        span := trace.SpanFromContext(otel.GetTextMapPropagator().Extract(ctx, propagation.HeaderCarrier(c.Request.Header)))
        defer span.End()

        c.IndentedJSON(200, gin.H{
            "message": "pong",
        })
    })
}
router.Run(":8088")

正确答案


可能有点晚了,但仍然有用。 在第一个微服务中,您需要放置:

req := resty.R().SetHeader("Content-Type", "application/json")
req.SetContext(c.Request.Context())

这将解决问题。 在此屏幕截图中,您可以看到第一个微服务上的 2 个跨度

opentelemetry go contrib 的官方存储库中有一个 go-gin 检测的示例: https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/instrumentation/github.com/gin-gonic/gin/otelgin/example

基本上,你需要使用这个包:
“go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin”

您还可以添加 otelgin.html 来呈现您的响应。

具体实现:https://github.com/open-telemetry/opentelemetry-go-contrib/blob/main/instrumentation/github.com/gin-gonic/gin/otelgin/gintrace.go

到这里,我们也就讲完了《在两个 Go 微服务之间实现跟踪的方法:使用 Opentelemetry 和 Otelgin》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

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