深入探索 RUM 与全链路追踪:优化数字体验的利器

作者:梅光辉(重彦)

背景介绍

随着可观测技术的持续演进,多数企业已广泛采用 APM、Tracing 及 Logging 解决方案,以此强化业务监控能力,尤其在互联网行业,产品的体验直接关系着用户的口碑,决定了市场命运,使得 RUM(真实用户监控)日益受到重视。然而,在面对由后端服务故障引起的体验问题时(例如,后端接口延迟引发的 APP 白屏或页面加载缓慢),如何有效的关联 RUM、APM 监控数据以及 Tracing 上下文,辅助问题排查以及影响面评估,成为一大挑战。

解决这一问题的关键在于如何实现从用户端到服务端的全链路打通,而 RUM 作为贴近用户的监测起点,天然适合担当此角色。本文旨在探讨端到端链路打通的解决方案,并分享 RUM 与端到端链路集成的最佳实践。

端到端链路打通的难点

技术架构复杂,多端、跨语言、跨团队场景多

一个典型的互联网应用,通常会包含用户终端(Web & 小程序/Android/iOS)、网关代理层(ALB/MSE/Ingress/Nginx)、后端服务(Java/Go/Python)以及中间件(数据库、消息、缓存)等部分,涵盖了前、后端开发以及中间件、运维团队,实现全链路打通,往往会面临以下问题:

1)不同的链路追踪工具,支持的主流语言、框架不一致,对跨端场景不友好;

2)生产环境实施,需要前后端开发人员、中间件以及运维同学通力协作,接入成本较高;

3)链路打通之后,如何与 RUM、APM 等监控数据、以及日志打通,方便问题排查与定界。

不同协议无法兼容,生产环境难以平滑切换

针对端到端链路打通场景,目前,主流的链路追踪项目,比如:OpenTelemetry、Zipkin、Jaeger、Skywalking 等,都有定义各自的链路传播协议:

  • OpenTelemetry:w3c 透传协议
  • Skywalking:sw8(v3)透传协议
  • ZipKin:b3/b3multi 透传协议
  • Jaeger:jaeger 透传协议

但是,不同协议间存在兼容性问题,比如:OpenTelemetry 和 Skywalking 就无法相互兼容,而且不同厂商和开源项目对各透传协议的支持力度也不一致:

因此,通常情况下,想要串联起完整的调用链路,就要求后端系统必须采用相同或者兼容的 Trace 协议,前端应用也需要引入对应的 SDK,并且,中间链路各个环节,比如:网关代理层,也必须保证协议 Header 的透传。

基于 OTel 与 W3C 的端到端链路解决方案

关注可观测领域的同学应该知道,近些年行业发展的一个显著趋势,是不断向标准化和开源生态方向整合,上文提到的 OpenTelemetry 项目和 W3C Trace Context 标准,都是这一趋势的代表项目,以下通过链路透传场景、链路透传协议以及跨协议兼容几个方面介绍基于 OTel 和 W3C Trace Context 的端到到链路解决方案。

链路透传场景

OpenTelemetry 使用一种称为“传播器”(Propagators)的机制来实现在不同环境和协议中 Trace 上下文的透传,确保在一个分布式系统中能够追踪完整的请求链路。无论是进程内还是进程间的通信,其核心都是通过特定的格式在请求头中携带必要的追踪信息。下面是 OpenTelemetry 如何在不同场景下实现 Trace 上下文透传的方案介绍:

进程内透传
  • 单线程场景: 在单线程环境下,由于所有操作都在同一个线程上执行,因此可以直接通过局部变量(比如在 Java 语言中,通常会采用 ThreadLocal)来存储当前 Span 信息,当新的操作开始时,可以将当前 Scope 的 Span 作为 Parent Span,从而传递了 Trace 上下文;
  • 多线程/异步场景: 在多线程异步编程场景,则需要在任务提交或异步调用时显式的携带Span上下文,比如:OpenTelemetry 就提供了 API(如:context.with(currentSpan))来创建一个带有特定 Span 的新 Context,并在此 Context 的作用域内执行代码,这样,即使是异步执行,也能确保 Trace 上下文可以被正确的传递和应用。
