本文介绍如何在WebPro中使用SDK调用API。
全文的client
代表的是SDK实例。如何获取SDK实例,请参见SDK接入。
初始化client实例,初始化配置中可以包含通用事件上下文,通用事件上下文以外的配置只生效一次。
init调用后会开始拉取服务端配置,并拉取异步加载的插件。
client('init', c: InitConfig) => void
interface InitConfig { aid: number; // 项目唯一标识,必传 token: string; // 项目 token,必传 // 通用事件上下文 pid?: string; userId?: string; deviceId?: string; release?: string; // 区分不同版本 env?: string; // 区分不同环境 useLocalConfig?: boolean; // 是否只使用本地配置,默认为关 storageExpires?: number | boolean;// 配置 storage 的过期时间,默认为 90 天 // 采样配置 和 插件配置 的具体配置可在详细配置中查看 sample?: SampleConfig; // 采样配置 plugins?: { ... }; // 具体可以查看 【配置插件】 // 特殊配置 pluginBundle?: { name: string; plugins: string[]; }; // 插件打包加载配置,非定制插件不需要配置 pluginPathPrefix?:string; // 插件加载路径前缀,调试用(比如 http://localhost:8081/cn/plugins)或加载定制插件用 domain?: string; // 上报域名。中国发布的应用:上报到中国大陆服务器,域名为https://apmplus.volces.com。海外发布的应用,上报到马来西亚柔佛服务器,域名为https://apmplus.ap-southeast-1.volces.com。如不配置,默认上报到中国大陆服务器。 }
client('init', { aid: 123456, // 你的 aid token:'xxx-xxx', // 替换成你的token env: 'boe', release: '1.0.221' })
更改通用上下文,仅对更新后发送的事件生效。如果需要对所有事件生效,请确保在start之前调用。
client('config', c?: Partial
// config 可以改动的配置 interface UserConfig { pid: string; userId: string; deviceId: string; sessionId:string; release: string; env: string; } // config 获取的配置 interface WebConfig { aid: number; // 项目唯一标识,必传 token: string; // 项目 token,必传 // 通用事件上下文 pid: string; userId: string; deviceId: string; sessionId: string; // 区分不同会话 release: string;// 区分不同版本 env: string;// 区分不同环境 useLocalConfig: boolean; // 是否只使用本地配置,默认为关 storageExpires?: number | boolean; // 配置 storage 的过期时间,默认为 90 天 // 采样配置 和 插件配置 的具体配置可在详细配置中查看 sample: SampleConfig; // 采样配置 plugins: { ... }; // 插件配置 // 特殊配置 pluginBundle: { name: string; plugins: string[]; }; // 插件打包加载配置,非定制插件不需要配置 pluginPathPrefix:string; // 插件加载路径前缀,调试用(比如 http://localhost:8081/cn/plugins)或加载定制插件用 domain?: string; // 上报域名,Saas不需要配置, 私有化部署时需要配制成具体环境的上报域名 }
// 更新配置 client('config', { userId: 'test_user', }) // 获取SDK当前配置,如果SDK还未init,则会返回undefined const config = client('config')
client('start')
设置自定义维度。context是一个全局维度的上下文,对所有事件生效。更新的context只对之后发生的事件生效。
client("context.set", "key", "value"); // 设置context中的单个key client("context.merge", { key: "value" }); // 将context 和 传入的对象合并,生成新的context client("context.delete", "key"); // 删除context中的某个key client("context.clear"); // 清空context
上报一次PV,若pid与当前pid相同则会忽略此次PV。
client('sendPageview',pid: string) => void
client('sendPageview', '/test/pageA')
上报一个自定义事件。注意格式,格式不符合的事件将会试图转换,无法转换的事件将会被忽略。具体消费方式可以查看自定义监控。
client('sendEvent', data: CustomEventPayload) => void
interface CustomEventPayload { /** 自定义事件名称 */ name: string; /** metrics 上报的是可以被度量的值,也就是数值 */ metrics?: { [key: string]: number }; /** categories 上报的是分类,维度,用来做筛选,分组 */ categories?: { [key: string]: string }; }
client('sendEvent', { name: 'login_event', metrics: { login_count: 1, login_api_duration: 1000, server_timing: 3456, login_level: 23, }, categories: { where: 'login_page', }, })
上报一个自定义日志。注意格式,格式不符合的事件将会试图转换,无法转换的事件将会被忽略。
client('sendLog', data: CustomLogPayload) => void
interface CustomLogPayload { /** 额外的附加信息, 在上报的时候 number会被分流到metric string会被分流到categories */ extra?: { [key: string]: string | number }; // /** 自定义事件内容,任意字符串,可以是日志或者对象的 JSON 字符串等等 */ content: string; /** 自定义事件级别,默认是 info, 可枚举项 debug | info | warn | error */ level?: "debug" | "info" | "warn" | "error"; }
client('sendLog', { level: 'error', content: `user loggedin from ${prev}`, extra: { where: 'login_page', }, })
client('captureException', error: any, extra?: { [key: string]: string }, react?: ReactInfo) => void
export interface ReactInfo { version: string; componentStack: string; }
// 上报一个error client('captureException', new Error('test error')) // 上报一个错误信息 client('captureException', 'custom error') // 上报一个error,同时附带一些错误的上下文 client('captureException', new Error('login error'), { loginId: 'xxxxx' })
client('sendCustomPerfMetric', metric: PerformancePayload) => void
interface PerformancePayload { /** 指标名称 */ name: string; /** 当前值 */ value: number; /** 性能指标类型, perf => 传统性能, spa => SPA 性能, mf => 微前端性能 */ type?: string = "perf"; /** 是否支持 */ isSupport?: boolean; /** 是否是Polyfill */ isPolyfill?: boolean; /** 是否跳出 */ isBounced?: boolean; /** 是否自定义 */ isCustom?: boolean; /** 指标的相关信息 */ extra?: { [key: string]: string }; }
client('sendCustomPerfMetric', { name: 'fcp', value: 3500 }
调用此方法可以去掉所有监听和副作用,包括hook或者内存对象。当前实例本身还是可用的,所以手动调用API依然可以上报数据。
client('destroy')
直接上报一个事件,具体格式见上报格式。
client('report', ev: ReportEvent) => void
client('report', { ev_type: 'pageview', payload: { source: 'history', pid: '/pageB' } })
面包屑主要在JS错误上报时会携带,如果业务想要自定义一些面包屑,可以使用下面的方式。
client('addBreadcrumb',breadcrumb: Breadcrumb) => void
export interface Breadcrumb { /** dom | http */ type: string; /** xpath, keyvalue | url */ message: string; /** ui.click, ui.keypress | post,get */ category: string; /** status: 400 for http */ data?: { [key: string]: string }; }
client('addBreadcrumb', { type: 'custom', message: 'user login', category: 'webview' })
client('wrapFetch', fetch: typeof window.fetch) => typeof window.fetch | undefined
如果需要手动包装,需要注意以下内容:
import client from '@apmplus/web' client('init', { ... plugins: { autoWrap: false, }, ... }) const fetchAfterWrap = client('wrapFetch', window.fetch) // then, use fetchAfterWrap to request
client('detectBlankScreen')
import client from '@apmplus/web' client('init', { ... plugins: { blankScreen: { // 关闭自动检测,改为下方的手动检测 autoDetect: false }, }, ... }) client('detectBlankScreen')
默认情况下,在页面关闭时SDK会使用sendBeacon强制发送缓存队列的数据,但是如果在页面关闭时,用户再手动调用某些API上报数据,可能因为时机问题导致漏发,可以使用以下方式强制发送数据:
import client from '@apmplus/web' // 写在回调里时为了确保SDK已经初始化完成,避免报错 onPageUnload(() => { client('on', 'init', () => { client.getSender().flush() }) })