Web SDK

SDK接入流程

步骤

集成内容

本文中的位置

是否必选

附加说明

第一步

SDK获取

查看文档「第一步SDK接入说明」

必选

提供NPMCDN两种方式,根据自身环境选择其一即可

第二步

设置初始化参数

查看文档 [第二设置初始化参数-设置应用唯一标识(appkey)」

必选

设置初始化参数

查看文档 [第二步设置初始化参数-设置收数服务地址」

必选

设置初始化参数

查看文档 [第二步设置初始化参数

黑白名单设置pageFilter

可选

通过设置pageFilter完成对日志的过滤

设置初始化参数

查看文档 [第二步设置初始化参数输出日志等级」

可选

附录

兼容性说明

查看文档 [附录兼容性说明」

注意:在完成Web端接入前,需要先获取Webappkey。

SDK接入说明

Web 端SDK接入方式有两种:CDNNPM

注意:

  1. CDN下载地址:APM H5 SDK

  2. npm命令:npm install lydaas_apm --save

  3. 内网环境,请将SDK中的js文件上传到内网的静态资源服务器上,并将集成代码中的CDN地址替换为内网js文件的URL地址

通过CDN在线部署

同步加载和异步加载区别

异步加载:又称为非阻塞加载,表示浏览器在下载执行JS之后还会继续处理后续页面。若对页面性能的要求非常高,建议使用此方式。(异步加载无法捕捉到SDK加载初始化完成之前的JS错误和资源加载错误)

同步加载:又称为阻塞加载,表示当前JS加载完毕后才会进行后续处理。如需捕捉从页面打开到关闭的整个过程中的JS错误和资源加载错误,建议使用此方式

异步加载

情景一:通过CDN异步引入SDK后,设置初始化参数。

<script>
  void (function (e, t, n, a, o, i, m) {
    (e._um_apm_namespace = o),
    (e[o] = e[o] || function () {
          (e[o].q = e[o].q || []).push(arguments);
    }),
    (e[o].l = e[o].l || +new Date()),
    (i = t.createElement(n)),
    i.setAttribute('crossorigin', ''),
    (i.src = a),
    (m = t.getElementsByTagName(n)[0]),
    m.parentNode.insertBefore(i, m);
  })(
    window,
    document,
    'script',
    'https://g.alicdn.com/QTSDK/oxm-web-apm/2.1.1/es5/uapm.iife.js',
    '_apm',
  );
  _apm('create', {
    pid: '应用唯一标识',
    //注意:域名前需要添加"https://" 
    dsn: '收数域名',
    pageFilter: { mode: 'ignore', rules: [] },
    //更多配置见第二步参数说明
  });
</script>

情景二:在SDK引入之前设置初始化参数

<script>
  window._apm = window._apm || {
    p:[[
      'create', {
       pid: '应用唯一标识',
       //注意:域名前需要添加"https://"
       dsn: '收数域名',
       pageFilter: {
         mode: 'ignore',
         rules: [],
       },
       //更多配置见第二步参数说明
    }]],
  };
</script>

<script>
  void (function (e, t, n, a, o, i, m) {
    (e._um_apm_namespace = o),
    (e[o] = e[o] || function () {
      (e[o].q = e[o].q || []).push(arguments);
    }),
    (e[o].l = e[o].l || +new Date()),
    (i = t.createElement(n)),
     i.setAttribute('crossorigin', ''),
    (i.src = a),
    (m = t.getElementsByTagName(n)[0]),
     m.parentNode.insertBefore(i, m);
  })(
    window,
    document,
    'script',
    'https://g.alicdn.com/QTSDK/oxm-web-apm/2.1.1/es5/uapm.iife.js',
    '_apm',
  );
</script>

同步加载

<script>
  window._um_apm_namespace = '_apm';
  window[_um_apm_namespace] = window[_um_apm_namespace] || {
    p: [],
  };
  window[_um_apm_namespace].p.push([
    'create',
    {
      //注意:域名前需要添加"https://"
      dsn: '收数域名',
      pid: '应用唯一标识',
      pageFilter: {
        mode: 'ignore',
        rules: [],
      },
      //更多配置见第二步参数说明
    },
  ]);
</script>

<script src="https://g.alicdn.com/QTSDK/oxm-web-apm/2.1.1/es5/uapm.iife.js" crossorigin></script>

通过NPM方式集成SDK

初始化调用示例

注意:域名前需要添加"https://"

import { init } from 'lydaas_apm';

init({
  pid: '应用唯一标识',
  //注意:域名前需要添加"https://"
  dsn: '收数域名',
  pageFilter: {
    mode: 'ignore',
    rules: []
  },
  errorFilter: {
    mode: 'ignore',
    rules: []
  },
  puid: "user@example.com", // 接入方平台用户账号
  tag: "", // 自定义标签
  logLevel: 0, // 日志级别; 0表示error、1表示warn、2表示info、3表示debug
  enableBlankScreen: true, // 是否开启白屏统计
  blankConfig: {
    blank_target: 'body', // 检测白屏DOM根节点
    blank_timeout: 6000, // 检测设置的白屏DOM根节点是否有像素显示的等待时间,单位为毫秒(ms)
    screenshot: true, // 是否发送白屏的截图
    X: 1.5, // 判断是否发送截屏,如果DOM得分小于设定的值,会发送截屏数据
    Y: 6, // 判断是否发送白屏日志,如果DOM得分小于设定值,会发送白屏日志
  }
});

设置/修改初始化参数

设置应用唯一标识(appkey)

必填

属性

含义

默认

类型

pid

接入应用唯一标识(appkey)

-

string

设置用户产品线标志tag(可选)

属性

含义

默认

类型

tag

设置产品线标识id,可以在同一个appkey下区分不同的产品线,方便开发者排查问题

-

string

设置SDK采集服务地址

必填

属性

含义

默认

类型

dsn

SDK采集服务地址

-

string

黑白名单设置pageFilter(可选)

您可以设置采集的H5页面黑白名单模式,黑名单和白名单二选一:

  • 若选择白名单模式,仅符合规则的页面会被采集

  • 若选择黑名单模式,则符合规则的页面不会被采集

此项非必须参数,用于根据页面地址判断是否过滤日志,包含如下属性

属性

含义

默认

类型

mode

匹配模式

当值为ignore,表示黑名单模式,命中规则的不上报 、当值为match,表示白名单模式命中规则的上报

ignore

枚举值 ignore|match

rules

匹配规则集合的匹配逻辑如下:

  • 当规则类型为字符串string时,表示当页面的 url 包含该字符串时,即视为命中规则;

  • 当规则类型为函数Function时,若该函数返回 true,则表示命中规则,返回 false 则表示未命中;

  • 当规则类型为数组时,表示一组规则集合,数组中的各个规则之间为“或”的关系,只要任意一个规则命中,则整个规则集视为命中。

[],该默认值表示黑名单为空,日志全部上报

  • string

  • RegExp

  • Function

  • Array<string | RegExp | Function>

黑白名单设置errorFilter(可选)

该功能用于配置H5页面的采集黑白名单。您可以选择白名单或黑名单模式:

  • 若选择白名单模式,仅符合配置规则的页面会被采集

  • 若选择黑名单模式,符合配置规则的页面将被排除,不会被采集

此项非必须参数,用于根据自定条件判断是否过滤日志,包含如下属性

属性

含义

默认

类型

mode

匹配模式

当值为ignore,表示黑名单模式,命中规则的不上报 、当值为match,表示白名单模式命中规则的上报

ignore

枚举值 ignore|match

rules

匹配规则集合的定义如下:

  • 当类型为 string 时,表示页面 URL 包含该字符串时规则命中;

  • 当类型为 Function 时,该函数返回 true 表示规则命中,返回 false 表示未命中;

  • 当类型为 数组 时,表示规则集合,集合中的规则之间为“或”关系,只要任意一个规则命中,则整个规则集命中。

[],该默认值表示黑名单为空,日志全部上报

  • string

  • RegExp

  • Function

  • Array<string | RegExp | Function>

黑白名单设置apiFilter (可选)

该功能用于设置api请求日志黑白名单,根据设置的黑白名单,过滤xhrfetch的请求url,仅对api日志生效

属性

含义

默认

类型

mode

匹配模式

当值为ignore,表示黑名单模式,命中规则的不上报 、当值为match,表示白名单模式命中规则的上报

ignore

枚举值 ignore|match

rules

匹配规则集合的定义如下:

  • 当类型为 string 时,表示页面 URL 包含该字符串时规则命中;

  • 当类型为 Function 时,该函数返回 true 表示规则命中,返回 false 表示未命中;

  • 当类型为 数组 时,表示规则集合,集合中的规则之间为“或”关系,只要任意一个规则命中,则整个规则集命中。

[],该默认值表示黑名单为空,日志全部上报

  • string

  • RegExp

  • Function

  • Array<string | RegExp | Function>

设置api请求参数(可选)

属性

含义

默认

类型

hookXHR

是否开启XMLHttpRequest请求的拦截

true

boolean

hookFetch

是否开启fetch请求的拦截

true

boolean

xhrConfig

xhr请求的配置

{

enableReqBody:true

}

object

fetchConfig

fetch请求的配置

{

enableReqBody:true

}

object

xhrConfig

属性

含义

默认

类型

enableReqBody

是否在开启对xhr请求body的采集,默认情况下,会在请求响应状态码大于400时采集

true

boolean

fetchConfig

属性

含义

默认

类型

enableReqBody

是否在开启对fetch请求body的采集,默认情况下,会在请求响应状态码大于400时采集

true

boolean

输出日志等级(可选)

非必填,表示js日志输出日志等级

属性

含义

默认

类型

logLevel

日志等级

0

枚举值

0 表示ERROR日志

1 表示WARN日志

2 表示INFO日志

3 表示DEBUG日志

白屏检测(可选)

非必填,用于设置白屏检测标准、截屏功能等相关配置

属性

含义

默认

类型

enableBlankScreen

白屏检查开关

true,即默认开启

boolean

blankConfig

白屏配置

{

blank_target:'body',

blank_timeout:6000,

screenshot:true,

X:1.5,

Y:6,

}

object

blankConfig

属性

含义

默认

类型

blank_target

白屏检查目标元素

body

string

blank_timeout

白屏检查时机,页面加载后多久检查白屏,单位毫秒

6000

number

screenshot

是否发送截屏

true

boolean

X

截屏的发送阈值,dom得分小于设定值时发送截屏数据

1.5

number

Y

白屏日志发送阈值,dom得分小于设定值时发送白屏日志

6

number

开启全链路请求注入(可选)

非必填,用于对H5应用内业务请求注入httpHeader。

注意:通过sendAPILog主动发起的请求日志不支持httpHeader注入

属性

含义

默认

类型

rumConfig

全链路请求header注入配置

-

object

rumConfig

属性

含义

默认

类型

injectTraceHeader

SDK会对H5应用网络请求注入设置的请求头,并且自动生成相关协议字段

undefined

枚举值

  • traceparent

  • b3

  • sw8

  • sentry-trace

needTracedUrls

全链路监控注入Urls白名单,默认值为null

null,该默认值表示白名单为空,如果设置此值,则仅符合规则的请求url会被注入请求头

Array<string | RegExp>

ignoredUrls

全链路监控注入Urls黑名单,默认值为null

null,该默认值表示黑名单为空,如果设置此值,则仅符合规则的请求url不会被注入请求头

Array<string | RegExp>

injectSDKRequest

是否对SDK内部请求注入请求头,默认为false,即不注入

false,该默认值表示SDK的内部请求url不会被注入请求头

boolean

方法说明

1. 用户手动捕捉并上报错误日志

captureException

调用方法,通过CDN引入的使用以下方式调用
_apm && _apm('captureException', new Error('手动捕捉'));
通过npm引入的使用以下方式来调用
import { captureException } from 'lydaas_apm';
try {
  throw new Error('开发者手动捕捉到的错误');
} catch (error) {
  captureException(error);
}
vue中的使用示范如下,以vite创建的工程为例,在main.js
import { createApp } from 'vue';
import './style.css';
import App from './App.vue';
import { init, captureException } from 'lydaas_apm';

init({
  pageFilter: {
    mode: 'ignore',
    rules: [],
  },
  pid: 'test124',
  dsn: '//aplus2-portal-lite.emas-poc.com',
  logLevel: 4,
});

const app = createApp(App);
app.config.errorHandler = (err, instance, info) => {
    // 处理错误,例如:报告给一个服务
    captureException(err);
};
app.mount('#app');

2. 用户手动上报API请求日志

sendAPILog

(该api调用要求版本不低于2.0.10)

调用方法,通过CDN引入的使用以下方式调用
_apm && _apm('sendAPILog', {
    url: 'https://example.com/getUserName',
    method: 5,
    rc: 500,
    rt: 2000,
    traceid: '1234567',
    req_body: '{a:1}',
    req_query: '&aaa=1'
});
通过npm引入的使用以下方式来调用
import { sendAPILog } from 'lydaas_apm';

sendAPILog({
    url: 'https://example.com/getUserName',
    method: 5,
    rc: 500,
    rt: 2000,
    traceid: '1234567',
    req_body: '{a:1}',
    req_query: '&aaa=1'
});

属性

含义

必填项

类型

举例

url

请求地址

必填

string

https://u.shujupie.com/d

method

请求方法

1: 'GET'

2: 'POST'

3: 'PUT'

4: 'HEAD'

5: 'DELETE'

6: 'CONNECT'

7: 'OPTIONS'

8: 'TRACE'

9: 'PATCH'

必填

int

2

rt

请求耗时(毫秒)

必填

long

3000

rc

响应编码

必填

int

200

traceid

请求追踪id

选填

string

abcdef

req_query

入参query

选填

string

string

req_body

入参body (仅状态码>400 且不等于0 采集上报,其它状态为空)

选填

string

string

3. 设置用户标识(可选)

通过CDN引入,异步加载
<script>
  void (function (e, t, n, a, o, i, m) {
    (e._um_apm_namespace = o),
    (e[o] = e[o] || function () {
      (e[o].q = e[o].q || []).push(arguments);
    }),
    (e[o].l = e[o].l || +new Date()),
    (i = t.createElement(n)),
     i.setAttribute('crossorigin', ''),
    (i.src = a),
    (m = t.getElementsByTagName(n)[0]),
     m.parentNode.insertBefore(i, m);
  })(
    window,
    document,
    'script',
    'https://g.alicdn.com/QTSDK/oxm-web-apm/2.1.1/es5/uapm.iife.js',
    '_apm',
  );
  _apm('create', {
    pid: 'appkey',
    dsn: 'https://example.com',
    pageFilter: { mode: 'ignore', rules: [] },
  });
</script>

<script>
  // 此处为用户可以在自己的业务代码中设置
  _apm('set', 'puid', '用户账号');
</script>
通过CDN引入,同步加载
<script>
  window._um_apm_namespace = '_apm';
  window[_um_apm_namespace] = window[_um_apm_namespace] || {
    p: [],
  };
  window[_um_apm_namespace].p.push([
    'create',
    {
      //注意:域名前需要添加"https://"
      dsn: 'https://example.com',
      pid: 'appkey',
      pageFilter: {
        mode: 'ignore',
        rules: [],
      },
    },
  ]);
</script>
<script src="https://g.alicdn.com/QTSDK/oxm-web-apm/2.1.1/es5/uapm.iife.js" crossorigin></script>

<script>
  window[_um_apm_namespace].p.push(['set', 'puid', '用户账号']);
</script>
通过npm引入
import { setUserConfig } from 'lydaas_apm';
setUserConfig({puid:"用户账号"});

附录:兼容性说明

浏览器和平台兼容性

浏览器/平台

支持版本

Safari

Safari 9+

Chrome

Chrome 49+

IE

IE 9+

Edge

Edge 12+

Firefox

Firefox 36+

Opera

Opera 43+

Safari for iOS

Safari for iOS 9.3.2+

Android Browser

android_webkit 4.4.2+