本文介绍如何在WebPro中使用SDK调用API。
全文的client代表的是SDK实例。如何获取SDK实例,请参见SDK接入。 初始化client实例,初始化配置中可以包含通用事件上下文,通用事件上下文以外的配置只生效一次。
init调用后会开始拉取服务端配置,并拉取异步加载的插件。
client('init', c: InitConfig) => void
useLocalConfig?: boolean;
storageExpires?: number | boolean;
pluginPathPrefix?:string;
更改通用上下文,仅对更新后发送的事件生效。如果需要对所有事件生效,请确保在start之前调用。
client('config', c?: Partial) =>WebConfig
useLocalConfig: boolean;
storageExpires?: number | boolean;
pluginPathPrefix:string;
const config = client('config')
设置自定义维度。context是一个全局维度的上下文,对所有事件生效。更新的context只对之后发生的事件生效。
client("context.set", "key", "value");
client("context.merge", { key: "value" });
client("context.delete", "key");
client("context.clear");
- 如果想要给一些初始化的上下文,需要在init之前设置context。因为init的时候会发送一些事件,例如pageview。
上报一次PV,若pid与当前pid相同则会忽略此次PV。
client('sendPageview',pid: string) => void
client('sendPageview', '/test/pageA')
上报一个自定义事件。注意格式,格式不符合的事件将会试图转换,无法转换的事件将会被忽略。具体消费方式可以查看自定义监控。 client('sendEvent', data: CustomEventPayload) => void
interface CustomEventPayload {
metrics?: { [key: string]: number };
categories?: { [key: string]: string };
login_api_duration: 1000,
上报一个自定义日志。注意格式,格式不符合的事件将会试图转换,无法转换的事件将会被忽略。
client('sendLog', data: CustomLogPayload) => void
interface CustomLogPayload {
extra?: { [key: string]: string | number };
level?: "debug" | "info" | "warn" | "error";
content: `user loggedin from ${prev}`,
client('captureException', error: any, extra?: { [key: string]: string }, react?: ReactInfo) => void
export interface ReactInfo {
client('captureException', new Error('test error'))
client('captureException', 'custom error')
client('captureException', new Error('login error'), { loginId: 'xxxxx' })
- 如果是默认集成的指标,例如FP、FCP,可以在Performance插件中关闭上报,通过这种自定义上报的方式上报上去,平台自动消费。
- 如果不是默认集成的指标,通过这种自定义上报的方式上报上去后,在性能指标管理中注册指标,即可在平台消费。
client('sendCustomPerfMetric', metric: PerformancePayload) => void
interface PerformancePayload {
extra?: { [key: string]: string };
client('sendCustomPerfMetric', { name: 'fcp', value: 3500 }
调用此方法可以去掉所有监听和副作用,包括hook或者内存对象。当前实例本身还是可用的,所以手动调用API依然可以上报数据。
client('report', ev: ReportEvent) => void
面包屑主要在JS错误上报时会携带,如果业务想要自定义一些面包屑,可以使用下面的方式。
client('addBreadcrumb',breadcrumb: Breadcrumb) => void
export interface Breadcrumb {
data?: { [key: string]: string };
client('addBreadcrumb', { type: 'custom', message: 'user login', category: 'webview' })
client('wrapFetch', fetch: typeof window.fetch) => typeof window.fetch | undefined
如果需要手动包装,需要注意以下内容:
- 需要在init之后执行。因为wrapFetch是动态挂载的,挂载的时机是在init时,所以需要在init后执行。
- 需要使用npm的接入方式。script接入会先加载主脚本,在这之前所有的调用都只是缓存起来,并没有真正运行,所以提前运行拿到的返回值会是undefined。
- 需要将fetch插件的autoWrap配置为false。既然选择手动包装,那么就要避免自动包装带来的其他无关请求的监控上报。
import client from '@apmplus/web'
const fetchAfterWrap = client('wrapFetch', window.fetch)
client('detectBlankScreen')
import client from '@apmplus/web'
client('detectBlankScreen')
默认情况下,在页面关闭时SDK会使用sendBeacon强制发送缓存队列的数据,但是如果在页面关闭时,用户再手动调用某些API上报数据,可能因为时机问题导致漏发,可以使用以下方式强制发送数据:
import client from '@apmplus/web'
client('on', 'init', () => {
client.getSender().flush()