跳转到主要内容
PRODUCT DOCUMENTS

快速找到所需文档,高效完成接入与排障

浏览产品文档与友盟 Skill,展开目录并阅读正文。

Web&H5 SDK接入说明

sdk集成说明和常见问题。

重要

1、在完成Web端接入前,需要先获取web端appkey

2、首次开通后直接测试会出现本地调试没有数据情况:由于云端配置存在多级缓存,因此数据上报会有延迟,如您清理缓存,则在清理缓存后5分钟后生效,可5分钟后再尝试测试上报;若不清理缓存,2小时后,页面刷新时会自动重新拉取云配接口更新配置

  1. APM Web端需要购买使用,可以点击APM下单地址购买并在友盟平台激活开通

关于集成成功后没有数据的说明

1.请先进入采样率配置页面查看采样率是否有不到100%的配置项

2.如果有,请修改成100%,并清空SDK需要采集的项目的缓存后重新加载项目拉取云配信息

3.如果没有,请将SDK集成代码配置项中的logLevel(Number类型)修改为3,并完整的将APM的日志和集成代码提交至工单

SDK接入说明

Web 端SDK接入方式有两种:CDN和NPM

通过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/jssdk/apm/2.0.10/es5/uapm.iife.js", "_apm");
 _apm('create',{
 pid:'appkey',
 pageFilter: { mode: 'ignore', rules: [] },
 });
</script>

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

