2.0.9 • Published 4 years ago

vue-dataac v2.0.9

Weekly downloads
3
License
MIT
Repository
github
Last release
4 years ago

Vue-dataAc - Vue 数据采集上报插件(求小星星,求star)

写在前面

此插件基于 dataAcquisition 进行重构
基于Vue进行插件开发,新增了很多配置,也对整体的采集监控做了优化,让这一切更优雅更灵活更简单。
项目初期,难免有一些不同场景下的问题,大家在使用过程中遇到任何问题,或者有不满意的点都可以提交issue上来。
另外: http://data.isjs.cn/logStash/push 作为测试接口使用,会不定期清空数据,请不要上报真实数据

公众号: js前端架构打赏 :confetti_ball:
js前端架构打赏

快速开始

安装

    npm install vue-dataac --save

Vue Cli

   import Vue from 'vue'
   import VueDataAc from 'vue-dataac'

   Vue.use(VueDataAc, {
       // imageUrl: 'http://data.isjs.cn/lib/image/ac.png'
       // or
       useImgSend: false,
       postUrl: 'http://data.isjs.cn/logStash/push'
    });

ES6

    import VueDataAc from 'vue-dataac'

CommonJS

    var VueDataAc =  require('vue-dataac');

直接引用

    <script src="../node_modules/vue-dataac/dist/vue-dataAc.min.js"></script>

demo:

功能demo地址数据分析展示
文档'http://data.isjs.cn/index.html'''
行为监控Demo'http://data.isjs.cn/basic/index.html''http://data.isjs.cn/log/index.html'
异常监控Demo'http://data.isjs.cn/error/index.html''http://data.isjs.cn/log/index.html'
性能监控Demo'http://data.isjs.cn/performance/index.html''http://data.isjs.cn/log/index.html'
主动埋点Demo'http://data.isjs.cn/appoint/index.html''http://data.isjs.cn/log/index.html'
图片数据上报Demo'http://data.isjs.cn/imgreport/index.html''http://data.isjs.cn/log/index.html'
上报节流Demo(sizeLimit)'http://data.isjs.cn/reportsize/index.html''http://data.isjs.cn/log/index.html'
关联登录信息Demo'http://data.isjs.cn/token/index.html''http://data.isjs.cn/log/index.html'

文档:

为了尽可能灵活,以下所有配置项理论上都可以修改配置,
我对每个配置项做了修改建议,供大家参考:

:smile: = 可以修改
:neutral_face: = 最好不修改
:rage: = 千万不要修改

1. 标识类配置,作为数据上报信息的分类标识

配置项类型默认值是否可配置说明生效版本
storeInputString'ACINPUT':neutral_face:输入框行为采集标识1.0.0
storePageString'ACPAGE':neutral_face:页面访问信息采集标识1.0.0
storeClickString'ACCLIK':neutral_face:点击事件采集标识1.0.0
storeReqErrString'ACRERR':neutral_face:请求异常采集标识1.0.0
storeTimingString'ACTIME':neutral_face:页面性能采集标识1.0.0
storeCodeErrString'ACCERR':neutral_face:代码异常采集标识1.0.0
storeCustomString'ACCUSTOM':neutral_face:自定义事件采集标识2.0.0
storeSourceErrString'ACSCERR':neutral_face:资源加载异常采集标识2.0.0
storePrmseErrString'ACPRERR':neutral_face:promise抛出异常标识2.0.0
storeCompErrString'ACCOMP':neutral_face:Vue组件性能监控标识2.0.0
storeVueErrString'ACVUERR':neutral_face:Vue异常监控标识2.0.0

2. 全局开关,用来自定义采集范围

