应用埋点方案

Dee_Das 关注
0.1 2016.10.02 17:38* 字数 2483 阅读 13951评论 8喜欢 53

前言

近期,应PM要求,对应用的埋点方案进行了调研,特在此写个博客记录分享一下。

需求分析

首先我们需要清楚埋点的实际需求是什么?对于一个产品来讲埋点无非就是想了解用户的使用习惯和产品的使用情况,从而从客户和产品的角度去了解客户群体,及其对产品的一些使用想法。本文将着重关注数据的收集而非数据分析。

数据处理

在这里,我们需要明确的一点是,数据处理的整个过程中,数据的收集是重中之重,它将是我们进行数据的分析的大前提,因为采集的数据会直接影响到最后的分析结果。

数据处理.png

因此,数据采集应具备以下几点特性:

多元性
采集过程应从不同的维度去获取数据。比如我们要采集用户相关的部分数据。那么我们可以从身高、体重、兴趣爱好等各个层次、多维度的去采集对应数据。这样的数据还原出来的用户对像才更有活性,对于今后的数据分析、包括描绘用户画像也更为有利。

准确性
准确性包含两个层次的要求:1.数据采集过程的准确性:对于特定的流程分析,我们的埋点方案要具备一定的针对性,避免无关因素的干扰。2.数据的客观性。我们不能代替客户,我们能做的只是观察并记录,臆想的数据对于我们毫无价值。

时效性
对于采集的数据,它只能反映过去的某个时刻或者某段时间的客观情况。得到的结果和结论也只能是对应过去的某个时间段而言。可能是受制于当时的网络情况、社会环境等因素的影响,才会呈现出这样的结果。所以我们在采集数据的同时最好能给它打上时间标签,方便今后的数据对比。


ok,接下里进入正题--埋点

什么是埋点?

简单的说,埋点就是定时、定点的数据采集,然后上报。
举个简单的🌰

代码埋点.png

如图,比如我们在到达页面A的时候,进行数据采集和上报,告诉服务器我是谁?我在哪里?我干了些什么?而后进入页面B,进行相同的操作,以此类推。最后后台可以根据得到的数据还原用户的各种行为,最终将这些数据呈现出来,方便运营等进行分析操作。(技术上讲,这里实际上还包含数据存储和传输等问题,不同的埋点方案的处理方式都不尽相同,这里就不做过多的阐述了。)


埋点方案一:代码埋点

代码埋点是很多人一开始就会想到的方案,也是目前最为人所知的一种方案。包括友盟在内的一些服务商目前都在使用这种方案。实现方式相信大家一看就明白,就是在需要数据采集的地方抓取数据,然后上传。

要指出的是,这里的数据采集往往会以事件的方式进行。事件包含事件名称、事件参数等,简单的点击事件统计(比如统计点击事件)仅需事件名称即可,如果想抓住事件内部的一些数据的话,比如电商领域的一些交易统计,就会在用户点击提交购买按钮的时候在事件参数里传递总价等数值。在开发文档里,后者通常会被称为自定义事件,这也是代码埋点最具灵活性的地方。

这种方案的优点在于它的准确性和针对性。指哪打哪,不浪费一发子弹。如果项目较小或者还只是在项目初期,这种方案还算可以接受,但是如果在较大的项目项目或者处于开发后期的项目来做,对于程序员来讲无疑是身心上的摧残。一方面工作量太大,这种特定的页面的数据采集方案(PM:什么?不知道埋哪里?那就都埋了吧!)能偷懒的地方都没有;另一方面,这种方案对代码的入侵性太大,很可能导致代码高耦合,并且这种方式采集的数据维度往往会太过单一。如果今后想从更高的层面或者其他角度去分析,很有可能需要重新埋点和发布版本。


做不做?!.png

埋点方案二:可视化埋点

代码埋点将核心代码和配置资源进行了分离。在每次启动的时候都会有去请求最新的埋点配置,他在一定程度上降低了代码埋点的门槛,只要客户端集成之后,PM在web上就可以进行操作(让PM自己玩去吧╮(╯▽╰)╭)

那么它是如何实现的呢?


可视化埋点.png

如图,简单来说,客户端集成SDK之后,在用户使用的过程中会定时截图,同时获取应用视图的层级关系,传到服务端。服务端会重新渲染页面,并判断控件是否可以埋点,然后关联对应的埋点事件,最后将配置信息传回客户端。

这种方式从某种程度上大大提升了应用的埋点灵活性,使用方便。当然它也有一定的局限性,比如埋点的内容有限,不能像代码埋点一样采用自定义事件,所以对于较为深入的行为分析要求,这种方案不能很好的实现。

埋点方案三:无埋点

无埋点的的技术方案,早在2013年就已提出了。它在客户端集成之后,会主动的尽可能多的收集数据,甚至连要在那里埋点的问题都省略了,我们不用去设置配置文件,如果我们想要特定的数据直接去查询即可(这就是为什么叫无埋点)。

与可视化埋点相比,无埋点主要解决的是数据的回溯问题。比如,我们想要得到某个页面的访问数量,如果是可视化埋点,就需要去配置一下埋点方案,然后发布,一段时间之后才会得到对应的数据。我们无法获取到发布之前的某个时间内的访问情况。也就是说所有想得到的数据只有在配置文件发布之后才能看到。对于无埋点方案来讲,这些数据的采集早在SDK集成的时候就开始了。某天突然想要看下,查询下就可以看到了。当然,它的缺点也是显而易见的,采集的数据越多,对于数据传输和存储的要求就会越高。

其实,有时候对于某些检测行为,我们并非一定要在客户端做。考虑到数据处理过程中的传输和存储问题(本地数据存储),在服务端进行埋点和分析会显得事半功倍。


淘宝SPM解读

一、提出问题

查看淘宝网页的源代码会经常看到

http://detail.tmall.com/item.htm?id=3716461318&&spm=2014.123456789.1.2 

这类代码,发现这是淘宝提供的SPM是淘宝社区电商业务(xTao)为外部合作伙伴(外站)提供的一套跟踪引导成交效果数据的解决方案。仔细看了一下文档,简直就是一种跟踪利器。

