发布日期:2023-03-28 15:45:04
分享到
在日常生活在,你的网页、小程序、app,是否有过以下情况?
当类似上述故障发生时,最痛苦的莫过于“救火队”——运维人员,不仅需要耗费大量时间进行排查,而且不能很好定位到是前端的问题还是后端的问题,前后端it人员的互相甩锅,也导致问题迟迟无法解决。
我们以一些典型的场景为切入,来看看排障定位为什么会出现如此困境:
01. 运维痛点——排障过程存在困境
1)单点用户排障流程
过去传统运维单点排障的工作实录:用户纷至沓来,客服电话被打爆,运维人员看看堆积如山的工单汗如雨下。只能一个个工单进行故障排查。
运维人员打开第一条工单,发现是个普通的js错误报错,但是只能看到异常错误堆栈信息,无法通过这个堆栈直接定位到错误的源代码行。只能抱着这个异常错误去自行解析。好不容易解析出了源代码异常的位置,并测试了几轮,完成了源代码修复。
运维人员打开第二条工单,解析完发现这是跟第一个一模一样的错误源代码行,也就是说,在完成第一个异常修复的时候,其实就已经同时完成了这条异常的修复。运维人员骂骂咧咧地打开第三条工单、第四条工单,一条一条解决着........
终于,在运维人员加班到十二点,解决完第433条工单,看着待办1000 后。啪地一声关上了电脑。
结果自己该做的其他工作,一点进度都没有。
2)前端排障原理与流程
当然,随着代码技术的不断演进,现在的程序员一般是不会一行一行的去排查代码的,不然动辄上万行的代码,如此去排障,运维人员、前后端人员早就“崩溃”了。以js异常为例,我们来看两个实例:
① 简单情况下的问题定位
大部分程序编写过程中,程序引擎会有定位异常行号的功能,但当部分引擎不具备定位行号功能时,几乎无法定位异常所在。在这种情况下,程序员们会使用try…catch语句,标记要尝试的语句块,并制定一个出现异常时的响应机制。
举例:
捕捉到异常之后,可以通过error的linenumber属性将行号打印出来:
借此,完成异常代码的定位。
② 复杂情况下的问题定位
当然,上例是比较简单的代码的情况,可以通过try…catch语句进行一条条的定位。
实际生产环境中,一般的网页代码都是体量较大的, 并且前端的javascript代码在上线前都会经过压缩、混淆处理,这样的好处是可以减小代码的体积,二来可以保证代码的安全性。例如某网页源代码可能是这样的:
在经过压缩、混淆后变成了这样:
在这种情况下,如果发生代码报错:
那么就很难根据错误信息去定位具体的代码行。
该例子中还有 auto_renew 这个关键字,能根据关键字入手,实际情况可能更加复杂,如仅提示“cannot read property [0] of undefined”时,定位具体问题将变得更加棘手。
③ sourcemap精准定位问题
如何解决复杂情况下的代码异常定位问题呢?
如果不压缩代码,直接用源码去进行发布工作,看似可以完美的解决异常,但是代码体积将会非常巨大,同时安全隐患也无法忽视。那为什么在本地开发的时候,默认的也是打包后的文件,用chrome测试的时候为什么就可以看到源码呢?这就不得不提sourcemap技术了。
所谓sourcemap技术,就是维护一个源代码和压缩后代码映射关系用的文件,通过压缩后的错误信息反向推出源代码的具体错误行号。
例如上述代码,map文件内容如下:
其中,最重要的内容就是mappings这一行。这是一个很长的字符串,分为了三层,记录了一搜索前后代码的映射关系。现在常用的的前端打包工具(webpack、gulp、rollup等)都支持这个sourcemap功能。
打包后类似:
另外需要注意,sourcemap是不会跟着打包后的js一起部署的,不然你的代码很容易就被他人反推出来。所以需要在打包脚本过程中,将其中的.js和.map独立出来。
借助sourcemap技术,通过合适的展示平台,如嘉为鲸眼真实用户监测中心,就可以在展示平台中精确定位到异常错误行。
除js异常外,前端还会有许多其它类型的异常,还存在种各种各样的排障困境,但实际上,只要弄清楚造成困境的根本原因,从本质出发着手处理,问题就迎刃而解了。
02. 根因分析——前后端分离的监控差异
1)前后端监控的差异
在当下流行前后端分离开发的大趋势下,apm技术(应用性能监测,也就是后端服务监测)也更多的被大家所认知。
当前,随着用户端的复杂度的上升以及精细化运营的需求上升,对流量层的监控已发展至第三阶段,从专注于网络、it部件/组件的后端监控转向前端后端一体化监控,从用户端着手开始采集数据,同时在整个用户体验交付链条的每一个环节都要进行监控,完成基于云的端到端全栈应用性能管理。
从用户端的角度看,用户操作一条信息大致是通过如下流程的:
这其中的每一个环节都可能产生缺陷:
到达环节
渲染环节
交互环节
请求环节
反馈环节
而在传统的监控体系下,这一系列环节中只有后端交互的部分能够用常规的后端监控工具,即apm覆盖到,其它环节的监控往往是缺失的。
因为缺乏这方面监视的工具,前后端同事也经常进行问题的“甩锅”。
为防止前后端的“撕逼”,我们需要从什么角度去建立前端监控体系,保证前后端的工作定位准确,精准排障呢?
03. 对症下药——跨越障碍实现精准排障
从用户端来看,任何一个角度出现问题,都会导致用户的体验不佳,导致流失。为了保证用户不流失,一些apmk8凯发天生赢家的解决方案开始引入uem(user experience monitoring)技术,即针对用户体验的监控,来保证可用性。
由于用户端的复杂度不断上升,我们面临的偶发性缺陷,局部性缺陷等难以复现的问题会越来越多。
用户端作为一个高度碎片化的系统,在任何个例上可用都不意味着整体可用,可用性问题实际上是按各种环境因素展开的概率问题。
影响可用性的环境因素:
从这些角度出发去分析问题,就可以撅弃传统的“反馈、复现、调试”的缺陷处理方法。通过前端主动上报监控信息的形式,收集更全面的用户端数据,用“打点、观察、分析”的方法,以统计学思维处理概率性的缺陷,而不是直接通过前后端一同还原现场深入细节排障的方式,就能够避免甩锅现象的发生。
前后端监控工具的相互联动,能够让运维人员提供加强故障感知能力,保证业务连续稳定,同时也便于研发人员进行异常根因分析,精准定位问题,从而跨越前后端鸿沟,实现全方位排障流程的效率提升。
微信扫码登录
申请演示
请登录后在查看!