基于Otel的前端全链路追踪思考和实践

简介: 本文内容是笔者基于 GOTC 2023 全球开源技术峰会整理。前端为什么要接入链路追踪大家都应该经历过这样的事情:某一个页面或者某一个请求比较慢,前后端分别调查后数据对不上,或者很难说明差异的来源是由什么造成的,这就是单点监控带来的问题。然后是问题定位,前端作为系统的出入口,导致很多团队问题一般界线模棱两可的问题都会交给前端去定位,相信很容前端应该都经历过这样的痛苦,而作为前端也只能人肉的去分析这

本文内容是笔者基于 GOTC 2023 全球开源技术峰会整理。

前端为什么要接入链路追踪

大家都应该经历过这样的事情:某一个页面或者某一个请求比较慢,前后端分别调查后数据对不上,或者很难说明差异的来源是由什么造成的,这就是单点监控带来的问题。然后是问题定位,前端作为系统的出入口,导致很多团队问题一般界线模棱两可的问题都会交给前端去定位,相信很容前端应该都经历过这样的痛苦,而作为前端也只能人肉的去分析这些问题,目前并没有什么好的手段自动发现问题。最后就是数据价值,比起后端,前端是与用户最接近的,可以获得非常多的用户使用信息,包括性能、接口、行为、地址位置、网络信息等等。这些信息单独来看可能是有一些价值的,但是对整个 IT 系统而言价值没有充分挖掘,形成了数据孤岛。

链路追踪问题和挑战

一条典型的链路展示

上面图片中是一条典型链路的基本结构。首先是端侧,端侧平台众多,常见的端侧有 Android、IOS 应用以及电脑端的浏览器和应用;在国内还有各个APP平台的小程序、小游戏、公众号等。端侧的繁荣景象导致链路追踪端侧 SDK 的开发成本非常高,需要适配和测试的平台非常多。而且端侧一般来说网络也比较复杂,有弱网的情况,如何保证 SDK 能够完整、正确、高效的发送日志也是一个非常棘手的问题。

其次是网关层,它在云原生的加持下变得更加独立和复杂,该层一般包括网关、负载均衡、防火墙等。用户的请求请过网关层到达服务端,这样的曲折链路导致用户测请求和服务端请求中间变得不再透明和直接,一般很少有方法能够持续的检测网关层不同节点之间的延迟。

最后是服务层,服务层的检测相对容易很多,已经有很多平台服务能够支持服务层的链路追踪服务。

从这条典型的链路可以看到构建全端的链路追踪服务痛点还是非常多的,下面展开讲讲需要解决的痛点:

痛点一:多端采集问题

