前端监控的一些设计思路-用户标识
前言
在使用 flogger3.0 及之前版本的时候(我之前编写的一款前端监控 sdk),我们往往通过 uid,ip 和 ua 去判断该日志是否属于某个用户,在使用过程中也遇到了很多的问题,例如:
用户未登录或者要查询用户登录前的日志时,只能通过 ua 和 ip 去判断,然而有些情况下即使两者全都一致也不一定是同一个用户。例如同一家公司的两个用户使用同一种浏览器访问(出口 ip 相同)。
另外如何统计 PV 和 UV 也是非常麻烦的事情。
PV 目前只能粗略地用性能日志数量去替代,对于服务端渲染的页面来说,不考虑日志丢失和来不及上报的情况,这两者可以勉强等同。但对于 SPA 的项目来说,如果我们要将前端路由跳转也记为一次 PV 就无法简单地用性能日志的数量去等同了。
UV 就更加难以统计了,除了登录用户携带 uid 外,未登录用户目前并没有唯一标识进行区分,用 ip+ua 也是无法准确进行统计。
另外虽然老版本也设计了 reqId 用来关联前后端日志,但使用率太低,平时几乎不会使用到,这次也需要重新设计。
正题
进入正题,在吸取了 flogger 之前的经验以及“偷窥”了部分 arms 源码之后,重新设计了一套字段用于覆盖以上各种复杂的情况,从而解决用户标识的问题。
主要设计以下字段:
- ip
- ua
- uid
- rid
- pid
- fpid
- sid
ip,ua 两个字段可以直接从服务端获取,无需客户端上报,uid 需要从客户端上报,其中 uid 还是主要判断用户身份的标识。
rid:相当于原来的 reqId,用于关联服务端请求。
pid
新增字段,用于标记页面唯一 id,与 rid 不同的之处在于新增了对于 SPA 页面的支持。当服务端输出 html 时,此时打开的第一个页面的 pid 与 rid 相同,当出现前端路由跳转时,如果需要统计一次 PV,则会随机生成一个新的 pid。
对应配置:enableSpa。当设置为 true 时,pid 会随着前端路由跳转变化,否则直接采用 rid。
后台通过统计 pid 的数量即可统计 PV。
fpid
设备指纹,也叫浏览器指纹。通过特殊算法计算后得到,保证每个浏览器的唯一性。用于区分当 IP 和 UA 都相同的用户。
对应配置:useFP。当设置为 true 时,对于未登录用户则会使用该值作为 uid。
sid
会话 id,存储在 session storage 当中,顾名思义标识用户的某个会话,能够串联起某个会话中的所有的事件。与 pid 和 rid 不同的是,用户页面跳转和刷新都不会改变 sid。
设计构想
rid 和 pid 以及如何计算 PV
当初设计时考虑将两者合并成一个,即由服务端渲染的 reqId 作为页面 id,如果服务端没有标识就不上报这个字段。
但在测试性能日志上报时发现,由于 FMP 和 onLoad 事件耗时较长,可能会出现长时间无法获取的情况,如果等待这两个事件完成后再上报,可能会丢失大量的数据,于是考虑先将能够直接获取的数据先行上报,其他的数据在获取完成后再分别上报补充,就能够最大程度地保证数据的完整性。
但随后也带来了另一个问题,一次页面访问会有多条性能日志上报,如何将这些性能日志关联到同一个页面访问行为中?
在已有的字段中,sid 是不可取的,因为页面刷新跳转都算作同一个 session。只有 pid 能够准确表达,但 pid 又完全依赖服务端渲染的 reqId,如果使用方没有或者不方便写入 reqId 时,能否让前端自行生成并计算 pid 呢?
前端 pid 生成规范
涉及相关配置:
配置项 | 说明 | 类型 | 必填/默认值 |
---|---|---|---|
enableSpa | 是否统计前端路由跳转 | Boolean | 默认值:false |
pid 生成逻辑:
如果服务端存在并写入了 reqId,直接将 reqId 初始化给 pid。
若 enableSpa 设置为 false,则 pid 不需要后续处理,保持与 rid 一致即可。后续前端页面跳转不会改变 pid 的值。
若 enableSpa 设置为 true,则在前端路由跳转时需重新生成一个新的 pid。可通过重写 pushState 和 replaceState 方法,若 url 发生改变则生成一个新的 pid。同时每个页面的 pid 需要通过 replaceState 方法写到 state 中,保证页面返回时能够获取到上一个页面的 pid,而不是重新生成一个。
(注意修改页面 state 一定要用 replaceState 方法,若直接给 state 赋值会在页面切换后丢失数据)
PV 统计
pid 按照上述规则生成后,后台只需要对所有日志通过 pid 进行去重就可以获得实际页面访问量了。
fpid 区分用户和统计 UV
在使用 flogger3.0 时,由遇到过同一家公司多个用户访问的情况,这些用户的来源 IP 和 UA 都一样,在追溯某个用户登录前的行为时就非常麻烦,只能通过访问行为进行反推,当日志量比较大的时候就无法准确判断。虽然有了 sid 之后也能一定程度上进行判断,但浏览器指纹能够更加准确地进行识别。
另外如何进行 UV 统计也是之前版本无法做到的,启用设备指纹之后,对于未登录的用户,可将 fpid 对 uid 进行赋值,通过 uid 去重可以估算出大概的 UV。