有奖捉虫:办公协同&微信生态&物联网文档专题 HOT

接入前端性能监控,小程序接入,正式环境需要将上报域名添加到安全域名中。安全域名要怎么添加?

Aegis SDK 使用 https://aegis.qq.com 进行数据上报,如果不希望使用 qq 域名,您也可以修改为 https://rumt-zh.com。您可登录 微信公众平台 > 开发管理 > 服务器域名,完成配置。







初始化 SDK 的时候传入的 UIN 是什么?

User Identification Number 用户唯一标识,简称 UIN,是 Aegis SDK 提供给业务侧填写的用户唯一标识,RUM 不进行校验 UIN 是否是一个真实标识,只把它作为查询日志的索引。开发中可以把业务提供的用户 ID 写入,也可以写入 open-id、uuid 等信息,只需方便您查询即可。

自定义测速耗时为什么仅支持 0 - 60000 之间的数据?

自定义测速的逻辑是用户上报任意数据,我们对用户数据进行求均值和中位数,并把它们作为展示的数据。由于无法判断服务端的脏数据,若产生少量脏数据,将会对用户实际数据产生非常大的影响。因此我们目前在服务端对用户数据进行了限制,目前只支持 0-60000 内的数据。

RUM 根据哪个字段来计算 UV ?

Aegis SDK 为每个用户独立生成一个 aid 作为用户(设备)的唯一标识,存储在浏览器的 localStorage,用于计算 UV。aid 不受登录状态影响,只有用户清理浏览器缓存 aid 才会更新。

RUM 为什么不根据用户 UIN 来计算 UV ?

如果当前用户没有登录,则没有 UIN 值,并且 UIN 值由开发者设置,可靠性比较低,也无法将用户登录前后的状态统一。

日志类型里面的接口请求日志是什么?

有两种情况用户会把接口请求信息发送服务端:
白名单用户将接口请求日志发送上来;
对于一般用户,如果发生 js 错误,我们会同步把错误发生之前的一些接口信息也发上来,用于帮助用户查找分析问题。
接口请求日志是用户接口的请求和返回内容。一般只有白名单用户才会上报接口请求日志,或者如果开发者在 sdk 里面开启全量接口上报,也会上报接口请求日志。

首屏时间(FirstScreenTiming)是怎么计算的?

监听页面打开 3s 内的首屏 DOM 变化,并认为 DOM 变化数量最多的那一刻为首屏框架渲染完成时间(SDK 初始化后 setTimeout 3s 收集首屏元素,由于 JS 是在单线程环境下执行,收集时间点可能大于 3s)。

性能里面的 DOM 解析 (DOM parse)时间是如何计算的?

PerformanceTiming 接口中的 domInteractive 到 domLoading 所消耗的时间。

RUM 采集数据时用的时间是客户侧(如浏览器)还是服务侧的。中间的延迟大概会有多久?

服务侧的,时间显示会比实际上报延迟 1s-2s,日志搜索可能有 1-2 分钟延迟。

接入前端性能监控后,没有数据是怎么回事?

可以从以下几个方向查找问题:
查看上报接口(rumt-zh.com 或者 aegis.qq.com)是否正常,正常返回200和204,如果有一些接口返回403可以看 技术排查相关问题
看日志查询里面页面访问和历史是否有数据,如果没有数据,有可能是上报延迟导致(1-2分钟)。
数据总览里面的数据是每整数小时计算一次,如果没有数据可以看下是否上个小时没有页面访问,或者新接入还没开始计算。
如果是页面性能没有数据,或者缺少数据,可以看下 network 中上报接口 performance 中 firstScreenTiming 的值,如果这个值为0或者大于15s,就会导致页面性能缺少数据。解决办法:把 SDK 初始化尽可能放在代码最前面,可以考虑用 CDN 并且在 head 中初始化代码,尤其对于一些 SSR 的页面,因为页面首屏时间较小,初始化 SDK 过晚会导致无法采集到页面首屏信息。注意目前只有 web 和小程序支持首屏算法。

接入前端性能监控后,如何查看当前项目上报量?

业务使用 RUM,可以在应用管理 > 业务系统或者应用管理 > 应用设置里面查看上报量。







接入前端性能监控后,日志中的“图片加载失败”、“JS 加载失败”、“CSS 加载失败” 问题如何处理?