二、SPM名词解释

SPM编码:用来跟踪页面模块位置的编码,标准spm编码由4段组成,采用a.b.c.d的格式(建议全部使用数字),其中,

  • a代表站点类型,对于xTao合作伙伴(外站),a为固定值,a=2014
  • b代表外站ID(即外站所使用的TOP appkey),比如您的站点使用的TOP appkey=123456789,则b=123456789
  • c代表b站点上的频道ID,比如是外站某个团购频道,某个逛街频道,某个试用频道 等
  • d代表c频道上的页面ID,比如是某个团购详情页,某个宝贝详情页,某个试用详情页 等

 

完整的SPM四位编码能标识出某网站中某一个频道的某一个具体页面。

比如xTao合作伙伴(a=2014)中某个外站appkey为123456789(b=123456789),频道ID为1(c=1),页面ID为2(d=2),那么spm=2014.123456789.1.2,就唯一标识外站123456789的频道1上的页面2,从这个页面点击出去的链接,后面都应该携带spm=2014.123456789.1.2的参数串。这样,通过这个编码,我们就能唯一的定位到一个url是由外站中哪个具体页面点击生成的。

注意:spm的四位总长度32位,并且不支持%、&等特殊字符,请尽量使用英文以及数字


SPM的应用场景

因为spm编码本身是有层次的,因此,我们可以:

  • 单独统计spm的a部分,我们可以知道某一类站点的访问和点击情况,以及后续引导和成交情况。
  • 单独统计spm的a.b部分,我们可以用来评估某一个站点的访问和点击效果,以及后续引导和成交情况。
  • 单独统计spm的a.b.c部分,我们可以用来评估某一个站点上某一频道的访问和点击效果,以及后续引导和成交情况。
  • 单独统计spm的a.b.c.d部分,我们可以用来评估某一个频道上某一具体页面的点击效果,以及后续引导和成交情况。

四、SPM的效果指标和数据查看

基于SPM可以得到的效果统计指标:

  • PV:通过指定spm编码引导到宝贝详情页面的PV
  • UV:通过指定spm编码引导到宝贝详情页面的UV
  • 支付宝成交人数:通过指定spm编码引导到宝贝详情页面的用户当天对同店商品的支付宝成交人数
  • 支付宝成交笔数:通过指定spm编码引导到宝贝详情页面的用户当天对同店商品的支付宝成交笔数
  • 支付宝成交金额:通过指定spm编码引导到宝贝详情页面的用户当天对同店商品的支付宝成交金额
  • 客单价=支付宝成交金额/支付宝成交人数,代表通过指定spm编码引导过来的购买用户的消费能力
  • 转化率=支付宝成交人数/UV,代表通过指定spm编码引导的用户最终转化为购买用户的比率

SPM 超级位置模型

版权声明:本文为「简简单单 Online zuozuo」原创文章,非商业用途欢迎转载,请保持署名,注明出处! Java 交流QQ 群:172083832 ,欢迎大家加入! https://blog.csdn.net/qq_15071263/article/details/81015996

SPM 超级位置模型


1.SPM 的定义

SPM (super position model 超级位置模型)
与Google Analytics在URL里面拼上utm_source, utm_medium等参数大同小异,主要是用来定位。

2.SPM需要解决的问题

  1. 统计页面的PV
  2. 追踪页面来源
  3. 记录来源页面的触发链接

SPM是受到土地户籍制度启发而设计的位置系统

3.优势和作用

统计投放效果

如一个双11的广告页需要投放到微博、知乎和优酷等渠道,只需要为每个渠道指定一个编码,后续可以统计每个渠道的投放效果,事后按流量计费进行费用结算。

分析用户行为

假设现在有一个淘宝女装的专题页,为了进行活动引流,会在淘宝首页多处区块放置引流入口,怎么统计各个入口进行淘宝女装专题的量呢,以便后续进行优化提高入口曝光度? 一种常见的思路是每个入口进行布点,当用户进行点击时,同时向日志服务器发送一条埋点日志。但是这个方案有天然的弊端:
1、在页面跳转时,埋点日志请求可能会丢失
2、日志请求过多。 SPM通过指定编码解决了这个问题,只需要进入页面的时发送一次埋点日志请求即可。

分析链路转化

如新用户的注册过程中,往往包含多个步骤,输入账号,验证手机,设置密码和上传头像等等,这么长的链路过程中,任何一个产品或者技术优化,都可能直接作用到用户的流失率,为了直观的看到这个效果,一般会采用漏斗图。而SPM的采集数据包括了精细化的来源数据,可以做出丰富的漏斗图出来分析链路转化率问题。

4.阿里云SPM的格式

// spm=spmA.spmB.spmC.spmD.spmE    
spmA 唯一标识一个站点 
spmB 唯一标识某站点的一个页面
spmC 唯一标识某页面的一个区块
spmD 唯一标识某区块的一个具体位置
spmE 随机生成的字串,跟时间有关系,在循环页面计算时可以区分点击的时序

// 淘宝也有SPM,SCM,可以自行百度
// 利用SPM可以精准分析网站的流量,【甚至可以高度复现用户操作,但是意义不大】
// 通过对网站流量的分析,可以进行资源的估值和定价,进行分层管理和运营,资源展现的竞价和排期【百度竞价,天猫直通车等】
// 然后对竞价,排期,效果进行再分析,重新作用到前面的流程上,得到更精确的资源估值和定价,提高收益。

参考资料
页面资源位监测和价值分析

淘宝SPM流量跟踪体系的研究

30 sec read

一、什么是SPM

