前端埋点

 
前端埋点主要是为了服务运营人员采集用户行为数据,进行后续的数据分析工做。

前端监控和埋点能作什么

  • 数据监控(用户行为)
    • pv,uv
    • 记录操做系统
    • 用户在每个页面的停留时间(离开页面,进入页面)
    • 用户进入的入口
    • 用户在相应页面的触发行为,点击按钮
  • 性能监控 (js中的performance)
    • 用户的首屏加载
    • http请求响应时间
    • 页面渲染时间
    • 页面交互动画完成时间
      关键代码
let timing = performance.timing,
start = timing.navigationStart,
dnsTime = 0,
tcpTime = 0,
firstPaintTime = 0,
domRenderTime = 0,
loadTime = 0;
//DNS解析时间
dnsTime = timing.domainLookupEnd - timing.domainLookupStart;
//TCP创建时间
tcpTime = timing.connectEnd - timing.connectStart;
//首屏时间
firstPaintTime = timing.responseStart - start;
//dom渲染完成时间
domRenderTime = timing.domContentLoadedEventEnd - start;
//页面onload时间
loadTime = timing.loadEventEnd - start;

 

| 域名( domain ) | javascript | document.domain ;获取的值如:"domain" : "127.0.0.1" |
| URL (url) | javascript | document.URL;获取的值如:"url" : " http://127.0.0.1:3000/" |
| 页面标题 (title) | javascript | document.title;获取的值如:"title" : "Express"; |
| 上一跳url、referrer (referrer) | javascript | document.referrer;获取的值如:"referrer" : "" ; |
| 分辨率 (height:sh; width: sw) | javascript | window.screen.height & width; 获取的值如:"sh" : "1050" ,"sw" : "1680"; |
| 颜色深度 (cd) | javascript | window.screen.colorDepth; 获取的值如:"cd" : "32"; |
| 客户端语言 (lang) | javascript | navigator.language;获取的值如:"lang" : "zh-CN"; |
| user-agent header(userAgent) | javascript | navigator.userAgent;获取的值如:"userAgent" : "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36"; |

现有的前端埋点方案总结

  • 手动埋点
    1.命令埋点,前端代码中须要监控的地方插入监控逻辑
    // 页面加载时发送埋点请求
    $(document).ready(function(){
    // ... 这里存在一些业务逻辑
    sendRequest(params);
    });
    // 按钮点击时发送埋点请求
    $('button').click(function(){
    // 这里存在一些业务逻辑
    sendRequest(params);
    });

     

    2.声明式埋点
    声明式埋点的思路是将埋点代码和具体的交互和业务逻辑解耦,开发者只用关心须要埋点的控件,而且为这些控件声明须要的埋点数据便可,从而下降埋点的成本 ,在dom元素上增添埋点信息,以下
    // key表示埋点的惟一标识;act表示埋点方式
    <button data-stat="{key:'111', act: 'click'}">埋点</button>
  • 相比命令式埋点,不至于傻瓜式的在哪监控在哪埋点
  • 遍历dom树,找到[data-stat]元素的节点,绑定click事件,将[data-stat]上的信息发送给服务器
  • 缺点:
    1.遍历DOM树的时机问题,一个简单的例子,一个表格的行数据是经过异步加载,而表格行中的操做按钮须要埋点,那么在DOM ready的时候去遍历,显然是没法找到的
    2.绑定埋点事件次数的问题,怎样保证埋点事件不会被重复绑定到元素上,一次操做发了N个埋点请求
    重复工做不少,还要处理冒泡。
  • 可视化埋点
    业内开源解决方案:Mixpanel
    与配套的可视化页面搭建和
    运营经过可视化的界面拖拽配置实现,这些活动控件元素都带有惟一标识。经过埋点配置后台,将元素与要采集事件关联起来,能够自动生成埋点代码嵌入到页面中。
  • 全埋点
    无埋点则是前端自动采集所有事件,上报埋点数据,由后端来过滤和计算出有用的数据,优势是前端只要一次加载埋点脚本。缺点是流量和采集的数据过于庞大,服务器性能压力山大,主流的 GrowingIO 就是这种实现方案。
SDK就会自动追踪页面上的按钮(a、button、input) 这种html标签类型的点击状况,一旦页面某一个按钮发生了点击行为,SDK就会去采集此按钮的一些信息,例如: 这个按钮的标签类型,这个按钮的文本内容,这个按钮的name,这个按钮的id、class名,还有一些按钮特有的属性如href等。
好比click事件,在document上绑定click,在事件中的捕获阶段进行绑定,即便按钮元素取消冒泡了,也跟不会影响捕获阶段的传递(在页面中点击一个元素,事件是从这个元素的祖先元素中逐层传递下来的,这个阶段为事件的捕获阶段。当事件传递到这个元素以后,又会把事件逐成传递回去,直到根元素为止,这个阶段是事件的冒泡阶段 )
事件标识?怎么惟必定位到某个页面的元素,设定一个根节点,根节点到这个元素自顶向下的属性名
缺点:dom结构可能会变,class 名字, 元素嵌套,很难惟必定位到
  • 美团实现方案
    70%全埋点 + 30%手动埋点
在不一样场景下咱们须要选择不一样的埋点方案。例如对于简单的用户行为类事件,可使用全埋点解决;而对于须要携带大量运行时才可获知的业务字段的埋点需求,就须要声明式埋点来解决。从更高的层面来看

思考

前端路由
前端路由经过‘#’锚点,其原本加在URL中指示网页的位置的,hash虽然出如今URL中,但不会被包括在HTTP请求中。它是用来指导浏览器动做的,对服务器端彻底无用,所以,改变hash不会从新加载页面。
改写history.replaceState
 

数据上传方式

  • img标签上传
  • ajax
    • 带来跨域问题

参考

免费开源的前端监控平台(github): https://github.com/kisslove/web-monitoring
相关文章
相关标签/搜索