进程间透传
  • HTTP 场景: 通常是将 Trace 上下文编码到 HTTP 请求头中,比如:上文提到的 W3C Trace Context 标准,就采用了 traceparent、tracestate 两个 header 来传递 Trace 上下文信息,客户端在发起请求时,会自动将当前的 Trace 信息添加到 HTTP 头中;服务端接收到请求后,通过相应的传播器解析这些头部,恢复或延续 Trace 上下文。
  • RPC 和其他自定义协议场景: 对于非 HTTP 协议,如 gRPC、MQTT 等,原理类似,也是通过协议允许的头部或元数据字段来携带 Trace 上下文信息。OpenTelemetry 提供了多种传播器(如 JaegerPropagator、B3Propagator、W3CBaggagePropagator 等),可以根据具体协议的要求选择合适的传播器来序列化和反序列化 Trace 上下文。
  • 消息队列场景: 在消息队列场景中,通常将 Trace ID、Span ID 等信息作为消息的属性或元数据随消息一起发送,接收方可以从消息中提取这些信息并恢复上下文。
  • 数据库场景: 目前主流的数据库,比如:MySQL、PG 等,底层协议层面尚未提供相应扩展机制,因此绝大数链路追踪工具,包括:OpenTelemetry,均采用了客户端插桩的方式,仅在应用侧记录耗时、以及执行 SQL 等关键信息。

链路透传协议

这里重点介绍下 W3C Trace Contxt,也是目前国内外使用最多的一个协议标准,W3C Trace Context 是 W3C 组织所推出的一个规范,旨在规范分布式追踪中跟踪信息的传播格式,除了 HTTP 场景以外,也支持二进制、以及消息等场景(目前还处于 Draft 状态),详见 W3C 官网 [ 1]

W3C Trace Context(HTTP Protocol)

Trace Context 规范主要定义了两个 HTTP 头部字段:traceparent 和 tracestate。

  1. traceparent:采用扩展的巴科斯范式(ABNF)定义,由四个部分组成:
traceparent: {version}-{trace-id}-{parent-id}-{trace-flags}
  • version:2 位十六进制数字,表示当前 traceparent 头部字段的版本,如:00;
  • trace-id:32 位十六进制数字,用于表示整个 Trace 链路的唯一 ID,如:ec95e5a118ce450eac82ab9ec530b287;
  • parent-id:16 位十六进制数字,用于表示当前请求或操作的唯一 ID,如:a7be58f9cd8dd80d;
  • trace-flags:2 位十六进制数字,用于控制追踪标志,包含采样、追踪级别等,如:01。
  1. tracestate:是对 traceparent 字段的扩展,用于携带额外的、服务间可能需要的追踪状态信息,并且是 traceparent 字段的伴随标头。
tracestate: {vendor1Key}={vendor1Value},{vendor2Key}={vendor2Value},...

链路传播器

OpenTelemetry 项目几乎已经支持了除 sw8 以外大多数透传协议,并且还内置了一些国内外云厂商的协议传播器,同时 Opentelemetry 也支持自定义 Propagator,我们可以组合不同的 Propagator,也可以基于 Opentelemetry 的 TextMapPropagator 实现一个自己的 Propagator。

RUM 集成端到端链路的最佳实践

为什么 RUM 适合作为链路入口

前面提到,RUM 作为用户请求的入口,在解决链路打通问题上,天生就具备优势。一个比较直观的解法,就是直接在 RUM 端侧生成链路追踪的 TraceID,然后通过透传协议,以 HTTP Header 的形式将 Trace 上下文传递给后端,后端应用就可以基于协议 Header,来初始化 Trace 上下文,并在后端系统调用中进行传递。

