浅谈游戏数据(2)

定义埋点规范

关于游戏数据埋点的一些说明,请参考前一篇文章(浅谈游戏数据(1)-埋点初探)。这里主要是讨论怎么定义一个游戏项目的埋点。之前说过,这种规范一般是由数据部门的产品经理去收集需求,然后来定义。但是相当一部分游戏公司,并没有专门的岗位。大部分埋点,早期都是开发亲自操刀。毕竟数据埋点对于技术来说比较简单,很少存在说这个埋点技术实现不了。我们要担心的是,老板说要分析一下为什么游戏打开到注册流失了这么多人,是什么原因导致的,这个时候没有埋点,数据支撑不了就略尴尬。我们在做技术之余,也不要局限于只是技术,拓宽自己的思维。这篇文章,我们分析大部分游戏情况,定义一个比较通用的规范。还要老样子,我们区分客户端埋点和服务端埋点,这里我们不讨论具体的技术实现、存储格式。我们统一用JSON来做样例。举个例子

-- 客户端下载版本校验文件结束埋点
{
"event": "client_start", //客户端启动过程(操作主事件)
"sub_event": "client_version_download_end",// 版本文件下载结果 (操作子事件)
"base_data": { // 事件全局通用属性集合(包含设备信息、客户端环境、游戏app基础信息)
"client_ip": "8.8.8.8", // 客户端ip
"client_time": "2021-04-16T16:12:13+08:00," // 客户端时间
"device_id": "xxxxxxxx", // 客户端设备唯一id
"device_model": "vivo xxx", // 客户端设备型号
"device_os": "android", // 客户端设备系统
"device_memory": 2785, // 客户端内存大小
"device_os_version": "9", // 客户端系统版本
"device_network": "wifi", // 客户端网络环境
"device_language": "zh", // 客户端语言
"device_tz": "CST", // 客户端时区
"device_country": "CN", // 客户端国家
"app_ver": "1.1.1", // app版本
"app_open_time": 10.53, // app打开时间
"region_id": 999, // app大区id
"package_name": "xxx.xx.xx", // app包名
"channel_name": "fb" // 用户渠道信息(一般较难获取,有就记录)
},
"sub_event_data": { // 事件特有属性集合
"result": 1, // 下载结果
"download_time": 3.25, // 下载时间
"download_url": "https://a.com/version.txt", // 下载的url
"msg": "OK" // 返回消息
}
}


-- 服务端玩家登入埋点
{
"event": "server_role_login", // 登入埋点(操作事件)
"base_data": { // 事件全局通用属性集合(包含设备信息、客户端环境、游戏app基础信息)
"client_ip": "8.8.8.8", // 客户端ip
"device_id": "xxxxxxxx", // 客户端设备唯一id
"device_model": "vivo xxx", // 客户端设备型号
"device_os": "android", // 客户端设备系统
"device_memory": 2785, // 客户端内存大小
"device_os_version": "9", // 客户端系统版本
"device_network": "wifi", // 客户端网络环境
"device_language": "zh", // 客户端语言
"device_tz": "CST", // 客户端时区
"device_country": "CN", // 客户端国家
"app_ver": "1.1.1", // app版本
"app_open_time": 10.53, // app打开时间
"region_id": 999, // app大区id
"package_name": "xxx.xx.xx", // app包名
"channel_name": "fb", // 用户渠道信息(一般较难获取,有就记录)
"role_id": "1", // 玩家游戏id
"role_name": "玩家", // 玩家游戏昵称
"user_name": "xxxxx", // 玩家账号标识
"record_time": "2021-04-16T16:12:13+08:00" // 数据产生时间
},
"event_data": { // 事件特有属性集合
"last_login_time": 100, // 上次在线时长
"log_type": 1 // 登入类型(比如打开新登入,断线重连,0点强制登入)
}
}

复制

埋点日志数据组成通过以上两个例子,我们可以看出,一个埋点日志,如下:

下面解释一下操作事件和事件属性

操作事件玩家的行为动作事件,具体来说就是玩家的一个操作或者一个类型的操作记录,对应例子里面的event和 sub_event。

比如客户端的主要事件分为 启动过程、新手引导过程、游戏过程,每一个过程涉及的关注点是不一样,每一个主要事件,下面可以拆出很多子事件,比如下载资源、版本脚本、登入sdk。

服务端相对来说,就都是参与游戏,可以不用区分的这么细,当然也可以根据功能来拆分一下。

