高级前端进阶必修:自主打造高扩展的业务组件库天文列宿在

#1

download:高级前端进阶必修:自主打造高扩展的业务组件库天文列宿在

skywalking-client-js 前端配置与源码解析

序文

skywalking是目前最炙手可热的散布式应用性能监控系统,且 Skywalking 从 8.2版本开端支持阅读器端的监控,完成的方式便是引入skywalking-client-js库,这是一个 skywalking 官方出品的一个前端埋点上报插件。轻量化,配置简单,提供了性能追踪,错误追踪,网络恳求追踪三大功用。

本篇将基于其配置函数从源码层面来解说skywalking-client-js的工作流程,协助学习如何运用的同时,了解前端监控埋点上报的一些思想。

skywalking-client-js 目前曾经发布到 v0.9.0 版本,本文也基于此版本解说,官方 GitHub 地址请点击这里,整体源码并不大,入口文件在 src/monitor.ts 下,鼓舞大家能够阅读一下

根本运用

skywalking-client-js定义了一个ClientMonitor对象,并将其挂载到了window全局对象上,该对象很重要,由于我们一切的配置操作都基于此对象的办法,我们能够在项目中恣意页面引入该对象随时停止配置:

import ClientMonitor from ‘skywalking-client-js’;

ClientMonitor.register({

// 根底配置

collector: ‘http://127.0.0.1:12800’,

service: ‘FE_instance’,

serviceVersion: ‘1.0.0’,

pagePath: window.location.href,

})

复制代码

ClientMonitor内部定义了以下八种办法,我们将其辨别为配置办法和内部办法,汇总如下:

配置办法:

register

catchErrors

setPerformance

reportFrameErrors

setCustomTags

performance

内部办法:

validateTags

validateOptions

配置办法即由我们调用来停止配置的办法,内部办法我们固然能够停止调用,但没有什么实践作用,在这里的两个内部办法都是由其它配置办法调用,辅助停止参数校验。

通用配置项

大局部配置办法都需求传入一个通用的配置对象CustomReportOptions(假如该配置办法运用了全局配置,且之前你曾经停止过全局配置了则不需求),其定义了我们接入 OAP 数据上报效劳器的一些细致信息:

collector (string):上报的的 OAP 效劳器地址(普通固定 12800 端口)

service (string):自定义的客户端效劳名

serviceVersion (string):自定义的效劳端实例版本

pagePath (string):自定义的效劳端端点,常指页面路由

skywalking-client-js中会存在一个全局的通用配置被一切功用模块运用,有些配置办法会改动它,而有些办法仅会改动本人模块的配置,后续引见的时分会阐明。此外还存在继承了CustomReportOptions的更全面的配置对象CustomOptionsType,能够停止更细致的配置。

接下来我们从错误追踪,性能追踪,网络追踪三个方面来停止解说

错误追踪

skywalking 在阅读器端定义了 6 种错误类型,每种错误类型的完成方式都十分巧妙,是前端埋点中常用的错误追踪方式,他们分别是:

错误名类别完成方式JSErrorsJS 执行错误运用 window.onerror 监听 JS 执行错误并上报PromiseErrorsPromise Reject 错误运用 unhandledrejection 事情监听未处置 reject 并上报VueErrorsVue 内部错误运用 Vue.config.errorHandler 监听错误AjaxErrorsAjax 网络恳求错误XHR 恳求类型运用 xhrReadyStateChange 事情拦截并判别能否发作错误;fetch 恳求则是重写 fetch 办法拦截响应 response,依据 response.status 判别能否发作错误ResourceErrors资源加载错误在 window 上设置 error 监听,并判别 error 事情能否来源于HTMLScriptElement,HTMLLinkElement,HTMLImageElement;假如是,则判别未资源加载错误FrameErrors框架错误非全局自动监听,需求本人手动传入 error 对象

错误追踪功用会在发作以上错误时,搜集error信息,并以 1min 的固定频率停止上报,目前我们暂时还无法改动上报频率。在这些错误类型中,前 5 种由catchErrors停止全局配置,而最后一种由reportFrameErrors停止捕获

catchErrors 配置办法

该配置办法需求传入通用配置和监听的错误类型配置,且其根底配置不会改动全局通用配置,仅作用于错误追踪模块:

