如何引入阿里云ARMS前端监控?

本文涉及的产品
云拨测,每月3000次拨测额度
简介: 如何引入阿里云ARMS前端监控?

老大对我目前手上的项目引入了阿里云ARMS前端监控,但是我自己对ARMS SDK的API以及如何注入到Vue中不是很懂,因此这篇博客诞生了。


/**
 * 阿里前端监控
 * 配置文档 https://www.npmjs.com/package/alife-logger
 */
import BrowerLogger from 'alife-logger';
const logger = (() => {
  if (process.env.NODE_ENV === 'production') {
    try {
      return BrowerLogger.singleton({
        pid: '241asf2342141@dfaf1', // 这是项目ID,新建一个应用站点后自动生成,在单个应用站点内部的`设置->应用设置`查看
        imgUrl: 'https://arms-retcode.aliyuncs.com/r.png?', // 日志上传地址,源码中默认值就是这个地址
        enableSPA: true, // 是否监听页面的 hashchange 事件并重新上报 PV,适用于单页面应用场景
        sendResource: true, // 是否上报资源数据
      });
    } catch (e) {
      // eslint-disable-next-line no-console
      console.error('init logger fail', e);
    }
  } else {
    return {
      error() {},
    };
  }
})();
export default logger;

enableSPA: true和hashchange事件是什么意思呢?


开启单页应用的PV上报。

就拿vue来说,通过vue-router进行页面切换时,每个url都会带一个#,例如从http://foo.com/#/bar跳转到http://bar.com/#/baz

严格意义上说,这不算是一次page change,但是由于我们是单页应用,所以也算是一次page change,因此我们需要一个事件去监听#后面的内容的变化,这个事件就是hashchange,每次#后面的内容变化,都会算做一次PV。

