(1)性能
收集Native热冷启动、Web页面加载、静态资源、ajax接口等性能信息,指标有加载时间、http协议版本、响应体大小等,这是为业务整体质量提升提供数据支撑,解决慢查询问题等。
(2)错误
收集Native和js报错、静态资源加载错误、ajax接口加载错误,这些常规错误收集都很好理解。下面主要说明一下"业务接口错误(bussiness)":
客户端发送ajax请求后端业务接口,接口都会返回json数据结构,而其中一般都会有errorcode和message两个字段,errorcode为业务接口内部定义的状态码。正常的业务响应内部都会约定比如errorcode==0等,那如果不为0可能是一些异常问题或者可预见的异常问题,这种错误数据就是需要收集的。
由于不同团队或者接口可能约定都不一样,所以我们只会提供一个预设方法,预设方法会在ajax请求响应后调用,业务方自己根据约定和响应的json数据,在预设的方法中编写判断逻辑控制是否上报。像是下面这样:
errcodeReport(res) { if (Object.prototype.toString.call(res) === '[object Object]' && res.hasOwnProperty('errcode') && res.errcode !== 0) { return { isReport: true, errMsg: res.errmsg,code: res.errcode }; } return { isReport: false }; }(3)辅助信息
除了上面两类硬指标数据,我们还需要很多其它的信息,比如:用户的访问轨迹、用户点击行为、用户ID、设备版本、设备型号、UV/UA标识、traceId等等。很多时候我们要解决的问题并不是那么简单直接就能排查出来,甚至我们需要前端监控和其它系统在某些情况下能够关联上,所以这些软指标信息同样很重要。
数据收集之后,并不能直接录入到数据库之中,而是要经过一定的处理。下面聊聊数据录入的两个过程。
3.2 数据录入(1)SDK过滤
一些三方的业务接口和资源等,有一定请求量,甚至它们自己也会会常常报错。或者总有一些我们内部的接口我们并不想要做收集,这些数据收集起来会污染我们的数据视角,影响我们查看管理台数据。客户端SDK提供过滤配置,业务方可以根据具体业务过滤一些不需要收集的接口等。或者内置一些企业约定过滤的接口路径。
(2)服务端处理
SDK上报的数据,服务端也是需要经过二次处理再保存,例如为了查询方便对原始数据做拆分等。
当我们的数据已经录入到数据库以后,我们就可以对我们的数据应该分析和查询了。除了管理台基础的数据查询功能,我们也会提供图表和日报,来帮助我们满足不同的场景。
3.3.1 日报日报可以从已有的数据中,筛选出重点信息和分析后的内容,虽然平台就在那里,但是可能大家有时候真的不怎么关注。日报的汇报目标对象目前主要是开发和测试人员。
3.3.2 图表图表只是一种数据的展示形式,比如页面性能加载实时图表,实时错误图表。在大部分情况下,可能我们都不会一直关注着,但是比如上线新版本的时候,我们可以一直打开关注它的变化。图表是数据视角的一种补充。
经过前面3节,对前端监控系统的功能都大致介绍完了。第四节,我们主要分享一下在打造前端监控系统的过程中,我们遇到过哪些问题,我们是如何解决的。
四、问题发现与解决 4.1 自动化集成测试JS-SDK属于一个需要长期维护和更新的独立库,它被使用在很多业务项目中。随着代码量和特性的增加、人工测试成本变得越来越高,开发过程伴随强烈的不安全感,测试覆盖率低的可怕。于是从无到有,我们开始完善自动化集成测试。
我们的JS-SDK主要是加入探针监听业务项目的运行状态而收集信息,集成测试是我们关注的重点。我们的Web SDK运行环境依赖Web浏览器环境,而不能单纯的在node之中运行。目前我们有两种测试方式并存。
通过终端测试,可以帮助我们支持持续集成环境(代码提交仓库以后托管平台提供的环境中进行托管测试)。
通过浏览器测试,可以让代码运行在最真实的环境中,也可以做浏览器的兼容测试。
在管理台视角,我们是需要将数据进行聚合归类的,这是为了让我们更清晰的查看我们的监控数据。但是一些原因会对数据造成聚合影响。
(1) 动态路由有部分接口使用动态路由设置参数,如xxx.com/api/getuid/15501/detail。此类接口会导致根据url无法聚合同一个接口,因此SDK默认会把此类接口的动态参数部分替换为*。替换后上面的链接变成xxx.com/api/getuid/*/detail。