跳到主要内容

产生埋点

埋点对象的参数

  • 参数是信息承载: 埋点的业务意义,是需要很多业务参数的
  • 对象上的参数: 大部分参数,都是绑定或者说声明到对象上的
  • 再来回顾下前面这个图对象&参数

一切基于 VTree

  • 基石VTree: 所有的埋点,都基于虚拟树,虚拟树是基石
  • 曝光埋点: 资源/元素的曝光,是我们做数据分析很重要的埋点
  • 事件埋点: 比如用户的点击事件、页面的下拉刷新事件、歌曲的播放事件,等等,都是事件埋点
  • 埋点结构化: 有了虚拟树VTree,所有埋点都可以做到结构化,具备上下层级关系

VTree的产生

  • AOP: SDK内部做了很多AOP,监控UI的变化
  • 源源不断的构建VTree: 当UI变动的时候,构建出一颗虚拟树VTree

随着时间,会源源不断的生成新的VTree: 远远不断地生成VTree

曝光埋点

  • 之前曝光分为三类:
    • 页面的曝光: 云音乐底层hock方式, viewstart/viewend
    • 列表元素曝光: 列表曝光组件来做, impress/impressend
    • 其他UI元素的曝光: 业务方来自定义控制, impress/impressend
  • 统一:
    • 特征: 所见即曝光,不可见即曝光结束
    • SDK内基于先后两个VTree来做节点的曝光(包含 page element 的曝光开始和曝光结束)
    • 概要机制:
      • 先后生成 VTree1, VTree2 两棵虚拟树
      • 仅仅在 VTree1 中出现的节点,需要曝光结束
      • 仅仅在 VTree2 中出现的节点,需要曝光开始
    • 所见即曝光: 跟随UI元素的显示一样,被看见了,就曝光;消失了,就曝光结束

比如T1时刻生成的VTree: T1时刻的VTree

T2时刻生成的VTree: T2时刻的VTree

前后两棵树diff,生成曝光数据

上述两颗VTree的diff结果:

  • T1存在T2不存在的节点: 3, 4, 6, 7, 8, 11
  • T1不存在T2存在的节点: 20, 21, 22, 23

上面的diff结果,就是曝光埋点的结论

  • 曝光结束: 3, 4, 6, 7, 8, 11
  • 曝光开始: 20, 21, 22, 23

事件埋点

  • 发生在节点上: 事件埋点如果发生在对象上,则是该对象的事件埋点
  • 举例:
    • 歌曲收藏: 发生在收藏按钮上,那么收藏按钮锁关联的歌曲信息,以及该收藏按钮所在的页面 header 模块信息,以及当前页面的信息,均被记录在埋点日志中
    • 页面下拉刷新: 发生在页面上,那么就会有该页面的信息在埋点日志中

埋点格式预览(示例)

{
"_elist": [
{
"_oid": "【必选】元素的oid",
"_pos": "【可选】,业务方配置的位置信息",
"biz_param": "【按需】业务参数"
}
],
"_plist": [
{
"_oid": "【必选】page的oid",
"_pos": "【可选】,业务方配置的位置信息",
"_pgstep": "【必选】, 该page/子page曝光时的页面深度"
}
],
"_spm": "【必选】这里描述的是节点的“位置”信息,用来定位节点",
"_scm": "【必选】这里描述的是节点的“内容”信息,用来描述节点的内容",
"_sessid": "【必选】冷启动生成,会话id",
"_eventcode": "【必选】事件: _ec/_ev/_ed/_pv/_pd",
"_duration": "数字,毫秒单位"
}