关于hashchange的更多细节,可以到一些低调的浏览器事件查看,或者到[hashchange](

https://developer.mozilla.org...


如何注入到vue项目中呢?


main.js


import arms from '@/arms';
Vue.config.errorHandler = (err, vm, info) => {
    arms.error(err, { filename: `${vm.$vnode.tag}, ${info}`});
};


Vue.config是什么?


Vue.config是一个对象,包含vue的一些全局配置,可以在启动应用之前修改属性。

它包含slient,optionMergeStrategies,devtools,errorHandler,warnHandler,ignoreElements,keyCodes,performance,productionTip等配置项。

这次主要的任务是学习Vue.config.errorHandler,附带着把Vue.config.productionTip = false也了解下。


Vue.config.errorHandler


在组件渲染函数或者watchers期间,分配一个处理器给uncaught error。


Vue.config.errorHandler = function (err, vm, info) {
    // err 错误信息
    // vm Vue实例
    // info Vue-specific error信息
}


关键词:捕获错误 捕获uncaught error 前端错误追踪 避免前端页面崩溃

  • 2.2.0版本开始,钩子会捕获组件生命周期的错误。
  • 2.4.0+,可以捕获Vue custom event handler中的错误,最典型的自定义事件就是vm.$on('eventName', handler)

Vue.config.errorHandler源码:


function globalHandleError (err, vm, info) {
  if (config.errorHandler) {
    try {
      return config.errorHandler.call(null, err, vm, info) // 有定义就返回自定义的运行后的Vue的config.errorHandler。可以用于将错误上报给第三方前端错误追踪服务,例如阿里云ARMS,Sentry,Bugsnag等等
    } catch (e) {
      logError(e, null, 'config.errorHandler'); // 运行错误的话抛出异常
    }
  }
  logError(err, vm, info); // 当errorHandler为undefined时,被捕获的错误会通过console.error输出避免崩溃,其实也就是默认会捕获uncaught error并且输出,避免崩溃。
}


logError源码:


function logError (err, vm, info) {
  {
    warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
  }
  /* istanbul ignore else */
  if ((inBrowser || inWeex) && typeof console !== 'undefined') {
    console.error(err); 
  } else {
    throw err
  }
}



errorHandler内部函数为什么是arms.error(err, { filename: `${vm.$vnode.tag}, ${info}`});?


https://www.npmjs.com/package... 给出了错误信息上报接口的文档。

__bl.error(error, pos)

error为JS的Error对象,filename是pos的一个key,filename后面的模板字符串是为了唯一定位错误信息文件。


vm.$vnode.tag是什么?


http://foo.com/#/friend 的vm.$vnode.tag为vue-component-136-record。

http://foo.com/#/autoreply 的vm.$node.tag为vue-component-138-autoreply。

源码在vnode.js。


Vue.config.errorHandler中的info可能是哪些值?


vue/src/core/util/error.js 源码会暴露一个handlerError函数,通过搜索'handlerEroor'关键词,找到可能输出的值。


handleError(err, vm, `@render`); // src/platforms/weex/runtime/recycle-list/render-component-template.js
handleError(e, vm, `render`); // src/core/instance/render.js
handleError(e, vm, `event handler for "${event}"`); // src/core/instance/events.js 
handleError(e, vnode.context, `directive ${dir.name} ${hook} hook`); // src/core/vdom/modules/directives.js
handleError(e, vm, `getter for watcher "${this.expression}"`); //  src/core/observer/watcher.js
handleError(e, ctx, 'nextTick'); // src/core/util/next-tick.js
handleError(e, vm, `${hook} hook`); // src/core/instance/lifecycle.js 
handleError(e, vm, `data()`); // src/core/instance/state.js
handleError(e, ctx, 'nextTick'); // packages/weex-vue-framework/factory.js,dist目录下的文件基本都有此方法
handleError(e, vm, (hook + " hook"));// packages/vue-server-renderer/build.js,basic.js



filename: `${vm.$vnode.tag}, ${info}` 对应ARMS前端监控平台的什么位置?


在访问明细表格的File字段,可以找到filename对应的信息,例如File: vue-component-109-chatFriend, nextTick。

相关文章
|
6天前
|
Arthas 弹性计算 运维
阿里云ECS监控服务
阿里云ECS监控服务
424 2
|
6天前
阿里云ARMS的新版和老版界面是两套不同的系统
阿里云ARMS的新版和老版界面是两套不同的系统
63 2
|
6天前
|
存储 监控 前端开发
【专栏】阿里云ARMS前端监控的引入方法,以提升应用质量和稳定性
【4月更文挑战第29天】本文介绍了阿里云ARMS前端监控的引入方法,以提升应用质量和稳定性。该工具通过实时收集和分析用户行为、性能数据,提供错误监测和实时告警。步骤包括注册阿里云账号,创建前端监控项目,获取并嵌入监控代码到页面中,部署并运行,最后查看监控数据。案例和经验分享强调了合理设置监控指标、与其他工具结合以及定期分析数据的重要性。注意保护用户隐私,正确管理监控代码,并解决可能出现的数据不准确和大量错误告警问题。
|
6天前
|
存储 Prometheus 监控
关于阿里云ARMS的新版计费方式
【1月更文挑战第7天】【1月更文挑战第32篇】关于阿里云ARMS的新版计费方式
37 2
|
6月前
|
监控 Java 调度
阿里云 ARMS 应用监控重磅支持 Java 21
阿里云 ARMS 应用监控重磅支持 Java 21
48420 33
|
6天前
|
弹性计算 运维 监控
解密阿里云弹性计算:探索云服务器ECS的核心功能
阿里云ECS是核心计算服务,提供弹性云服务器资源,支持实例按需配置、集群管理和监控,集成安全防护,确保服务稳定、安全,助力高效业务运营。
192 0
|
6天前
|
存储 弹性计算 固态存储
阿里云服务器CPU内存配置详细指南,如何选择合适云服务器配置?
阿里云服务器配置选择涉及CPU、内存、公网带宽和磁盘。个人开发者或中小企业推荐使用轻量应用服务器或ECS经济型e实例,如2核2G3M配置,适合低流量网站。企业用户则应选择企业级独享型ECS,如通用算力型u1、计算型c7或通用型g7,至少2核4G配置,公网带宽建议5M,系统盘可选SSD或ESSD云盘。选择时考虑实际应用需求和性能稳定性。
236 6
|
6天前
|
域名解析 弹性计算 Linux
阿里云购买云服务器、注册域名、备案及绑定图文教程参考
本文为大家介绍了2024年购买阿里云服务器和注册域名,绑定以及备案的教程,适合需要在阿里云购买云服务器、注册域名并备案的用户参考,新手用户可通过此文您了解在从购买云服务器到完成备案的流程。
阿里云购买云服务器、注册域名、备案及绑定图文教程参考
|
4天前
|
存储 安全 数据库
阿里云服务器计算型、通用型、内存型主要实例规格特点、适用场景及最新价格参考
在阿里云服务器的实例规格中,有共享型也有企业型,一般用户选择较多的企业级实例规格有计算型、通用型、内存型,每一种实例规格又有多个实例规格族可选,不同的云服务器实例规格在架构、计算、存储、网络、安全等方面有着不同,因此,其适用场景也有所不同。本文来详细介绍一下阿里云服务器计算型、通用型、内存型主要实例计算、存储等性能及其适用场景,以供参考。
阿里云服务器计算型、通用型、内存型主要实例规格特点、适用场景及最新价格参考
|
6天前
|
存储 弹性计算 固态存储
阿里云服务器租用价格参考,云服务器收费标准与实时活动价格整理
阿里云服务器租用价格参考,本文更新了阿里云服务器最新的租赁费用,包括云服务器实时的活动价格与云服务器收费标准。经济型e实例云服务器4核16G10M带宽配置30.00元/1个月、90.00元/3个月,独享型通用算力型u1实例2核4G服务器仅需199元1年,轻量云服务器2核2G新用户专享价格61元/1年,计算型c7a实例2核4G配置特惠价625.68元/1年。更多阿里云服务器热门配置活动价格及云服务器租赁费用及活动价格见下文。
阿里云服务器租用价格参考,云服务器收费标准与实时活动价格整理