相比直接在端侧集成开源协议 SDK,RUM 集成链路追踪还具有以下优势:

  • 优势一: 可以将用户体检监控中的错误、缓慢、以及用户会话数据,与链路追踪数据联动,实现端到端分析,比如:某个用户请求,在端侧看可能很慢,但是后端链路显示耗时并不长,此时,结合 RUM 与后端调用链数据,最终发现是 DNS、网络层耗时较长;
  • 优势二: 无需在端侧集成开源协议 SDK,也无需关心端侧链路数据上报的问题,尤其对于一些存在多个后端服务域名,并且协议还不相同的应用,可以在 RUM 产品中为不同域名设置不同的透传协议,一次接入即可实现一站式监控体验,极大降低了接入成本。

RUM 与 Trace 数据模型的融合

目前主流的 RUM 开源项目以及国内外云厂商,数据模型上基本都是以用户、会话作为核心,以 Event 的方式记录前端用户的页面加载、资源请求(包含 API 与静态资源),同时也会包含请求错误、JS 错误、崩溃、卡顿、自定义错误等异常数据,通过 API 请求,我们可以将 RUM 数据与后端调用链数据进行关联,从而获得从端侧用户到后端服务的完整链路,而 RUM Event 数据模型和 Trace Span 数据模型本身其实也是可以相互转换的。

RUM 与端到端链路集成的两种方案

方案一:RUM 转 Span,构建完整 Trace 链路

RUM 转 Trace 的方案,通常是在端侧应用中接入 RUM 探针,通过 RUM 进行协议透传,同时记录 Trace 上下文信息,并在 RUM 数据接收侧,将 RUM Event 数据转换为标准的 Trace Span 数据,并将 RUM 相关信息(如:user、session、view 等)注入到 Span Attributes 中,这么做的好处是:我们可以在 RUM 与 Trace 中实现互联互通,从而在线上问题排查中,可以方便的进行根因定位,并直观的评估对用户侧产生的影响。

方案二:Span 转 RUM,基于 OTel 的扩展机制构建

Span 转 RUM 的方案,则是在端侧应用中接入 OTel SDK,然后通过 OTel 提供的扩展机制,在 OTel Collector 中实现一个自定义的 rum exporter,将 OTel SDK 上报的 Span 数据转换为 RUM Event 数据,当然,你也可以在端侧同时引入 RUM 与 OTel 的 SDK,然后通过 OTel SDK 中提供 SpanProcessor 进行扩展,像开源 RUM 项目 Sentry 就采用的是这种方案。

但是这个方案对于 RUM 的数据模型有一定要求,最好的方式就是 OTel 能够支持RUM数据模型,目前 OTel 社区也有相关的小组,正在往这个方向努力,具体可以参考 Github 上这个 Issue:https://github.com/open-telemetry/oteps/issues/169

RUM 集成端到端链路的实际应用

全链路洞察

RUM 与 Trace 链路打通后,一个最直观的应用场景就是全链路洞察,可以实现故障根因的快速定界,无需跳转产品和页面,这一点对于一些角色职责分离的大型团队比较有价值。

影响面分析

另外一个比较重要的应用场景,就是当后端系统出现问题时,可以记录故障期间用户侧的所有操作,同时结合调用链可以方便的定位出哪些请求受到了后端故障影响,从而精准地定位出故障的影响面,包含受影响的客户列表、终端设备、运营商、地域等信息。在某些情况下,还可以帮助我们判断线上问题处理优先级。

总结展望

本文主要介绍了基于 OpenTeletemetry 与 W3C 协议构建端到端全链路的解决方案,同时探讨了 RUM 与端到端链路集成的最佳实践,希望可以为大家在生产环境落地应用提供一些参考。实际上,除了上面介绍到的全链路洞察根因定位,以及影响面分析外,RUM 与全链路追踪的应用场景还有很多,比如:对于一些生产环境难以复现的问题,可以结合 RUM 的会话重放功能,进行问题复现等,对于解决线上疑难问题,优化用户体验,绝对是一大利器。

相关链接:

[1] W3C 官网

https://w3c.github.io/trace-context-protocols-registry/

[2] W3C Trace Context

https://www.w3.org/TR/trace-context/

