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

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

热心网友
15
转载
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。

相关攻略

多语言文档比对方法如何准确定位跨语言差异
业界动态
多语言文档比对方法如何准确定位跨语言差异

在全球协作与信息交换日益频繁的今天,高效实现多语言文档比对并精准定位跨语言差异,已成为企业国际化运营与内容管理中的核心需求。以下是一套系统化的关键步骤与技术方案,旨在帮助您有效应对这一挑战。 一、明确比对目标与范围 首要任务是清晰定义比对的具体目标。这包括确定需要比对的文档集合、涵盖的语言种类,以及

热心网友
05.13
多语言混排文本识别OCR技术解决方案详解
业界动态
多语言混排文本识别OCR技术解决方案详解

在全球数字化进程中,文档与图像中的文字内容日益呈现多语言混合的特点。中英文混杂、多语种并存的文本场景已成为常态,这对OCR(光学字符识别)技术提出了更高的要求。如何让机器精准识别并理解混合语言文本,成为提升信息处理效率的关键。本文将系统解析实现多语言混排文本识别的核心技术路径与实践方法。 一、多语言

热心网友
05.13
Figma多语言界面设计指南:AI与本地变量自动映射
AI
Figma多语言界面设计指南:AI与本地变量自动映射

在Figma中完成UI框架设计后,若需同时适配中文、英文、日文等多语言版本,手动逐项替换文本不仅效率低下,且极易出错,同步维护更是难题。这通常源于缺乏系统化的文案管理机制。实际上,通过Figma原生的Local Variables功能,您可以建立起结构清晰的多语言文案管理体系,再结合AI工具进行批量

热心网友
05.13
多语言混排文本OCR识别策略与优化方法
业界动态
多语言混排文本OCR识别策略与优化方法

在包含中文、英文及其他多语种的混合文档中,传统OCR技术常面临识别准确率下降的挑战。实现高效、精准的多语言混排文本识别,需要系统化地整合多项关键技术。那么,如何构建可靠的识别方案?以下核心策略至关重要。 一、多语言字符集支持 强大的OCR系统首先需要具备广泛的字符识别能力。这意味着引擎必须集成覆盖中

热心网友
05.13
VSCode进阶教程如何为不同编程语言配置智能补全规则
编程语言
VSCode进阶教程如何为不同编程语言配置智能补全规则

许多开发者在 Visual Studio Code 中配置代码自动补全时,常会遇到提示不准确或功能失效的问题。这通常并非某个单一设置错误,而是由于 VSCode 智能补全系统的几个核心组件未能协同工作所致。 简而言之,VSCode 的智能补全由三大核心驱动:语言服务器协议(LSP)提供深度代码分析,

热心网友
05.10

最新APP

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

热门推荐

清华大学AI视觉模型推理能力深度评测报告
AI
清华大学AI视觉模型推理能力深度评测报告

这项由清华大学、美团、香港大学等多家顶尖机构联合开展的研究,于2026年3月以预印本论文(arXiv:2603 25823v1)的形式发布。它直指当前AI视觉生成领域一个被长期忽视的核心问题:这些能画出“神作”的模型,到底有多“聪明”?研究团队为此构建了一套全新的测试基准——ViGoR-Bench,

热心网友
05.14
AI科学写作新突破:机器自动生成完整学术论文
AI
AI科学写作新突破:机器自动生成完整学术论文

人工智能的浪潮席卷了各个领域,机器在诸多任务上已展现出超越人类的能力。然而,有一个看似寻常却异常复杂的领域,始终是AI研究者们渴望攻克的堡垒——让机器像真正的学者那样,撰写出一篇结构严谨、逻辑自洽、图文并茂的完整科学论文。这远比下棋或识图要困难得多。 2026年3月,一项由中科院AgentAlpha

热心网友
05.14
法国Hornetsecurity与里尔大学合作:AI隐私保护技术从675亿到1.5亿参数的知识迁移实践
AI
法国Hornetsecurity与里尔大学合作:AI隐私保护技术从675亿到1.5亿参数的知识迁移实践

这项由法国Hornetsecurity公司与里尔大学、法国国家信息与自动化研究院(Inria)、法国国家科学研究中心(CNRS)以及里尔中央理工学院联合开展的研究,发表于2026年3月31日的计算机科学期刊,论文编号为arXiv:2603 29497v1。 在信息爆炸的今天,我们每天都在网上留下数字

热心网友
05.14
清华大学AI自主编写操作指南研究突破人工编程局限
AI
清华大学AI自主编写操作指南研究突破人工编程局限

当你满怀期待地拆开一台全新的智能设备,最令人困扰的往往不是如何使用它,而是如何让它真正“理解”指令并智能地执行任务。如今,一个更为优雅的解决方案可能已经出现。来自清华大学深圳国际研究生院与哈尔滨工业大学(深圳)的联合研究团队,近期取得了一项极具前瞻性的突破:他们成功训练人工智能自主“撰写”并精准理解

热心网友
05.14
华盛顿大学AI新突破图片转可编辑矢量图形技术详解
AI
华盛顿大学AI新突破图片转可编辑矢量图形技术详解

2026年3月,来自华盛顿大学、艾伦人工智能研究所和北卡罗来纳大学教堂山分校的研究团队,在图像智能矢量化领域取得了一项突破性进展。这项研究(论文编号:arXiv:2603 24575v1)开发了一个名为VFig的AI系统,它能够将静态的栅格图像智能地转换为可自由编辑的矢量图形,如同一位“图形考古学家

热心网友
05.14