端侧是全端全链路建设的核心发起点,是生成链路追踪 id 的第一环(本章主要介绍和 Javascript 相关端全链路的建设,关于原生移动端(IOS/Andriod)可以参考这篇文章。端侧需要解决的问题非常多,大致分为五类:

  1. 平台众多,包含桌面平台、浏览器(Web)平台、国内特殊的小程序平台和全栈框架,既要全部兼容,还要保证端侧 agent 包的大小不至于膨胀过大有一定的难度。
  2. 兼容难度大,不同平台需要兼容的接口不一样,特别是路由、请求、缓存相关的。
  3. 上下文获取难,javascript 端侧的执行环境不同于后端 java、go,目前还没有很好的获取当前 context 的标准,而且小程序情况更加恶劣,各个厂家的实现方式都不一样。
  4. 日志丢错问题,端侧存在弱网的情况可能发送不成功,而且端侧用户是即来即走的模式,设备或者网页随时可能关闭。
  5. 高 QPS 问题,用户量大的情况下,端侧流量会非常大,需要保证高流量下稳定写入。

痛点二:统一协议问题

链路追踪业界提供的方案非常多,国内外厂商都有,前端链路追踪用的比较多的有sentry,自建相对比较方便,github 上也有一些开源的支持小程序的插件。但是整体来看呢,可观测系统会包含日志、指标、链路等多种需要接入的系统,业界很少有能够满足前后端一体化统一协议的问题。例如前后端通信方案不统一、日志系统和链路追踪系统等多套方案不统一、不同系统隔离数据不互通,以及很多方案都是厂商绑定的,不方便迁移未来迁移的别的方案。而且链路追踪采集数据涉及的面非常广,不仅包括采集协议,还涉及到存储的方式、流批计算等。

链路追踪设计方案

统一协议 OpenTelemetry

云原生基金会CNCF在合并OpenCensus和OpenTracing后诞生了OpenTelemetry项目,旨在将Logging、Tracing、Metrics三者进行统一,实现数据的互通互操作。OpenTelemetry最核心的功能是产生、收集可观察性数据,并支持传输到各种的分析软件中,整体的架构如上图所示,其中Otel Library用于产生统一格式的可观察性数据;Collector用来接收这些数据,并支持把数据传输到各种类型的后端系统。OpenTelemetry标准化对于可观测有着重要的意义。

在此基础上,我们基于 OpenTelemetry 的协议打造了自研的 SLS OT JS SDK,旨在和后端统一日志、Trace的协议格式。选择自研主要是因为开源的 OT JS SDK 目前主要用于nodejs端,而用户前端的包体过大,达到100KB,我们自研的 SDK 非常轻量级,仅 15KB 大小。

确保日志不丢失

JS SDK 在设计之初就确保了高可用性。首先是数据缓存,根据平台的不同有多种策略选择,优先选择 IndexDB,在其他小程序平台可以选择 local storage。其次是数据发送,支持多种发送方式包括最省流量的点图,以及性能和成功率最高的 beacon。最后是数据通道,除了默认的域名上报外,还支持使用 DCDN,支持就近访问上报,这个能够大大提高发送成功率。

统一协议的全端 SDK 架构

下图就是我们全端的 JS SDK 的架构,全插件化设计。有一层兼容层,适配了大部分 JS 平台的接口包括请求、路由。支持全自动埋点,发送请求时自动会带上 TraceID、SpanID、当前页面的 PageID 和 当前会话 SessionID,支持和服务端以及云产品中间层打通。所有端的日志会和后端日志一起统一写入 SLS 统一接入层,支持定义一个 plugin 后写入其他支持 OT 的厂商。

全平台链路追踪架构

下图是 SLS 全平台链路追踪的架构,里面重点画出了和前端相关的部分,前端支持了主流的web平台和小程序平台还有桌面平台,也和阿里云一些流量转发的云产品做了打通。首先系统有一层统一接入层,支持高流量并发接入,所有端包括前端后端app端都会以统一的协议接入统一接入层。

统一接入层后面是统一存储层,会将所有端的接入分析日志、链路数据、指标数据。然后是数据处理层,我们使用 SLS 上统一的 ETL 和 schedule SQL 引擎,按分钟汇总 trace 数据,计算每一条trace的拓扑和指标,最后汇总到标准的数据存储,接入的用户可以方便的搜索规整后的日志库和指标库。

最后为了充分的挖掘我们前端agent记录的数据的价值,系统还提供了许多上层的应用,包括链路分析、拓扑分析、根因分析还有告警等。

前端链路追踪分析案例

案例一:打通网关、负载均衡

上文介绍过网关层在云原生的加持下变得更加独立和复杂,SLS 通过和阿里云各个网关层合作,在全链路的每个网关层节点上支持将 HTTP 协议 header 中的 traceid 和 spanid 记录在网关的访问日志中。我们会综合所有网关的访问日志、Trace的日志,根据请求时间、处理时间、内置默认顺序等,重新计算出每个节点的 traceid 和 spanid,通过这样的方式打通了所有的链路环节。

案例二:多维度智能异常分析

端侧的数据是比较丰富的,和后端相比,端侧通常会多出地域(机房、城市、省份)、设备型号、设备版本、运营商等。除了这些信息外,基本的端侧性能数据、用户的访问行为、接口的性能和报错也可以收集,有了这些数据后就可以针对这些属性构建异常分析程序。

第一步是针对业务属性构建告警,比如流量下跌告警、交易量下跌告警,此类告警构建相对是比较容易的。

第二步是针对每一个告警进行异常分析,基于一个深度学习异常分析算法,支持单维归因和组合归因,通过正向显示和反向显示的比较能够分析出异常的原因。

总结

相关实践学习
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
目录
相关文章
|
21天前
|
资源调度 前端开发 测试技术
前端工程化实践:从零搭建现代化项目构建流程
【4月更文挑战第6天】本文介绍了前端工程化的概念和重要性,包括模块化、自动化、规范化和CI/CD。接着,讨论了选择合适的工具链,如包管理器、构建工具和测试框架。然后,详细阐述了如何从零开始搭建一个基于React的现代化项目构建流程,涉及初始化、代码规范、测试、CSS处理、代码分割和CI/CD配置。最后,提到了持续优化与迭代的方向,如性能优化、类型检查和微前端。通过这样的实践,开发者可以提升开发效率和代码质量,为项目长远发展奠定基础。
27 0
|
27天前
|
前端开发 编解码 数据格式
浅谈响应式编程在企业级前端应用 UI 开发中的实践
浅谈响应式编程在企业级前端应用 UI 开发中的实践
22 0
浅谈响应式编程在企业级前端应用 UI 开发中的实践
|
2月前
|
编解码 前端开发 开发者
现代前端开发中的响应式设计原理与实践
传统的网页设计通过固定的布局方式难以适应不同设备的屏幕尺寸,而响应式设计则能够使网页在各种终端上都能良好呈现。本文将深入探讨现代前端开发中响应式设计的原理和实践,帮助开发者更好地理解和应用响应式设计技术。
|
21天前
|
前端开发 数据可视化 JavaScript
探索前端可视化开发:低代码平台原理与实践
【4月更文挑战第7天】本文探讨了低代码平台在前端开发中的应用,介绍了其模型驱动、组件化和自动化部署的原理,强调了提升效率、降低技术门槛、灵活适应变更和保证一致性等优势。建议开发者明确适用场景,选择合适平台,并培养团队低代码技能,同时规划与现有技术栈的融合,实施持续优化治理。低代码平台正改变开发格局,为业务创新和数字化转型提供新途径。
46 0
|
1天前
|
前端开发 JavaScript 开发者
前端技术栈:探索现代Web开发的核心要素与代码实践
前端技术栈:探索现代Web开发的核心要素与代码实践
7 1
|
1天前
|
前端开发 JavaScript 开发工具
前端技术栈:构建现代Web应用的基石与实践
前端技术栈:构建现代Web应用的基石与实践
9 3
|
3天前
|
前端开发 JavaScript 开发者
【专栏】前端工程化实践与构建工具比较:Webpack、Rollup等
【4月更文挑战第27天】本文探讨了前端工程化的重要性,强调构建工具在其中的角色,如Webpack和Rollup。Webpack以其灵活性和插件系统适用于复杂SPA项目,建议开发者理解其核心概念并优化性能。Rollup则专注于JavaScript模块打包,生成更小、更快的代码,适合小型至中型项目和库创建,以其Tree-shaking技术减小代码体积。开发者应根据项目需求、团队技术和生态选择合适工具,掌握核心原理以提升开发效率和质量。
|
18天前
|
敏捷开发 前端开发 JavaScript
实践总结|前端架构设计的一点考究(上)
实践总结|前端架构设计的一点考究(上)
37 0
|
18天前
|
SQL 前端开发 JavaScript
实践总结|前端架构设计的一点考究(中)
实践总结|前端架构设计的一点考究(中)
34 0
|
18天前
|
设计模式 开发框架 前端开发
实践总结|前端架构设计的一点考究(下)
实践总结|前端架构设计的一点考究(下)
43 0