SPM是淘宝社区电商业务(xTao)为外部合作伙伴(外站)提供的一套跟踪引导成交效果数据的解决方案。下面是一个跟踪点击到宝贝详情页的引导成交效果数据的SPM示例:http://detail.tmall.com/item.htm?id=3716461318&&spm=2014.123456789.1.2  其中spm=2014.123456789.1.2 便是下文所说的SPM编码。
SPM编码:用来跟踪页面模块位置的编码,标准spm编码由4段组成,采用a.b.c.d的格式(建议全部使用数字),其中,
  • a代表站点类型,对于xTao合作伙伴(外站),a为固定值,a=2014
  • b代表外站ID(即外站所使用的TOP appkey),比如您的站点使用的TOP appkey=123456789,则b=123456789
  • c代表b站点上的频道ID,比如是外站某个团购频道,某个逛街频道,某个试用频道 等
  • d代表c频道上的页面ID,比如是某个团购详情页,某个宝贝详情页,某个试用详情页 等
如果是站内,则SPM编码会有第五个参数,具体为:
  • a:网站ID,每一个单独的网站(域名),分配唯一的ID,如www.taobao.com的aID为1,list.taobao.com的aID为a217f,item.taobao.com的aID为a217v,tmall是3,聚划算是608,搜索是a230r
  • b:网页ID,为同一个网站下每一个网页,分配唯一的ID,页面A ID为7274553,页面BID为7289245
  • c:频道ID,为网站中不同区域划分频道,每个频道分配唯一ID,
  • d:产品ID,为每个频道内的每个独立产品,分配唯一ID
  • e:同一个链接请求,为每次请求分配一个随机特征码,保证每次点击spm值的唯一性。
注意:spm的四位总长度32位,并且不支持%、&等特殊字符,请尽量使用英文以及数字
SPM的应用场景因为spm编码本身是有层次的,因此,我们可以:
  • 单独统计spm的a部分,我们可以知道某一类站点的访问和点击情况,以及后续引导和成交情况。
  • 单独统计spm的a.b部分,我们可以用来评估某一个站点的访问和点击效果,以及后续引导和成交情况。
  • 单独统计spm的a.b.c部分,我们可以用来评估某一个站点上某一频道的访问和点击效果,以及后续引导和成交情况。
  • 单独统计spm的a.b.c.d部分,我们可以用来评估某一个频道上某一具体页面的点击效果,以及后续引导和成交情况。
SPM的效果指标和数据查看基于SPM可以得到的效果统计指标:
  • PV:通过指定spm编码引导到宝贝详情页面的PV
  • UV:通过指定spm编码引导到宝贝详情页面的UV
  • 支付宝成交人数:通过指定spm编码引导到宝贝详情页面的用户当天对同店商品的支付宝成交人数
  • 支付宝成交笔数:通过指定spm编码引导到宝贝详情页面的用户当天对同店商品的支付宝成交笔数
  • 支付宝成交金额:通过指定spm编码引导到宝贝详情页面的用户当天对同店商品的支付宝成交金额
  • 客单价=支付宝成交金额/支付宝成交人数,代表通过指定spm编码引导过来的购买用户的消费能力
  • 转化率=支付宝成交人数/UV,代表通过指定spm编码引导的用户最终转化为购买用户的比率
除此之外,还有许多其他参数,分别代表其他含义或者适用于其他业务统计需求。如pos代表的是位置,另外一个比较重要的参数为:scm=1003.632.1102.1
  • 1003:投放系统ID,比如1003标识阿拉丁投放系统
  • 632:算法ID,标识投放的具体算法
  • 1102:标识投放算法的版本信息
  • 1:标示投放针对的具体投放人群分类等信息
类似的跟踪方式还有凡客的体系,凡客与淘宝最主要的区别是跟踪参数ref的参数一直有继承,即是下一个点击会继承上一个点击产生ref,目前是继承到10级,然后就开始从原始的减少,一直保持10级。具体如下:
http://item.vancl.com/2810450.html#ref=hp-hp-yc-1_1-v:n|hp-hp-head-logo-v:n|s-s-c_rs_28806-1_3-6373505_Sort01_qb_000-v|hp-hp-classman-3_2-v:n
二、SPM体系有何作用
流量实现精准定位
  • 流量可以标识到频道、页面、区块、位置任意层级
  • 资源位的稳定唯一标识意味着效果可持续跟踪
  • 位置和内容的分离标识,将土地和庄稼分开评估
运算资源消耗降低
  • 通过编码的配置圈定多样的流量业务归属
  • CPU运算资源的大幅度减低
建立效果评估体系
  • 流量资源价值的统一评估标准
  • 建立以资源位为中心的数据体系和运营体系
流量运营的宏观调控+市场经济时代
  • 资源位估值和定价
  • 资源位的分层管理和运营
  • 资源位商业化通道和流动机制
  • 资源位竞价和排期
三、如何搭建SPM体系
  • 流程约定 — 通过侵入页面发布流程,规范打点过程
  • 工具支持 — 提供低成本进行流量资源布点工具集
  • 技术保障 — 用户点击链接时,由全局js生成标识编码,有效避免标识重复和疏漏

SPM

参考资料:页TBI-梵易-页面资源位监测和价值分析(PPT)

DataWorks数据埋点的设计及未来发展的思考

陶太郎 2017-11-01 15:40:20 浏览2529 评论1

摘要: 什么是前端埋点?         马总曾经说过现在是DT时代(大数据的时代)。        数据已经成为一家公司最宝贵的财富,越来越多的互联网公司开始重视数据的应用。数据应用的过程是:数据收集 -> 数据整理(数据同步)-> 数据分析 -> 数据可视化。

什么是前端埋点?

        马总曾经说过现在是DT时代(大数据的时代)。
        数据已经成为一家公司最宝贵的财富,越来越多的互联网公司开始重视数据的应用。数据应用的过程是:数据收集 -> 数据整理(数据同步)-> 数据分析 -> 数据可视化。
        前端埋点是用户行为数据采集领域非常重要的手段,指的是针对特定用户行为或事件进行捕获、处理和发送的相关技术及其实施过程。
        当然前端埋点上报也不仅仅有用户行为数据的采集,还有一个很重要的领域——前端健康度分析。包括采集页面加载性能,js报错收集,接口出错上报,自定义测速等等。

