亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 NATS 正確傳遞遠程父跨度?

如何使用 NATS 正確傳遞遠程父跨度?

Go
Cats萌萌 2023-02-21 16:38:58
我在這個 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 示例:
查看完整描述

1 回答

?
慕斯709654

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()

http://img1.sycdn.imooc.com//63f483760001223008960384.jpg

查看完整回答
反對 回復 2023-02-21
  • 1 回答
  • 0 關注
  • 113 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號