配置项类型默认值是否可配置说明生效版本
userShaString'vue_ac_userSha':smile:用户标识存储在Storage中的key,有冲突可修改1.0.0
useImgSendBooleantrue:smile:是否使用图片上报数据, 设置为 false 为 xhr 接口请求上报2.0.0
useStorageBooleantrue:smile:是否使用storage作为存储载体, 设置为 false 时使用cookie2.0.0
maxDaysNumber365:smile:如果使用cookie作为存储载体,此项生效,配置cookie存储时间,默认一年2.0.0
openInputBooleantrue:smile:是否开启输入数据采集1.0.0
openCodeErrBooleantrue:smile:是否开启代码异常采集1.0.0
openClickBooleantrue:smile:是否开启点击数据采集1.0.0
openXhrQueryBooleantrue:smile:采集接口异常时是否采集请求参数params2.0.0
openXhrHockBooleantrue:smile:是否开启xhr异常采集1.0.0
openPerformanceBooleantrue:smile:是否开启页面性能采集1.0.0
openPageBooleantrue:smile:是否开启页面访问信息采集(PV/UV)2.0.0
openVueErrBooleantrue:smile:是否开启Vue异常监控2.0.0
openSourceErrBooleantrue:smile:是否开启资源加载异常采集2.0.0
openPromiseErrBooleantrue:smile:是否开启promise异常采集2.0.0
openComponentBooleantrue:smile:是否开启组件性能采集2.0.0
maxComponentLoadTimeNumber1000:rage:组件渲染超时阈值,太小会导致信息过多,出发点是找出渲染异常的组件2.0.0
openXhrTimeOutBooleantrue:smile:是否开启请求超时上报2.0.0
maxRequestTimeNumber10000:smile:请求时间阈值,请求到响应大于此时间,会上报异常,openXhrTimeOut 为 false 时不生效2.0.0
customXhrErrCodeString'':smile:支持自定义响应code,当接口响应中的code为指定内容时上报异常2.0.0

3. 行为采集配置

配置项类型默认值采集范围是否可配置说明生效版本
selectorString'input'所有input输入框(全量采集):smile:通过控制选择器来限定监听范围,使用document.querySelectorAll进行选择,值参考:https://www.runoob.com/cssref/css-selectors.html1.0.0
selectorString'input.isjs-ac'所有class包含isjs-ac的input输入框(埋点采集):smile:通过控制选择器来限定监听范围,使用document.querySelectorAll进行选择,值参考:https://www.runoob.com/cssref/css-selectors.html1.0.0
ignoreInputTypeArray['password', 'file']type不是password和file的输入框:smile:---1.0.0
ignoreInputTypeArray[]所有输入框:smile:---2.0.0
classTagString''所有可点击元素(全量采集):smile:点击事件埋点标识, 自动埋点时请配置空字符串1.0.0
classTagString'isjs-ac'只会采集 class 包含 isjs-ac 元素的点击(埋点采集):smile:点击事件埋点标识, 自动埋点时请配置空字符串1.0.0
maxHelpfulCountNumber5全量采集和埋点采集场景下,为了使上报数据准确,我们会递归父元素,找到一个有class或id的祖先元素,此项配置递归次数:neutral_face:页面层次较深情况下,建议保留配置,以减少性能损耗2.0.0

4. 数据上报配置

配置项类型默认值是否可配置说明生效版本
imageUrlString'http://data.isjs.cn/lib/image/ac.png':smile:《建议》 图片上报地址(通过1*1px图片接收上报信息)依赖 useImgSend 配置打开1.0.0
postUrlString'http://data.isjs.cn/logStash/push':smile:接口上报地址1.0.0
openReducerBooleanfalse:smile:是否开启节流,用于限制上报频率,开启后sizeLimit,manualReport生效2.0.0
sizeLimitNumber20:smile:采集数据超过指定条目时自动上报,依赖 openReducer == true, 优先级:22.0.0
cacheEventStorageString'ac_cache_data':smile:开启节流后数据本地存储key2.0.0
manualReportBooleanfalse:smile:强制手动上报,开启后只能调用postAcData方法上报,依赖 openReducer == true,优先级:12.0.0