为什么要进行前端埋点

        埋点可以帮助分析人员获取真正需要的业务数据及其附带信息,对产品发展、业务决策和指导运营有非常重要的作用。
        在不同场景下,业务人员关注的信息和角度可能不同。典型的应用场景如淘宝活动运营,以及PD和UED。前者注重来源渠道和广告效果,而后两者更在意产品本身流程和体验的优化。这就需要通过埋点采集到对应的数据,以数据为依据来做决策和判断。
        打个比方,城市要提高一个路口的通过率,那必须要重新调整交通信号灯的逻辑。光看是不行的,我们需要同时拿到路口各个时间段和各个方向的车辆流动量,这就需要在相应的节点上安装摄像头和交通流量计数器。埋点同理。

DataWorks的产品和埋点需求

        DataWorks是阿里集团内最大最优秀的一站式大数据平台,整合了大数据设计和开发、运维监控、数据集成、数据管理,数据安全,数据质量等产品,并打通算法平台pai,形成了完整的大数据闭环。

需求背景

        目前整个DataWorks所有前端产品缺少一个统一化的埋点方案,导致产品和UED无法准确地拿到用户数据来辅助决策。
        鉴于此背景,我们在为DataWorks做埋点和数据上报的时候,遇到了不小的挑战。

需要上报的数据

  • UV/PV(支持单页应用)
  • 所有按钮链接的点击事件
  • 导航点击事件
  • 表格筛选表单的使用情况
  • 操作系统和浏览器信息
  • 前端性能数据
  • 前端报错记录
  • 接口返回时间
  • 接口报错信息,包含errorCode,requestId等

碰到的问题

  1. 首先,DataWorks是一个数据平台,包含产品15+,涉及到的页面将近50个,如果使用传统埋点方式,工作量巨大。
  2. 因为历史遗留问题,产品的前端技术栈不统一,有jquery、requirejs、react、angular1.x,还有一些自研的前端框架,导致无法使用统一的埋点规则进行数据采集上报。
  3. DataWorks的很多产品都是复杂的单页应用,而且需求交互迭代特别频繁,对用户行为数据埋点上报的拓展性和灵活性有非常高的要求。

其他业务需求

  1. 业务上对用户的角色、BU等信息进行分析有需求,所以在上报的数据中需要带上当前用户信息及一些产品自定义的信息。
  2. 能够有一个地方可以看到所有产品的PV/UV,及在线时长,流失率等指标。
  3. 针对定制化的需求,能够方便地对上报的数据进行抽取分析,并输出报表。
  4. 能够支持专有云的埋点上报。

埋点设计

设计原则

  1. 能够支持基础的PV/UV以及前端健康度的上报,也可以支持用户自定义上报。
  2. 尽量做到无痕,或者尽可能少的代码改动。降低接入埋点的工作量。
  3. 能够提供快速的数据抽取分析的方法。
  4. 可以让开发者针对不同的产品,在每次数据采集的时候,传入自定义数据。例如,用户信息,项目信息等。
  5. 默认全部记录,可设置抽样上报,并提供开关,关闭埋点功能。
  6. 统一入口,比如在公共头里统一接入埋点,再对外暴露方法,让各个产品设置自己的埋点配置。

技术选型

集团内比较成熟的两个方案:

  • aplus:可以进行采集用户的PV/UV,并统计页面的在线时长,流失率等指标,而且提供了页面可视化展示各项数据。
  • retcode:更专注于对前端健康度的监控和报警,并提供了灵活的自定义上报接口。另外retcode的源日志数据比较开放,更方便做后续的数据分析。

        针对DataWorks的数据上报需求,我们决定使用retcode进行主要的数据上报,aplus也会默认接入(阿里的Nginx会默认在页面中插入aplus的js)。

        但在埋点需求中有一项aplus和retcode都无法实现,就是“所有按钮链接的点击事件”。这个需求就需要使用到“无痕埋点”(在“无痕埋点”的场景下,数据监测工具一般倾向于在监测时捕获和发送尽可能多的事件和信息,而在数据处理后端进行触发条件匹配和统计计算等工作,以较好地支持关注点变更和历史数据回溯。)。

        但因为DataWorks的产品技术栈不统一,尤其当下业界在react和angular框架的无痕埋点方向上基本属于空白状态。所以我设计了一套埋点机制,来实现不同前端框架的下的无痕埋点,并将采集到的事件和数据通过retcode进行数据上报。

架构设计

从结构上划分,分为底座和插件两大块。

  • 底座:负责插件的装载、数据的封装处理和上报。
  • 插件:不同前端框架的埋点方案都基于规定好的数据格式开发插件,并按需插入到底座来实现埋点数据采集。

从功能上划分,底座总共分为三层,既数据采集层、数据处理层及数据传输层。

image.png

底座设计

上面讲到底座分为三层:

  1. 数据采集层,提供了一整套的插件接入机制。底座自身并不提供数据采集的功能,它本身只是一个容器,允许各种插件按照一定的规则插入到底座中,提供数据采集的功能。
  2. 数据处理层:提供了数据的规范,各个插件需要依照该数据规范把采集到的数据进行包装(例如加入各个产品配置的业务数据),然后传给数据传输层。
  3. 数据传输层:封装retcode进行埋点上报。

        这样设计的好处是底座不负责采集,采集的工作由插件实现。而插件机制又保证了整个埋点机制的拓展性,甚至未来其他的开发者也可以基于这套底座和规范,去开发各种前端框架的埋点上报。

插件设计

        我们目前开发了jQuery、react及fetch的埋点采集插件。它们前端事件和请求数据的采集方案,主要是通过Hack通用的前端框架,在事件处理函数上做文章。具体Hack的方式下面会描述。

  • 优点:能够较为精确地定位到具体的选择元素以及其功能,并且可以结合框架的优势传递业务数据,更能满足我们在复杂业务场景下处理数据的需求。
  • 缺点:必须要在执行用户代码之前执行我们的埋点代码。

jQuery的埋点方式:

  • 第一步: 改写jQuery的事件绑定方法(如on,click,delegate等)
  • 第二部: 判断如果是click,则记录selector,并对回调函数做一层封装。
  • 第三部:执行回调封装的时候,会把selector传入函数内,上报上去。

