前端监控之用户行为监控实践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, // 不变的话,则可以设置为 1
          erp: 1,
          fullname: 1
        },
      },
      {
        $project: {
          _id: 1,
          // 通过 $arrayElemAt 取最后一项,即tableName
          content: { $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 表示将分组统计的结果记为 total
    total: { $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的学习和利用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java监控系统源码是基于Java编写的一种软件,用于实时监控和管理计算机系统的运行状态。其源码通常包含了以下几个关键组件和功能。 1. 数据采集:源码中会包含数据采集模块,用于定时收集计算机系统的各项指标数据,如CPU利用率、内存使用情况、磁盘IO等。通过Java提供的API和第三方库,可以实现对系统资源的动态监控。 2. 数据存储:采集到的数据需要进行持久化存储,源码中会涉及到数据库的操作。可以使用关系型数据库如MySQL或非关系型数据库MongoDB来存储数据,通过Java的数据库连接操作来实现数据的保存和查询。 3. 数据处理和分析:监控系统源码还会包含对采集到的数据进行处理和分析的模块。其中,数据处理模块会对原始数据进行清洗和转换,使其符合业务需求;数据分析模块则是为了从大量的数据中提取出有价值的信息,进行数据挖掘和趋势分析。 4. 告警和通知:当监控指标超过设定的阈值时,监控系统会触发告警机制。通过源码实现告警模块,可以在特定条件下发送警告信息给管理员,例如通过邮件、短信或APP推送等方式。 5. 用户界面:监控系统源码还会包含用户界面的开发,用于展示监控系统的各项指标和告警信息,方便管理员进行系统运行状态的查看和管理。常见的用户界面技术包括Java Swing、JavaFX或Web前端开发等。 总之,Java监控系统源码具有数据采集、存储、处理和分析、告警和通知、用户界面等关键功能。通过对这些组件的开发和整合,可以实现一个全面的监控系统,帮助管理员及时了解和管理计算机系统的运行状态,提高系统的可靠性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值