发布于 

自己搭建简易数据统计模块

最近把 blog 从 octopress 切换到了 hexo,又试用了两个 hexo 模板。直到现在的模板也真是够折腾的. 之前一直用 baidu 的数据统计,因为第三方比较臃肿,因此想考虑自己做一个简单的统计模块。

主要的步骤如下:

  • 通过 js 收集统计需要的元数据,然后把元数据打到nginx;
  • 通过nginx+lua 把元数据存储到 mongo;
  • 后台启动守护进程运行一个 golang 程序来处理元数据,然后将数据分析后的结果放到 mongo 中;
  • 前端页面通过 ajax,调用nginx + lua 查询 mongo 的数据
  1. 元数据格式暂时定为:

js 采集的元数据为:

1
2
3
4
5
6
7
8
9
10
11
{
"u_id" : "WyYznde8T", //cookie,用来标识一个 uv
"agent" : "Mozilla/5.0*(Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML# like Gecko) Chrome/56.0.2924.87 Safari/537.36",
"title" : "自己搭建简易数据统计模块|一个phper的博客", //页面标题
"udata" : "", //用户数据,因为暂时没有用户中心,为空
"rf" : "http://guojianxiang.com/", //referer
"url" : "http://guojianxiang.com/posts/2016-08-25-LocalSite_DataStatistics.html", //页面 url 地址
"active" : 1, //用户操作状态码,暂定 1:进入页面;2:离开页面
"page_id" : "/posts/2016-08-25-LocalSite_DataStatistics.html", //一个页面的唯一标识
"page_ranstr" : "CECL4HuDK" //随机生成的字符串,防止 js 请求被浏览器缓存住
}

在 nginx 和 lua 层,我又追加了几个参数:

1
2
3
4
{
"create_time": 1488268223, //采集时间
"ip": "210.56.60.175", //请求客户端 ip
}

备注:后期可以考虑加入地址等信息

所以,最终进入 mongo 的元数据为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"_id": ObjectId(58b52bbf4dc9a6a37674356c),
"page_id": "/posts/2015-09-01-About_HttpStatus200_FromCache_And_304_NotModified.html",
"create_time": 1488268223,
"rf": "https://www.google.com.hk/",
"ip": "210.56.60.175",
"active": 1,
"udata": "",
"page_ranstr": "mPaCbOAvQ",
"url": "http://guojianxiang.com/posts/2015-09-01-About_HttpStatus200_FromCache_And_304_NotModified.html",
"title": "关于 HttpStatus 200(From Cache)和 304(Not Modified)的探索|一个phper的博客",
"agent": "Mozilla/5.0*(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML# like Gecko) Chrome/50.0.2661.102 Safari/537.36",
"u_id": ""
}
  1. golang 守护进程分析元数据:
1
2
3
4
5
6
7
8
9
#!/bin/bash
while true
do
/$GOROOT/bin/site_analytics -c /$GOROOT/src/site_analytics/conf/online.conf

date_now=`date +"%Y-%m-%d %H:%M:%S"`
echo $date_now" Excute done ..."
sleep 30
done

目前流量较小,守护进程会每隔 30s 分析一次元数据。

做这件事情的初衷不是单独为了自己重复造轮子,单独再写一个统计模块,主要是为了学习下 lua 和 golang。

短期的打算:用 golang 重写之前的 robot,嗯,练手。