事件属性事件属性可以对应到数据库里面的字段。我们整理一下,大概可以划分为全局通用属性和事件特有属性,对应例子里面的base_data、event_data、sub_event_data。

比如客户端:设备信息、app信息这些是客户端每次都可以获取到的属性,我们称之为全局通用属性。事件的全局通用属性,是可以抽离出来的。

下载资源这个事件,我们需要知道下载资源的url,这是这个事件的特有属性。其他事件,可能就没有这个属性,这个我们称之为事件特有属性。

客户端

上面我们知道了埋点日志由操作事件和事件属性组成。那我们要怎么定义客户端的操作事件。

首先,我们先整理出客户端的启动流程。

客户端启动流程按照最细力度整理出客户端的启动流程,这一步可由开发人员帮忙整理。如下是一个游戏APP启动的过程(缩略版),真实的客户端启动流程,步骤会比这个要多和更复杂,这个是一个简化版本。实际根据每家公司的情况去整理即可,前期力度尽可能细一些。

有了这个流程图,接下来的事情就比较简单了。我们先定义好全局通用属性,然后再根据这个流程图,整理出客户端埋点流程即可。数据组装,我们就根据前面例子的格式,来组装数据即可。客户端全局通用属性全局通用属性所有客户端埋点日志必须接入,必须指定。

"base_data": {
"client_ip": "8.8.8.8", // String 客户端ip
"client_time": "2021-04-16T16:12:13+08:00," // datetime 客户端时间
"device_id": "xxxxxxxx", // String 客户端设备唯一id
"device_model": "vivo xxx", // String 客户端设备型号
"device_os": "android", // String 客户端设备系统
"device_memory": 2785, // Number 客户端内存大小
"device_os_version": "9", // String 客户端系统版本
"device_network": "wifi", // String 客户端网络环境
"device_language": "zh", // String 客户端语言
"device_tz": "CST", // String 客户端时区
"device_country": "CN", // String 客户端国家
"app_ver": "1.1.1", // String app版本
"app_open_time": 10.53, // Number app打开时间,当此打开累计
"region_id": "999", // String app大区id
"package_name": "xxx.xx.xx", // String app包名
"channel_name": "fb" // String 用户渠道信息(一般较难获取,有就记录)
}

复制

客户端流程埋点打开游戏APP

event: client_start
sub_event: open_app
触发条件:用户打开app时触发
完整内容:


{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "open_app", // String 打开游戏APP
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": "null" // Json/String 打开操作没有特有属性
}

复制

版本文件下载开始

event: client_start
sub_event: version_download_begin
触发条件:用户下载版本文件开始的时候触发上报
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "version_download_begin", // String 版本文件下载开始
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"download_url": "https://a.com/version.txt" // String 下载的url
}
}

复制

版本文件下载结束

event: client_start
sub_event: version_download_end
触发条件:用户下载版本文件结束的时候触发上报
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "version_download_end", // String 版本文件下载结束
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"download_url": "https://a.com/version.txt", // String 下载的url
"download_result" : 1, // Number 这里我们尽量用枚举,比如1成功,0失败
"download_time" : 1200 // Number 下载时间,毫秒
}
}

复制

弹出提示网络失败

event: client_start
sub_event: version_download_network_err
触发条件:下载版本文件失败时候触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "version_download_network_err", // String 弹出提示网络失败
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"download_url": "https://a.com/version.txt" // String 下载的url
}
}

复制

弹窗提示更新

event: client_start
sub_event: version_app_update_notice
触发条件:下载版本文件失败,弹窗时候触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "version_app_update_notice", // String 弹窗提示更新
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": "null" // Json/String 事件特有属性集合
}

复制

用户是否更新app

event: client_start
sub_event: version_app_update_result
触发条件:版本不一致,提示用户更新APP的时候触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "version_app_update_result", // String 用户是否更新app
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"is_update": 1 // Number 是否更新,尽量用枚举,比如1更新,0不更新
}
}

复制

拉起更新页面

event: client_start
sub_event: version_app_update
触发条件:拉起更新页面的触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "version_app_update", // String 拉起更新页面
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": "null" // Json/String 事件特有属性集合
}

复制

LUA列表下载开始

event: client_start
sub_event: lua_list_download_begin
触发条件:LUA列表下载开始的时候触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "lua_list_download_begin", // String LUA列表下载开始
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"download_url": "https://a.com/lua.txt" // String 下载的url
}
}

