在 Opentelemetry 中根據追蹤 ID 建構 Span
上下文傳播通常用於檢索父追蹤 ID 並建立子 Span。但是,在使用標頭進行訊息交換的情況下,需要替代方法。
要從字串追蹤ID 建立範圍,可以依照下列步驟操作:
建構一個解析Trace 和Span ID 的函式:
func constructNewSpanContext(request NewRequest) (spanContext trace.SpanContext, err error) {
traceID, err := trace.TraceIDFromHex(request.TraceID)
if err != nil {
fmt.Println("error:", err)
}
spanID, err := trace.SpanIDFromHex(request.SpanID)
if err != nil {
fmt.Println("error:", err)
}
spanContextConfig := trace.SpanContextConfig{
TraceID: traceID,
SpanID: spanID,
TraceFlags: 01,
Remote: false,
}
spanContext = trace.NewSpanContext(spanContextConfig)
return spanContext, nil
}
此函數從請求中提取追蹤和跨度 ID,並建構一個 SpanContext 物件。
將 SpanContext 注入 Context:
spanContext, err := constructNewSpanContext(request)
if err != nil {
fmt.Println("ERROR:", err)
}
requestContext := context.Background()
requestContext = trace.ContextWithSpanContext(requestContext, spanContext)
SpanContext用於豐富請求上下文,表示trace的延續。
創建一個新跨度:
var requestInLoopSpan trace.Span
childContext, requestInLoopSpan := otel.Tracer("inboundmessage").Start(requestContext, "requestInLoopSpan")
requestInLoopSpan.AddEvent("processing....")
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3