我有三个服务,它们订阅并发布到 azure 服务总线上的单独队列。我刚刚为这些服务添加了开放遥测,但它似乎并未在服务之间传播跟踪 ID。
例如,单个跟踪理想情况下包括服务之间的流:
服务1 -> 队列1 -> 服务2 -> 队列2 -> 服务3
看起来我应该在服务之间注入(inject)/提取此信息,但关于如何执行此操作的文档/示例似乎有限,因为显然它应该使用 W3C 跟踪上下文“正常工作”?
如果有人能够提供任何见解或指导,告诉我应该做什么才能达到预期的结果,我将不胜感激。
非常感谢。
最佳答案
我记得当我需要在多个 GRPC 服务之间传播跟踪时,我对 OpenCensus 跟踪库做了类似的事情。我获取了现有的跟踪范围,将其馈送到 Binary 函数,获取字节,将其设置为传出上下文中的数据,然后在接收端,我从传入上下文中提取跟踪范围并将其馈送到trace.StartSpanWithRemoteParent。
这是向上下文添加跟踪的 util 的实现:
package grpcutil
import (
"context"
"encoding/base64"
"github.com/grpc-ecosystem/go-grpc-middleware/util/metautils"
"go.opencensus.io/trace"
"go.opencensus.io/trace/propagation"
"google.golang.org/grpc/metadata"
)
const TraceContextMDKey = "trace_ctx"
func NewTraceableContext(ctx context.Context, span *trace.Span) context.Context {
return metadata.AppendToOutgoingContext(
ctx,
TraceContextMDKey, base64.StdEncoding.EncodeToString(propagation.Binary(span.SpanContext())),
)
}
func GetRemoteTraceContext(ctx context.Context) (trace.SpanContext, bool) {
var traceCtx []byte
extCtx := metautils.ExtractIncoming(ctx).Get(TraceContextMDKey)
if len(extCtx) > 0 {
traceCtx, _ = base64.StdEncoding.DecodeString(extCtx)
}
return propagation.FromBinary(traceCtx)
}
接收端的样子:
remoteTraceCtx, _ := grpcutil.GetRemoteTraceContext(ctx)
_, span := trace.StartSpanWithRemoteParent(ctx, "name", remoteTraceCtx)
defer span.End()
希望这能为您指明正确的方向。
关于azure - 使用 Go 的 Azure ServiceBus 队列的 OpenTelemetry 传播问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71236578/