注: 这里selector需要注意区分,因为有可能是通过parent或者find找到的,我们需要根据selector以及prevObject来精确查找具体的元素。

React的埋点方式:

        通过改写React.createElement,其中可以拿到组件传递的Property,通过Property可以进行判断,如果含有onClick事件的话,则在此事件中进行数据的上报操作。整个过程中可以上报Component名称以及Component的父子关系。

请求采集方案:

        目前对于jQuery的Ajax。主要做法是修改ajax的beforeSend函数和complete函数,来对ajax进行统一的处理及上报。
        如果是fetch,则hack浏览器原生的fetch方法,来对请求进行包装,上报请求信息。

其他框架Angular、vue、backbone....

        如果想使用我们的这套埋点机制,任何前端框架只需要遵循传输的数据格式,然后实现各自的点击事件采集即可。

解决的问题和优化

优化:

  1. 优化pv/uv数据的采集,由于用户在使用DataWorks时,页面不会关闭,导致PV/UV数据不准确。所以增加用户每日首次激活页面的时候也会进行PV/UV采集。
  2. jQuery插件中,减少不必要的全局事件,例如绑在body上,用来隐藏右键下拉菜单的事件。

解决掉的问题:

  1. retcode必须在页面文档流加载的时候引入,否则不会上报PV/UV和页面加载性能数据。这个问题很严重,因为我们的基础库是通过公共头统一引入的,这个时候文档流已经执行完毕,所以我们通过手动调用retcode提供的spm上报接口来实现PV/UV的上报。另外页面加载性能数据,也通过浏览器的PerformanceTiming API进行手动采集上报。
  2. jQuery的on事件绑定方法,在hack的时候需要提取guid,并赋给hack的函数,否则off的时候会找不到对应的函数。
  3. 推动七星阵支持retcode数据上报。

后期计划

本期主要目标在于产出数据,即实现对买点数据的采集、上报、汇总工作。后续工作可以从前端及后端数据处理两个方向进行发展。

前端方向:

  1. 制作浏览器插件: 基于埋点数据,开发类似Udata的浏览器插件,能够帮助PD、UED、运营对页面上用户的行为数据有个直观的认识,从而支撑他们的产品设计和决策。这个插件的数据来源可以是实时数据,也可以是离线数据。
  2. 数据可视化: 与集团内部的一些自定义报表工具打通,能够快速方便得进行数据可视化展现。

后端数据处理方向:

  1. 自动生成离线任务:DataWorks本身就是一整套的大数据平台,能够实现数据的抽取、分析和运维。后续将考虑搭建一套机制,能够自动的生成调度任务去帮用户进行数据分析。

即形成了 数据收集 -> 数据整理(数据同步)-> 数据分析 -> 数据可视化的闭环。
​​
image.png

【云栖快讯】云栖专辑 | 阿里开发者们的20个感悟,一通百通  详情请点击

日志上报项目说明v1.2

1. 项目介绍

本项目旨在以js脚本的形式,为全站web页面提供统一的日志上报接入服务,供数据平台相关同学提供标准化的数据服务。目前的上报内容包括页面pv,点击事件,页面加载性能,模块曝光与自定义事件。

日志上报脚本的兼容性为ie9或以上任意浏览器。

如果你关心上报的去向,请移步产品和数据同学应该知道的spm_id二三事

2. 脚本接入方式

2.1 申请spm_id

spm_id的作用,是作为脚本使用者接入的唯一标记,以便在查询数据时根据spm_id得到该使用者期望的结果。每个接入日志上报脚本的项目,都有唯一的spm_id。

在准备接入脚本时,使用者应与脚本开发人员(fuqiang)进行沟通,以确定自己的spm_id。

在确定了spm_id之后,在项目html文件(或其他形式的模板)head内,埋入

此例中的spm_id为333.999。

如果需要更新页面的spm_id,可以调用reportObserver.setSPM_id方法。例如:

reportObserver.setSPM_id('123.456')

 

2.2 声明自定义上报的数据对象

在head标签内,声明自定义上报的数据对象:reportMsgObj 已修改为 spmReportData,详见:数据上报 by zhoubing01

2.3 引入脚本文件

</body> 标签之前注入:

2.4 验证是否接入成功

如完成上述步骤的姿势正确,打开浏览器控制台查看network---All, 你会看到一个或多个以web? 开头的请求。 在这个请求中,你会看到2.1中设置的spm_id。

3. 上报内容

3.1 pv上报

在脚本加载后,会立即发送一条固定的pv请求到数据平台,且只发送一次。

对于前端路由,当url切换完成后,可以手动调用window.reportObserver.sendPV(), 以再次获取当前url并发送pv日志——在不希望影响现有逻辑的情况下,建议写成:

自动的上报内容包括url,refer_url, spm_id, timestamp , fts, 浏览器分辨率, 是否手机浏览。

3.2 点击上报

为了识别页面中的哪些区域需要被记录点击事件,需要脚本使用者在页面中注入特定的className。

例如,某个需要记录点击的区域显示如下


就需要在class中加入report-wrap-module, 并为该div添加id,即

 

这样,该report-wrap-module下的a标签点击,都会被上报。

如果有心查看点击上报发送的请求,你会发现spm_id所在的数据项,一共有四位,如333.999.xxx.7 。其中xxx为report-wrap-module的id,7即为该report-wrap-module下的第7个a标签。

自动上报的内容包括url, spm_id, 跳转url,timestamp,点击屏幕的坐标,浏览器分辨率,是否手机浏览。

3.3 性能上报

性能上报的内容为window.performance.timing中的全部字段,用于计算页面加载的各项所需时间。在脚本加载后会随pv一同上报。

3.4 模块曝光上报

模块曝光可以理解为随着滚动条的滑行,页面内指定内容出现在了视觉范围之内。这些内容的出现即称之为曝光。

为了识别哪些模块被标记为需要曝光上报,脚本使用者也需要为模块添加className。同时为该模块添加id