复制

LUA列表下载结束

event: client_start
sub_event: lua_list_download_end
触发条件:LUA列表下载结束的时候触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "lua_list_download_end", // String LUA列表下载结束
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"download_url": "https://a.com/lua.txt", // String 下载的url
"download_result" : 1, // Number 下载结果,尽量用枚举,比如1成功,0失败
"download_time" : 1200, // Number 下载时间,毫秒
}
}

复制

弹出提示网络失败

event: client_start
sub_event: lua_list_download_err
触发条件:下载lua文件失败弹窗时候触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "lua_list_download_err", // String 弹出提示网络失败
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"download_url": "https://a.com/lua.txt" // String 下载的url
}
}

复制

更新LUA资源开始

event: client_start
sub_event: lua_res_download_begin
触发条件:更新LUA资源开始的时候触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "lua_res_download_begin", // String 更新LUA资源开始
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"download_url": "https://a.com/2.1/lua", // String 下载的url
"download_filesize": 10269, // Number 下载的总字节数
"download_filenum": 10 // Number 下载的文件数量
}
}

复制

更新LUA资源结束

event: client_start
sub_event: lua_res_download_end
触发条件:更新LUA资源结束的时候触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "lua_res_download_end", // String 更新LUA资源结束
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"download_url": "https://a.com/2.1/lua", // String 下载的url路径
"download_filesize": 10269, // Number 下载的总字节数
"download_filenum": 10, // Number 下载的文件数量
"download_bytes": 10001, // Number 已下载字节数
"download_time": 1300, // Number 下载文件耗时
"download_result": 1 // Number 下载文件结果
}
}

复制

热更判断

event: client_start
sub_event: hotupdate_check
触发条件:判断完是否需要热更后触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "hotupdate_check", // String 热更判断
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"is_hotupdate": 1 // Number 是否需要热更(1需要0不需要)
}
}

复制

资源热更开始

event: client_start
sub_event: hotupdate_begin
触发条件:热更开始的时候触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "hotupdate_begin", // String 热更开始的时候触发上报
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"download_url": "https://a.com/2.1/res", // String 下载的url路径
"download_filesize": 10269, // Number 下载的总字节数
"download_filenum": 10 // Number 下载的文件数量
}
}

复制

资源热更结束

event: client_start
sub_event: hotupdate_end
触发条件:热更结束的时候触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "hotupdate_end", // String 资源热更结束
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"download_url": "https://a.com/2.1/res", // String 下载的url路径
"download_filesize": 10269, // Number 下载的总字节数
"download_filenum": 10, // Number 下载的文件数量
"download_bytes": 10001, // Number 已下载字节数
"download_time": 1300, // Number 下载文件耗时
"download_result": 1 // Number 下载文件结果
}
}

复制

资源解压开始

event: client_start
sub_event: unzip_res_begin
触发条件:资源解压开始触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "unzip_res_begin", // String 资源解压开始
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"unzip_filesize": 10269, // Number 压缩包总字节数
"unzip_filenum": 10 // Number 压缩包数量
}
}

复制

资源解压完成

event: client_start
sub_event: unzip_res_end
触发条件:资源解压完成的时候触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "unzip_res_end", // String 资源解压完成
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"unzip_filesize": 10269, // Number 压缩包总字节数
"unzip_filenum": 10, // Number 压缩包数量
"unzip_time": 30 // Number 解压消耗时间
}
}

复制

拉取SDK开始

event: client_start
sub_event: request_sdk_begin
触发条件:拉取SDK开始的时候触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "request_sdk_begin", // String 拉取SDK开始
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": "null" // Json/String 事件特有属性集合
}

复制

拉取SDK结束

event: client_start
sub_event: request_sdk_end
触发条件:拉取SDK结束的时候触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "request_sdk_end", // String 拉取SDK结束
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"request_result": 1, // Number 请求结果(1成功0失败)
"request_time": 130 // Number 请求耗时
}
}

复制

登入游戏服开始

event: client_start
sub_event: login_server_begin
触发条件:登入游戏服开始的时候触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "login_server_begin", // String 登入游戏服开始
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"server_url": "https://xx.com:8080" // String 游戏服地址
}
}

复制

登入游戏服结束

event: client_start
sub_event: login_server_end
触发条件:登入游戏服结束的时候触发
完整内容:

