Vue3+vite+sls打造前端性能监控平台

基于vue3+vite+阿里云sls开发的一个简单的性能监控平台,可以进行用户行为分析,如:用户数量,热点页面访问量,访问时段,用户浏览器使用,分辨率等等数据,以及前端性能相关数据,如:页面加载时间,js报错相关信息,接口加载时间,接口调用次数等等。下面废话不多说,直接开始项目。
1.vue3+vite初始化项目

1.   npm create vite 项目名称
2.   cd项目名称
3.   npm install    《安装项目依赖包》
4.   npm run dev   《启动项目》

选择框架的时候选择vue+ts,完成之后就获得了一个基础版本的项目。大致目录如下:


微信截图_20220325133337.png

你会发现script用到了setup语法糖,


微信截图_20220325134731.png

第一次见到的小伙伴可能会一脸懵,这里先附上官网文档以及一份写的不错的setup语法糖,总结就是变量不用return了,组件不用注册了,props和emits换方法了,父组件要调用子组件内容,需要把子组件变量或者方法defineExpose({})出去,等等。
https://v3.cn.vuejs.org/api/sfc-script-setup.html#%E5%9F%BA%E6%9C%AC%E8%AF%AD%E6%B3%95
https://mp.weixin.qq.com/s/-1VRzekOKvK4ymEN8mHAFg
vue3不再使用elementui,而是改成了element-plus,这点大家也要注意,附上官网:
https://element-plus.gitee.io/zh-CN/
element-plus自身支持国际化,有点比较麻烦的是里面的icon需要用到哪个,就要在文件里import哪个,没有原来方便了,可以使用注册全局组件的方法,把所有ICON注入:

import * as Icons from '@element-plus/icons'
Object.keys(Icons).forEach(key => {
  app.component(key, Icons[key as keyof typeof Icons])
})

以上这些只是随意提一嘴,属于基础内容,打造前端性能监控平台,最主要的在于阿里云sls日志服务的使用。

微信截图_20220329201937.png

也就是这个东西,开通服务,然后新建Project:
微信截图_20220329203139.png

然后再新建一个Logstore
微信截图_20220329203222.png

此时切记一定要打开WebTracking,这是专门为前端来采集信息的。最好打开永久保存。
创建完毕之后会问你是否立即接入数据,选择是,然后选择webTracking接入数据:
微信截图_20220329204229.png

微信截图_20220329204238.png

接入之后,阿里云的基本配置也就准备好了,下一步就是去我们的项目里进行埋点,并且使用阿里云的WebTracking SDK将埋点数据传到阿里云sls上。
这里附上官方文档地址:
https://help.aliyun.com/document_detail/31752.html?spm=5176.2020520112.0.0.377f34c0q0DTnF#h4--http-get-
微信截图_20220402094906.png

这里我们尝试上传一个js埋点报错数据:

//监听页面Js报错
function injectJsError(){
  window.addEventListener('error',function(event){
    console.log('------addEventListener-error-------')
    console.log(event)
    let log = {
      kind:'stability',//监控指标大类 稳定性
      type:'error',//小类
      errorType:'jsError',
      message:event.message,
      filename:event.filename,
      position:`${event.lineno}:${event.colno}`,
      stack:event.error&&event.error.stack?getLines(event.error.stack):'-'
    }
    SentTracker.sendMsg(log);
    // console.log(log)
  })
}
class SentTracker{
  url;
  xhr;
  constructor(){
    this.url = `https://${ProjectName}.${Endpoint}/logstores/${logstoreName}/track`;
    this.xhr = new XMLHttpRequest;
  }
  //上报单条埋点信息
  sendMsg(data = {}){
    let extraData = getExtraData();
    let logInfo = {...extraData,...data}
    for(let key in logInfo){
      if(typeof logInfo[key] === 'number'){ //如果是数字 需要转为字符串,阿里要求的传参格式
        logInfo[key] = `${logInfo[key]}`
      }
    }
    logger.send(logInfo)
  }
  //上报多条埋点信息
  sendMsgs(data = []){
    let extraData = getExtraData();
    let logArr= [logInfo]
    data.forEach((item)=>{
      let logInfo = {...extraData,...item}
      for(let key in item){
        if(typeof item[key] === 'number'){ //如果是数字 需要转为字符串,阿里要求的传参格式
          item[key] = `${item[key]}`
        }
      }
      logArr.push(logInfo)
    })
    let body = JSON.stringify(logInfo)
    this.xhr.open('POST',this.url,true);
    this.xhr.setRequestHeader('Content-Type','application/json');
    this.xhr.setRequestHeader('x-log-apiversion','0.6.0');
    this.xhr.setRequestHeader('x-log-bodyrawsize',body.length);
    this.xhr.setRequestHeader('x-log-compresstyp','lz4');
    this.xhr.onload = ()=>{
      console.log(this.xhr.response)
    }
    this.xhr.onerror = (error)=>{
      console.log(error)
    }
    let newBody = {
      "__topic__": topic,
      "__source__": source,
      "__logs__":logArr,
      "__tags__": {
        "tag": "日志标签"
      }
    }
    this.xhr.send(JSON.stringify(newBody));
  }
}

