前端监控之用户行为监控实践2(数据统计mongodb)

news2025/1/10 10:55:22

一、技术栈介绍

我们当前的项目,后端是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的学习和利用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/366363.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Spring MVC】这一篇,带你从入门到进阶

目录 1、什么是MVC? 2、什么是 Spring MVC 3、如何学好 Spring MVC? 3.1、如何创建 Spring MVC 项目 3.1.1、使用Spring Initializr创建(推荐) 3.2、将 Spring 程序与用户(浏览器)联通 3.3、基础注解…

6.5 拓展:如何实现 Web API 版本控制,同时兼容无版本控制的原始接口?

第6章 构建 RESTful 服务 6.1 RESTful 简介 6.2 构建 RESTful 应用接口 6.3 使用 Swagger 生成 Web API 文档 6.4 实战:实现 Web API 版本控制 6.5 拓展:如何实现 Web API 版本控制,同时兼容无版本控制的原始接口? 6.5 拓展&#…

干旱预测方法总结及基于人工神经网络的干旱预测案例分析(MATLAB全代码)

本案例采用SPEI干旱指数,构建ANN和BP神经网络预测模型,并开展1~3个月预见期的干旱预测,对比分析干旱预测模型的适用性,为流域干旱预警和管理提供技术依据。 干旱预测 1 干旱预测方法 1.1 统计学干旱预测 根据历史降水或气温等…

【python】用plotly绘制正二十面体

文章目录顶点棱实现正二十面体plotly 的 Python 软件包是一个开源的代码库,它基于 plot.js,而后者基于 d3.js。我们实际使用的则是一个对 plotly 进行封装的库,名叫 cufflinks,能让你更方便地使用 plotly 和 Pandas 数据表协同工作…

设备树(配合LED驱动说明)

目录 一、起源 二、基本组成 三、基本语法 四、特殊节点 4.1 根节点 4.2 /memory 4.3 /chosen 4.4 /cpus 多核CPU支持 五、常用属性 5.1 phandle 5.2 地址 --------------- 重要 5.3 compatible --------------- 重要 5.4 中断 --------------- 重要 5.5 …

python攻陷米哈游《元神》数据?详情请看文章。。

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 《原神》是由米哈游自研的一款全新开放世界冒险RPG。 里面拥有许多丰富得角色,让玩家为之着迷~ 今天,我们就来用python探索一下原神游戏角色信息! 标题大家看看就好了哈~&#xff08…

DNS,DNS污染劫持,DNS加密

1. DNS(Domain Name System)DNS(Domain Name System), 也叫网域名称系统,是互联网的一项服务。它实质上是一个 域名 和 IP 相互映射的分布式数据库.DNS(Domain Name Server,域名服务…

医疗保健和智慧城市服务将引领5G物联网采用

Juniper Research预测,到2026年,全球5G物联网连接将达到1.16亿,而2023年仅为1700万。该公司预测,医疗保健部门和智慧城市服务将在未来三年推动这1100%的增长,到2026年占5G物联网设备的60%以上。5G物联网技术的超低延迟…

配置Flutter开发环境

一、在Windows上搭建Flutter开发环境 1、去flutter官网下载其最新可用的安装包,下载地址:https://flutter.dev/docs/development/tools/sdk/releases 。 注意,Flutter的渠道版本一直在不断的更新,请以Flutter官网为准。 另外&…

自动化测试框架对比

Robot Framework(RF) 链接:http://robotframework.org/ Robot Framework(RF)是用于验收测试和验收测试驱动开发(ATDD)的自动化测试框架。 基于 Python 编写,但也可以在 Jython&…

Android 基础知识4-3.1 TextView(文本框)详解

一、前言 TextView就是一个显示文本标签的控件,就是用来显示文本。可以在代码或者 XML中设置字体,字体大小,字体颜色 ,字体样式 (加粗级斜体),文字截断(比如:只显示10个字…

【Python数据挖掘入门】一、数据挖掘概况

一、数据挖掘概况 数据挖掘是指从大量的数据中,通过统计学、人工智能、机器学习等方法,挖掘出未知的、具有价值的信息和知识的过程。 典型案例: 啤酒与尿布杜蕾斯与口香糖杜蕾斯与红酒 数据挖掘是一门交叉学科,覆盖了统计学、数…

正则表达式常见语法_findall方法、r原串的使用

正则表达式常见语法 re.findall()方法 findall()方法中flag参数的作用 运行结果为 运行结果是空列表, 以上说明,正则表到时中的“点号”不能和换行符匹配。 如果匹配模式设置为re.DOTALL或者re.S&#xff…

类与对象(this 关键字、构造器)

目录一、面向对象二、类与对象三、对象内存图四、成员变量和局部变量区别五、this关键字六、构造器/构造方法一、面向对象 一种编程思想:也就是说我们要以何种思路,解决问题,以何种形式组织代码 当解决一个问题的时候,面向对象会把事物抽象成…

23年六级缓考

【【六级674】3月六级规划+许愿成功的小伙伴记得来还愿啦!!(四六级延期考2周冲刺计划)】https://www.bilibili.com/video/BV1nx4y1w7fz?vd_source=5475f4f6010a81c8e6d4789af8e1a20f 作文

「TCG 规范解读」初识 TPM 2.0 库续一

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alli…

前端预防XSS攻击全攻略

如何防止XSS攻击 一、是撒子 XSS攻击(跨站点脚本攻击),就是黑客恶意篡改你网页的前端代码,在里面注入一些恶意的 htmljavascript的脚本,并在你的浏览器内运行,获取你的信息,或者进行一些恶意操…

3年自动化测试经验,面试连20K都拿不到,现在都这么卷了吗····

我的情况 大概介绍一下个人情况,女,本科,三年多测试工作经验,懂python,会写脚本,会selenium,会性能,会自动化,然而到今天都没有收到一份offer!从2022年11月1…

Html 代码学习

场景:在页面中插入音频 代码 常见属性: src 音频的路径 controls 显示播放的控件 autoplay 自动播放 loop 循环播放 场景:在页面中插入视频 代码 常见属性: src 路径 controls 显示播放的控件 autoplay 自动播放 要配合muted 例如 autoplay muted loop 循环播放 链接 /…

MySQL 的体系结构、引擎与索引

MySQL的引擎与体系结构 体系结构 连接层 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限 服务层 第二层架构主要完成大多数的核心服务功能,如SQL…