前端监控和前端埋点

数据监控与前端埋点,傻傻分不清楚。什么是前端监控,什么是数据埋点。为什么把他们两个放在一起,他们之间是什么关系,这个问题我探究了很久。前端监控是在理念,前端埋点是实施方法。

  • 前端监控:我们需要掌握用户的数据,通过用户的行为数据,设备数据,浏览数据。对这些数据进行分析与处理,这样才能更好的解决公司未来的发展需要以及广告投入的百分比。
  • 前端埋点:为了实现上述的前端监控理念,我们就需要一些解决方案。前端埋点就是我们的解决方案。如何埋点,就要根据具体的情况进行埋点。

现有的前端埋点方案总结

手动埋点

  • 命令式埋点

顾名思义,我们手动的从浏览器获取用户数据信息(跳转网站,浏览时间,设备信息等),并通过ajax发送给后台。后台拿到前端埋点搜集的数据后,对数据进行分析,从而得到用户行为数据。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    这是一个前端埋点测试页面
</body>
<script> (function() {
     console.log(132) let data = {
    } data.url = document.URL //文档当前地址 data.domain = document.domain //文档的当前域名 data.referrer = document.referrer //文档的源地址 data.title = document.title //文档题目 data.innerHeight = window.innerHeight data.innerWidth = window.innerWidth console.log(data) }()) </script>
</html>

上面的就是一个埋点。在这里埋点一般都是为了获取用户设备信息、跳转信息、首屏加载速度、白屏时间等。

  • 声明式埋点
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    这是一个前端埋点测试页面
    <button id='button'>点击埋点</button>
</body>
<script> let button = document.getElementById('button') button.addEventListener('click',() => {
     let data = {
    } a.url = document.URL //文档当前地址 data.domain = document.domain //文档的当前域名 data.referrer = document.referrer //文档的源地址 data.title = document.title //文档题目 data.innerHeight = window.innerHeight data.innerWidth = window.innerWidth console.log(data) },false) </script>
</html>

手动埋点特点

  • 优点
    • 灵活:面对任何业务情况都可以进行埋点,获取到对应的数据。
  • 缺点
    • 页面卡顿:每一个埋点都需要进行一次ajax的发送,那么问题来了,对于一个大型页面而言,他本身就请求很多的数据。对于V8引擎而言,他并行请求的数量是有限的,超过请求上限的请求将会在队列中存放等待。
    • 无法解耦:如上图代码所示,可以发现,这种埋点的方式是在业务代码中进行埋点。在一个足够大的系统情况下,埋点完全嵌套在业务代码中,在多出埋点不好维护。

无埋点

顾名思义,没有埋点,那么没有埋点又是怎么埋点的呢?我理解了很久。

无埋点:就是在不在业务逻辑中进行埋点代码的书写,而是引入埋点sdk(埋点脚本)来实现埋点的。

常见的无埋点

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    这是一个前端埋点测试页面
    <button id='button'>点击埋点</button>
</body>
<script> var _bury = _bury||[]; _bury.push(["_testData","网站标识"]); (function(){
     var jsnode = document.createElement('script'); jsnode.type='text/javascript'; jsnode.async=true; //这里填入js sdk链接 jsnode.src= 'xxxxxxx/bury_test.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(jsnode,s); }) </script>
</html>

上述代码会创建一个scripyt的脚步并引入埋点sdk,并执行这段sdk。

(function() {
   
  var buryData = {
   };
  //常用信息
  if (document) {
   
    //域名
    buryData.domain = document.domain || '';
    //标题
    buryData.title = document.title || '';
    //访问来源
    buryData.referrer = document.referrer || '';
    //分辨率
    buryData.sw = window.screen.width || 0;
    buryData.sh = window.screen.height || 0;
    //设备信息
    buryData.lang = navigator.language || '';
    buryData.ua = navigator.userAgent || '';
    //页面加载时间
    buryData.loadT = window.performance.timing.domContentLoadedEventEnd - window.performance.timing.navigationStart || 0;
  }
  //整理埋点数据
  var arg = [];
  if (buryData) {
   
    for (var i in buryData) {
   
      arg.push(encodeURIComponent(i) + '=' + encodeURIComponent(buryData[i]));
    }
  }
  var args = arg.join('&');
})

在脚本中在写入ajax发送数据到对应的接口。但是为了解决页面请求过多的情况,通常使用js脚本创建image对象,在让image脚本src指向后端接口,并拼接上数据。

无埋点的特点

  • 优点

    • 方便维护:应为是通过sdk的形势引入的,这样只需要维护对应的脚本即可。
    • 解耦性好:埋点代码没有与业务代码相互嵌套。
  • 缺点

    • 给数据传输增加压力、无法定制
    • 流量和采集的数据过于庞大,服务器性能压力山大

可视化埋点

通过集成封装sdk的形式,封装成一可视化的操作界面。目前很多商用软件比如Mixpanel、TalkingData、诸葛IO、腾讯MTA等都可以用来可视化埋点,用户仅需要点击想要监测的元素,然后对该埋点起个对应的名字,并给个编号,就进行了埋点。

如何操作这里我没有深究,在后期的学习中我会对其进行一个探究,并上传到博客和大家分享。


总结

现在大部分的产品都有做埋点,更具不同的需求使用不同的埋点方式。