ClientMonitor.catchErrors({

// 根底配置(错误上报的地址)

collector: ‘http://127.0.0.1:12800’,

service: ‘FE_instance’,

serviceVersion: ‘1.0.0’,

pagePath: window.location.href,

// 错误监听

jsErrors: true, // 启用JSErrors,PromiseErrors错误的监听

apiErrors: true, // 启用AjaxErrors错误的监听

resourceErrors: true, // 启用ResourceErrors错误的监听

vue: true, // 启用VueErrors错误的监听

})

复制代码

reportFrameErrors

该配置办法用于标志框架产生的错误,skywalking自身只支持了Vue的错误捕获,其他框架可能的错误,需求我们手动调用该办法停止上报,并传入产生的error对象,同样不会改动全局通用配置:

ClientMonitor.reportFrameErrors({

// 根底配置

collector: 'http://127.0.0.1:12800',

service: 'vue-demo',

pagePath: '/app',

serviceVersion: 'v1.0.0',

}, error);

复制代码

性能追踪

skywalking的性能追踪采取的是window.performance原生计划,这也是大多数性能埋点的计划,其配置由setPerformance和performance办法完成,追踪页面初次加载中的各项性能参数。

performance

该配置办法做的事情很简单,他会判别调用时页面能否加载终了,假如已加载完成会立刻调用内部的tracePerf.getPerf办法,传入配置项并立刻停止性能数据的搜集和上报,假如还未加载完成会添加window.onLoad监听,等到加载完成后再执行上述操作。

performance才是完成性能追踪的主要办法,其配置项直接作用于性能追踪模块,不会改动全局配置,配置如下:

ClientMonitor.performance({

// 根底配置

collector: ‘http://127.0.0.1:12800’,

service: ‘FE_instance’,

serviceVersion: ‘1.0.0’,

pagePath: window.location.href,

// 性能追踪

autoTracePerf: true,

useFmp: true,

enableSPA: false,

})

复制代码

仅有简单的三个配置项,他们的作用于tracePerf.getPerf办法,运用如下:

字段功用autoTracePerf能否开启自动追踪,开启后才会去 window.performance 拿取性能数据,否则上报的内容中仅有通用配置的数据useFmp能否搜集 FMP 初次有效绘制性能指标,需求 autoTracePerf 开启才有用,会向上报数据添加一个 fmpTime 字段enableSPA能否开启单页应用形式,开启后会在每次 window.onhashchange 事情中均发作性能数据

setPerformance

该办法会调用performance来配置错误追踪,但他做了更多的工作,首先其会改动全局通用配置(假如你没有设置 useFmp,该办法会将其置为 false),并对我们传入的配置参数停止校验,随后会调用 performance 办法,最后还会依据全局配置重新设置一遍错误追踪(不包括框架错误追踪)。

也就是说 setPerformance 能够同时配置错误追踪和性能追踪,且会改动全局配置:

ClientMonitor.register({

// 根底配置

collector: ‘http://127.0.0.1:12800’,

service: ‘FE_instance’,

serviceVersion: ‘1.0.0’,

pagePath: window.location.href,

// 错误追踪

jsErrors: true,

apiErrors: true,

resourceErrors: true,

vue: true,

// 性能追踪

autoTracePerf: true,

useFmp: true,

enableSPA: true,

})

复制代码

网络追踪

skywalking-client-js中的网络恳求追踪,会记载你的网络恳求状况并上报,该项功用只能由register配置项完成,其也是最综合的配置项,三个功用模块均能配置,贴一段源码了解其做了什么:

register(configs: CustomOptionsType) {

// 改动全局配置

this.customOptions = {

  ...this.customOptions,

  ...configs,

};

// 校验参数

this.validateOptions();

// 启用错误追踪

this.catchErrors(this.customOptions);

if (!this.customOptions.enableSPA) {

  // 假如没有开启enableSPA,启用性能追踪

  this.performance(this.customOptions);

}

// 启用网络追踪

traceSegment(this.customOptions);

}

复制代码

