登录
首页 >  Golang >  Go问答

启动子范围的 Goroutine 从存在的父范围启动

来源:stackoverflow

时间:2024-02-19 16:18:22 309浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《启动子范围的 Goroutine 从存在的父范围启动》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

我尝试使用此答案从现有跨度创建子跨度,但遗憾的是它对我不起作用。

每当我进行 grpc 调用时,我都会启动一个父跨度,代码片段如下所示。

type spanctxkey struct{} // pushing span in context to fetch it from anywhere

func startspan(ctx context.context, operationname string) (context.context, span) {
parentspan := sentry.startspan(ctx, operationname, sentry.transactionname(operationname))
return context.withvalue(originalspan.context(), spanctxkey{}, &span), span{
        originalspan,
    }
}

现在,我试图从另一个包获取当前运行的跨度,以便我可以启动一个子跨度,其代码是。

func getcurrentspan(ctx context.context) *span {
    if span, ok := ctx.value(spanctxkey{}).(*span); ok {
        return span
    }
    return nil
}
childspan := getcurrentspan(ctx)
fmt.println(childspan)

当我尝试打印它时,它打印 nil,我很困惑为什么跨度会关闭。

现在的问题可能是父级跨度可能会在子级跨度之前关闭,但是不是,我也添加了一些打印语句来验证这一点。

--starting span before making a grpc call---
-- starting span before querying the db ---
--closing span after querying the db---
--closing span after making a grpc call---

正确答案


您是否尝试过 span.StartChild("foobar") ? (我是根据sentry sdk判断的)

今天关于《启动子范围的 Goroutine 从存在的父范围启动》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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