暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

浅谈游戏数据(2)-埋点规范

小灯数据 2021-07-01
1401

定义埋点规范

关于游戏数据埋点的一些说明,请参考前一篇文章(浅谈游戏数据(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)-数仓选型


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


                                                                                          文章转载自小灯数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                                                          评论