首页  >  文章  >  后端开发  >  如何在 Go 中从字符串 TraceID 创建 OpenTelemetry Span?

如何在 Go 中从字符串 TraceID 创建 OpenTelemetry Span?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-27 20:51:30732浏览

How can I create an OpenTelemetry Span from a string TraceID in Go?

从字符串 TraceID 创建 OpenTelemetry Span

要使用 TraceID 在订阅者端创建新的 Span,不能直接创建使用接收到的 TraceID 字符串进行跨度。相反,您必须使用提供的traceID构造一个[trace.SpanContext](https://pkg.go.dev/go.opentelemetry.io/otel/trace#SpanContext)。

构造SpanContext

要生成 SpanContext,建议将代码包装在单独的函数中,例如:

<code class="go">func constructNewSpanContext(request NewRequest) (spanContext trace.SpanContext, err error) {
    // Assuming the trace and span IDs are provided as strings in request struct.

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

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

    spanContextConfig := trace.SpanContextConfig{
        TraceID: traceID,
        SpanID:  spanID,
        // Other TraceFlag bits if desired
    }

    spanContext = trace.NewSpanContext(spanContextConfig)
    return spanContext, nil
}</code>

使用 SpanContext 丰富上下文

创建 SpanContext 后,用它丰富一个新的上下文:

<code class="go">spanContext, err := constructNewSpanContext(request)
if err != nil {
    fmt.Println("ERROR:", err)
}

fmt.Println("IS VALID?", spanContext.IsValid()) // Check if the `spanContext` is valid

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

// Start a new span within the enriched context
var requestInLoopSpan trace.Span
childContext, requestInLoopSpan := otel.Tracer("inboundmessage").Start(requestContext, "requestInLoopSpan")

requestInLoopSpan.AddEvent("processing....") // Should now work</code>

通过执行这些步骤,您可以使用收到的 TraceID 在订阅者端成功创建一个新的 Span来自请求标头。

以上是如何在 Go 中从字符串 TraceID 创建 OpenTelemetry Span?的详细内容。更多信息请关注PHP中文网其他相关文章!

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