<script>
window._apm = window._apm || {
 p: [
 [
 'create',
 {
 pid:'appkey',
 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/jssdk/apm/2.0.10/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',
 {
 pid:'appkey',
 pageFilter: {
 mode: 'ignore',
 rules: [],
 },
 },
]);
</script>
<script src="https://g.alicdn.com/jssdk/apm/2.0.10/es5/uapm.iife.js" crossorigin></script>

通过npm集成

在终端执行如下命令安装最新版sdk @umengfe/apm, 注意SDK版本必须大于2.0.0

npm install @umengfe/apm --save

ESM

import { init } from '@umengfe/apm';
init({
 pageFilter: { mode: 'ignore', rules: [] },
 pid:'appkey',
});

CJS

const APM = require('@umengfe/apm');
APM.init({
 pageFilter: { mode: 'ignore', rules: [] },
 pid:'appkey',
});

设置/(修改)初始化参数

如您使用cdn方式,则已复制完毕初始化代码,可按照下面方式进行参数修改;

如您使用npm方式,则需要复制下面的初始化代码,并按照下面方式进行参数设置

初始化说明

初始化方法,调用示意

import { init } from '@umengfe/apm';
init({
 pageFilter: {
 mode:'ignore',
 rules:[]
 },
 pid:'appkey',
 logLevel: 0,
 traceKey:'trace-x',
});

参数如下

设置应用唯一标识pid(必填)

属性

含义

默认

类型

pid

接入应用唯一标识(appkey)

-

string

设置用户账号id(可填)

属性

含义

默认

类型

puid

用户账号id

-

string

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

属性

含义

默认

类型

tag

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

-

string

黑白名单设置(可选)

属性

含义

默认

类型

pageFilter

用于设置采集的H5页面黑白名单,可以在黑名单和白名单中选择其一,如果选择白名单的方式,那么只有符合标准的页面会被采集,如果选择的是黑名单的方式,那么符合标准的页面不会被采集

此项非必须参数,用于根据页面地址判断是否过滤日志,对所有日志类型生效

{mode:'ignore',rules:[]}

object

apiFilter

设置api请求日志黑白名单,根据设置的黑白名单,过滤xhr和fetch请求的url,仅对api日志生效

{mode:'ignore',rules:[]}

object

errorFilter

设置错误日志黑白名单,根据设置的黑白名单,过滤错误堆栈,仅对api日志生效

{mode:'ignore',rules:[]}

object

pageFilter

属性

含义

默认

类型

mode

匹配模式

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

ignore

枚举值 ignore|match

rules

匹配规则集合,当类型为string时,表示包含当页面url包含该字符串时命中规则;当类型为Funtion,该函数返回true表示命中规则,false表示未命中规则;当类型为数组时,表示规则集合,规则之间为或的关系,只要任意一个规则命中,则规则集命中。

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

string | RegExp | Function | Array<string | RegExp | Function>

apiFilter

属性

含义

默认

类型

mode

匹配模式

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

ignore

枚举值 ignore|match

rules

匹配规则集合,当类型为string时,表示包含当页面url包含该字符串时命中规则;当类型为Funtion,该函数返回true表示命中规则,false表示未命中规则;当类型为数组时,表示规则集合,规则之间为或的关系,只要任意一个规则命中,则规则集命中。

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

string | RegExp | Function | Array<string | RegExp | Function>

errorFilter

属性

含义

默认

类型

mode

匹配模式

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

ignore

枚举值 ignore|match

rules

匹配规则集合,当类型为string时,表示包含当页面url包含该字符串时命中规则;当类型为Funtion,该函数返回true表示命中规则,false表示未命中规则;当类型为数组时,表示规则集合,规则之间为或的关系,只要任意一个规则命中,则规则集命中。

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

string | RegExp | Function | Array<string | RegExp | Function>

输出日志等级(可选)

属性

含义

默认

类型

logLevel

日志等级

0

枚举值

0 表示ERROR日志

1 表示WARN日志

2 表示INFO日志

3 表示DEBUG日志

设置traceKey链路追踪(可选)

特别注意,开启后还需要配合服务端同学,在业务接口返回的header中添加traceId:xxxidxxid,同时在header中返回access-control-expose-headers: traceId,以允许浏览器读取header中key为traceId的字段

属性

含义

默认

类型

traceKey

设置需要采集xhr或fetch响应header中的哪个字段

'traceId'

string

设置白屏参数(可选)

设置白屏、截屏功能开关,以及相关配置

属性

含义

默认

类型

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

设置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

自定义错误采集

captureException

调用方法,通过cdn引入的使用以下方式调用

_apm && _apm('captureException', new Error('手动捕捉'));

通过npm引入的使用以下方式来调用

import { captureException } from '@umengfe/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 '@umengfe/apm';
init({
  pageFilter: {
    mode: 'ignore',
    rules: [],
  },
  pid: 'test124',
  logLevel: 4,
});
const app = createApp(App);
app.config.errorHandler = (err, instance, info) => {
  // 处理错误,例如:报告给一个服务
  captureException(err);
};
app.mount('#app');

用户手动上报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 '@umengfe/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

修改用户配置

npm 方式

import { setUserConfig } from '@umengfe/apm';
setUserConfig({puid:"用户自己的账号"});

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/jssdk/apm/2.0.10/es5/uapm.iife.js", "_apm");
  _apm('create',{
    pid:'appkey',
    pageFilter: { mode: 'ignore', rules: [] },
  });
</script>

<script>
  // 此处为用户可以在自己的业务代码中设置
 _apm('set','puid','用户自己的账号');
</script>

修改sdk的命名空间

在cdn引入时,需要从全局变量中获取apm的句柄,如下图,第五个参数"_apm"可修改为开发者期望的全局句柄,比如改为_um_apm,后面sdk的初始化和调用都是通过_um_apm()来调用。

<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/jssdk/apm/2.0.10/es5/uapm.iife.js", "_apm");
  _apm('create',{
    pid:'appkey',
    pageFilter: { mode: 'ignore', rules: [] },
  });
</script>

避免sdk被移除,sdk调用时报错

window._apm = window._apm || {p: []}; 
_apm.push([
      'create',
      {
        pid:'appkey',
        pageFilter: {
          mode: 'ignore',
          rules: [],
        },
      },
]);
_apm.push([
      'set',
      'puid',
      '用户自己的账号id'
]);

附录:

浏览器兼容性说明

浏览器/平台

支持版本

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+

常见问题

  1. 已经开通功能的情况下,开发人员本地调试没有数据上报?

答:由于云端配置存在多级缓存,因此数据上报会有延迟,如您清理缓存,则在清理缓存后5分钟后生效,可5分钟后再尝试测试上报;若不清理缓存,2小时后,页面刷新时会自动重新拉取云配接口更新配置

  1. uni-app怎么集成?

    1. 答:参考apm相关的demo https://github.com/umeng/apm_demos_fe/blob/main/uni-app/README.md

加入开发者钉钉交流群

如您正在接入U-APM SDK 恰好有问题需要我们支持,或想和其他开发者交流 崩溃问题的优化与解决 都可以加入到该钉钉群.

点击获取入群二维码