首页 游戏 软件 资讯 排行榜 专题
首页
科技数码
在多语言的分布式系统中如何传递 Trace 信息

在多语言的分布式系统中如何传递 Trace 信息

热心网友
85
转载
2025-12-15

在解决这个问题之前想要搞清楚 Trace 是如何跨语言以及跨应用传递的。其实也可以类比为在分布式系统中如何传递上下文;既然要传递数据那就涉及到系统之间的调用,也就是我们常说的 RPC(remote procedure call)。

背景

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

图片图片

图片图片

图片图片

前段时间有朋友问我关于spring cloud的应用在调用到 Go 的 API 之后出现 Trace 没有串联起来的问题。

完整的调用流程如下:

┌──────┐ │Client│ └┬─────┘ ┌▽──────────────────┐│SpringCloud GateWay│└┬──────────────────┘┌▽──────────────┐ │SpringBoot(app)│ └┬──────────────┘ ┌▽──────────┐ │Feign(http)│ └┬──────────┘ ┌▽─────┐ │Go Gin│ └──────┘

根因

在解决这个问题之前想要搞清楚 Trace 是如何跨语言以及跨应用传递的。

其实也可以类比为在分布式系统中如何传递上下文;既然要传递数据那就涉及到系统之间的调用,也就是我们常说的RPC(remote procedure call)。

提到 PRC 我们常见的一般有两种协议:

• 基于 HTTP 协议,简单易读,兼容性好

• 基于 TCP 的私有协议,高效性能更佳

基于 TCP 私有协议的又诞生出许多流行的框架,比如:

• Dubbo

• Thrift

• gRPC(基于 HTTP2,严格来说不算私有协议)

• 基于 MQ 实现的 RPC(生产消费者模式,本质上这些 MQ 都是私有协议,比如 RocketMQ、Pulsar 等)

但我们需要在 RPC 调用的过程中在上下文里包含 Trace 时,通常都是将 TraceId 作为元数据进行传递。

对于 HTTP 来说就是 header、而其余的私有 TCP 协议通常也会提供一个元数据的结构用于存放一些非业务数据。

图片图片

图片图片

图片图片

比如在 OpenTelemetry-Go 的 sdk 中,会在一次 RPC 中对 Trace 数据进行埋点。

最终也是使用metadata metadata.MD来获取上下文。

在 Pulsar 中是将 TraceId 存放在 properties 中,也相当于是元数据。

┌──────┐│Client│└┬─────┘┌▽─────┐│Pulsar│└┬─────┘┌▽───┐ │gRPC│ └────┘

func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { defer apiCounter.Add(ctx, 1) md, _ := metadata.FromIncomingContext(ctx) log.Printf("Received: %v, md: %v", in.GetName(), md) name, _ := os.Hostname() span := trace.SpanFromContext(ctx) span.SetAttributes(attribute.String("request.name", in.Name)) s.span(ctx) return &pb.HelloReply{Message: fmt.Sprintf("hostname:%s, in:%s, md:%v", name, in.Name, md)}, nil }

图片图片

图片图片

在这样一次调用中如果我们将Pulsar的properties和gRPCmeta 打印出来将会看到TraceID是如何进行传递的。

解决

回到这个问题本身,Trace在 Gin Server 端没有关联起来,明显就是 Gin 没有接收到上游的 TraceId,导致它认为是新的一次调用,从而会创建一个 Trace。

解决起来也很容易,只需要在启动 Gin 的时候传入一个 OTEL 提供的拦截器,在这个拦截器中 OTEL 的 sdk 会自动从 HTTP header 里解析出 TraceId 然后塞入到当前的 context 中,这样两个进程的 Trace 就可以关联起来了。

相关代码如下:

r := gin.New() r.Use(otelgin.Middleware("my-server"))

由于 Go 没有提供类似于 Java 的 javaagent 扩展,这类原本可以全自动打桩的代码都需要硬编码实现。

在这个otelgin实现的Middleware里会使用 HTTP header 来传输 context。

图片图片

图片图片

图片图片

本质上是操作 HTTP header 查询和写入 Trace

图片图片

会首先获取上游的 TraceID,这里的traceparentHeader也就是我们刚才看到的traceparent。

如果获取到了就会解析里面的TraceID,并生成当前的Context,这样这个 context 就会一直往后传递了。

流程与上文提到 gRPC 类似。

image.webpimage.webp

这是目前 otel-go-sdk 支持的自动打桩框架[1],目前看来还不太多,但常用的也都支持了。