首先自己访问一下这个资源是否存在异常情况。如果访问正常,但是日志里面还是有比较多的异常情况,再查看一下这些异常是否有聚集的情况,例如区域聚集、运营商聚集等。如果没有发现有聚集的情况,可能是因为用户的网络问题导致资源加载异常,可以尝试项目中接入 PWA 或者离线包来减少这类情况。本质上,前端没有办法完全避免这种情况。

为什么接入 Aegis 后没有首屏数据?为什么上报接口中首屏数据 firstScreenTiming 为0?为什么页面性能数据那么少?为什么首屏数据那么大?

Aegis sdk 根据 DOM 变化记录首屏,如果 SDK 引入较晚,或者初始化较晚,可能会出现无法获取首屏的情况。当出现这种情况时,建议可以试着把 SDK 引入和初始化放在更前面,例如 head 里,然后再观察一下数据。尤其针对服务端直出的项目(SSR),页面加载完成即首屏完成,如果 Aegis sdk 初始化较晚,就会上报一个首屏时间 firstScreenTiming 为 0 的数据,该数据不是有效数据,因此不参与计算,导致样本量减少;而少数有值的数据上报,综合计算又导致整体首屏值计算偏高。



除此之外,少数非常大的首屏值(异常用户)也会影响平均值,用户可以看下中位数的值是否正常。

为什么页面上报了很多重复数据,例如页面切换时重复上报多个pv?

可能是重复初始化了多个 Aegis 的实例,建议检查业务逻辑。

对于 SSR 页面,接入 Aegis SDK 需要注意哪些问题?

1. aegis-web-sdk 只能运行在浏览器环境,所以记得在服务端不要执行初始化操作。
2. SSR 页面初始化完成较早,所以如果把 aegis-sdk 初始化放在比较靠后的地方(body 里面或者最后)可能会导致 SDK 无法获取到页面首屏的情况。建议 SSR 页面使用 script 标签引入 Aegis SDK,并且放在 head 中初始化,解决上述两个问题。

日志搜索为什么没办法搜模糊匹配?

例如页面地址为 https://test.abcdefg.qq.com/,希望通过 from:test.*.com 对这个页面进行搜索,结果发现没办法搜到数据。
建议用户修改搜索关键词,使用多个关键词进行搜索,例如 from: "test" AND from “腾讯网

为什么接口错误率上报失败率接近100%,但实际接口返回正确?

正常情况下,是由于业务或者第三方框架手动调用 xhr.abort() 导致的。此时 aegis 会获取到 xhr.readyState=0,并且 xhr.status=0,此时会认为接口请求失败。需要重点排查下业务或者第三方框架(特别是 angular),重点搜索下 abort。

前端监控统计到 cdn 资源失败,但是实际自己访问没有出现问题,可能是什么原因导致的?

首先看下对应 cdn 的成功率是多少,如果这个 cdn 大概率都是成功的,可能是因为前端访问这个资源时超时、abort 等因素导致的,一般情况可以忽略。
如果 cdn 整体成功率不高,可能就是 cdn 确实有问题了,您可以从以下几个方面去查:
本地访问这个 cdn 是否有问题,如果有问题,找具体人排查。
看下区域分布是否有问题,可以看前端监控的数据,也可以到 腾讯云诊断服务平台 去查一下这个资源。
同样可以看下运营商分布,也可能出现局部运营商把 cdn 封禁的情况。

为什么不能看某个具体用户的性能数据,例如接口耗时、静态资源耗时、首屏耗时等数据的原始数据?

对于性能类的数据,我们只保留了计算后的数据,例如平均值、错误率、中位数、90分位数等,所以无法根据用户信息进行查找。如果用户对此有诉求,可以用以下几个方式进行查询:
1. 开启全量接口耗时上报,具体参考 api.reportRequest
2. 如果业务数据量比较少,可以把用户信息写到 ext 中,然后通过 ext 进行查询。
3. 可以在 beforeRequest 中把性能数据,例如接口耗时、静态资源耗时等信息通过 aegis.infoAll 上报到历史日志中,然后去历史日志中进行查询。

在日志里面的 js 错误日志里面看到一些莫名其妙的错误,代码里面找不到相关的问题,可能是哪些原因导致的?

有些用户在历史日志中,发现了一些奇怪的报错,本地不会复现,并且搜源码也没搜到相关的问题。这种情况大概率由于用户侧执行的代码跟开发者执行的代码不一致导致的。



