实现pv uv统计_聊聊前端监控(二)--行为监控的技术实现

fde58651aa10f6601989a4cfa684e684.png

上一篇梳理了前端监控的主要场景和类型,从本文开始,讨论下我知道的一些技术实现。前端黑科技层出不穷,个人眼界有限,尽量把了解到的实现方式都罗列出来,希望对大家有些启发,同时也欢迎流言讨论。

限于篇幅,按照第一篇的场景来进行拆分,本文只讨论行为监控的技术实现方案:

总体思路

监控系统设计的总体思路上,最重要的是“无痛”或者“无侵入”

任何监控代码,不在业务系统需要自定义的情况下,需要侵入到业务代码里面,都是不可取的设计。同时接入配置应该尽量简单。

如何做到无痛?主要方式是拦截和重写

比如,很多监控系统都会重写 xhr(XMLHttpRequest)/ fetch来拦截请求, 例子:xhr 重写上报示例代码

proxyAjax.send = XMLHttpRequest.prototype.send;proxyAjax.open = XMLHttpRequest.prototype.open;// 重写 openXMLHttpRequest.prototype.open = function(){// 先在此处取得请求的url、method等信息并记录等处理// 调用原生 open 实现重写proxyAjax.open.apply(this, arguments);}// 重写 sendXMLHttpRequest.prototype.send = function () {// 调用原生sendproxyAjax.send.apply(this, arguments);// 在onleadend ontimeout等事件中上报,上报处理函数 handleMonitorthis.onloadend = function() {handleMonitor(someParams)}}// 上报函数handleMonitor = function(params) {this.send(params)}

比如,在对页面事件的点击记录时,给document对象绑定click事件收集点击就是拦截的一种。

例子:要注意的是在捕获阶段绑定,防止业务代码中的阻止冒泡捕获不到事件

document.addEventListener("click", function(event) {handleClick(event);}, false);

1、用户使用场景

下面按照统计维度来说明一下统计指标的技术实现:

1.1 pv,uv

通常的方式对访问当前域名的一个用户植入一个cookies用于标识用户身份,以传统的统计口径来看,对于pv,每次刷新页面都 + 1,对于uv,在今天内访问的用户只会 + 1。这里有几个注意点:

  • 1、统计口径:对于不同的产品,pv的统计口径可能是不一样的,有的要求首页完全加载完才算一个pv,有的要求曝光1/4,有的需要dom加载完。根据需求的不同,绑定上报事件的时机也不同。对于监控系统来说,一般会实现通用口径的pv统计,如果有其他不同需求,可以走后文提到的自定义上报流程。
  • 2、防刷:对于pv/uv,有很多刷流量的方式,比如删掉cookies,重新加载一次。对有账号体系的系统,cookies和账号绑定就可以防刷。对没有账号体系的系统,可以使用ip来限制,同ip发起多少次都算一个uv。防刷是个比较有趣的话题,限于篇幅,这儿简略提一下,有兴趣的同学可以一起进一步探讨。
  • 3、spa网页:由于前端路由的存在,spa结构的网页,传统的pv很难反应网站的真实状况,推荐使用uv或者rpv来观测。

1.2 ip数

访问ip数的统计有多种方式,这里介绍两种主要方式:

  • 1、接入层直接记录:在接入层入口直接记录来源ip,收到就 + 1,如有需要详情也可以记录更多信息,这种方式可能会增加当前系统的一些负担。改造成MQ或者其他的异步方式,可以减轻对主干系统的影响。
  • 2、分析日志:主流做法,分析接入层日志,对日志做统计即可得出ip数。

1.3 跳出率

根据上文提到的跳出率公式,需要计算当前页面的打开次数,对于非spa且非hash的页面,都可以用接入层统计的方式来计算url的打开次数。对使用hash路由的spa页面,需要绑定hashchange事件或者框架提供的路由事件来进行上报。总访问页数同理。

1.4 平均访问时长 / 平均访问深度

根据计算公式,统计方法类似跳出率。

1.5 会话数量

这个没太多好说的,服务端统计就完事了。

1.6 路由切换量(rpv)

重点讲下这个,随着前端路由系统的普及,当前 spa 是web系统的主要形态之一,对spa系统来说,统计的实现方式和 mpa 系统有很多的不同,一般来说统计路由切换量(rpv)需要手动开启配置,比如阿里云arms就需要配置enableSPA = true

前端路由主要是通过hashhistory api来实现的,使用hash路由时hash值不会上传服务器,需要前端来做捕获上报,而history api的情况url是变化的,可以在后台统计到。

hash路由的捕获上报实现:

// hash路由绑定onhashchange事件if("onhashchange" in window) {window.onhashchange = handler}// history api类型路由的上报// 监听popstatewindow.addEventListener('popstate', (event) => {// 上报处理handler()})

如果前端需要通过 history api来统计,这里也给出一些代码实例