5. 实例方法

1. vue.$vueDataAc.setCustomAc( {cusKey: String, cusVal: Any} )

用于自定义事件的约定上报,例如在业务场景中对某些逻辑的埋点。
自定义事件上报逻辑与其他事件上报共用,可以通过openReducer限制频率

2. vue.$vueDataAc.postAcData()

手动上报当前采集信息

3. vue.$vueDataAc.setUserToken(userToken: String)

用于关联用户后台标记,利用用户登录后的userid,sessionId
目的是将前后台日志打通,方便查找模拟用户
   

上报数据格式:

1. 页面访问,路由跳转,等同于PV/UV数据:

    {
        "uuid": "F6A6C801B7197603",             //用户标识
        "t"   : "",                             //后端 用户标识/登录标识 默认为空,通过setUserToken设置
        "acData" : {
            "type"       :  "ACPAGE"            //行为标识
            "sTme"       :  1591760011268       //数据上报时间
            "fromPath"   :  "/register?type=1"  //来源路由
            "formParams" :  "{'type': 1}"       //来源参数
            "toPath"     :  "/login"            //目标路由
            "toParams"   :  "{}"                //目标参数
            "inTime"     :  1591760011268       //页面进入时间
            "outTime"    :  1591760073422       //离开页面时间
        }
    }

2. 代码异常数据

{
        "uuid": "F6A6C801B7197603",                 //用户标识
        "t"   : "",
        "acData" : {
             "type"    : "ACCERR",     		        //上报数据类型:代码异常
             "path"    : "www.domain.com/w/w/w/", //事件发生页面的url
             "sTme"    : "1591760073422",	        //事件上报时间
             "msg"     : "script error",          //异常摘要
             "line"    : "301",  		              //代码行数
             "col"     : "13",  		              //代码列下标
             "err"     : "error message",         //错误信息
         }
}

3. 资源加载异常数据

{
        "uuid": "F6A6C801B7197603",                         //用户标识
        "t"   : "",                                         
        "acData" : {
             "type"        : "ACSCERR",     		            //上报数据类型:资源加载异常
             "path"        : "www.domain.com/w/w/w/",       //事件发生页面地址
             "sTme"        : "1591760073422",	              //事件上报时间
             "fileName"    : "test.js",                     //文件名
             "resourceUri" : "http://isjs.cn/js/test.js",   //资源地址
             "tagName"     : "script",  		                //标签类型
             "outerHTML"   : "script ...",                  //标签内容
          }
}

4. Promise 异常数据

{
        "uuid": "F6A6C801B7197603",                      //用户标识
        "t"   : "",                                      
        "acData" : {
            "type"        : "ACPRERR",     		           //上报数据类型:Promise 异常
            "path"        : "www.domain.com/w/w/w/",     //事件发生页面地址
            "sTme"        : "1591760073422",	           //事件上报时间
            "reason"      : "reason"                     //异常说明
         }
}

5. 自定义事件数据

  //自定义事件上报
  vue.$vueDataAc.setCustomAc({
    cusKey: "click-button-001",
    cusVal: "1"
  })  

{
        "uuid": "F6A6C801B7197603",                      //用户标识
        "t"   : "",                                      
        "acData" : {
            "type"        : "ACCUSTOM",     		         //上报数据类型:自定义事件
            "path"        : "www.domain.com/w/w/w/",     //事件发生页面地址
            "sTme"        : "1591760073422",	           //事件上报时间
            "cusKey"      : "click-button-001"           //自定义事件key,用户定义
            "cusVal"      :"1"                          //自定义事件值,用户定义
         }
}

6. Vue异常监控数据

