1 回答

TA贡献1840条经验 获得超5个赞
go.opentelemetry.io/otel/trace@v1.11.1/trace.go正确定义了上下文,您可以调用 MarshalJSON 并让它吐出一些看起来有用的东西,但这就是事情。没有等效的解组函数,输出是一个字符串,而内部格式是一个固定长度的字节数组......
因此,要使其正常工作,只需将跟踪和跨度 ID 转储为您喜欢的任何格式:
// Attach telemetry headers
headers := nats.Header{}
headers.Set(otelTraceID, span.SpanContext().TraceID().String())
headers.Set(otelSpanID, span.SpanContext().SpanID().String())
然后在接收端,您必须手动将其重建为 SpanContext:
func getParentContext(msg *nats.Msg) (spanContext trace.SpanContext, err error) {
var traceID trace.TraceID
traceID, err = trace.TraceIDFromHex(msg.Header.Get(otelTraceID))
if err != nil {
return spanContext, err
}
var spanID trace.SpanID
spanID, err = trace.SpanIDFromHex(msg.Header.Get(otelSpanID))
if err != nil {
return spanContext, err
}
var spanContextConfig trace.SpanContextConfig
spanContextConfig.TraceID = traceID
spanContextConfig.SpanID = spanID
spanContextConfig.TraceFlags = 01
spanContextConfig.Remote = true
spanContext = trace.NewSpanContext(spanContextConfig)
return spanContext, nil
}
然后实际使用它:
remoteCtx, err := getParentContext(msg)
if err != nil {
logrus.Fatal(err)
}
_, span := otel.Tracer(fqpn).Start(trace.ContextWithRemoteSpanContext(context.Background(), remoteCtx), msg.Subject)
defer span.End()
- 1 回答
- 0 关注
- 129 浏览
添加回答
举报