我在这个 repo上有一个虚拟示例
我试图将当前跨度上下文传递给远程上下文,以便它可以正确显示跟踪,我所做的是:
go func() {
_, span := otel.Tracer("natsC").Start(context.Background(), "publish")
defer span.End()
// send current span context as header
spanCtx := span.SpanContext()
spanJson, _ := spanCtx.MarshalJSON()
log.Println(string(spanJson))
msg, err := nc.RequestMsg(&nats.Msg{
Subject: topic1, Data: []byte("whatever"), Header: nats.Header{
"otelTrace": []string{string(spanJson)},
},
}, 2*time.Second)
if L.IsError(err, `nc.Publish`) {
return
}
log.Println(`reply:`, msg)
}()
在接收方服务器上:
_, err = nc.QueueSubscribe(topic1, "my-queue", func(msg *nats.Msg) {
// take header and deserialize back to spanContext
rsc := msg.Header.Get(`otelTrace`)
parentSpanCtx := trace.SpanContext{}
err := json.Unmarshal([]byte(rsc), &parentSpanCtx)
L.IsError(err, `json.Unmarshal`)
// use remote context as parent context
_, span := otel.Tracer(`natsC`).Start(trace.ContextWithRemoteSpanContext(context.Background(), parentSpanCtx), topic1)
defer span.End()
data := string(msg.Data)
fmt.Println(data)
err = msg.Respond(msg.Data)
L.IsError(err, `msg.Respond`) // ignore error
})
然后我使用这个命令运行它go run main.go natsC。
Jeager (localhost:16686) 上显示的两个跨度都是单独的跨度,不像 http/grpc 示例中那样相关,我应该修改什么才能将其视为父跨度?
等效的 http/grpc 示例:
慕斯709654
相关分类