在线教育之采集系统 day02

在线教育之采集系统 day02

第3章 数据生成模块

3.1目标数据

我们要收集和分析的数据主要包括页面数据事件数据、曝光数据、启动数据、播放数据和错误数据。

3.1.1页面

页面数据主要记录一个页面的用户访问情况,包括访问时间、停留时间、页面路径等信息。

1)日志范例如下

{

"actions": [

],

"common": {

},

"displays": [

],

"page": {

"during_time": 11622,

"item": "57",

"item_type": "course_id",

"last_page_id": "course_list",

"page_id": "course_detail"

},

"ts": 1645529967261

}

2)所有页面类型如下:

home("首页")

course_list("列表页")

course_detail("商品详情")

chapter_video("章节视频")

cart("购物车")

order("下单结算")

payment("支付页面")

exam("考试")

mine("我的")

3)所有页面对象类型如下:

course_id("课程Id")

keyword("搜索关键词")

video_id("视频id")

chapter_id("章节id")

coupon_id("购物券id")

order_id("订单id")

paper_id("考卷id")

exam_id("考试id")

3.1.2事件

事件数据主要记录应用内一个具体操作行为,包括操作类型、操作对象、操作对象描述等信息。

1)日志范例:

{

"actions": [

{

"action_id": "favor_add",

"item": "57",

"item_type": "course_id",

"ts": 1645529967261

},

{

"action_id": "cart_add",

"item": "57",

"item_type": "course_id",

"ts": 1645529967261

}

],

"common": {

},

"displays": [

],

"page": {

},

"ts": 1645529967261

}

注:对于下单、支付等业务数据,可从业务数据库获取。

2)所有动作类型如下

favor_add(新增收藏)

review_add(新增课程评价)

comment_add(新增章节评价)

cart_add(加购物车)

3)所有动作目标类型如下:

course_id("课程Id")

keyword("搜索关键词")

video_id("视频id")

chapter_id("章节id")

coupon_id("购物券id")

order_id("订单id")

paper_id("考卷id")

exam_id("考试id")

3.1.3曝光

曝光数据主要记录页面所展示的内容,包括曝光对象,曝光类型等信息。

1)曝光日志范例:

{

"actions": [

],

"common": {

},

"displays": [

{

"display_type": "query",

"item": "6",

"item_type": "course_id",

"order": 1,

"pos_id": 4

},

{

"display_type": "query",

"item": "8",

"item_type": "course_id",

"order": 2,

"pos_id": 5

},

{

"display_type": "query",

"item": "1",

"item_type": "course_id",

"order": 3,

"pos_id": 4

},

{

"display_type": "query",

"item": "10",

"item_type": "course_id",

"order": 4,

"pos_id": 1

},

{

"display_type": "promotion",

"item": "4",

"item_type": "course_id",

"order": 5,

"pos_id": 4

},

{

"display_type": "promotion",

"item": "4",

"item_type": "course_id",

"order": 6,

"pos_id": 4

},

{

"display_type": "query",

"item": "9",

"item_type": "course_id",

"order": 7,

"pos_id": 1

}

],

"page": {

},

"ts": 1645529967261

}

2)所有曝光类型如下:

promotion("商品推广")

recommend("算法推荐商品")

query("查询结果商品")

activity("促销活动")

3)所有曝光对象类型如下:

course_id("课程Id")

keyword("搜索关键词")

video_id("视频id")

chapter_id("章节id")

coupon_id("购物券id")

order_id("订单id")

paper_id("考卷id")

exam_id("考试id")

3.1.4启动

启动数据记录应用的启动信息。

1)启动日志范例:

{

"common": {

},

"start": {

"entry": "notice",

"first_open": 0,

"loading_time": 17970,

"open_ad_id": 20,

"open_ad_ms": 2876,

"open_ad_skip_ms": 0

},

"ts": 1645532980257

}

2)所有启动入口类型如下:

icon("图标"),
notice("通知"),
install("安装后启动");

3.1.5播放

播放日志记录播放信息。

1)播放日志范例:

{

"appVideo": {

"play_sec": 19,

"video_id": "3904"

},

"common": {

},

"ts": 1645526307119

}

3.1.6错误

错误数据记录应用使用过程中的错误信息,包括错误编号错误信息

上述五种日志都有可能包含错误信息,此处仅对 appVideo 的错误日志进行展示。

1)错误日志范例

{

"appVideo":{

},

"common":{

},

"err":{

"error_code":3485,

"msg":" Exception in thread \\ java.net.SocketTimeoutException\\n \\tat com.atguigu.edu2021.mock.log.AppError.main(AppError.java:xxxxxx)"

},

"ts":1645538276217

}

3.2数据埋点

3.2.1主流埋点方式(了解)

目前主流的埋点方式,有代码埋点(前端/后端)、可视化埋点全埋点三种。

代码埋点是通过调用埋点SDK函数,在需要埋点的业务逻辑功能位置调用接口,上报埋点数据。例如,我们对页面中的某个按钮埋点后,当这个按钮被点击时,可以在这个按钮对应的 OnClick 函数里面调用SDK提供的数据发送接口,来发送数据。