{
"event": "client_start", // String 客户端启动过程(操作主事件)
"sub_event": "login_server_end", // String 登入游戏服结束
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"server_url": "https://xx.com:8080", // String 游戏服地址
"request_result": 1, // Number 请求结果(1成功0失败)
"request_time": 130 // Number 请求耗时
}
}

复制

新手引导开始

event: client_guide
sub_event: guide_step_begin
触发条件:新手引导开始触发
完整内容:

{
"event": "client_guide", // String 客户端新手引导过程(操作主事件)
"sub_event": "guide_step_begin", // String 新手引导开始
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": "null" // Json/String 事件特有属性集合
}

复制

新手节点1

event: client_guide
sub_event: guide_step_1
触发条件:通过新手节点1的时候触发
完整内容:

{
"event": "client_guide", // String 客户端新手引导过程(操作主事件)
"sub_event": "guide_step_1", // String 新手节点1
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"guide_step": "1", // String 引导步骤
"guide_time": 1300 // Number 引导完成耗时
}
}

复制

新手节点n

event: client_guide
sub_event: guide_step_n
触发条件:通过新手节点n的时候触发
完整内容:

{
"event": "client_guide", // String 客户端新手引导过程(操作主事件)
"sub_event": "guide_step_n", // String 新手节点n
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"guide_step": "n" , // String 引导步骤
"guide_time": 1300 // Number 引导完成耗时
}
}

复制

进入游戏

event: client_game
sub_event: login_game_server
触发条件:过完新手进入游戏后触发
完整内容:

{
"event": "client_game", // String 客户端游戏过程(操作主事件)
"sub_event": "login_game_server", // String 进入游戏
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"server_url": "https://xx.com:8080" // String 登入游戏服的地址
}
}

复制

以上是我们整个游戏启动流程触发的上报,下面这几个,是贯穿整个app,在一些特殊的点,触发的上报,一般用于技术问题排查。域名解析开始

event: client_log
sub_event: dns_begin
触发条件:域名解析的时候触发
完整内容:

{
"event": "client_log", // String 客户端日志类型(操作主事件)
"sub_event": "dns_begin", // String 域名解析开始
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"host": "a.com" // String 需要解析的域名
}
}

复制

域名解析结束

event: client_log
sub_event: dns_end
触发条件:域名解析完成的时候的时候触发
完整内容:

{
"event": "client_log", // String 客户端日志类型(操作主事件)
"sub_event": "dns_end", // String 域名解析结束
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"host": "a.com", // String 需要解析的域名
"result": 1, // Number 解析结果
"time": 100, // Number 解析耗时
"msg": "info|errinfo" // Number 域名解析捕获的一些日志
}
}

复制

网络ping结果

event: client_log
sub_event: net
触发条件:主要是涉及到cdn资源和游戏服务器交互的时候,异步ping一下地址,ping三次取平均值,最大值,最小值,丢包率,一般主要是,在下载资源的时候/进入游戏的时候这两个点测试一下即可。
完整内容

{
"event": "client_log", // String 客户端日志类型(操作主事件)
"sub_event": "net", // String 网络ping结果
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"host": "a.com", // String 需要测试的地址,ip或者域名
"min": 5.15, // Number ping的最小时延
"avg": 5.35, // Number ping的平均时延
"max": 5.45, // Number ping的最大时延
"loss": "30%", // Number ping的丢包率
"time": 3000, // Number ping的次数
"scene": "hotupdate" // String 触发上报场景
}
}

复制

FPS

event: client_log
sub_event: fps
触发条件:进入游戏某些场景的时候(比如战斗)上报5秒平均帧率
完整内容:

{
"event": "client_log", // String 客户端日志类型(操作主事件)
"sub_event": "fps", // String FPS
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"fps": 30, // Number 帧率
"scene": "finght_1" // String 触发上报场景
}
}

复制

异常捕获

event: client_log
sub_event: catchlog
触发条件:app发生异常的时候捕获上报
完整内容:

{
"event": "client_log", // String 客户端日志类型(操作主事件)
"sub_event": "catchlog", // String 异常捕获
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"sub_event_data": { // Json/String 事件特有属性集合
"msg": "xxxxxxxxx" // String 捕获的异常信息
}
}

复制

服务端

服务端埋点,相对来说就简单一些了。服务端关注的的更多的是玩家在游戏内的一下行为日志,更不需要关注设备层面的属性。但在一些核心埋点,我们尽量把客户端的全局通用属性也加上,主要是 注册、登入、登出、充值这四个埋点,我们也需要知道用户的设备信息。方便做一些关联分析。

