前言
一款App的运营离不开数据的支撑,数据可以直观的体现产品力。运营需要的数据非常多,所以会设计大量的埋点采集数据,甚至某些指标需要一系列的的埋点才能提供可供分析的结果。
埋点模块设计的重点:
- 作为运营人员,需要设计与配置埋点足够的快捷。所以需要设计一套埋点规则,使他们可以根据需求来制作数据埋点规则。
- 作为运营人员,需要频繁的修改埋点规则。所以需要做好埋点规则配置文件的下发管理。
- 作为运营人员,需要获得时效性更强的数据。所以需要对埋点数据的上传进行管理。
- 作为开发人员,需要简便的代码实现方式。所以需要提供高封装程度的API,以及容易理解的配置方式。
何为埋点
埋点是用来记录用户触发的某一个动作,或者程序流程中的某一个状态。埋点需要从运营的角度来设计,埋点中记录的数据要足够描述它的定义,这样才能在分析时产生价值。
为了还原事件本身,埋点至少需要包含人物,时间,地点,三个要素,如果是属于流程中的埋点,还需添加事件信息。
人物:触发埋点时的用户身份。
时间:触发埋点的时间。
地点:触发埋点的设备信息、网络条件、App版本等。
事件:事件的唯一ID,存在则表示有相关流程。
常规的埋点类型,可以分为五种。
- 页面类型,用于统计客户端页面打开与关闭的信息,按时间线串联页面埋点数据,可以拼凑出用户的使用路径。
- 事件类型,用于统计特定的事件触发次数,通常为流程中的一系列动作。比如从App打开,到用户发起Socket连接,再到用户登录IM,最后到用户完成数据获取,这一系列的事件埋点可以分析出用户完成登录的冷启动耗时。
- 状态类型,用于统计用户的某些状态,会在埋点数据上报时实时获取,比如用户当前是否开启推送,是否开启消息提示音等。
- 计数类型,用于统计事件的触发次数,区别与事件类型,计数类型在上报时会整合一个时间段的埋点数据,而不会上报所有事件,减小上传数据量,减轻服务端分析压力。比如用户打开相册,用户使用了首页搜索。这些数据可以整理出App的功能热力图,让开发有针对性的进行优化。
- 日常类型,用于进行实时性要求特别高的埋点。这类埋点不参与上报逻辑,会在触发时直接上报,保证数据实时性。比如用户登录时上报日活跃数据。
架构设计
埋点规则模型
- eventName,埋点事件名称
- remark,埋点描述
- type,指定埋点的分类(页面类型、事件类型、状态类型、计数类型、日常类型)。
- clientType,指定埋点生效的平台,比如PC、PAD、Phone,类型为位枚举,可以同时生效。
- vcClassName,页面类型埋点使用,用于指定iOS平台中关联的页面。
- data,用于指定埋点中需要的参数,同时参与参数校验,类型为Map。
- groupKeys,用于对计数类型埋点进行分组,类型为包含String的数组。
埋点数据模型
- eventName,埋点事件名称。
- remark,埋点描述。
- type,指定埋点的分类(页面类型、事件类型、状态类型、计数类型、日常类型)。
- displayMode,页面类型埋点使用,分为页面显示与页面消失两种类型。
- uploaded,用于判断该条埋点记录是否完成上传。
- triggerId,关联事件ID,用于串联埋点。
- triggerTime,事件的触发时间。
- dataJsonStr,埋点采集的数据,用JSON String存储。
埋点规则配置
埋点规则是多平台一起使用的,使用JSON文件进行整理是比较好的方案。
再将文件放入客户端预埋,或者通过服务端下发更新都可以。
{
"version":"1.0.0",
"commonData":{
"OSVer":"",
"appVer":"",
"deviceModle":"",
"clientType":0,
"network":0,
"areaId":"",
"numId":"",
"userId":"",
"triggerTime":0,
"triggerId":""
},
"rules":[
{
"iOSVCClassName":"IMSessionVC",
"AndroidPageClassName":"IMSessionVC",
"remark":"进入/离开聊天会话界面",
"eventName":"IMSessionPage",
"type":0,
"client":13,
"data":{
}
},
{
"iOSVCClassName":"",
"AndroidPageClassName":"",
"remark":"打开消息管理器",
"eventName":"IMMsgManagerPage",
"type":0,
"client":8,
"data":{
}
}
]
}
埋点记录上传
上传间隔超过1小时,就会上传一次数据。
每次上传数据需要控制数据包大小,比如每次只上传100条,防止过度占用网络资源。
上传后的记录需要标记,防止重复上传。