首页 >后端开发 >Golang >如何在非 HTTP 上下文中从跟踪 ID 构造 Span?

如何在非 HTTP 上下文中从跟踪 ID 构造 Span?

Susan Sarandon
Susan Sarandon原创
2024-10-28 03:06:31937浏览

How to Construct Spans from Trace IDs in Non-HTTP Contexts?

从非 HTTP 上下文中的跟踪 ID 构造 Span

在非 HTTP 上下文中使用标头传播跟踪时,您需要手动构造使用提供的跟踪和跨度 ID 进行跨度。以下是实现此目的的方法:

订阅者端:

在处理带有跟踪和跨度标头的传入消息的函数内部:

  1. 提取标头中的跟踪和跨度 ID。
  2. 使用trace.TraceIDFromHex() 和trace.SpanIDFromHex() 函数将字符串ID 转换为适当的类型。
  3. 构造一个trace.SpanContext 通过提供提取的跟踪 ID、跨度 ID 和跟踪标志。
  4. 使用 context.Background() 使用新创建的跨度上下文丰富当前上下文,然后使用 trace.ContextWithSpanContext()。
  5. 使用丰富的上下文和适当的名称开始一个新的范围。

示例:

<code class="go">func handleIncomingMessage(request NewRequest) {
    traceID, err := trace.TraceIDFromHex(request.TraceID)
    if err != nil {
        fmt.Println("error: ", err)
        return
    }

    spanID, err := trace.SpanIDFromHex(request.SpanID)
    if err != nil {
        fmt.Println("error: ", err)
        return
    }

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

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

    _, span := otel.Tracer("requestInLoop").Start(ctx, "requestInLoopSpan")
    span.AddEvent("processing....")
}</code>

在此示例中,NewRequest 是一个自定义类型,包含跟踪和跨度 ID。 handleIncomingMessage 函数采用 NewRequest 结构作为输入,并使用提供的跟踪和跨度 ID 创建一个跨度。

注意: 如果提供的 Span 的 IsRemote 字段,请确保不会创建新的 Span context 设置为 true,因为这表明该跨度已经远程导出。

以上是如何在非 HTTP 上下文中从跟踪 ID 构造 Span?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn