通过数据埋点来提取运营数据

前言

一款App的运营离不开数据的支撑,数据可以直观的体现产品力。运营需要的数据非常多,所以会设计大量的埋点采集数据,甚至某些指标需要一系列的的埋点才能提供可供分析的结果。

埋点模块设计的重点:

  1. 作为运营人员,需要设计与配置埋点足够的快捷。所以需要设计一套埋点规则,使他们可以根据需求来制作数据埋点规则。
  2. 作为运营人员,需要频繁的修改埋点规则。所以需要做好埋点规则配置文件的下发管理。
  3. 作为运营人员,需要获得时效性更强的数据。所以需要对埋点数据的上传进行管理。
  4. 作为开发人员,需要简便的代码实现方式。所以需要提供高封装程度的API,以及容易理解的配置方式。

何为埋点

埋点是用来记录用户触发的某一个动作,或者程序流程中的某一个状态。埋点需要从运营的角度来设计,埋点中记录的数据要足够描述它的定义,这样才能在分析时产生价值。

为了还原事件本身,埋点至少需要包含人物,时间,地点,三个要素,如果是属于流程中的埋点,还需添加事件信息。

人物:触发埋点时的用户身份。

时间:触发埋点的时间。

地点:触发埋点的设备信息、网络条件、App版本等。

事件:事件的唯一ID,存在则表示有相关流程。

常规的埋点类型,可以分为五种。

  1. 页面类型,用于统计客户端页面打开与关闭的信息,按时间线串联页面埋点数据,可以拼凑出用户的使用路径。
  2. 事件类型,用于统计特定的事件触发次数,通常为流程中的一系列动作。比如从App打开,到用户发起Socket连接,再到用户登录IM,最后到用户完成数据获取,这一系列的事件埋点可以分析出用户完成登录的冷启动耗时。
  3. 状态类型,用于统计用户的某些状态,会在埋点数据上报时实时获取,比如用户当前是否开启推送,是否开启消息提示音等。
  4. 计数类型,用于统计事件的触发次数,区别与事件类型,计数类型在上报时会整合一个时间段的埋点数据,而不会上报所有事件,减小上传数据量,减轻服务端分析压力。比如用户打开相册,用户使用了首页搜索。这些数据可以整理出App的功能热力图,让开发有针对性的进行优化。
  5. 日常类型,用于进行实时性要求特别高的埋点。这类埋点不参与上报逻辑,会在触发时直接上报,保证数据实时性。比如用户登录时上报日活跃数据。

架构设计

埋点规则模型

  1. eventName,埋点事件名称
  2. remark,埋点描述
  3. type,指定埋点的分类(页面类型、事件类型、状态类型、计数类型、日常类型)。
  4. clientType,指定埋点生效的平台,比如PC、PAD、Phone,类型为位枚举,可以同时生效。
  5. vcClassName,页面类型埋点使用,用于指定iOS平台中关联的页面。
  6. data,用于指定埋点中需要的参数,同时参与参数校验,类型为Map。
  7. groupKeys,用于对计数类型埋点进行分组,类型为包含String的数组。

埋点数据模型

  1. eventName,埋点事件名称。
  2. remark,埋点描述。
  3. type,指定埋点的分类(页面类型、事件类型、状态类型、计数类型、日常类型)。
  4. displayMode,页面类型埋点使用,分为页面显示与页面消失两种类型。
  5. uploaded,用于判断该条埋点记录是否完成上传。
  6. triggerId,关联事件ID,用于串联埋点。
  7. triggerTime,事件的触发时间。
  8. 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条,防止过度占用网络资源。

上传后的记录需要标记,防止重复上传。