掘力计划第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 中,供更多团队使用。本次分享从研发流程的全局视角审视端监控,分享了许多可操作的方式来提升应用性能,对于其它前端团队也具有很好的借鉴意义。

掘力计划

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

相关推荐
德迅云安全-小钱1 小时前
跨站脚本攻击(XSS)原理及防护方案
前端·网络·xss
ss2731 小时前
【2025小年源码免费送】
前端·后端
Amy_cx1 小时前
npm install安装缓慢或卡住不动
前端·npm·node.js
gyeolhada1 小时前
计算机组成原理(计算机系统3)--实验八:处理器结构拓展实验
java·前端·数据库·嵌入式硬件
小彭努力中1 小时前
16.在Vue3中使用Echarts实现词云图
前端·javascript·vue.js·echarts
flying robot1 小时前
React的响应式
前端·javascript·react.js
禁默1 小时前
深入探讨Web应用开发:从前端到后端的全栈实践
前端
来一碗刘肉面1 小时前
Vue - ref( ) 和 reactive( ) 响应式数据的使用
前端·javascript·vue.js
guhy fighting2 小时前
原生toFixed的bug
前端·javascript·bug
上官熊猫3 小时前
nuxt3项目打包部署到服务器后配置端口号和开启https
前端·vue3·nuxt3