[3] W3C Baggage

https://www.w3.org/TR/baggage/

[4] B3

https://github.com/openzipkin/b3-propagation

[5] B3Multi

https://github.com/openzipkin/b3-propagation

[6] Jaeger

https://www.jaegertracing.io/docs/1.21/client-libraries/#propagation-format

[7] OpenTracing

https://github.com/opentracing?q=basic&type=&language=

[8] AWS X-Ray

https://docs.aws.amazon.com/xray/latest/devguide/xray-concepts.html#xray-concepts-tracingheader

[9] 相关文档

https://www.w3.org/TR/trace-context/

[10] 相关文档

https://github.com/openzipkin/b3-propagation

[11] 相关文档

https://github.com/openzipkin/b3-propagation

[12] 相关文档

https://www.jaegertracing.io/docs/1.21/client-libraries/#propagation-format

[13] 相关文档

https://skyapm.github.io/document-cn-translation-of-skywalking/zh/8.0.0/protocols/Skywalking-Cross-Process-Propagation-Headers-Protocol-v3.html

参考文章:

[1] https://opentelemetry.io/docs/

[2] https://www.w3.org/TR/trace-context/

[3] https://w3c.github.io/trace-context-protocols-registry/

[4] https://docs.google.com/document/d/16Vsdh-DM72AfMg_FIt9yT9ExEWF4A_vRbQ3jRNBe09w/edit?pli=1

[5] https://develop.sentry.dev/sdk/telemetry/traces/opentelemetry/#step-1-implement-the-sentryspanprocessor-on-your-sdk

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/55152.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

音视频入门基础:FLV专题(4)——使用flvAnalyser工具分析FLV文件

一、引言 有很多工具可以分析FLV格式,这里推荐flvAnalyser。其支持: 1.FLV 文件分析(Tag 列表、时间戳、码率、音视频同步等),HEVC(12)/AV1(13) or Enhanced RTMP v1 with fourCC(hvc1/av01); 2.RTMP/HTT…

工业缺陷检测——Windows 10本地部署AnomalyGPT工业缺陷检测大模型

0. 引言 在缺陷检测中,由于真实世界样本中的缺陷数据极为稀少,有时在几千甚至几万个样品中才会出现一个缺陷数据。因此,以往的模型只需在正常样本上进行训练,学习正常样品的数据分布。在测试时,需要手动指定阈值来区分…

AntFlow-Vue3 :一个仿钉钉流程审批,且满足99.8%以上审批流程需求的企业级工作流平台,开源且免费!

在现代企业管理中,流程审批的高效性直接影响到工作的流畅度与生产力。最近,我发现了一个非常有趣的项目—— AntFlow-Vue3 。这个项目不仅提供了一个灵活且可定制的工作流平台,还能让用户以可视化的方式创建和管理审批流程。 如果你是一名前…

OpenCV_自定义线性滤波(filter2D)应用详解

