前端监控是一个非常重要的话题,对于业务的发展意义重大,就像遍布在城市各处的探头,实时监测整座城市的运行状况,保证系统的稳定、高效运行。
前端监控,对于业务和团队的重要性,不言而喻,是前端领域绕不开的一个话题。最大的意义是能了解系统的运行状态,哪些地方还有优化的空间,让App和网站运行的更流畅,从技术的角度为业务赋能,获取到更多的潜在用户。
著名的 2-5-8 原则
主要包括 用户行为、程序异常、运行性能这三方面的内容。
本文更侧重于介绍 用户行为数据 和 运行指标的上报监控链路,程序异常的异常监控一般会采用业界的主流方案,比如sentry 这样的监控系统来辅助处理系统的错误异常。
监控的形式,主要分为两类:主动监控 和 被动监控。
一般监控系统,都是经过页面埋点
,数据上报
,后台存储
,汇总统计
,报警展示
,优化整改
等几个环节,每个环节都可以采用不同的方案来迎合业务的需求。
在页面埋点时,选择哪些指标十分重要,需要和业务方统一好口径。一个完善的监控系统,监控的指标要全面、细粒度、易于量化等。
以上的指标,可以借助浏览器给我们提供的performance API(window.performance
)来计算
const timing = performance.timing // DNS 解析耗时
timing.domainLookupEnd - timing.domainLookupStart // TCP 连接耗时
timing.connectEnd - timing.connectStart // SSL 安全连接耗时
timing.connectEnd - timing.secureConnectionStart // 网络请求耗时
timing.responseStart - timing.requestStart // 数据传输耗时
timing.responseEnd - timing.responseStart // DOM 解析耗时
timing.domInteractive - timing.responseEnd // 资源加载耗时
timing.loadEventStart - timing.domContentLoadedEventEnd /* 关键性能指标 */ // 首包时间
timing.responseStart - timing.domainLookupStart // 白屏时间
timing.responseStart - timing.navigationStart // 首次可交互时间
timing.domInteractive - timing.requestStart // HTML 加载完成时间, 即 DOM Ready 时间
timing.domContentLoadedEventEnd - timing.navigationStart // 页面完全加载时间
timing.loadEventStart - timing.navigationStart
谷歌认为之前的标准太复杂,指标太多了。Google 于 2020 年 5 年 5 日提出了新的使用者体验量化方式,推出 Web Vitals 是简化这个学习的曲线,大家只要观注 Web Vitals 指标表现即可。加载性能LCP,交互性FID,视觉稳定性CLS。只需要做好这三个,网站的性能基本上就可以了。
测量Web Vitals的工具有很多,比如Lighthouse,web-vitals,浏览器插件web vitals
UV(用户访问数)、PV(页面被访问次数)、用户的留存率、转化率等等一般和业务耦合比较深,没有通用的范式。在采集时,结合业务需要,在特定的地方埋点,选择统计的表达式。
此时的UV = 3,PV = 10
怎么留住老用户,吸引更多的新用户,将潜在的用户群体转化成业务的客户,是产品抉择过程要考虑的一个重要问题。这是通过监控系统,能拿到一手的数据,辅助产品的未来规划和决策。
页面买点主要有以下三种处理方式:
综合考虑,推荐采用动态埋点的方案,比较灵活,实现高效配置,不需要修改业务代码,只要在业务项目中引入基础SDK,实现无侵入式的前端监控。
推荐使用最后一种方案navigator.sendBeacon()
, 可用于通过 HTTP POST 将少量数据 异步 传输到 Web 服务器
navigator.sendBeacon(url); navigator.sendBeacon(url, data); // 页面隐藏时,上报数据
document.addEventListener("visibilitychange",
function logData() {
if (document.visibilityState === "hidden") {
navigator.sendBeacon("/log", analyticsData);
}
}
);
当用户代理成功把数据加入传输队列时,sendBeacon() 方法将会返回 true,否则返回 false
使用 sendBeacon() 方法会使用户代理在有机会时异步地向服务器发送数据,同时不会延迟页面的卸载或影响下一导航的载入性能,这意味着:
根据监控上报的数据,可以在管理平台利用BFF层做数据的二次加工,生成各种维度的数据,丰富统计类型,更好地指导业务。
在项目上线初期,数据波动比较大,需要在平台根据情况调整监控的埋点位置、阈值的参数、增加或删减一个埋点等
原理: 通过启动定时任务来读取配置表,根据不同的规则去读取es里面的数据(一分钟查询一次),如果有错误,则通知报警
报警通知的形式有:短信、邮件、平台消息、企业IM等,当某些监控指标出现异常时,需要通知到相关人员,及时处理。可以根据报警的级别,下发不同的通知形式。
举个例子:性能标准是首屏时间 1.5s,秒开率 90%,如果超出 10%,平台上会标红展示,并会发企业微信报警通知;如果超过 20%,会发邮件报警;如果超出 30%,会发短信报警通知。
提升前端的性能,涉及的面比较广,比如提升首屏的秒开率。可以通过一下方式
除此之外,还有白屏优化
、DNS优化
、支持HTTPS
、负载均衡
等优化措施
提升应用的市场率,一个综合且漫长的过程,是运营、产品、技术等共同协作的目标。
利用监控结果,来调整新的策略,综合施策,来适应应用场景,不断留住用户
整篇文章侧重于性能监控方面,关于用户行为监控可能更多的需要和产品经理探讨,根据监控数据改变业务策略,来不断提升用户的留存和转化。 性能监控,涉及的面比较广、链路比较长,针对前端开发要掌握常见的监控指标,理解监控的整个链路。