可以从两个方面排查这类问题。首先,如果报错的用户比较集中(可以根据 aid、IP 等信息来看),可能是由于用户浏览器插件导致的。如果用户有某些聚类特征,例如主要集中在某个地区、某个运营商等,也有可能是 cdn 劫持导致的。
如果是 cdn 劫持,开发者可以通过使用 sri 等方案来解决。
如果是浏览器插件导致的,其实对整个业务没什么影响,可忽略。如果不希望出现在报错信息中,也可以通过 beforeRequest 钩子函数进行屏蔽,具体参考 处理方法
如果用户页面运行在某些终端中,或者小程序中,也有可能终端或者小程序注入代码导致 js 报错,如常见的“ReferenceError: Can't find variable: WeixinJSBridge”

我开启了 SPA 参数,但是页面之间跳转的时候,为什么没有上报页面性能呢?

SPA 页面之间的跳转,本质上只是一段 js 代码的执行,首屏探测的是从用户浏览器发起请求到页面可见元素渲染完成的时间,因此,没有办法计算首屏。

抽样是如何抽的?

目前抽样分为服务端抽样和客户端抽样,客户端抽样通过参数 random 来控制。
new Aegis({
id: 'pGaaFTC******VTKBe',
random: 0.5 // random 0~1
});
无论服务端抽样还是客户端抽样,都是基于用户级别的抽样(即如果一个用户命中黑名单,所有 aegis 上报接口都不会上报)
注意:
如果同时设置服务端抽样和用户抽样,则实际抽样率为:客户端抽样率 * 服务端抽样率。
白名单用户不受抽样率影响。
服务端抽样通过 whitelist 接口下发抽样率控制,实际上报量会比设置的抽样率高,因为有些接口在 whitelist 接口返回之前就上报了。
RUM 中可以设置精准的服务端采样。

为什么使用 aegis-first-screen-timing 标记后的元素不是最终 aegis.firstScreenInfo 里面的元素?

aegis.firstScreenInfo 默认为关闭状态,如果需要该值,需要主动开启。
new Aegis({
id: '',
pagePerformance: {
firstScreenInfo: true,
}
})
因为标记的元素有可能是跟其父元素同时被 MutationObserver 收集进来的,这时候 aegis.firstScreenInfo 里面的 element 和 markDoms 对应的是标记元素的父元素。
如果 aegis.firstScreenInfo 为 undefined,需要注意设置 aegis-first-screen-timing 的元素必须得有宽高,同时 window.innerWidth、window.innerHeight 也得有值。
1. 可以尝试把 aegis 使用 cdn 的方式引入,并且在 head 中进行初始化,看下是否初始化太晚导致的。
2. 在渲染后的 html 中看下 dom 中标记的元素是否存在,标记的自定义属性是否存在,有些构建工具会自动删除这类自定义属性。

第三方 SDK、插件、组件内部可以使用 Aegis SDK 吗?

不建议这样使用,因为我们的 SDK 是由 for 页面设计,默认采集页面的 pv、错误、全局的接口信息等,如果您在自己的 SDK 内部使用了 Aegis SDK,会导致页面数据重复采集、xhr 重复劫持等问题。而且 Aegis SDK 默认采集数据上报,用户页面并没有授权第三方的 SDK 采集其他页面的数据,因此可能还存在合规的问题。

上报数据中的 eval 为什么会变成 evaI?

js 里面 eval 是一个敏感操作,之前会被腾讯的网关屏蔽报错,所以被改成了 evaI。




小程序上报的 referer 的值如何理解?

小程序的 referer 指的是小程序的场景值,具体值可以参考 小程序文档

小程序 SDK 初始化之后报错 “unexpected loadSdkSubPackage”。

可点击 此处 参考解决。“更新微信开发工具 or 在【详情】里的【本地设置】勾选【启用独立域进行调试】”

上报统计的接口耗时跟浏览器中 network 中接口耗时不一致可能是什么原因导致的?