其配置功用全面,错误追踪和性能追踪我们前面曾经引见了,配置项是一样的,独一值得留意的是假如你开启了enableSPA,并不会开启性能追踪,需求你额外调用performance来开启,我并不晓得作者在这里的企图是什么,或许有其它思索。最后是由traceSegment开启的网络追踪办法。

traceSegment

从该办法的名字,片段追踪,我们引出skywalking世界中存在的span概念,这并不是我们的前端标签 span,而是指一个用来追踪的完好调用过程,从客户端到效劳端的网络恳求就是一个Exit类型的 span 过程(还有其它的类型的 span,前端不用理解)。一个时间片段以内可能会发作屡次恳求,skywalking 会将多个 span 封装到 segments 中停止上报。

traceSegment是如何晓得一段时间内你发送了网络恳求并记载上报的呢?其实是采用了拦截重视写fetch办法和xhr办法完成的。首先会在顶层定义一个segments队列,随后会生成xhrInterceptor和windowFetch拦截器,以后者 fetch 恳求为例,其伪代码如下:

windowFetch(option,segments){

// 复制原生fetch恳求办法

const originFetch = window.fetch;

// 重写

window.fetch = async (args) => {

    // 运用copy办法拿取恳求

    const response = await originFetch(...args);

    const segment = {

        // 用response和option结构上报数据

    }

    // 将该次恳求数据添加到队列

    segments.push(segment);

}

}

复制代码

如此一来你的一切xhr和fetch恳求都会被记载并上报。但也提供了你扫除一些恳求,不停止追踪的方式,在拦截器内部会有个hasTrace标志,其判别逻辑为:

const hasTrace = !noTraceOrigins || (isSDKInternal && customConfig.traceSDKInternal);

复制代码

前者表示能否在扫除列表中,后者表示非常追踪本人的上报恳求。traceSegment 还会设置一个循环定时器,定时轮询 segments 中能否有数据,存在的话就停止上报并清空,同时也有beforeunload事情监听在页面关闭的时分停止最后的上报。

总结以上功用,有如下的配置项:

traceSDKInternal:能否追踪本人的上报恳求

detailMode:设置能否开启细致形式,开启后会在 span 中添加更多细致信息的 tag

noTraceOrigins (array):扫除追踪的恳求列表

traceTimeInterval:设置循环定时器轮询的时间,默许 1min,单位 ms

register

最后我们经过一个完好的配置示例来阐明register的运用,除了根底配置外均运用默许配置:

ClientMonitor.register({

// 根底配置

collector: ‘http://127.0.0.1:12800’,

service: ‘FE_instance’,

serviceVersion: ‘1.0.0’,

pagePath: window.location.href,

// 错误追踪

jsErrors: true,

apiErrors: true,

resourceErrors: true,

vue: true,

// 性能追踪

autoTracePerf: true,

useFmp: true,

enableSPA: true,

// 网络追踪

traceSDKInternal:false,

detailMode:false,

noTraceOrigins:[],

traceTimeInterval:60000

})

复制代码

值得留意的是 register 办法全局只能调用一次,由于 traceSegment 的网络追踪是重写全局 fetch 和 xhr 办法完成的,屡次调用会屡次重写发作错误

setCustomTags

此配置办法是最新版的 v0.9.0 新增的,还记得网络追踪的detailMode配置项能够像 span 中添加细致信息的 tag 吗,假如开启后会默许添加http.method和url两个 tag。如今我们能够用setCustomTags配置办法在 span 中参加一些我们本人的 tag:

ClientMonitor.setCustomTags([

{ key: 'key1', value: 'value1' },

{ key: 'key2', value: 'value2' },

]);

复制代码

总结

假如你打算采用 skywalking 作为你的散布式系统的应用程序性能监视工具,那么skywalking-client-js能够协助你非常轻松地将阅读器 web 端接入其中,经过简单的十余项配置就能完成强大的埋点功用,疾速展示在 skywalking UI 上。

他非常轻量化,埋点代码侵入量小,中心代码量在千行左右,均采用原生 API 完成,且控制上报频率后不会有太大的性能影响,是性价比很高的埋点计划。

但目前的上报信息我们能够控制的局部比拟少,都是固定的,且不便当对不同类型效劳的恳求做辨别,在添加setCustomTags办法后有所改善,如今 skywalking 照旧在开展壮大,将来可期。