仍以3.2中的模块为例,添加的className为report-scroll-module,即

现在这个模块即可以点击上报也可以滚动上报了。

自动上报的内容包括url, spm_id, timestamp, 浏览器分辨率,是否手机浏览。

3.5 自定义上报

在2.2节中有一个reportMsgObj 已修改为 spmReportData,详见:数据上报 by zhoubing01,它即为自定义上报的数据对象。

使用者在自己的脚本中执行

那么你会在浏览器network看到一条上报信息。对应的spm_id数据项形如 333.999.selfDef.xxx 。xxx与111 在上报中表示为json串:{%22event%22:%22xxx%22,%22value%22:111}。这里的value不仅限于数字,也可以是字符串,对象或其他。

上报脚本每隔1s会检查一次这个对象中的内容。如果检测到内容,会上报并将内容清除。

当有自定义内容需要立即上报时,可以使用如下的方式:

脚本会强制检查数据对象并进行上报。

3.6 错误上报(实验)

错误上报用于捕获页面加载、展现、与用户交互过程中,可以被window的error事件捕获的异常。脚本本身对错误的捕获逻辑,遵照MDN-GlobalEventHandlers.onerror,可以概述为:

用window.onerror监听运行时错误——如句法错误,各种handler抛出的异常;

用window.addEventListener('error', func) 监听资源类加载错误——script,img等。

整个错误上报流程与其他上报方式均有所不同,可以理解为:

当脚本捕获到错误之后,首先将在浏览器network一栏看到dataflow.biliapi.com/log/system开头的post请求。之后数据到达kibana,可以在这里进行实时查看。关于如何在kibana上查询,可以参见这里

3.6.0 如何开启上报脚本的错误捕获功能

在2.3节提到的reportConfig中,加入下面的逻辑:

3.6.1 如何让上报脚本捕获到runtime error

由于浏览器的同源策略限制,当页面引用的非同域的外部脚本中抛出了异常,此时本页面无权限获得这个异常详情, 将输出 Script error 的错误信息。

 这就是说,如果你在x.bilibili.com下使用window.onerror对s1.xxxcdn.com/a.js的错误进行捕获,获得的错误信息将只有‘Script error’。

为此,我们需要对a.js开启“跨域资源共享机制”。

首先,在a.js引入时添加crossorigin属性:

如果你使用webpack动态引入a.js, 则可以在webpack配置里,对output.crossOriginLoading进行设置,参见这里

其次,请求运维在a.js的相应头中添加Access-Control-Allow-Origin: *  (如果已添加,可忽略)。

你可以在kibana上看到的runtime错误信息包括url,行号,列号以及错误调用堆栈信息。

3.6.2 上报脚本捕获到的错误类型

脚本将自动对资源类错误进行捕获。在kibana查询时,可以根据errorType字段获得不同种类资源对应的错误信息。errorType对应关系如下

errorType 错误类型
1 runtime
2 script
3 style
4 image(当src为空时不报)
5 audio
6 video
7 console
8 try-catch

3.6.3 try-catch上报

如果你catch到了自己的错误,那么可以交给上报脚本,脚本会帮你上传到kibana平台供实时查询。上报的方式如下:

其中,reportMsgObj为2.2节中的reportMsgObj.

如果tryCatchError传入一个对象,脚本会将该对象中的所有key-value在kibana中逐项显示;如果传入数字或字符串,那么内容默认显示在errorMsg项。

3.6.4 上报字段一览

对于runtime error,上报以下字段:

字段名 取值\含义
col 错误所在列号
line 错误所在行号
errorType 固定为1
instance_id 固定为runtime
level ERROR
url 错误所在页面url
errorMsg 具体的错误信息
time ISO时间戳,YYYY-MM-DDTHH:mm:ss.sssZ
referrer 页面来源

对于资源类错误,上报以下字段:

字段名 取值\含义
errorType 2,3,4,5,6,7, 见errorType表
instance_id 固定为resource
level ERROR
url 错误所在页面url
errorMsg 具体的错误信息
time ISO时间戳,YYYY-MM-DDTHH:mm:ss.sssZ
referrer 页面来源

对于try-catch到的错误,上报以下字段:

字段名 取值\含义
app_id 固定为:main.frontend.bilibili-log-report-seed
errorType 8
instance_id 固定为trycatch
level ERROR
url 错误所在页面url
errorMsg 3.6.3节传入的数字或字符串
time ISO时间戳,YYYY-MM-DDTHH:mm:ss.sssZ
referrer 页面来源
... 3.6.3节传入对象时的自定义错误信息

目前,可以上报错误的日志上报脚本已部署在uat环境下。

 

4. 报表

所有的上报都依类型存储于不同的表中,即pv一张表,性能一张表,曝光一张表,点击与自定义共用一张表。

使用者(如有操作权限)在查表时,需要根据自己的spm_id在表中进行查询。

5. 目前的接入方与spm_id

spmid pc页面 url
333.334 主站pc首页 www.bilibili.com
333.788 主站pc播放页 www.bilibili.com/video/avXXXXXX/
333.337 主站pc搜索页 search.bilibili.com
333.4 主站pc一级分区页 www.bilibili.com/video/XXXXXX.html
333.5 主站pc一级分区页--动画 www.bilibili.com/{name}
spmid h5页面 url
333.400 主站h5首页 m.bilibili.com/index.html
333.401 主站h5播放页 m.bilibili.com/video/avXXX.html
333.405 主站h5tag页 m.bilibili.com/tag/XXX(id)
333.406 主站h5缺省页 m.bilibili.com/404.html
333.2 主站h5个人空间页 m.bilibili.com/space/xxxxxx
666.1 pgc作品详情落地 bangumi.bilibili.com/review/media/{mediaId}