OpenCV filter2D将图像与内核进行卷积,将任意线性滤波器应用于图像。支持就地操作。当孔径部分位于图像之外时,该函数根据指定的边界模式插值异常像素值。 卷积核本质上是一个固定大小的系数数组,数组中的某个元素被作为锚点(一般…

CICD 持续集成与持续交付

一 、CICD是什么 CI/CD 是指持续集成(Continuous Integration)和持续部署(Continuous Deployment)或持续交付(Continuous Delivery) 1.1 持续集成(Continuous Integration) 持续集…

OpenSource - 开源WAF_SamWaf

文章目录 PreSafeLine VS SamWaf开发初衷软件介绍架构界面主要功能 使用说明下载最新版本快速启动WindowsLinuxDocker 启动访问升级指南自动升级手动升级 在线文档 代码相关代码托管介绍和编译已测试支持的平台测试效果 安全策略问题反馈许可证书贡献代码 Pre Nginx - 集成Mod…

游戏开发2025年最新版——八股文面试题(unity,虚幻,cocos都适用)

1.静态合批与动态合批的原理是什么?有什么限制条件?为什么?对CPU和GPU产生的影响分别是什么? 原理:Unity运行时可以将一些物体进行合并,从而用一个描绘调用来渲染他们,就是一个drawcall批次。 限…

OpenGL ES 绘制一个三角形(2)

OpenGL ES 绘制一个三角形(2) 简述 本节我们基于Android系统,使用OpenGL ES来实现绘制一个三角形。在OpenGL ES里,三角形是一个基础图形,其他的图形都可以使用三角形拼接而成,所以我们就的案例就基于这个开始。 在Android系统中…

Java项目实战II基于Java+Spring Boot+MySQL的厨艺交流平台设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在美食文化…

计算机毕业设计 基于Python的热门微博数据可视化分析系统的设计与实现 Python+Django+Vue 可视化大屏 附源码 讲解 文档

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

OJ在线评测系统 前端创建题目(增) 更新题目(改) 题目列表(查) 以及做题页面的开发 基于VUECLI脚手架画界面

目录 前端创建页面的开发一 创建一个路由 用acro design写 前端创建页面的开发二 题目管理页面 搜索 最終效果 题目更新页面的开发 携带参数的那种 修改路由 页码更新细节 我们先处理菜单项的权限控制和权限隐藏 在这里改 属性绑定一个函数 可以参考聚合搜索项目…

Jenkins入门:从搭建到部署第一个Springboot项目(踩坑记录)

本文讲述在虚拟机环境下(模拟服务器),使用docker方式搭建jenkins,并部署一个简单的Springboot项目。仅记录关键步骤和遇到的坑 目录 一、环境准备和基础工具安装 1. 环境 2. yum安装 3. docker安装 4. 内网穿透工具安装natapp 二、jenkins安装和配置…

毕业设计选题:基于ssm+vue+uniapp的校园二手交易平台小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

操作系统与进程

1.操作系统 操作系统是计算机中的一个重要软件,它是一个专门进行管理的软件。操作系统可以通过驱动程序来间接管理外部硬件,也可以为计算机中的程序提供一个稳定的运行环境,从而来方便管理各种程序的运行,让程序之间的运行互不影…

上交所服务器崩溃:金融交易背后的技术隐患暴露杭州BGP高防服务器43.228.71.X

一、上交所宕机事件始末 2024 年 9 月 27 日,上交所交易系统突发崩溃,这一事件犹如一颗巨石投入平静的湖面,引起了轩然大波。当天上午,众多投资者反馈券商交易出现延迟问题,随后上交所发布了《关于股票竞价交易出现异常…

AI驱动的Java开发框架:Spring AI Alibaba实战部署教程

前言 随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言&a…

敏感字段加密 - 华为OD统一考试(E卷)

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 【敏感字段加密】给定一个由多个命令字组成的命令字符串: 1、字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号; 2、命令字之间以一个或多个下划线 进行分割; 3、可…

【JavaSE系列】IO流

目录 前言 一、IO流概述 二、IO流体系结构 三、File相关的流 1. FileInputStream 2. FileOutputStream 3. FileReader 4. FileWriter 四、缓冲流 五、转换流 1. InputStreamReader 2. OutputStreamWriter 六、数据流 七、对象流 八、打印流 九、标准输入输出流…

Apache APISIX学习(2):安装Grafana、prometheus

一、Grafana安装 1、介绍 Grafana 是一个监控仪表系统,它是由 Grafana Labs 公司开源的的一个系统监测 (System Monitoring) 工具。它可以大大帮助你简化监控的复杂度,你只需要提供你需要监控的数据,它就可以帮你生成各种可视化仪表。同时它…

Deep Learning for Video Anomaly Detection: A Review 深度学习视频异常检测综述阅读

Deep Learning for Video Anomaly Detection: A Review 深度学习视频异常检测综述阅读 AbstractI. INTRODUCTIONII. BACKGROUNDA. Notation and TaxonomyB. Datasets and Metrics III. SEMI-SUPERVISED VIDEO ANOMALY DETECTIONA. Model InputB. MethodologyC. Network Archite…