前端监控之用户行为监控实践2(数据统计mongodb)
一、技术栈介绍
我们当前的项目,后端是node 搭建,数据库是非关系型数据库 mongodb。
二、数据情况介绍
日志存储存储格式如下:

主要包括:
| key | 意义 |
|---|---|
| type | 当前访问类型 |
| actionTime | 访问时间 |
| content | 访问内容 |
| erp、fullname、orgname、fullOrgname | 用户信息 |
三、统计需求
需求1: 统计报表页面下,不同报表的pv、uv
mongodb 中数据的统计主要通过 aggregate(聚合)实现。
这里,我默认看到这篇文章的你,到mogodb有一定了解。如果 不了解的话,也没关系,我会给你提供一些资料,并对代码和思路进行详细说明。
步骤1:筛选,符合时间的,日志类型为页面,访问为报表页面的日志列表。
{ // mongodb的筛选使用 $match。$match: {type:'browse', // 类型为页面actionTime: { // 筛选时间范围内的'$gte': formatStart, // $gte 为mongodb中的大于操作符'$lte': formatEnd // $lte 为mongodb中的小于操作符},// 这里content 匹配,是根据业务而定,报表页面都具有 /analysis/event ; 且包含/table 的报表url 才是有效的// 这里通过 $all 实现同时满足的查询; $in 为其中一个满足;$nin 为其中一个不满足content: { '$all': [ /\/analysis\/event/, /table/] },},},
步骤2:取 content 中的tableName 部分
我们记录的页面URL 一定是完整的URL,但是最后展示的却是URL中的一部分。因此,需要对content 的内容进行截取。 通过上一篇文章,我们将URL统一成了全部为 /table/tableName 结尾的格式。 也就是说,我们只需要截取最后的tableName。
由于URL 不定长,因此我们无法直接指定截取索引。只能通过如下方式完成:
{// project 为聚合操作中的一个步骤,主要是进行映射$project: {_id: 1,// 通过 $split 对url 进行分割content: { '$split': ['$content', '/'] }, actionTime: 1, // 不变的话,则可以设置为 1erp: 1,fullname: 1},},{$project: {_id: 1,// 通过 $arrayElemAt 取最后一项,即tableNamecontent: { $arrayElemAt: ['$content', -1] },actionTime: 1,erp: 1,fullname: 1},},
步骤3:进行分组统计
从这里开始,uv 和 pv 的统计逻辑不同了。
先思考一下,pv 计算的是同一时间范围下,同一页面。pv分组聚合代码为:
{// $group 对应 sql 中的 group by$group: {_id: {content: '$content',// 分组一定是按天分组,用 $substrBytes 取天actionTime: { $substrBytes: ['$actionTime', 0, 10] },},// total 表示将分组统计的结果记为 totaltotal: { $sum: 1 }}
},
{// 由于我们是按 content 和 actiontime 进行分组的,分组后,需要将这两个值展开$project: { _id: 0, content: '$_id.content', total: 1, date: '$_id.actionTime' }
},
而,uv 统计的时候,是同时按人、时间、页面进行统计的。uv 统计代码为:
{// 先对每天每个人访问的内容进行去重$group: {_id: {actionTime: { $substrBytes: ['$actionTime', 0, 10] },erp: '$erp',fullname: '$fullname',content: '$content'},num: { $sum: 1 }}
},
{// 上面分组之后,再统计uv$group: {_id: {actionTime: '$_id.actionTime',content: '$_id.content',},total: { $sum: 1 }}
},
{$project: { _id: 0, content: '$_id.content', total: 1, date: '$_id.actionTime' }
},
需求2:统计整体平台下的PV、UV
平台整体下的pv 反而更简单了。
这是只展示统计代码。
PV统计代码:
{ $match: {type:'browse',actionTime: {'$gte': formatStart,'$lte': formatEnd}},
},
{$group: {_id: { actionTime: { $substrBytes: ['$actionTime', 0, 10] } },total: { $sum: 1 }}
},
{$project: { _id: 0, total: 1, date: '$_id.actionTime' }
},
uv统计代码:
{ // 筛选满足条件的数据$match: {type:'browse',actionTime: {'$gte': formatStart,'$lte': formatEnd}},
},
{// 按人去重$group: {_id: {actionTime: { $substrBytes: ['$actionTime', 0, 10] },erp: '$erp',fullname: '$fullname',},num: { $sum: 1 }}
},
{$group: {_id: {// 统计人数actionTime: '$_id.actionTime',},total: { $sum: 1 }}
},
{$project: { _id: 0, total: 1, date: '$_id.actionTime' }
},
参考文档
聚合相关的文档如下:
官方聚合实例书:
https://www.practical-mongodb-aggregations.com/front-cover.html
mongodb官方文档: 聚合支持的步骤
Aggregation Pipeline Stages — MongoDB Manual
mongodb官方文档:聚合所支持的操作符
Aggregation Pipeline Operators — MongoDB Manual
四、总结
写到这里,关于用户日志监控需求的记录也就结束了。
现在回过头看,这个需求其实不复杂,难的是,
学会如何使用mongodb 进行数据统计、以及收集到想要的信息。
总结的目的,也是强化收集信息和数据统计的能力。
其实互联网行业,很多时候也是经验主义,你像这种统计需求,在做过完整的前端监控的人看来,可能就是芝麻粒大的需求,但是对于我这种第一次近距离接触前端监控的人来说,却显得如此吃力。
后续还会更深的去了解,去总结其他类型的监控实现方式,也会展开对mongodb的学习和利用。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
