如何从字符串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范围 的相关文章

  • Java ReentrantReadWriteLocks - 如何在读锁中安全地获取写锁?

    我现在在我的代码中使用可重入读写锁 http java sun com javase 6 docs api java util concurrent locks ReentrantReadWriteLock html同步对树状结构的访问 这
  • 我应该在请求中创建 executorService 还是在 Web 应用程序中共享一个实例?

    我正在向基于 Jersey 的 Web 服务添加一个新端点 支持端点的逻辑需要对另一个服务进行 10 到 50 次调用 这些调用是独立的并且可以并行化 因此我正在考虑使用执行器服务将工作分配到多个线程 我想知道是否应该为每个请求实例化一个
  • 即使没有显式事务,SQL Server 也会获取锁吗?

    我第一次阅读有关 MSSQL 锁定的内容 在很多地方 锁定机制概念依赖于事务的存在 我想知道在不涉及任何事务的情况下是否可以锁定 一般来说 当不存在显式事务时 每个 SQL 语句都在自动 自动提交 事务中执行 在这种情况下将应用正常的锁定行
  • Golang 按位运算以及一般字节操作

    我有一些 C 代码 可以对字节执行一些按位运算 我正在尝试在 golang 中做同样的事情 但遇到了困难 C 中的示例 byte a c byte data int j c data j c byte c j c a c 0xFF c 0x
  • 何时在多线程中使用 易失性?

    如果有两个线程访问全局变量 那么许多教程都说使该变量成为易失性的 以防止编译器将变量缓存在寄存器中 从而无法正确更新 然而 两个线程都访问共享变量需要通过互斥体进行保护 不是吗 但在这种情况下 在线程锁定和释放互斥体之间 代码位于关键部分
  • nsq 无法通过连接到 nsqlookupd 来消费消息

    我尝试使用 docker compose 来运行 nsq docker compose yml如下 version 3 services nsqlookupd image nsqio nsq command nsqlookupd ports
  • 如何在golang模板上打印JSON?

    我需要在客户端有一个对象 所以我使用 json marshal 将其转换为 JSON 并将其打印到模板中 该对象被打印为转义 JSON 字符串 我期待它是var arr o1 o2 但它是var arr o1 o2 我知道我可以在客户端进行
  • 我可以根据我正在构建的操作系统导入 Golang 包吗?

    假设我有一个基于哪个操作系统的 go 项目 在某些情况下是哪个发行版 我想使用 Systemd 客户端包 Upstart 客户端包 sysv 客户端包 launchd 客户端包 是否可以有选择地导入每个包 以便我只导入我正在构建的每个操作系
  • 在golang中获取TTFB(第一个字节的时间)值

    我正在尝试获取 TTFB 值和 Connect 值 c exec Command curl w Connect time connect TTFB time starttransfer Total time time total o dev
  • 错误“binary.Write:无效类型”是什么意思?

    下面显示的代码 我创建了一个结构类型并希望将其编码为二进制 但它显示binary Write invalid type main Stu错误 我读过一些类似的代码 但我找不到为什么我的代码不起作用 type Stu struct Name
  • 使用覆盖率信息测试 Go 中的 os.Exit 场景 (coveralls.io/Goveralls)

    这个问题 如何在 Go 中测试 os exit 场景 https stackoverflow com questions 26225513 how to test os exit scenarios in go 以及其中得票最高的答案 列出
  • prolog跟踪如何使用

    跟踪prolog程序时如何进行第二步 例如 我想跟踪以下简单程序 length1 0 length1 X Xs N length1 Xs N1 N is N1 1 我跟踪程序 trace length 1 2 3 N Call 7 leng
  • 在文件复制/上传未完成时读取文件内容

    例如 每 5 秒 服务器检查文件是否已添加到特定目录 如果是 它会读取并处理它们 相关文件可能非常大 例如 100 Mo 因此将它们复制 上传到上述目录可能会很长 如果服务器尝试访问尚未完成复制 上传的文件怎么办 JAVA是如何管理这些并发
  • 当参数是大映射时跟踪函数

    当我跟踪一个函数时 如果其中一个参数是包含大量元素的嵌套映射 则跟踪会充满混乱 这是一个典型的例子 TRACE t36705 get value nodeclass simple nodeid simple25 dock constan t
  • 在 Go/ 中创建/更新 google 驱动器权限/ [使用 api 创建电子表格但无法访问它]

    我正在尝试使用 google Drive api 和以下代码创建电子表格 但我无法访问它 update 该文件似乎不在我在这里指定的驱动器中 有人知道为什么会发生这种情况吗 update 在字段中添加了父母 但有 404 错误 说找不到文件
  • 如何在 Java 8 中从 CompletableFuture> 获取结果

    Java 8 环境 同时使用 CompletableFuture allOf 运行任务 然后从每个线程获取每个结果 然后将所有结果组合成一个组合结果并返回它 在下面的代码中 要得到结果 List
  • GORM中的一对多递归关系

    我需要有一个Organization与父级有关系 像这样的事情 type Organization struct gorm Model Parent Organization gorm ForeignKey ParentId Name st
  • benchmem 的输出

    使用内存分析器运行基准测试时 我看到以下输出 SomeFunc 100 17768876 ns op 111 B op 0 allocs op 我不明白输出 0 allocs op 但分配了 111 B 知道这意味着什么吗 我的函数是否在堆
  • 与 Reflect.StructTag.Get 不兼容

    我当时在 Google Cloud 中工作 一切都很好 但是当我在 PC 中克隆所有项目时 每个 JSON 结构中都有此消息 结构体字段标签bson edad json edad omitempty 与reflect StructTag G
  • 如何在 GHCJS 程序中定期执行操作?

    应该有人使用setInterval通过Javascript 或者使用一些更惯用的基于线程的解决方案 Using setInterval posed 一些挑战 https stackoverflow com questions 3357661

随机推荐

  • 如何在执行时打印 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设置为出站请求中的标头 发送消息 然后订阅者应该