服务端埋点,我们不区分主事件和子事件,统一用功能模块划分时间,比如注册、登入、充值、任务模块、玩家属性模块。

我们假设一个游戏一些通用的游戏模块。注册模块、登入模块、游戏任务模块、游戏战斗模块、游戏货币模块。我们根据这些模块去做埋点设计。

服务端全局通用属性全局通用属性所有服务端埋点日志必须接入,必须指定。

"base_data": {
// 以下是服务端全局通用属性,所有服务端埋点都需要加上
"region_id": "999", // String app大区id
"package_name": "xxx.xx.xx", // String app包名
"channel_name": "fb", // String 用户渠道信息(一般较难获取,有就记录)
"role_id": "1", // String 玩家游戏id
"role_name": "玩家", // String 玩家游戏昵称
"user_name": "xxxxx", // String 玩家账号标识
"record_time": "2021-04-16T16:12:13+08:00" // datetime 数据产生时间
// 以下是客户端的全局通用属性,只需要在注册、登入、登出、充值这四个地方加上即可。
// 可以理解为客户端的这些属性,是需要客户端传值过来,才能获取到。
"client_ip": "8.8.8.8", // String 客户端ip
"device_id": "xxxxxxxx", // String 客户端设备唯一id
"device_model": "vivo xxx", // String 客户端设备型号
"device_os": "android", // String 客户端设备系统
"device_memory": 2785, // Number 客户端内存大小
"device_os_version": "9", // String 客户端系统版本
"device_network": "wifi", // String 客户端网络环境
"device_language": "zh", // String 客户端语言
"device_tz": "CST", // String 客户端时区
"device_country": "CN", // String 客户端国家
"app_ver": "1.1.1", // String app版本
"app_open_time": 10.53, // String Number app打开时间,当此打开累计
}

复制

服务端埋点不区分sub_event
,事件统一用event
来识别。事件属性用event_data
注册

event: reg
触发条件:玩家完成游戏注册/创角的时候触发
完整内容:

{
"event": "reg", // String 服务端埋点事件(注册)
"base_data": base_data, // Json 客户端全局通用属性(含客户端的全局通用属性,见上面定义)
"event_data": "null" // Json/String 事件特有属性集合
}

复制

登入

event: login
触发条件:玩家登入游戏后触发
完整内容:

{
"event": "login", // String 服务端埋点事件(登入)
"base_data": base_data, // Json 客户端全局通用属性(含客户端的全局通用属性,见上面定义)
"event_data": { // Json/String 事件特有属性集合
"login_type": 1 // String 登入类型(比如重连,打开app重新登入)
}
}

复制

登出

event: logout
触发条件:玩家登出游戏后触发
完整内容:

{
"event": "logout", // String 服务端埋点事件(登出)
"base_data": base_data, // Json 客户端全局通用属性(含客户端的全局通用属性,见上面定义)
"event_data": { // Json/String 事件特有属性集合
"login_time": "2021-04-16T16:12:13+08:00" // String 登入时间
}
}

复制

充值

event: pay
触发条件:玩家充值成功后触发
完整内容:

{
"event": "pay", // String 服务端埋点事件(充值)
"base_data": base_data, // Json 客户端全局通用属性(含客户端的全局通用属性,见上面定义)
"event_data": { // Json/String 事件特有属性集合
"order_channel": "wx", // String 支付渠道(官方、第三方)
"order_channel_sub": "card",// String 支付子渠道(支付子渠道,比如第三方的卡、网银)
"product_id": "id_xxx", // String 商品id
"game_bill_no": "uuid", // String 游戏订单id
"plat_id": "uuid", // String 平台订单id
"money": 100, // Number/Decimal 获得<虚拟货币>金额
"currency_amt": 1000, // Number/Decimal 充值<实际>金额
"currency_type": "USD" // String 币种
}
}

复制

资源

event: res
触发条件:玩家资源变动后触发(游戏币,金币,钻石之类的)
完整内容:

{
"event": "res", // String 服务端埋点事件(资源)
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"event_data": { // Json/String 事件特有属性集合
"res_type": 1, // Number 资源类型(钻石,绑钻,金币,点数等)
"type": 1, // Number 1:获取/2:消耗
"way": 99, // Number 获取/消耗途径
"res_count": 10, // Number 消耗/获取数量(消耗为负值)
"cur_count": 100, // Number 当前数量
"prev_count": 90 // Number 变化前数量
}
}

