目录
umami是一个开源的轻量化的可私有部署的网站分析工具。自称是谷歌统计的替代品。
在用php复刻一份自己的统计工具时阅读了项目源码,作此笔记。
本文指本地数据库版本 也就是用MYSQL或者POSTGRESQL,不包含CLICKHOUSE。
session_uuid
访客跟踪机制,以访客ip和浏览器user-agent,确定访客。
生成算法
如下,主要为四个数据。分别时统计站点编号,访问域名,访客ip, 访客userAgent。
session_uuid = uuid(website_id, hostname, ip, userAgent);
stats
接口为stats,数据来自函数 getWebsiteStats
4个当前数据
接口键值 |
页面显示 |
含义 |
pageviews |
Views |
浏览量 |
uniques |
Visitors |
访客数) |
bounces |
Bounce rate |
跳出率(同个会话只有一个页面流量视为跳出) |
totaltime |
Average visit time |
平均页面浏览时间(第一个页面到进入最后一个页面的时间,不包含最后一个页面浏览时间) |
4个增量数据
增量时间是按查询时间差值往后计算一个跨度。
问题
- 统计维度导致的误差
维度为小时会出现一个问题,如果在59分访问一次,之后的01分再访问一次。这2次访问会被算作2个会话,2次跳出,无访问时间。
- 平均页面浏览时间偏小
由于平均页面浏览时间计算总总时长时计算问题,正确的值应该 总时间/(浏览数-跳出数-1) ,实际是 总时间/(浏览数-跳出数)
pageview
接口为pageview,数据来自函数 getPageviewStats
2个数据
接口键值 |
页面显示 |
含义 |
* |
Page views |
页面浏览数 |
distinct pageview.session_id |
Unique visitors |
访客数 |
metrics
接口为metrics,数据来自函数 getPageviewParams、getSessionMetrics、getPageviewMetrics。
该接口比较有意思,页面上的大部分图表都是来自这个接口。包括Pages、Referrers、Browsers、Operating systems、Devices、Countries、Events。主要可以分为
3个类型,分别为 views,visitors,Events。
- views ,按浏览数区分
- visitors,按会访客区分
- Events,按事件区分
同时这个接口同个type参数确定返回数据类型,支持时间跨度和其他条件筛选。此过程会同个查询类型和查询条件,确定查询表,关联表和查询语句。
api/website/1/metrics?type=url&start_at=1661274000000&end_at=1661360399999&country=RU
上诉接口表示按url统计,时间跨度是start_at 至 end_at,同时限定国家为RU.
主要收获
-
了解了无cookie的访客 标记方法。
在国内一ip为标识不是一个理想的选择,拨号上网定时换ip决定这个跟踪时间不会太长。
user-agent取决于用户升级频率,短时间内是个可以配合使用的数据。
-
metrics 接口十分强大,并且极富拓展性,增加统计维度也简单兼容。
得益于该接口,筛选的联动的设计上也会变得十分简单。
-
经过一天思考,发现这个会话跟踪方式其实非常适合我这种小站。
- 老客几乎没有,都是几乎新用户。
- 访问时间短,几乎不会超过2分钟。极少数会多停留,但不会长到标记信息改变。
- blog站也不太需要cookie这个功能,甚至是该用户标识方案以足以应对
- 该用户标识模式几乎无法判断新老用户,也就是说忠实度这样数据是不存在的。反而博客站比较关心的页面访问量,访问时间和浏览路线等数据刚好能应付。