当监听到js报错的时候,项目就会自动把错误信息上传到sls里


微信截图_20220402101409.png

当时我在想,如果我要统计后端接口的调用次数,那是不是每次调用接口都要往sls里发起一次请求,那对于我项目的性能不是会有很大影响么,但是sls其实也早就想到了这点,所以它有两个配置项:

opts = {
    host: '',      
    project: '',                 
    logstore: '',               
    time: 10, //10s内自动收集日志,10s发一次
    count: 30, //最多收集30条
  }

可以看到,他是可以自动收集埋点数据,然后每隔一段时间发起一次请求的。
我们再去看看阿里云日志库:


微信截图_20220402102002.png

所有上传的埋点信息,都会存进去,可以理解为一张数据库表,下一步,就是把这些表数据收集整理,然后做成可视化图表就行了,只要会简单的sql语句就行。
这里有个坑,我当时按照文档用Js去查日志库里的数据,死活查不出来,后来才发现,必须用node.js去查才可以,这里附上node关键代码:

const ALY = require('aliyun-sdk')
var sls = new ALY.SLS({
  accessKeyId: "",                         //阿里云访问密钥AccessKey ID。更多信息,请参见访问密钥。阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维。 
  secretAccessKey: "",                     //阿里云访问密钥AccessKey Secret。 
  endpoint: '', //日志服务的域名。更多信息,请参见服务入口。此处以杭州为例,其它地域请根据实际情况填写。
  apiVersion: '2015-06-01'                         //SDK版本号,固定值。
})
const projectName = ""               // 必选,Project名称。
const logstoreName = ""             // 必选,Project描述。
// 查询日志。
function queryLog(query, callback) {
  const param = {
    projectName,                                  // 必选,Project名称。
    logStoreName: logstoreName,                   // 必选,Logstore名称。
    from: query.from,                                         // 必选,开始时间,精度为秒。
    to: query.to,                                           // 必选,结束时间,精度为秒
    topic: query.topic,                                    // 可选,指定日志主题。
    query: query.query                                   // 可选,查询的关键词,不输入则查询全部日志数据。
  }

  sls.getLogs(param, function (err, data) {
    if (err) {
      let obj = {
        code: 500,
        data: '',
        msg: err
      }
      callback(obj)
    } else {
      let obj = {
        code: 0,
        data: data,
        msg: 'success'
      }
      callback(obj)
    }
  })
}

然后通过前端调用后端Node的接口,前端就可以获取到日志库里面的数据了,node只是为了前端获取数据做一道中转而已。附上前端sql语句的示例

 //获取js执行报错统计
  let jsError = await getLogs(
    proxy.$urlData.getLogs,
    "* and kind : stability and type : error and errorType : jsError | SELECT message,url, count(url) AS PV where message!='null' GROUP BY message,url ORDER BY PV DESC"
  );

此时一个性能监控平台就搭建好了:


微信截图_20220402161616.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 225,529评论 6 524
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 96,683评论 3 406
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 172,905评论 0 370
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 61,318评论 1 303
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 70,325评论 6 401
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 53,754评论 1 316
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,081评论 3 431
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,088评论 0 280
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 47,653评论 1 327
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 39,651评论 3 347
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 41,766评论 1 355
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 37,359评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,083评论 3 341
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 33,491评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 34,654评论 1 278
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 50,367评论 3 383
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 46,836评论 2 367

推荐阅读更多精彩内容