1 回答

TA貢獻1840條經驗 獲得超5個贊
go.opentelemetry.io/otel/[email protected]/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 關注
- 113 瀏覽
添加回答
舉報