{
        "uuid": "F6A6C801B7197603",                      //用户标识
        "t"   : "",                                      
        "acData" : {
            "type"          : "ACVUERR",     		         //上报数据类型:Vue异常监控
            "path"          : "www.domain.com/w/w/w/",   //事件发生页面地址
            "sTme"          : "1591760073422",	         //事件上报时间
            "componentName" : "Button"                   //组件名
            "fileName"      : "button.js"                //组件文件
            "propsData"     : "{}"                       //组件props
            "err"           : "..."                      //错误堆栈
            "info"          : "信息"                      //错误信息
            "msg"           : "1"                        //异常摘要
         }
}

7. 点击事件监控数据

{
        "uuid": "F6A6C801B7197603",                      //用户标识
        "t"   : "",                                      //后端 用户标识/登录标识 默认为空,通过setUserToken设置
        "acData" : {
            "type"          : "ACCLIK",     		         //上报数据类型:点击事件监控
            "path"          : "www.domain.com/w/w/w/",   //事件发生页面地址
            "sTme"          : "1591760073422",	         //事件上报时间
            "eId"           : ""                         //元素id属性
            "className"     : "login-form"               //点击元素class属性
            "val"           : "标题"                      //元素value或者innertext
            "attrs"         : "{class:'...', placeholder:'...', type:'...'}"       //元素所有属性对象
         }
}

8. 输入事件监控数据

{
        "uuid": "F6A6C801B7197603",                      //用户标识
        "t"   : "",                                      //后端 用户标识/登录标识 默认为空,通过setUserToken设置
        "acData" : {
            "type"          : "ACINPUT",     		         //上报数据类型:输入事件监控
            "path"          : "www.domain.com/w/w/w/",   //事件发生页面地址
            "sTme"          : "1591760073422",	         //事件上报时间
            "eId"           : ""                         //元素id属性
            "className"     : "van-field__control"       //元素class属性
            "val"           : "0:111,638:11,395:1,327:,1742:5,214:55,207:555,175:5555"     //时间:当前值,用逗号分隔,体现时间变化
            "attrs"         : "{class:'...', placeholder:'...', type:'...'}"               //元素所有属性对象
         }
}

9. 接口异常数据(包含 请求时间过长/自定义code/请求错误)

{
        "uuid": "F6A6C801B7197603",                      //用户标识
        "t"   : "",
        "acData" : {
            "type"          : "ACRERR",     		         //上报数据类型:接口异常
            "path"          : "www.domain.com/w/w/w/",   //事件发生页面地址
            "sTme"          : "1591760073422",	         //事件上报时间
            "errSubType"    : "http/time/custom"         //异常类型:【time: 请求时间过长】【custom: 自定义code】【http:请求错误】
            "responseURL"   : "/static/push"             //请求接口
            "method"        : "GET"                      //请求方式
            "readyState"    : 4                          //xhr.readyState状态码
            "status"        : "404"                      //请求状态码
            "statusText"    : "not found"                //错误描述
            "requestTime"   : 3000                       //请求耗时
            "response"      : "{...}"                    //接口响应摘要,截取前100个字符
            "query"         : "{}"                       //请求参数,用 openXhrQuery 配置打开,注意用户信息泄露
         }
}

10. 页面性能监控数据

{
        "uuid": "F6A6C801B7197603",                      //用户标识
        "t"   : "",
        "acData" : {
            "type"          : "ACTIME",     		         //上报数据类型:页面性能监控
            "path"          : "www.domain.com/w/w/w/",   //事件发生页面地址
            "sTme"          : "1591760073422",	         //事件上报时间
            "WT"            : 1000                       //白屏时间
            "TCP"           : 1000                       //TCP连接耗时
            "ONL"           : 1000                       //执行onload事件耗时
            "ALLRT"         : 1000                       //所有请求耗时
            "TTFB"          : 1000                       //TTFB读取页面第一个字节的时间
            "DNS"           : 1000                       //DNS查询时间
         }
}

11. Vue组件性能监控数据

