有些场景下只希望上报部分数据,可以称为采样。本文介绍如何在SDK和平上中配置采样。
部分插件提供了一些过滤选项,可以针对简单的内容进行过滤,命中过滤则直接不上报。具体插件配置请参见配置插件。
例如,JS错误插件提供了按照错误信息过滤的配置项。完成以下配置,可以不上报指定的符合条件的JS错误。
import browserClient from '@apmplus/web' browserClient('init', { ... plugins: { jsError: { ignoreErrors: ['Failed to fetch'] } }, ... })
SDK提供了多个生命周期,其中beforeSend是自定义采样时常用的生命周期,每一个需要上报的事件都会完成beforeSend生命周期。在回调里返回false、null或者undefined,就不会上报该事件到平台上。
例如,完成以下配置,当页面地址中包含test
,该页面发生的JS错误就不上报。
import browserClient from '@apmplus/web' browserClient('on', 'beforeSend', (ev) => { if(ev.ev_type === 'js_error' && ev.common.url.includes('test')) { return false // 不再上报 } return ev // 继续上报 })
ev的具体类型,除了查看ts提示,还可以查看@apmplus/web导出的类型BrowserSendEvent。
您可以在init时传入sample对象来配置采样。
字段 | 类型 | 说明 |
---|---|---|
sample_rate | number | 总采样率,对所有事件生效。 |
include_users | string[] | 用户白名单,命中的用户会直接上报所有字段。 |
sample_granularity | string | 采样模式。
|
rules | { [key: string]: EventSampleRule } | 规则采样,针对不同事件类型来特殊配置,key为事件类型。
所有的插件名都是事件类型,如果您想查看事件类型的全部取值,请参见配置插件。 |
采样有两种模式:
例如,某个规则下的采样率是1%
为了更好的还原单个用户下的所有行为,SDK默认采用的是session模式。
rules常用于指定某个事件类型的特殊采样率或者特殊规则采样。rules的参数类型是对象格式,key对应插件名称,value对应的EventSampleRule类型。所有的插件名称,请查看配置插件。
EventSampleRule的具体类型如下:
interface EventSampleRule { enable: boolean = true // 是否开启 sample_rate: number = 1 // 采样率 conditional_sample_rules?: Array<ConditionalSampleRule> // 条件采样规则 } interface ConditionalSampleRule { sample_rate: number // 命中条件事件的采样率 filter: FilterCondition // 命中过滤条件 } interface FilterCondition { /** or 或者 and 或者rule */ type: string // 'rule' | 'and' | or', rule 表示原子规则, and/or 表示对子规则的逻辑运算 field?: string // 过滤判断的字段 // op 代表匹配模式,包括 'eq' 等于 | 'neq' 不等于 | 'gt' 大于 | 'gte' 大于等于 | // 'lt' 小于 | 'lte' 小于等于 | 'regex' 正则符合 | 'not_regex' 正则不符合 op?: string values?: Array<string> // 判断操作数,具体类型根据判断字段的类型以及操作符决定 children?: Array<FilterCondition> // 子规则 }
您可以通过配置单个事件的sample_rate指定单个事件类型的采样率,也可以通过配置conditional_sample_rules指定不同规则下的采样率。
在conditional_sample_rules中,type用来指定多个子规则children之间的与和或关系,具体设计请参见举例说明。
场景一:总采样0.1,针对pageview事件再采样0.2。
pageview实际采样率 = 总采样 * 单一事件采样 = 0.1 * 0.2 = 0.02。
browserClient('init', { ... sample: { sample_rate: 0.1, include_users: [''], sample_granularity: 'session', rules: { pageview: { enable: true, sample_rate: 0.2, conditional_sample_rules: [], } }, } ... })
场景二:简单规则采样。
在场景一的基础上,设置一个条件,针对pid等于'login'的pageview事件只采样0.5。
[pid='login'] pageview实际采样率 = 总采样 * 规则采样率 = 0.05。
browserClient('init', { ... sample: { sample_rate: 0.1, include_users: [''], sample_granularity: 'session', rules: { pageview: { enable: true, sample_rate: 0.2, conditional_sample_rules: [ { sample_rate: 0.5, filter: { // 针对条件为payload.pid为 login 的 PV 上报 type: 'rule', field: 'payload.pid', op: '=', values: ['login'], }, }, ], } }, } ... })
field的取值是BrowserSendEvent上报类型的字符串写法。在这个示例中,payload.pid等效于beforeSend中的ev.payload.pid。
场景三:复杂规则采样。
在上一个规则采样中再加入一个子规则。针对pid等于'login'并且release正则符合'0.1012'的pageview事件采样0.5。
pid等于'login'并且release正则符合'0.1012'的pageview实际采样率为 = 总采样 * 规则采样率= 0.05
browserClient('init', { ... sample: { sample_rate: 0.1, include_users: [''], sample_granularity: 'session', rules: { pageview: { enable: true, sample_rate: 0.2, conditional_sample_rules: [ { sample_rate: 0.5, filter: { type: 'and', children: [ { type: 'rule', field: 'payload.pid', op: '=', values: ['login'], }, { type: 'rule', field: 'common.release', op: 'regex', values: ['0.1012'], } ] }, }, ], } }, } ... })
如果配置了多个规则采样,会按照数组顺序进行配置,如果上一个规则命中,则使用对应规则的采样率,都否则命中下一个规则采样。
从使用的角度,虽然设计时有些复杂,但是足够灵活,可以满足任意场景。如果觉得手动配置太多复杂或者对正确配置没有把握,可以直接选择在平台上配置采样,平台和SDK使用的是同一套规则。
平台侧可以在项目设置页面中配置采样率。
相比于在SDK中使用sample来配置采样:
说明
交互上支持多层嵌套,但是不推荐规则采样里再多层嵌套规则。
您可以在network中过滤settings/get/webpro接口,从接口的响应体判断平台的配置是否有生效。
如果SDK和平台都配置了采样,配置合并的优先级顺序为:SDK默认配置 < 平台采样配置 < SDK初始化时用户传入的采样配置。
同时合并规则为深度合并,即对象合并,数组也合并。