// history 只监听 popstate事件可以处理掉大部分的api触发window.addEventListener("popstate", function() {// 上报逻辑});// pushState 和 replaceState 不会触发 popstate 事件,可以采用类似xhr的方式重写

2、埋点,点击流

埋点的实现上面其实已经提到了,本质上就是对事件的拦截,这里主要提一下自定义埋点上报的实现。

2.1 自定义埋点

自定义埋点上报,涉及到各监控系统api设计,一般来说,各监控系统的接入sdk都会给出自定义上报的方法,供业务系统自己控制上报时机和上报内容。 举例:

// 自定义埋点实例,指定类型type,服务器解析数据并呈现monitor.diysend({type:'monitor', value: 't1=1&t2=2'})

2.2 点击流

点击流其实是通过根据统一的用户标识把一系列的事件上报的用户行为串起来的一种方式,结合以上的数据上报和页面切换,可以构造出一个基于时间轴的用户点击操作流程。 示例页面

3958e6f4f598f8a9ff308ba155481c6f.png
点击流示例页面

3、场景回放,录屏

场景回放和录屏的技术实现,总的来主要有如下实现方式:

  • dom 背景 + 回放操作:用当前页面做背景,方法:1、iframe加载目标页面放在下层做背景,2、用phantomjs截取当前页面做背景,在背景之上根据上报数据重现用户操作。这种实现不用特殊上报,只需要有点击流的坐标数据即可。但其最大的问题在于回放操作和背景没有交互,即使在背景中实现模拟操作,也可能存在一定的延迟。
  • html2canvas:顾名思义,此方案的思路是把当前dom结构转化成一张截图,然后按照每秒24帧上传图片,后端和用户操作组合一下,组成一个可播放视频。这种方法的悲催在于上传的图片体积过大,导致出现一些性能问题。
  • chrome 插件方式:使用chrome的插件权限实现录屏,缺点是完全没有兼容性,而且装插件对用户体验不友好。
  • dom 上报重建:思路是上报dom并重建,实现:上报首次的dom结构做基础,后续使用增量上报方式,上报dom结构的变化,然后通过后端平台,将数据组装成可播放的视频,这种方式的典型代表有rrweb等实现。这种方式对于canvas之类的非dom表现元素,需要做特殊处理,但已经是个比较成熟可用的方案了。

总的来说,以上录屏方案中,dom上报回放是一个比较成熟的方案了,也有类似rrweb等成熟实践,比较不容易遇到坑,可以考虑使用。

手已敲麻,行为监控的实现先写这么多吧,下篇开始总结下异常监控的技术实现。

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

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

相关文章

Science:揭示人类大脑进化机制

来源:细胞 概要:人类与其它灵长类动物的最大区别在于我们大脑的不同,这也是我们作为人类最特殊的标志之一。 人类与其它灵长类动物的最大区别在于我们大脑的不同,这也是我们作为人类最特殊的标志之一。 然而,人类与灵长…

单元格格式_单元格格式的用法你知道吗~~

想了解excel吗??? 想从小白变大神吗??? 快来look look excel单元格格式的用处吧!!!先来了解一下单元格格式的…

人工智能名人堂第54期 | 深度学习鼻祖:Geoffrey Hinton

来源:德先生 概要:近日,他因提出capsule 概念,推翻反向传播再次引发广泛关注与热议。 Geoffrey Hinton,被称为“神经网络之父”、“深度学习鼻祖”,他曾获得爱丁堡大学人工智能的博士学位,并且为…

eureka和zookeeper的区别

首先我们先说下: RDBMS>(MySql,Oracle,SqlServer等关系型数据库)遵循的原则是:ACID原则(A:原子性。C:一致性。I:独立性。D:持久性。)。 NoSql> &#…

struts2 防止重复提交 与 进入等待画面

演示重复提交的错误&#xff1a; 相关文件&#xff1a; struts.xml <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE struts PUBLIC"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN""http://struts.apache…

征服围棋之后 谷歌DeepMind宣布利用AI对抗乳腺癌

来源&#xff1a;全球人工智能 概要&#xff1a;在征服围棋世界之后&#xff0c;DeepMind公司将许多机器学习资源用于提升医疗水平&#xff0c;今天&#xff0c;DeepMind宣布利用人工智能对抗乳腺癌。 在征服围棋世界之后&#xff0c;DeepMind公司将许多机器学习资源用于提升医…

rabbitmq详细入门文档+springboot结合使用

在介绍RabbitMQ之前&#xff0c;我们先来看下面一个电商项目的场景&#xff1a; 商品的原始数据保存在数据库中&#xff0c;增删改查都在数据库中完成。 搜索服务数据来源是索引库&#xff08;Elasticsearch&#xff09;&#xff0c;如果数据库商品发生变化&#xff0c;索引库…

Cognizant:走向2028年将诞生的21个新工作