Aegis SDK 中默认采用劫持 xhr 和 fetch 请求的方式统计接口耗时,即在接口请求之前打一个点,接口请求之后打一个点,然后计算这两个点之间的时间差值,为接口耗时。这样统计接口耗时可能跟 network 中接口真实耗时有所不同,可能看起来明显大于真实接口耗时。主要有以下几个原因导致:
浏览器有请求并发限制,js代码把请求事件发送给浏览器之后,浏览器并不是立即执行的,而且把所有接口排队然后执行,如果接口使用 http/1.x 协议并且进入到浏览器并发限制,就会导致这个问题。因为我们统计的是 js 的耗时,浏览器阻塞时间会默认加上,导致统计时间大于真实接口耗时。
js 打点的方式也会遇到单线程阻塞的问题,两次记时的代码并非真实时间,而且两次时间循环的时间,就像遇到的 setTimeout 和 setInterval 的问题一样。
解决方案:
可以开启 api.usePerformanceTiming 参数。开启后,Aegis SDK 会从 performance 中重新获取接口耗时,让接口耗时统计更为准确。需要注意的是,开启该参数的前提是用户业务接口请求 url 是独立且唯一的,用户可以在接口请求 url 中添加时间戳等方式来保证 url 唯一性。如果 url 不唯一,可能导致同 url 接口耗时获取错误,业务本身无重复 url 的情况则可以直接开启。

数据总览里面的首屏耗时或者请求耗时为什么与详情页面里面查到的数据不一致?




数据总览里面的值,是通过定时任务计算出来的,每个小时计算一次,如果选了多个小时,相当于多个小时的计算平均值的平均值。
数据详情里面的值,是真实的平均值,所以这两个略有区别。

Aegis SDK 中是否有限制日志长度?

Aegis SDK 中有限制每条日志最大长度为 100k,超过时日志会被截断。同时,数据上报的接入层也有限制单条日志最大长度为100k,并且网关有限流每次上报数据不能超过 500k。

首屏数据能把 url 后面的 query 参数带上吗?




RUM 对于性能数据的页面地址,只取了 path,不取 query ,核心是为了降低 query 对数据聚合的影响。但是有些用户的页面核心信息是写在 query 里面的,导致无法区分不同页面的性能。对此,我们提供了一个钩子函数来修改上报性能数据的地址。



只需要在 urlHandler 中修改返回值就行,该返回值就是上报页面性能数据中页面地址的值。注意修改的时候,可以把需要的 query 关键词放在 path 里面,例如原 url 是 https://a.qq.com/?name=tick,可以改成 a.qq.com_tick

webvitals 里面统计的 FCP 和 LCP 是否包含了浏览器滚动条滚动后页面的渲染?如果用户有操作,例如 spa 页面跳转、页面重新渲染,时间是否有影响?

webvitals 中的数据是从浏览器 API 中获取的,所以这部分实现对于我们来说是黑盒的,但是我们也可以根据官方给出的描述和自己实验给出结论。
首先拿 LCP 来说,看官方的定义:
Largest Contentful Paint is the metric that measures the time a website takes to show the user the largest content on the screen, complete and ready for interaction. Google defines that this metric considers only the content above the page's fold, meaning everything that appears without scrolling.
所以可以明显看出来,页面滚动后的内容渲染显然不属于 LCP 的计算范围内。那页面渲染的时候有一些浏览器操作是否有影响呢?我们用 Chrome 浏览器放慢网速,模拟了一些操作,发现也是没有计算在内的。
再重新理解这个定义,可以看到 “complete and ready for interaction” 应该表示的是在浏览器可交互之前,所以 LCP 应该是指用户打开页面后,在浏览器完成可交互之前,并且在浏览器没有发生滚动的时候,页面最大元素渲染完成时间。

Aegis SDK 采集到错误 Failed to execute 'transaction' on 'IDBDatabase' 如何解决?

Aegis SDK 中,如果开启了离线日志,会将用户日志写到 indexedDB 中,如果浏览器 indexedDB 满容或者支持性有问题,就会报这个错误,目前对用户侧无影响。由于离线日志已经下线,建议用户升级 SDK,或者关闭离线日志(删除初始化中 offlineLog: true 这行代码)。

Aegis SDK 可以自动捕获 console.error 的错误吗?

不能,因为可能导致重复重写的问题,例如用户自己已经重写过 console.error 了,捕获后进行上报;如果用户对这个逻辑不了解,可能会导致一些敏感数据上报,因此 Aegis SDK 默认没有捕获 console.error 中抛出的日志。用户有需求的话可以自行重写,并且使用 aegis.report 或者 aegis.error 进行上报。