可视化埋点只需要研发人员集成采集 SDK,不需要写埋点代码,业务人员就可以通过访问分析平台的“圈选”功能,来“圈”出需要对用户行为进行捕捉的控件,并对该事件进行命名。圈选完毕后,这些配置会同步到各个用户的终端上,由采集 SDK 按照圈选的配置自动进行用户行为数据的采集和发送。

全埋点是通过在产品中嵌入SDK,前端自动采集页面上的全部用户行为事件,上报埋点数据,相当于做了一个统一的埋点。然后再通过界面配置哪些数据需要在系统里面进行分析。

3.2.2埋点数据上报时机

埋点数据上报时机包括两种方式。

方式一,在离开该页面时,上传在这个页面产生的所有数据(页面、事件、曝光、错误等)。优点,批处理,减少了服务器接收数据压力。缺点,不是特别及时。

方式二,每个事件、动作、错误等,产生后,立即发送。优点,响应及时。缺点,对服务器接收数据压力比较大。

本次项目采用方式一埋点。

3.2.3埋点数据日志结构

我们的日志结构大致可分为三类,一是普通页面埋点日志,二是启动日志,三是播放日志。

普通页面日志结构如下,每条日志包含了,当前页面的页面信息,所有事件(动作)、所有曝光信息以及错误信息。除此之外,还包含了一系列公共信息,包括设备信息,地理位置,应用信息等,即下边的common字段。

1)普通页面埋点日志格式

{

"actions": [

{

"action_id": "favor_add",

"item": "57",

"item_type": "course_id",

"ts": 1645529967261

},

{

"action_id": "cart_add",

"item": "57",

"item_type": "course_id",

"ts": 1645529967261

}

],

"common": {

"ar": "16",

"ba": "iPhone",

"ch": "Appstore",

"is_new":"1",--是否首日使用,首次使用的当日,该字段值为1,过了24:00,该字段置为0。

"md": "iPhone 8",

"mid": "mid_161",

"os": "iOS 13.3.1",

"sc": "2",

"sid": "9acef85b-067d-49f9-9520-a0dda943304e",

"uid": "272",

"vc": "v2.1.134"

},

"displays": [

{

"display_type": "query",

"item": "6",

"item_type": "course_id",

"order": 1,

"pos_id": 4

},

{

"display_type": "query",

"item": "8",

"item_type": "course_id",

"order": 2,

"pos_id": 5

},

{

"display_type": "query",

"item": "1",

"item_type": "course_id",

"order": 3,

"pos_id": 4

},

{

"display_type": "query",

"item": "10",

"item_type": "course_id",

"order": 4,

"pos_id": 1

},

{

"display_type": "promotion",

"item": "4",

"item_type": "course_id",

"order": 5,

"pos_id": 4

},

{

"display_type": "promotion",

"item": "4",

"item_type": "course_id",

"order": 6,

"pos_id": 4

},

{

"display_type": "query",

"item": "9",

"item_type": "course_id",

"order": 7,

"pos_id": 1

}

],

"page": {

"during_time": 11622,

"item": "57",

"item_type": "course_id",

"last_page_id": "course_list",

"page_id": "course_detail"

},

"err":{

"error_code":1359,

"msg":" Exception in thread \\ java.net.SocketTimeoutException\\n \\tat com.atguigu.edu2021.mock.log.AppError.main(AppError.java:xxxxxx)"

},

"ts": 1645529967261

}

2)启动日志格式

启动日志结构相对简单,主要包含公共信息,启动信息和错误信息。

{

"common": {

"ar": "1",

"ba": "Redmi",

"ch": "wandoujia",

"is_new": "1",

"md": "Redmi k30",

"mid": "mid_356",

"os": "Android 11.0",

"sc": "2",

"sid": "76909678-abaf-41c4-916d-a0a72f546bc1",

"uid": "161",

"vc": "v2.1.134"

},

"start": {

"entry": "notice",

"first_open": 0,

"loading_time": 17970,

"open_ad_id": 20,

"open_ad_ms": 2876,

"open_ad_skip_ms": 0

},

"err":{

"error_code":2959,

"msg":" Exception in thread \\ java.net.SocketTimeoutException\\n \\tat com.atguigu.edu2021.mock.log.AppError.main(AppError.java:xxxxxx)"

},

"ts": 1645532980257

}

3)播放日志

播放日志结构相对简单,主要包含公共信息,播放信息和错误信息。

{

"appVideo": {

"play_sec": 19,

"video_id": "3904"

},

"common": {

"ar": "4",

"ba": "Sumsung",

"ch": "oppo",

"is_new": "0",

"md": "Sumsung Galaxy S20",

"mid": "mid_253",

"os": "Android 11.0",

"sc": "1",

"sid": "47157c4a-4790-4b9a-a859-f0d36cd62a10",

"uid": "329",

"vc": "v2.1.134"

},

"err":{

"error_code":3485,

"msg":" Exception in thread \\ java.net.SocketTimeoutException\\n \\tat com.atguigu.edu2021.mock.log.AppError.main(AppError.java:xxxxxx)"

},

"ts": 1645526307119

}