来源&#xff1a;亿欧 概要&#xff1a;未来十多年&#xff0c;伴随着AI等新技术的发展&#xff0c;部分工作岗位可能消失&#xff0c;但也可能创造出很多新的工作机会。 未来十多年&#xff0c;伴随着AI等新技术的发展&#xff0c;部分工作岗位可能消失&#xff0c;但也可能创…

delphi excel取批注所在的行列_excel技巧教程丨34个常用Excel小技巧,助你玩转职场!...

技巧1&#xff1a;单元格内强制换行在单元格中某个字符后按alt回车键&#xff0c;即可强制把光标换到下一行中。技巧2&#xff1a;锁定标题行选取第2行&#xff0c;视图 - 冻结窗格 - 冻结首行(或选取第2行 - 冻结窗格)冻结后再向下翻看时标题行始终显示在最上面。技巧3&#x…

Spring Security用户认证和权限控制(默认实现)

1 背景 实际应用系统中&#xff0c;为了安全起见&#xff0c;一般都必备用户认证&#xff08;登录&#xff09;和权限控制的功能&#xff0c;以识别用户是否合法&#xff0c;以及根据权限来控制用户是否能够执行某项操作。 Spring Security是一个安全相关的框架&#xff0c;能…

2017年数据可视化的七大趋势!

来源&#xff1a; 全球人工智能 概要&#xff1a;随着科技的不断进步与新设备的不断涌现&#xff0c;数据可视化领域目前正处在飞速地发展之中。 随着科技的不断进步与新设备的不断涌现&#xff0c;数据可视化领域目前正处在飞速地发展之中。ProPublica的调查记者兼开发者Lena…

struts2中用interceptor实现权限控制

在jsp servlet中我们通常使用Servlet Filter控制用户是否登入&#xff0c; 是否有权限转到某个页面。在struts2中我们应该会想到他的拦截器(Interceptor)&#xff0c; Interceptor在struts2中起着非常重要的作用。很多struts2中的功能都是使用Interceptor实现的。 需求&#xf…

CGAL的三维点集

CGAL提供了几种处理点集的算法&#xff0c;从形状检测到通过标准点集处理工具进行的表面重建。 虽然这些算法不强制使用特定的数据结构&#xff0c;但该软件包提供了一个3D点集结构&#xff0c;使用户更容易处理附加属性&#xff0c;如法向量、颜色、标签&#xff0c;并在其上调…

2018年AI智商将达到多少?未来智能实验室启动第三次世界AI智商评测

来源&#xff1a; 人工智能学家 概要&#xff1a;21世纪以来&#xff0c;人工智能领域陆续爆发很多重要事件。其中最吸引人们眼球的&#xff0c;当属2016年战胜了人类围棋冠军并开始能够从0自我学习的AlphaGo。 一.人工智能能否超越人类智慧的争议 21世纪以来&#xff0c;人工智…

二进制函数_Go二进制文件逆向分析从基础到进阶——MetaInfo、函数符号和源码文件路径列表...

书接前文&#xff0c;本文主要介绍 Go 二进制文件中 Meta Information 的解析&#xff0c;与函数符号和源码文件路径列表的提取。最后详细介绍一下 Moduledata 这个结构。传送门&#xff1a;Go二进制文件逆向分析从基础到进阶——综述05Meta information>>>>5.1 Go…

七大科技巨头统治世界?

来源&#xff1a;亿欧智库 概要&#xff1a;我想无论是业内人士还是普通用户&#xff0c;都会思考为什么是他们成为最大的公司&#xff1f; 2017年秋天&#xff0c;随着腾讯和阿里巴巴两家中国公司市值的不断上涨&#xff0c;全球市值头部公司刚好是七大科技巨头&#xff08;下…

用户权限管理——DB设计篇

来源&#xff1a;http://www.noahweb.net/mail/2/Project.htm#biao B/S系统中的权限比C/S中的更显的重要&#xff0c;C/S系统因为具有特殊的客户端&#xff0c;所以访问用户的权限检测可以通过客户端实现或通过客户端服务器检测实现&#xff0c;而B/S中&#xff0c;浏览器是每一…

雷克世界:Gyrfalcon加入芯片角斗场,又一款改变AI界的产品问世

来源&#xff1a;雷克世界 概要&#xff1a;随着人工智能产业规模扩大&#xff0c;众多巨头和初创公司纷纷加入人工智能芯片领域。 随着人工智能产业规模扩大&#xff0c;众多巨头和初创公司纷纷加入人工智能芯片领域&#xff0c;今天来了解一家旨在开发低成本、低功耗、高性能…

报告怎么看_体检报告怎么看? 超实用的阅读指南来了!

体检报告怎么看&#xff1f;超实用的阅读指南来了&#xff01;要点概括除了禁食禁水可以吞口水吗&#xff1f;这样的问题&#xff0c;还有胆固醇、甘油三酯、胆红素…这些指标都是什么意思&#xff1f;出现升高或降低提示了怎样的身体变化&#xff1f;九图带你读懂&#xff01;…