把 Nginx access_log 接入 Google Analytics 的方法和几个问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
eason1874
V2EX    NGINX

把 Nginx access_log 接入 Google Analytics 的方法和几个问题

  •  
  •   eason1874 2020-03-05 21:59:09 +08:00 2196 次点击
    这是一个创建于 2125 天前的主题,其中的信息可能已经有所发展或是发生改变。

    由于不想安装日志分析软件,所以我就想自己弄个 access_log 分析,经过一段时间折腾,发现要做个与第三方统计平台相当的分析系统的工作量还是挺大的。然后我就放弃自建了,计划把数据接入统计平台。

    说到统计平台,百度统计在功能上足以满足我,而且实时性高,但百度统计没有 HTTP API 给提交自定义数据,遂放弃。后选择 Google Analytics,虽实时性不如百度,但有 Measurement Protocol 接口,功能更丰富。

    我服务器软件是 Nginx + ngx_lua ,找了一下,目前网上还没有比较靠谱的接入教程,都是通过 post_action 或者 mirror 实现数据提交,缺点较多,比如受 location 段影响 ,比如不能获取到 ngx_lua 处理后的 headers 等。

    所以我研究并用了个新方法,这里分享给各小站长作为参考。

    我的方法

    1、通过 lua_shared_dict 设置一个内存空间。

    2、在 Nginx http 加一段 log_by_lua 代码,内容是把 Analytics 需要的字段包装好和一个时间戳通过 ngx.shared.DICT.rpush 存到内存数组最后。

    3、在 Nginx http 加一段 init_worker_by_lua 代码,内容是通过 ngx.timer.every 创建一个每秒执行一次的定时任务,回调函数内容是通过 ngx.shared.DICT.lpop 在内存数组里取出最前面的数据,循环取出 20 条,每条都通过时间戳计算出距离当前秒数,作为 qt 参数附加到提交内容里,然后通过 resty.http 提交 Analytics 接口。

    特点

    数据字段是在 log_by_lua 阶段生成的,不受 location 匹配的影响,不需要动具体的 server 配置。而且几乎可以取到所有数据用来提交,比如可能被 lua filter 改变的 http status,request_time,bytes_sent 等。注:非 HTTP GET 请求也有 log 阶段,所以处理代码需要判断 ngx.var.request_uri 是否 nil 和 ngx.var.request_method 是否 GET。

    提交数据先通过 lua_shared_dict 存到内存再异步读出来提交,可以实现一次提交多条,比每一个请求都提交一次的做法节省资源。注:定期提交造成的时间差通过 qt 参数修正,Analytics 允许最大 4 个小时的修正。

    数据生成时把 ngx.var.host 用作 dh 域名参数,把 ngx.var.sent_http_content_type、ngx.var.status 等用作 cd 维度参数,可以在 Analytics 依据这些内容创建不同数据视图,比如特定域名、特定文件类型、特定服务器、特定 HTTP 状态的数据视图,如果不过滤那就是所有服务器所有请求的总数据视图。

    我的问题

    Analytics 数据量限制说标准帐号每天发送会话限制 20 万,超过了延迟处理或不处理,但一个会话可以有多个匹配。浏览器的 analytics.js 怎么计算会话我知道,一个浏览器打开就是一个会话,期间用户导致发送的每一条命中数据就是匹配。

    那么通过 Measurement Protocol 发送数据该怎么计算会话呢?是按数据里的客户端 cid,用户 uid,IP 替换 uip ?抑或就是请求接口的本地 IP 地址?

    像 http_status、content_type、bytes_sent 这三个大家会放到维度还是指标呢?我目前的选择是前两个放到维度,bytes_sent 放到指标。

    另外我这个方法有没有什么问题呢?或者大家有没有什么建议?

    请大家指出、建议,集思广益,也算是丰富网络资料,方便以后需要的小站长参考。

    2 条回复    2020-03-06 08:43:33 +08:00
    cydian
        1
    cydian  
       2020-03-06 07:07:25 +08:00   1
    发现要做个与第三方统计平台相当的分析系统的工作量还是挺大的???

    Matomo 开源统计程序欢迎你。PHP Yes !
    eason1874
        2
    eason1874  
    OP
       2020-03-06 08:43:33 +08:00
    @cydian 这我倒没想到。。。一开始想着有几条统计 SQL 够了,最近受灾影响需要比较多维度的统计发现不够用,然后试着写,感觉工作量太大了,然后就开始找统计平台,没想过找现成的开源程序。。。

    现在 Google Analytics 够用了,以后需要自建的时候就试试你推荐的。PHP Yes !我之前的数据入库和查询也是 PHP 写的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5271 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 08:13 PVG 16:13 LAX 00:13 JFK 03:13
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86