azure - 使用 Go 的 Azure ServiceBus 队列的 OpenTelemetry 传播问题

标签 azure go azureservicebus azure-sdk open-telemetry

我有三个服务,它们订阅并发布到 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/

相关文章:

java - 如何解决maven无法创建 'azure-functions-archetype'项目问题

azure - Hyper-v 管理器在 Windows Azure 门户的 RDP 中不可用

go - 为什么在Golang中创建 slice 时会有一个CAPACITY参数

go - 什么是使用 goroutine 的正确方法?

go - 为什么 IntelliJ Idea 找不到 GO SDK 的位置?

c# - 查看没有事件消息的 session 启用主题/订阅时出现超时异常

azure - 保护和配置 Azure 服务总线,以便面向公众的 Web 应用程序(使用 B2C)使用 AAD 调用下游 API 和服务

azure - 如果数据中心出现故障,如何对 Azure ACS 进行故障转移

azure - 从 WebJob Application Insights 中筛选出 Azure ServiceBus 日志

linux - 通过 Azure Devops 将 .Net Core 3.1 Web 应用部署到 Azure Linux Web 服务时出错