总结

如何跨进程调的 Trace 信息都是通过网络传递的,只是对于不同的协议传输的细节也各不相同,但原理都是类似的。

图片图片

关键就是上面这两张图,进程 1 在调用进程 2 的时候将信息写入进去,进程 2 在收到请求的时候解析出 Trace,这两个步骤缺一不可。#Blog

引用链接

[1]自动打桩框架:https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/instrumentation

来源:https://www.51cto.com/article/822994.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

多语言翻译:利用方舟CodingPlan实现代码注释的中英互译
AI
多语言翻译:利用方舟CodingPlan实现代码注释的中英互译

多语言翻译:利用方舟CodingPlan实现代码注释的中英互译 在团队协作或开源项目中,代码注释的语言不统一是个常见痛点。手动翻译不仅效率低下,还容易误译技术术语,破坏代码的可读性。如果你正面临这样的困扰,那么方舟CodingPlan提供的语义感知翻译功能,或许正是你需要的解决方案。它能精准识别注释

热心网友
04.22
Zadarma多语言AI语音智能体:实现跨国沟通的语音解决方案
科技数码
Zadarma多语言AI语音智能体:实现跨国沟通的语音解决方案

来源:美通社伦敦2026年1月20日 美通社 -- 全球VoIP服务提供商Zadarma宣布正式推出Zadarma AI语音智能体。 这款虚拟助手可自动接听来电,采用自然逼真的语音表达,并可在营

热心网友
01.21
在多语言的分布式系统中如何传递 Trace 信息
科技数码
在多语言的分布式系统中如何传递 Trace 信息

在解决这个问题之前想要搞清楚 Trace 是如何跨语言以及跨应用传递的。其实也可以类比为在分布式系统中如何传递上下文;既然要传递数据那就涉及到系统之间的调用,也就是我们常说的 RPC(remote

热心网友
12.15

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

iPhone16之间如何快速传输App?详细步骤解析
iphone
iPhone16之间如何快速传输App?详细步骤解析

通过AirDrop功能,可在iPhone16之间快速传输已安装的App,无需重新下载。 省去重新下载的等待,直接在两部iPhone 16之间“搬运”已经安装好的App——这个用AirDrop传App的功能,确实方便。不过,想顺利操作,有几个关键前提得先摆正。 准备工作与条件确认 开始之前,最好花一分

热心网友
04.22
iPhone17设备名称怎么修改?详细步骤教程
iphone
iPhone17设备名称怎么修改?详细步骤教程

修改iPhone17设备名称的核心步骤 想给你的iPhone17换个独具特色的名字吗?其实很简单,整个操作的核心路径就在「设置」>「通用」>「关于本机」>「名称」里,几步就能完成自定义。 为什么要修改iPhone17的设备名称? 给iPhone17改个名,可不仅仅是图个新鲜。它在蓝牙配对、使用Air

热心网友
04.22
iPhone14隐藏ID怎么解除?详细步骤与注意事项
iphone
iPhone14隐藏ID怎么解除?详细步骤与注意事项

解除iPhone14隐藏ID的核心方法是联系原机主或提供购买凭证,通过官方渠道重置Apple ID 手里突然多出一台被锁的iPhone 14,用起来处处受限,这事儿确实头疼。好消息是,只要遵循官方路径,问题基本都能解决。关键在于,你得有耐心走完正规流程。 什么是iPhone隐藏ID? 简单来说,iP

热心网友
04.22
怎么查找我的iPhone17位置?
iphone
怎么查找我的iPhone17位置?

通过“查找”应用或iCloud网站,登录Apple ID即可实时定位iPhone 17,即使设备离线也能显示最后已知位置。 使用“查找”应用定位iPhone 17 如果你手边还有别的苹果设备,比如iPad或者Mac,最省事的方法就是直接用上面的“查找”应用。打开应用,登录和iPhone 17同一个

热心网友
04.22
iPhone 16通知权限设置与微信提示音修复指南
iphone
iPhone 16通知权限设置与微信提示音修复指南

iPhone 16通知权限设置与微信提示音修复指南 微信消息突然“静音”了?先别急着怀疑手机坏了。在iPhone 16上,通知体系和声音管理比以往更精细,有时只是某个开关没到位。接下来,咱们就把系统通知中心、应用权限、勿扰模式这几个关键环节捋清楚,帮你快速找回失联的提示音,避免错过重要信息。 iPh

热心网友
04.22