天天看點

遊戲日志分析5:資料庫與日志關聯分析

系列文章:

在日志分析場景中,我們經常會遇到資料分散在各地場景,例如:

  1. 使用者操作、行為相關的資料在日志中
  2. 使用者屬性、注冊資訊,資金、道具等狀态存在DB中
  3. 根據1和2我們需要對使用者進行分層統計,将最後的計算結果寫入DB中供報表系統查詢

是以為了做分析,我們要在日志服務Logstore和其他資料源中進行關聯查詢。以下我們就來看一個例子

使用者日志資料

下圖是一條經典的遊戲日志樣例,包括操作、目标、血、魔法值、網絡、支付手段、點選位置、狀态碼、使用者id。日志資料量一般規模會随着使用者數目+活動頻率相關,對一個大型遊戲而言,一天會有幾百G-幾TB規模。

遊戲日志分析5:資料庫與日志關聯分析

使用者元資訊

日志表示是增量的事件,一些靜态的使用者資訊,例如使用者的性别、注冊時間、地區等等是固定不變的,或者在用戶端很難擷取,不能夠列印到日志裡。我們把這些資訊稱為使用者元資訊。中繼資料一般和使用者數目相關,一般在幾百MB-十幾GB之間。

在分析日志的時候,需要結合事件日志和使用者元資訊才能拿到結果,例如性别對支付行為的影響。性别隻儲存在使用者元資訊中,在日志中則沒有。我們需要通過使用者id把日志和使用者資訊關聯起來分析。

下圖是使用者元資訊樣例,包括了使用者的id、昵稱、性别、年齡、注冊時間、賬戶餘額、省份。

遊戲日志分析5:資料庫與日志關聯分析

日志服務和MySQL關聯分析

  • 日志服務LogStore,提供日志的收集、存儲、查詢分析。
  • 日志服務ExternalStore,映射到RDS表。開發者把使用者資訊放到rds表中。

日志服務查詢分析引擎,提供跨LogStore和ExternalStore的查詢分析功能,使用SQL的join文法把日志和使用者元資訊關聯起來。使用者可以用來分析跟使用者屬性相關的名額。

遊戲日志分析5:資料庫與日志關聯分析

除在查詢過程中引用ExternalStore之外,日志服務還支援将計算結果直接寫入ExternalStore中(例如MySQL),友善結果的進一步處理。

如何使用?

1. 采集日志到日志服務

  1. 移動端采集
    1. Android
    2. iOS
  2. 伺服器日志采集 ilogtail

收集的日志樣例:

遊戲日志分析5:資料庫與日志關聯分析

2. 建立MySQL表,儲存使用者屬性

建立一張chiji_user表,儲存使用者的id、昵稱、性别、年齡、注冊時間、賬戶餘額、注冊省份。

CREATE TABLE `chiji_user` (
  `uid` int(11) NOT NULL DEFAULT '0',
  `user_nick` text,
  `gender` tinyint(1) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `register_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `balance` float DEFAULT NULL,
  `province` text,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8           

3. 建立ExternalStore

建立ExternalStore需要使用日志服務cli,首先安裝cli:

pip install -U aliyun-log-cli           

建立ExternalStore,指定所屬的project,以及ExternalStore的配置檔案/root/config.json

aliyunlog log create_external_store --project_name="log-rds-demo" --config="file:///root/config.json"            

/root/config.json的内容是:

{
    "externalStoreName": "chiji_user",
    "storeType": "rds-vpc",
    "parameter": {
        "vpc-id": "vpc-m5eq4irc1pucpk85frr5j",
        "instance-id": "rm-m5ep2z57814qsn97b",
        "host": "rm-m5ep2z57814qsn97b.mysql.rds.aliyuncs.com",
        "port": "3306",
        "username": "testroot",
        "password": "123456789",
        "db": "chiji",
        "table": "chiji_user",
        "region": "cn-qingdao"
    }
}           

在配置檔案中,指定外部存儲的名稱,以及外部存儲的參數。rds vpc需要指定的參數有:vpc-id ,rds執行個體id,内網域名、端口、使用者名、密碼、資料庫和表名、rds所屬region。

添加白名單

在rds中,添加白名單位址

100.104.0.0/16

如果是mysql,請添加該位址到安全組

4. 關聯分析

4.1 分析活躍使用者的性别分布

使用join文法,通過指定日志中的userid和rds中的uid相等來關聯日志和使用者屬性。

* | select  case gender  when 1 then '男性'  else  '女性'  end as gender , count(1) as pv 
  from log l join chiji_user u on l.userid = u.uid  group by gender   order by pv desc           
遊戲日志分析5:資料庫與日志關聯分析

4.2 分析不同省份的越活度

* | select  province , count(1) as pv   from log l join chiji_user u on l.userid = u.uid  group by province   order by pv desc           
遊戲日志分析5:資料庫與日志關聯分析

4.3 分析不同性别的消費情況

* | select  case gender  when 1 then '男性'  else  '女性'  end as gender , sum(money)  as  money  from log l join chiji_user u on l.userid = u.uid  group by gender   order by money  desc           

5. 儲存查詢分析結果

  • 首先建立結果表,該表存儲每分鐘的PV值:
CREATE TABLE `report` (
  `minute` bigint(20) DEFAULT NULL,
  `pv` bigint(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8           
  • 同樣的,參考上文建立ExternalStore的步驟,給report表撞見ExternalStore。

編寫SQL把結果儲存到report:

* |  insert into report select __time__- __time__ % 300 as min, count(1) as pv group by min           

SQL傳回的結果是最終輸出到rds中的行數。最終report表的結果:

遊戲日志分析5:資料庫與日志關聯分析

總結

日志服務強大的查詢分析能力,幫助遊戲開發者去分析使用者的習慣。同時,日志服務提供的ExternalStore功能,幫助使用者擴充日志的資訊。通過關聯日志和使用者屬性,擷取更多有價值的資訊。

遊戲日志分析5:資料庫與日志關聯分析