我知道我们要使用上下文传播来获取作为彼此子级创建的父级 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