掘力计划第25期 前端研发全流程的性能监控实践

2022年9月23日,字节跳动在北京举办了掘力计划第25期"性能专场"技术沙龙。本次活动的主题是《前端研发全流程的性能监控实践》,由字节跳动架构前端 APM 团队的李俊安和嵇晓濛两位讲师进行分享。

长期以来,对前端监控的理解局限于对线上应用进行数据采集和监控,以便及时发现问题。但随着业界对应用质量和稳定性要求越来越高,仅仅依靠线上监控已然不能满足需求。因此,业内开始探索在研发流程中"左移"监控点,使质量监控覆盖更早的开发阶段。

视频回放:juejin.cn/live/jpower...

研发流程左移的动机

李俊安讲师首先解析了典型的研发流程,包含计划、开发、测试、构建、部署、全量发布、灰度发布、监控等8个节点。过去,监控节点主要位于全量发布之后,意味着问题往往已经暴露给大批用户,无法避免对用户造成影响。

随着业务团队对端监控能力要求不断提高,对应用质量和稳定性的需求也在提升。这要求端监控能力需要从简单的线上监控,逐步向研发流程的更早阶段扩展。业界传统的端监控集中在全量发布之后,一旦出现问题就已经影响到大量用户。为了能够尽早发现问题、减小问题影响,需要将监控点逐步左移。

首先可以从全量发布后左移到灰度发布,在小流量环境下测试新版本。再进一步可以左移到持续集成环节,在交付过程中的各个节点实施监控,对问题 adoption 采取措施。这对应了业务团队的诉求,从最初简单追求尽早发现问题,到关注降低问题影响范围,最后希望能够防患于未然、杜绝低级错误反复出现。

从全量发布到灰度发布

相比日常监控,灰度监控有自己的特点。嵇晓濛介绍了灰度监控的3个关键点:

  • 区分灰度流量数据:在数据采集时通过版本号标记灰度数据,在后续处理中以版本号筛选。

  • 按比例调整报警阈值:根据灰度比例动态调整报警阈值,保证敏感度。还可以通过复合指标监控灰度放量异常。

  • 关注版本引入的新问题:主要通过核心业务链路指标、异常指标发现问题,辅以性能指标。

技术实现上,主要是在数据采集时打标签,后续处理和报警以标签区分灰度数据。此外,监控灰度覆盖率指标以确保放量正常。另外,设计了动态报警阈值机制,可以根据不同的灰度放量比例来调整报警触发阈值。

报警之外,还可以在监控看板上设计多指标联动观测,比如同时观察灰度版本的错误率和所有版本的错误率,判断是否存在明显差异。如果放量比例不精确,可以通过设计复合指标来动态适应。

针对灰度监控的指标选取,要优先关注稳定性问题,如核心业务链路的异常、JS 错误、网络请求错误等高优先级指标。同时要关注灰度放量本身的异常,确保放量符合预期。

从上线后到上线前

嵇晓濛讲师提到,即便我们能通过灰度监控能力减少问题影响的范围,也不可避免地将问题直接暴露给了部分用户。我们如何在上线前就发现和拦截问题,不让这些问题直接暴露到用户面前呢?

1. 页面快照与端到端测试:预览环境的模拟验证

为了避免将缺陷及性能问题暴露给用户,我们将监控能力左移到上线前的节点,即持续测试阶段,在测试环境或预览环境就对应用做一次全面的体检。

具体来说,可以采用以下措施:

  • 使用基于 Lighthouse 的线下性能分析能力,Lighthouse 可以分析网页首屏加载、渲染、运行时的性能瓶颈。

  • 通过平台化手段增强 Lighthouse 的归因能力和跨版本追踪能力,可以更好地定位性能瓶颈。

  • 使用基于 Puppeteer 的端到端测试。通过编写业务核心链路的交互流程,自动化测试不同场景下应用的性能。

2. 产物分析:分析打包产物对应用的影响

除了页面交互外,构建产物本身也会对性能产生很大影响。所以我们将监控继续左移到了持续集成阶段,对构建产物进行分析:

  • 收集 Webpack、ESBuild、Rollup 等构建工具产生的构建信息。
  • 增加产物信息的跨版本追踪、报警等能力。
  • 引入规范,给出产物优劣的评判结果。
  • 从多个维度分析产物对性能的影响,如文件体积、重复依赖等。

通过上述措施,我们能在上线前发现绝大部分问题,最大限度地减少问题对用户的影响。

总结

通过逐步左移监控点,可以在更早开发阶段发现问题,有效防止缺陷暴露给用户,提高产品质量。线下性能分析的能力已经被集成到开源平台 perfsee.com 中,供更多团队使用。本次分享从研发流程的全局视角审视端监控,分享了许多可操作的方式来提升应用性能,对于其它前端团队也具有很好的借鉴意义。

掘力计划

掘力计划由稀土掘金技术社区发起,致力于打造一个高品质的技术分享和交流的系列品牌。聚集国内外顶尖的技术专家、开发者和实践者,通过线下沙龙、闭门会、公开课等多种形式分享最前沿的技术动态。

相关推荐
无尽的大道20 分钟前
Java反射原理及其性能优化
jvm·性能优化
John.liu_Test27 分钟前
js下载excel示例demo
前端·javascript·excel
Yaml441 分钟前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
PleaSure乐事42 分钟前
【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案
前端·javascript·react.js·前端框架·webstorm·antdesignpro
哟哟耶耶43 分钟前
js-将JavaScript对象或值转换为JSON字符串 JSON.stringify(this.SelectDataListCourse)
前端·javascript·json
getaxiosluo44 分钟前
react jsx基本语法,脚手架,父子传参,refs等详解
前端·vue.js·react.js·前端框架·hook·jsx
理想不理想v1 小时前
vue种ref跟reactive的区别?
前端·javascript·vue.js·webpack·前端框架·node.js·ecmascript
知孤云出岫1 小时前
web 渗透学习指南——初学者防入狱篇
前端·网络安全·渗透·web
贩卖纯净水.1 小时前
Chrome调试工具(查看CSS属性)
前端·chrome
栈老师不回家2 小时前
Vue 计算属性和监听器
前端·javascript·vue.js