产品和数据同学应该知道的spm_id二三事

  1. spm_id是什么

    举个例子,点击主站首页的某个链接,会上报一条数据,里面包含了一串spm_id : 333.334.home_popularize.2
    其中,333.334是这个页面在埋点系统中的唯一id,home_popularize是点击链接所在的模块,本例中的模块为“推广”,最后一位的2,代表了链接在该模块中的区位。
    spm_id是数据同学在数据表中查询的最有效凭证。

  2. 产品需要给数据提供什么
    2.1 页面的唯一id,即spm_id 的前两位(产品同学应该有申请过);
    2.2 对于pv的统计需求,如果2.1中页面的唯一id为a.b,那么完整的spm_id为:a.b.0.0 ;
    2.3 对于曝光类的统计需求,需要提供模块的id,如果2.1中页面的唯一id为a.b , 模块id为c,那么完整的spm_id为:a.b.c.0 ;
    2.4 对于自定义埋点的统计需求,需要将自定义事件名罗列出来,如果2.1中页面的唯一id为a.b , 某个自定义事件名为d,那么该自定义事件上报的spm_id为a.b.selfDef.d , 这里,数据同学可以同时提取数据表中的msg字段作为参考。
    2.5 对于点击行为自动上报的统计需求,需要提供模块的id,如果2.1中页面的唯一id为a.b , 模块id为c,那么完整的spm_id为:a.b.c.x ;其中x代表该链接在模块中的区位。

  3. 数据分别在哪张表里
    3.1 pv——ods.ods_web_pv
    3.2 曝光——ods.ods_web_impression
    3.3 自定义埋点——ods.ods_web_click
    3.4 点击行为的自动上报——ods.ods_web_click

  4. 埋点参考
    日志上报项目说明v1.2

阿里巴巴的日志采集分享(上)

要说日志采集的难度是不高,但是要说复杂程度,绝对是很繁琐的。有许多细节和流程需要考虑,不同的客户端如何采集,格式怎么统一,各种用户行为怎么跟踪,如何减少对业务代码的侵入,怎么保证性能和实时性等等。

流量产品整体介绍

闭环:无规范不分析,无分析不采集;采集必计算,计算必分析;

自下而上是「数据采集规范」,「数据采集」,「数据解析」,「日志数据域」,「流量分析平台」。

在数据采集前,先定义了采集规范如SPM(超级位置模块),SCM(超级内容模块),黄金令箭(交互采集模块),采集规则统一等。

数据采集的支持平台有埋点申请埋点配置埋点验证数据监控数据管理。(这个就是埋码的流程。)数据采集技术包括 Apus/Etag(WEB产品采集),Beacon(WEB嗅探),UserTrack(APP产品采集)等。

采集规范

1. 采集规则统一

各个产品线只有一套统一的数据监控规则。

举一个天猫和淘宝在做产品曝光率分析的例子。比如在做智能推荐系统的时候,希望知道产品的曝光率。这时就需要对曝光制定一个规则 – 什么是曝光。如果淘宝把出现一点产品图片的边缘就算曝光,而天猫把出现了整个产品图片才叫曝光,那么这样的统计结果就有很大的差异。

现在统一规定:一个产品图片露出50%的区域同时展示了0.5秒,就算一次曝光。

2. SPM 和 SCM

SPM(Super Position Model)全称超级位置模型。

SPM是Web端Aplus日志体系和APP端UserTrack日志体系下,共同使用的的重要规范。

阿里的SPM位置编码由A.B.C.D四段构成, 各分段分别代表 A:站点/业务, B:页面, C:页面区块, D:区块内点位. 如下图所示:

SCM(Super Content Model)全称超级内容模型。

与业务内容一起下发的埋点数据,用来唯一标识一块内容。 客户端打点时,将 SCM 编码作为埋点的参数上传给 UT 服务器。

SCM编码也采用a.b.c.d的格式,其中,一般来说,

  • a标识投放系统ID,用来标识不同的内容投放方,比如商城的阿拉丁系统,对应的投放系统ID为1003。
  • b标识投放算法ID,用来标识投放系统产生不同内容的投放算法。
  • c标识投放算法版本ID,用来标识投放算法的不同版本。
  • d标识投放人群ID,用来标识不同的投放人群,或者对接profile。

在分析中,可以分析不同位置相同内容带来的影响,也可以分析相同位置不同内容带来的流量,当然还可以交叉分析。

3. 黄金令箭

用户在页面上某个行为触发一个异步请求,按照约定的格式向日志服务器发送请求,展现、点击、等待、报错等等都可以作为交互行为。

数据采集

整体设计

采集主要分为客户端埋点,插件/封装,服务端部署。

  • Aplus 是Web端(基于浏览器)日志采集技术方案
  • UserTrack 是阿里巴巴内部采集并上报App日志的sdk,适用于native原生页面、webview相关业务。
  • Adash 是UserTrack的服务端,主要负责处理用户数据上传请求,配置获取请求,以及对请求进行相关校验。

Aplus - WEB 采集

采集内容包括:

  • 当前页URL, 标题和来源页的URL(如果有)
  • 用户身份识别信息: cookieID, 淘宝会员数字id(不一定需要登录)和nickname(若已登录)
  • 客户端/浏览器信息和屏幕分辨率
  • 当前页SPM, 来源页点击位置SPM编码, 来源页的来源页点击位置SPM编码 (前提均为若已部署了SPM)
  • aplus版本信息及反作弊验证码

交互行为使用「黄金令箭」统计。

UserTrack - APP 采集

UserTrack 将采集以下数据

  • 采集设备信息(设备、运营商……)
  • 采集APP信息(应用、版本、渠道……)
  • 采集用户行为(会员、登陆、注册、页面浏览、控件点击……)

UserTrack 会为每种业务事件分配一个事件ID(event_id),通过event_id来区分每条日志的业务含义,例如常见的页面事件(event_id=2001)、控件事件(event_id=2101)等。开发人员可以根据不同的业务场景调用不同的API埋点,为不同的业务事件提供不同的业务参数。

UTDID

UTDID 表示唯一用户,该id可以在不同的产品中通用。

Next

下期在分享

  • UserTrack 高级功能
    • 曝光日志预聚合
    • 回退识别
    • H5 和 native日志统一
  • 数据保障
    • 日志处理链路
    • 日志分流
    • 日志缓存
  • 埋码流程
    • 基本流程
    • 埋码准确度验证
  • 埋码测试
    • 本地测试
    • 灰度版本测试