复制

属性

event: var
触发条件:玩家自身属性变动后触发(等级,经验,段位,积分等等)
完整内容:

{
"event": "res", // String 服务端埋点事件(资源)
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"event_data": { // Json/String 事件特有属性集合
"var_type": 1, // Number 属性类型(等级,经验,段位,积分等等)
"type": 2, // Number 1:增加/2:减少
"way": 100, // Number 增加/减少途径
"res_count": -10, // Number 增加/减少数量(消耗为负值)
"cur_count": 100, // Number 当前数量
"prev_count": 110 // Number 变化前数量
}
}

复制

物品

event: item
触发条件:玩家物品变动后触发(获取、丢弃、强化、升级、卖出、交易等等)
完整内容:

{
"event": "item", // String 服务端埋点事件(物品)
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"event_data": { // Json/String 事件特有属性集合
"item_id": 1, // Number 物品ID
"item_name": "xx武器", // String 物品名称
"type": 1, // Number 1:获取/2:丢弃/3: 强化/4:升级/5:卖出/6:交易
"is_bind": 1, // Number 是否为绑定
"expiry_date": "2099-12-01" // datetime 有效期,永久有效物品传2099-12-01
}
}

复制

任务

event: task
触发条件:玩家任务变动后触发(接收任务,完成任务等等)
完整内容:

{
"event": "task", // String 服务端埋点事件(任务)
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"event_data": { // Json/String 事件特有属性集合
"type":1, // Number 1:接收任务/2:完成任务
"task_id": "xx-1" // String 任务ID
}
}

复制

关卡/副本

event: chapter
触发条件:玩家触发关卡副本后触发(玩家开始,完成时分别埋点记录)
完整内容:

{
"event": "chapter", // String 服务端埋点事件(关卡/副本)
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"event_data": { // Json/String 事件特有属性集合
"type": 1, // Number 1:开始/2:结束
"chapter_id": "xx-1" // String 关卡/副本ID
}
}

复制

活动参与

event: activity
触发条件:玩家成功参与活动时埋点记录
完整内容:

{
"event": "activity", // String 服务端埋点事件(活动参与)
"base_data": base_data, // Json 客户端全局通用属性(见上面定义)
"event_data": { // Json/String 事件特有属性集合
"type": 1, // Number 活动类型,1:每日活动 2:节日活动 3:其他
"activity_id": "xx-1" // String 活动ID
}
}

复制

在线

event: online
触发条件:当前服务器玩家在线数量(每分钟触发一次),这个埋点比较特殊,是服务器全局的。不需要关注具体到某个玩家的事件。
完整内容:

{
"event": "online", // String 服务端埋点事件(在线)
"base_data": base_data, // Json 客户端全局通用属性(见上面定义,这里只需要区服信息即可,玩家信息不需要,这个是全区的)
"event_data": { // Json/String 事件特有属性集合
"online": 999 // Number 在线人数
}
}

复制

以上,可以视为一个项目的通用完整的埋点规范。每种游戏类型不一样,一些玩法不一样,可能会有一些特色的埋点,比如游戏可能会有一些公会模块,我们需要针对公会添加一些埋点。埋点的属性,我们也可以再丰富一些,比如活动参与,我们可能需要埋点活动参与的进度,需要添加一个进度标识之类的。这些都可以根据项目实际情况进行增减。

怎么去对接这些日志

客户端目前采用的是api的方式,提供一个api接口,实时上报。

服务器目前采用的是本地文件记录的方式,服务端开发按照约定的规则,实时写到本地埋点文件,然后数据这边,再通过flume/filebeat去抽取。

下集预告:《浅谈游戏数据(3)-数仓选型》

长按下图二维码关注,您将第一时间接收到最新的数据库相关的文章。

相关知识

浅谈游戏数据(2)
浅谈游戏数据(1)
浅谈游戏引擎
小学生竞赛性体育游戏有效组织策略浅谈
自在门】《逆水寒》浅谈PVP技术进阶个人心得
三国游戏之三国霸业 经典时刻回忆、浅谈 已推荐
游戏数据分析——解读LTV
逆水寒手游独珍进阶攻略 PVP属性发展方向浅谈
浅谈策略类型游戏
《名将之路》玩家攻略——浅谈置换宝物功能

网址: 浅谈游戏数据(2) http://www.hyxgl.com/newsview366611.html

推荐资讯