{
        "uuid": "F6A6C801B7197603",                      //用户标识
        "t"   : "",
        "acData" : {
            "type"          : "ACCOMP",     		         //上报数据类型:页面性能监控
            "path"          : "www.domain.com/w/w/w/",   //事件发生页面地址
            "sTme"          : "1591760073422",	         //事件上报时间
            "componentsTimes" : [                        //渲染超时组件列表
                '组件名': [1000,1200,1090]   
            ]
         }
}

TODO:

  • 异常监控
    • 代码异常
    • 资源加载异常
    • promise异常
    • Vue异常
    • 请求异常(慢请求,超时,错误)
    • axios异常

  • 用户行为监控
    • 点击事件
    • 输入事件
    • 自定义事件
    • 页面访问事件

  • 数据上报
    • 图片上报
    • 接口上报
    • 手动上报

  • 页面性能上报
    • performance
    • 组件性能上报

  • 留存
    • 访问时间
    • 访问间隔

  • 开关
    • openPage 页面访问信息采集开关
    • openSourceErr 资源加载异常采集
    • openPromiseErr promise异常采集
    • openCodeErr 是否开启代码异常采集
    • openVueErr 是否开启Vue异常监控
    • openSourceErr 是否开启资源加载异常采集
    • openPromiseErr 是否开启promise异常采集
    • openClick 是否开启点击数据采集
    • openInput 是否开启输入数据采集
    • openXhrQuery 是否采集接口异常时的参数params
    • openXhrHock 是否开启xhr异常采集
    • openPerformance 是否开启页面性能采集
    • openComponent 组件性能采集

  • npm自动发布
  • 后端日志关联机制
  • eslint
  • docs
  • demo
  • 文章

Q&A

1. 我需要采集用户行为吗?

用户行为相关数据,我认为对产品有益,可以用于分析转化,页面热点图等   
根据数据对产品进行调整。所以看你的产品类型 2C 的产品一般有这样的需求   
 

2. 我需要监控页面异常吗?

从前端角度是有必要的,用户遇到问题,经过问题上报,汇总,最终分配到你,时间不可控
能在第一时间对端上的问题进行告警,会大大提高解决问题的效率
所以我认为需要有一个监控系统作为生产安全的兜底方案

3. 我需要采集页面性能&组件性能吗?

页面性能组件性能,我建议开启,生产测试环境可能因为数据不相同,会有差异性bug
可能会导致组件渲染慢,影响体验
但是前提是要把阈值调大,以免数据过多,大量数据上报,会降低对报警的敏感度

4. 数据采集后如何进行整理分析?

我们的数据上报分为两种,接口和图片
其实不论哪一种方式,最终都要将数据本地化,持久化。
可以问一下公司后端的同事,他们的数据怎么分析,对接他们的上报接口就可以。
一般这样的日志搜集分析,会用到 ELK 系统。没有的话让运维帮忙搭建一套。
通过接口将上报的数据存储到本地文件或数据库中。或是通过图片上报,将数据存储在nginx中
然后用ELK对接日志即可。ELK有提供查询API,你可以做一套轮训告警系统

5. 如何将前端日志与后台日志关联起来?

前端日志的唯一标识是uuid,后端唯一标识可以通过 setUserToken方法将用户唯一 id 和 uuid 做关联

6. 我该如何将他应用到生产项目中?

建议你分批次,分功能,做足够量的测试之后,逐步打开开关上线。
我只能保证在我的场景下可以正常使用,但是不同的产品,不同的用户场景,不能百分百保证

设计思路

1. 页面访问采集

作为页面级访问的采集,我们在beforeCreate中注入了根组件监控,
当根组件开始渲染时,上报当前页面的地址信息,同时会将此次记录本地存储,页面跳转后,会附加到from字段。
在多页面应用的场景下,该方式保证了上报,但如果是多入口嵌套vue-router的情况下,会触发第二种监控,
路由监控,插件会监控你的$route变化,并记录上报。在没有使用vue-router的情况下,只会上报页面的访问信息

change log

2.0.9:

bugfix: 1. 修复页面刷新数据未上报问题