文章中图片因版权原因移除,详细内容可以查看《大数据之路》

阿里巴巴的日志采集分享(下)

UserTrack 高级功能

曝光日志预聚合

曝光日志,是电商场景下很特殊的一类日志,具体来说:比如商品图墙列表上有多少商品给用户展示过就是一种典型的曝光日志,一般用来作为推荐算法的输入信息或者广告展示计费用途。曝光日志一般是点击日志的几十到几百倍,而一页内的曝光信息又大致雷同,所以一般都会做聚合。

只是如何聚合,由客户端采集框架聚合还是由业务自身聚合(比如曝光日志设计为一条可以直接记录一批商品),这会是需要权衡考虑的。

回退识别

用户回退行为的识别,也是比较棘手的,因为跟踪用户浏览行为的目的,主要是为了分析链路转化率,用来优化业务或分析活动效果等。而页面回退行为对这些行为分析是一种干扰。在下游数据分析过程中再识别这种行为往往很难,在采集端会有更充分的信息进行识别。但具体实现也并不是总能万无一失,而且有些特殊情况下,可能还需要保留这种回退行为的数据。

H5 和 native日志统一

H5 和 native日志统一:H5日志通过JS接口传给Native的方法,转换成native的格式统一输出

H5越来越流行,Hybrid的应用越来越普及,用户并不关心你的页面是native的还是H5的,但是日志的采集方案在Web端和Native端通常却是两套架构,后续采集传输流程等等很可能也不在一条链路上。如果不加处理,对于用户行为的链路分析会带来很大的麻烦。

具体怎么处理,不外乎是要自动识别H5页面的运行环境,打通H5跳转到Native和Native跳转到H5两个方向的页面数据传递,加上各种回退之类行为要处理,安卓和IOS的方案要兼容等等,真的实现起来,还是要费不少力气处理好各种细节的。

数据保障

日志处理链路

日志分流

日志分流:根据页面业务类型的不同,采用不同的URL Log记录地址,将分流工作从客户端开始做起
日志分流的目的,自然是为了增加日志链路水平拓展的能力,然后降低后续流程具体业务的计算代价,所以理论上来说,分流得越早,分流得越彻底,这方面的收益越高。

日志缓存

主要使用缓存部分日志先不发送,以及日志采样等
日志分流以后,当然可以做开关,缓存,采样等工作,这也是分流的收益之一。

阿里现在日志的上传率是98%,目前是国内上传率最高的公司。平时每天大概会有4000亿的日志上传,双十一期间会高达6000亿,这还是在减少一些通用型数据上传的情况下。

在网络差的时候,阿里会把数据分包,如果还是上传会继续拆分,一直到10k。如果还是上传不上去,就会采取其他技术手段。

埋码流程

基本流程

阿里的埋码流程如下:

埋点申请,埋点配置,埋点验证,数据监控,采集管理

  • 埋点申请:在平台上申请埋码,并记录埋点信息
  • 埋点配置:埋码分为 可视化自动埋码,和非可视化手动埋码
  • 埋点验证:sdk自动处罚点击事件,和平台上提交的埋点信息做验证
  • 数据监控:监控埋码质量
  • 采集管理:采集数据管理

埋码测试

本地测试

本地会使用自动埋码测试工具

灰度版本测试

阿里会对部分软件的部分用户进行灰度测试,验证灰度测试结果

Next

上期的分享

  • 流量产品整体介绍
  • 采集规范
    • 采集规则统一
    • SPM 和 SCM
    • 黄金令箭
  • 数据采集
    • 整体设计
    • Aplus - WEB 采集
    • UserTrack - APP 采集
    • UTDID

文章中图片因版权原因移除,详细内容可以查看《大数据之路》

一些国内外的服务商

Google Analytics(Firebase Analytics)
https://link.jianshu.com/?t=https://firebase.google.com/docs/database/ios/start
Firebase Analytics是2016年在Google I/O上推出的针对移动应用的服务。

Flurry
https://link.jianshu.com/?t=https://developer.yahoo.com/flurry/docs/analytics/gettingstarted/technicalquickstart/ios/

Localytics
http://docs.localytics.com/dev/ios.html

Mixpanel
https://link.jianshu.com/?t=https://mixpanel.com/help/reference/ios
(支持可视化埋点)

Umeng
http://dev.umeng.com/analytics/ios-doc/integration?spm=0.0.0.0.t9tzbd

Growing IO
https://link.jianshu.com/?t=https://help.growingio.com/SDK/iOS.html
(国内无埋点方案-无埋点的启发性更好哦)

TalkingData
https://link.jianshu.com/?t=https://www.talkingdata.com/tracking/documents/AdTracking_SDK_iOS_%E9%9B%86%E6%88%90%E6%96%87%E6%A1%A3.pdf

以上都是集成文档的链接,各家都有自己的特点。具体方案请视自己的情况而定。

自行搭建埋点服务

有时候我们也会遇到数据是有了,但是当要把原始数据做导出分析时又遇到问题。自己产品的数据却不能被我们自己拥有。
这里介绍两款免费开源的私有化部署方案
1.cobub razor
传送门:http://www.cobub.com
2.countly
传送门:https://link.jianshu.com/?t=https://count.ly


总结:
不同的埋点方案都有各自的优缺点,对于不同的业务需求,一种埋点方案明显无法满足 ,所以往往我们需要结合多种方案进行处理。

最后,希望本文能拓宽大家对于埋点的思路吧:)

若文章中有不对的地方望指正,万分感谢!
本文提到的服务商与本人没有利益关系.

参考文章
1.http://www.itechdog.com/blog/event-tracking?utm_source=tuicool&utm_medium=referral
2.http://www.jianshu.com/p/973d626fa19a
3.http://www.jianshu.com/p/4e1b371ec46a
4.https://link.jianshu.com/?t=https://www.zhihu.com/question/41831617