如何从字符串traceid创建opentelemetry范围

2023-11-22

我知道我们要使用上下文传播来获取作为彼此子级创建的父级 Traceid 和 Span,但我的发布者正在使用标头(nats 不是 http)

我的消息代理使用标头,我将traceid和spanid设置为出站请求中的标头,发送消息,然后订阅者应该能够创建一个新的span,将父traceid设置为请求中的traceid。将它们联系起来

我的出站请求如下所示:

        msg := new(nats.Msg)
        msg.Data = []byte("new request being sent!")
        msg.Subject = subject
        getTraceID := requestSpan.SpanContext().TraceID().String()
        header := make(nats.Header)
        msg.Header = header
        header.Set("traceid", getTraceID)

        getSpanID := requestSpan.SpanContext().SpanID().String(
        header.Set("spanid", getSpanID)
        msg.Header = header
        
        reply, err := nc.RequestMsg(msg, time.Duration(5*time.Second))

这有效,在订阅者端我可以获取跟踪和跨度 ID 的标头值

如何使用traceid在订阅者端构建上下文/跨度?

我相信我可以在频道内做这样的事情:

    var traceID trace.TraceID
    traceID, err = trace.TraceIDFromHex(request.TraceID)
    if err != nil {
        fmt.Println("error: ", err)
        continue
    }
    var spanID trace.SpanID
    spanID, err = trace.SpanIDFromHex(request.SpanID)
    if err != nil {
        fmt.Println("error: ", err)
        continue
    }

    spanContext := trace.NewSpanContext(trace.SpanContextConfig{
        TraceID:    traceID,
        SpanID:     spanID,
        TraceFlags: 01, 
    })

   ctx := context.Background()
   ctx = trace.ContextWithSpanContext(ctx, spanContext)
   var requestInLoopSpan trace.Span
   ctx2, requestInLoopSpan := otel.Tracer("requestInLoop").Start(ctx, "requestInLoopSpan")

   requestInLoopSpan.AddEvent("processing....") // NOT WORKING

GOT IT!

顺便说一句,输入 NewRequest:

type NewRequest struct {
    Requestid    string `json: "requestid"`
    TraceID      string
    SpanID       string
}

您需要将构造 spanContext 的代码包装在函数内:

func constructNewSpanContext(request NewRequest) (spanContext trace.SpanContext, err error) {
    var traceID trace.TraceID
    traceID, err = trace.TraceIDFromHex(request.TraceID)
    if err != nil {
        fmt.Println("error: ", err)
        return spanContext, err
    }
    var spanID trace.SpanID
    spanID, err = trace.SpanIDFromHex(request.SpanID)
    if err != nil {
        fmt.Println("error: ", err)
        return spanContext, err
    }
    var spanContextConfig trace.SpanContextConfig
    spanContextConfig.TraceID = traceID
    spanContextConfig.SpanID = spanID
    spanContextConfig.TraceFlags = 01
    spanContextConfig.Remote = false
    spanContext = trace.NewSpanContext(spanContextConfig)
    return spanContext, nil
}

然后你调用它,传入包含跟踪和跨度 ID 的内容

然后,您使用函数返回的 spanContext 来丰富上下文:

        spanContext, err := constructNewSpanContext(request)
        if err != nil {
            fmt.Println("ERROR: ", err)
        }
        fmt.Println("IS VALID? ", spanContext.IsValid()) // check if okay

        requestContext := context.Background()
        requestContext = trace.ContextWithSpanContext(requestContext, spanContext)

        var requestInLoopSpan trace.Span
        childContext, requestInLoopSpan := otel.Tracer("inboundmessage").Start(requestContext, "requestInLoopSpan")
        requestInLoopSpan.AddEvent("processing....") // WORKING
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从字符串traceid创建opentelemetry范围 的相关文章

随机推荐

  • 如何在执行时打印 python 脚本的每一行(包括控制台)?

    我想打印正在执行的 python 脚本的每一行 以及每行正在执行时控制台的日志 例如 对于此脚本 import time print hello time sleep 3 print goodbye 我希望它在控制台中生成以下内容 line
  • 数据源中的 MySQL 连接有效性测试:SELECT 1 或者更好的东西?

    我正在 MySQL 上以主 从架构设置故障转移集群 我还在配置 JBoss 数据源 并且正在寻找更好的方法来测试我的连接 因为我知道它适用于 Alfresco 正在使用 Ibatis 即使我练习过MySQL很多次 我也不太了解MySQL S
  • 如何在 C# 中对连续的 GUID 进行排序?

    顺序 GUID 是唯一的 但按顺序创建 该顺序有点不寻常 并且与使用标准 NET Guid 比较器时实现的顺序不同 我正在寻找一个 C Guid 比较器 它将按顺序 GUID 的规则进行排序 更新 我特别指的是 SQL Server 中 N
  • 解释这个 O(n log n) 算法来解决猫/鸡蛋投掷问题

    这个问题 你需要从建筑物中扔出多少只猫才能确定这样一只猫能够生存的最大楼层 实际上相当残酷 有一个复杂度为 O n 3 的公认答案 问题相当于这个谷歌代码挑战赛 对于 N 2000000000 应该是可解的 看来O n 3 的解法还不足以解
  • 如何在 Solr 4 中使用正则表达式进行查询

    我已经到了绝望的地步 所以我请求帮助 我正在尝试使用正则表达式查询 Solr 4 引擎的结果 假设我要查询的文档是
  • 如何实现自动换行?

    XNA有Spritefont类 它有一个MeasureString方法 可以返回一个物体的宽度和高度string 我试图了解如何创建一个方法来有效地返回一个字符串Environment Newline插入到正确的位置 以便适合特定的宽度和高
  • ActionFilter Response.StatusCode 始终为 200

    我正在尝试设置一个动作过滤器 仅在以下情况下执行某些操作StatusCode of the HttpContext Response is 302 我希望能够在OnActionExecuting方法 但是StatusCode总是200 Ac
  • Python - 如何使用日期时间重命名文本文件

    我正在使用 Python v2 x 想知道如何重命名已知的文本文件 例如 text txt 以包含当前日期和时间 任何帮助将不胜感激 os rename text txt time strftime Y m d H M S txt 请注意
  • 插入后导航属性返回 null

    我已将应用程序从 EF4 迁移到 EF5 我将以下代码与以前的版本一起使用来获取新添加项目的相关实体 Student s new Student s Name name s ClassID cID db Students Add s db
  • 从数据框中提取带有条件的列名称

    dput new structure list ID c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 A1 c 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0
  • exec() 和 phantomjs 的绝对路径问题

    我在用着幻影JS用于以编程方式截取网页屏幕截图的目的 我的网络服务器在 Linux 64 位上运行 场景 My test php file exec phantomjs version o e print r o echo e I open
  • 对“kill”的未定义引用

    我用 C 语言为 ARM7 嵌入式系统开发了一个应用程序 现在我想用 C 编译并链接它 以便使用一些 C 功能 为此 我正在使用mipsel elf g 代替mipsel elf gcc 我可以用以下命令编译我的代码mipsel elf g
  • 为什么 ng-hide 不适用于自定义指令?

    我正在阅读 angularjs org 上的开发人员指南的指令部分 以刷新我的知识并获得一些见解 我试图运行其中一个示例 但指令 ng hide 不适用于自定义指令 这里是jsfiddle http jsfiddle net D3Nsk
  • 如何在 iOS 模拟器中测试动态类型(较大字体)

    可以手动更改 iOS 中的动态类型设置 设置 gt 常规 gt 辅助功能 gt 较大文本 但这似乎在当前的模拟器 撰写本文时为 v9 3 中不起作用 并且手动执行此操作并不是需要自动化的解决方案 问题 有没有办法启动具有动态类型设置的应用程
  • Silverlight构造函数注入视图模型+设计模式

    我正在尝试在 Silverlight 4 中编写可测试的 ViewModel 我目前使用 MVVM light 我使用 AutoFac IoCContainer 做得很好 但是 要注入绑定到视图的 ViewModel 的构造函数 我有以下构
  • java 使用套接字发送文件

    我正在尝试使用 Java 将文件从一台计算机发送到另一台计算机 我编写了下面的代码 如果发送方和接收方都在同一台计算机上启动 则它可以正常工作 但如果它们在不同的计算机上工作 则接收到的文件大小比原始文件大并且已损坏 注意 我正在尝试传输最
  • 没有参数的模板类“template<>”是什么意思?

    不带参数的模板类是什么意思 例如 我们采用一个计算阶乘的模板类 其模板参数为 N N 基本上 这是一个类 template
  • 开始使用 PM2 时如何将生产模式添加到 sailsjs 应用程序

    要在生产模式下启动 sailsjs 您需要附加 prod Run node app js prod 我使用 PM2 和一个简单的 json 文件进行设置 其中包含进程名称和脚本名称 以启动节点进程 我如何使用 PM2 传递生产参数 Read
  • 使用 JavaScript 的 FileReader 接口检测文件的内容类型

    我一直在为 Web 应用程序中的纯文本文件设置导入脚本 我的脚本如下 function dataImport files confirm Are you sure you want to import the selected file T
  • 如何从字符串traceid创建opentelemetry范围

    我知道我们要使用上下文传播来获取作为彼此子级创建的父级 Traceid 和 Span 但我的发布者正在使用标头 nats 不是 http 我的消息代理使用标头 我将traceid和spanid设置为出站请求中的标头 发送消息 然后订阅者应该