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

作者 Gavin 日期 2016-08-25
自己搭建简易数据统计模块

最近把 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": ""
    }
  2. 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,嗯,练手。