在使用A/B测试进行实验前,您需要先明确实验场景并规划实验方案,研发工程师根据实验方案完成实验SDK接入,集成后,后续通过SDK与DataTester的分流服务实现实验的分流、获取实验参数等功能。本文为您介绍实验SDK的能力和通用集成流程。
SDK发布日志 | 隐私政策说明 |
|---|---|
|
A/B实验类型主要分为客户端实验和服务端实验。两类实验的对比介绍如下所示。
对比说明 | 客户端实验 | 服务端实验 |
|---|---|---|
实验描述 | 指通过客户端获取实验分组信息并控制配置生效的实验。 | 指通过服务端获取实验分组信息并控制配置生效或下发的实验。 |
特点及场景 |
|
|
对比说明 | 客户端实验 |
|---|---|
实验描述 | 指通过客户端获取实验分组信息并控制配置生效的实验。 |
实验SDK逻辑 |
|
实验指标/参数数据落库流程 | 其中:
|
支持的端/语言类型 | 客户端SDK支持iOS、Android、Web/JS、HarmonyOS、小程序、各种框架(如RN、Flutter等)的SDK等。 |
通常进行实验SDK集成时,有以下通用流程与注意事项。
注意事项 | 引导说明 |
|---|---|
用户标识说明 | 根据数据接入方案,了解数据接入时支持的用户标识类型,统一统计口径,详情请参见支持的用户唯一标识。 |
数据格式说明 | 如果需要自定义事件则需要了解对应事件及其属性对应的数据格式要求,详情请参见支持的数据格式(自定义事件/属性)。 注意 如果数据格式不符合规范,可能会导致数据接入操作正常,但后续上报的数据落库后为空或出现异常,因此您需要关注数据格式要求,例如将数值类型的属性,数据类型定义为string,可能后续数据上报候后,进行分析时会出错。 |
预置事件及属性 | 根据数据接入方案,明确后续需要采集上报的事件及其属性,了解预置事件及属性列表是否满足业务需求,预置事件及属性详情请参见预置属性总表。 |
「A/B」测试支持客户端、Web端、服务端等多种集成方式。请您根据需集成的应用类型,选择合适的集成方式,并参考以下的视频和文档完成SDK的集成。
集成场景 | 操作指导 |
|---|---|
客户端 |
说明
实验指标的上报可以通过客户端SDK上报,或使用HTTP API上报,可参考下文的 实验指标上报 章节。
可参考以下验证步骤对实验进行调试验证,调试成功后,可开启实验,后续可查看实验报告。
注意
如果实验是当天创建的实验报告和数据指标均为实时的,如果非当天创建,实验报告为非实时的,如果想查看实时数据,可以通过数据指标,选择5分钟级或小时级查看实时数据。
测试白名单为创建A/B实验时设置的测试用户,主要在实验创建完成、实验SDK集成操作完成后,用来调试实验/feature、检查白名单用户是否可以命中实验/feature,从而验证集成代码是否有误。
在开发工具运行应用,在控制台看获取分流结果是否和添加版本的value保持一致,如一致,意味着分流成功。
在全局设置-用户细查查看指定用户的细查行为中有没有携带目标实验vid的实验曝光事件上报上来。
SDK | 上报策略描述 | 是否可配置 | 是否可以根据网络环境自动调节 | 是否可以分时段上报 |
|---|---|---|---|---|
Android |
| 否 | 否 | 否 |
iOS |
| 否 | 否 | 否 |
Web JS | 实时上报,但有大约30ms的异步队列等待时间,30ms内触发的事件条数在20条以内的话就合并为一条上报,超过20条,就按照20个一组分开上报。max_report可以设置条数。 | 可配置最大上报条数和异步队列等待时间: | 否 | 否 |
小程序 | 默认实时上报。
| 可配置是否开启、间隔秒数、单次数量阈值
| 否 | 否 |
小游戏 | 同小程序 | |||
快应用 | 同小程序 | |||
SDK | 网络异常、崩溃等情况导致上报失败后数据处理机制 | 是否压缩 | 压缩算法 | 算法是否可定制 |
|---|---|---|---|---|
Android | 埋点打包会存db(sdk初始化前产生的埋点不会存db,最多缓存300条;初始化后才会存储db。只要没杀进程之前缓存的埋点都会落库),上报成功会从db删除,上报失败不会从db删除,直到10天过期才删除,db存储量跟随手机存储空间来定。 | 是 | AES加密+gzip压缩 | 可(默认支持AES+CBC,需要跟服务端配套) |
iOS | 埋点打包会存SQLite3数据库,上报成功会从数据库删除,上报失败不会从db删除,ios不会删除本地数据,sdk没有存储限制,db存储跟随手机的硬盘大小限制。 | 是 | AES加密+gzip压缩 | 可(默认支持AES+CBC,需要跟服务端配套) |
小程序 | 默认下上报失败就失败了,在开启缓存(1.x版本参数enable_storage、2.5版本及以上参数enable_cache)的情况下,会放入本地存储等待下次进行补充上报(单个key允许存储的最大数据长度为1MB,所有数据存储上限为10MB)。 | 否 | 无 | 无 |
Web | 默认无机制,可配置开启全局 | 否 | 无 | 无 |
对比说明 | 服务端实验 |
|---|---|
实验描述 | 指通过服务端获取实验分组信息并控制配置生效或下发的实验。 |
实验SDK逻辑 |
注意 服务端SDK/分流Agent仅完成实验分流和上报预置的曝光事件,如果您还需上报实验指标数据,可通过集成客户端SDK上报指标事件,或通过HTTP API、数据集成功能集成实验指标数据。 |
实验指标/参数数据落库流程 | 其中:
|
支持的端/语言类型 | 服务端SDK支持Java、Python、Go、PHP等。 |
通常进行实验SDK集成时,有以下通用流程与注意事项。
注意事项 | 引导说明 |
|---|---|
用户标识说明 | 根据数据接入方案,了解数据接入时支持的用户标识类型,统一统计口径,详情请参见支持的用户唯一标识。 |
数据格式说明 | 如果需要自定义事件则需要了解对应事件及其属性对应的数据格式要求,详情请参见支持的数据格式(自定义事件/属性)。 注意 如果数据格式不符合规范,可能会导致数据接入操作正常,但后续上报的数据落库后为空或出现异常,因此您需要关注数据格式要求,例如将数值类型的属性,数据类型定义为string,可能后续数据上报候后,进行分析时会出错。 |
预置事件及属性 | 根据数据接入方案,明确后续需要采集上报的事件及其属性,了解预置事件及属性列表是否满足业务需求,预置事件及属性详情请参见预置属性总表。 |
「A/B」测试支持客户端、Web端、服务端等多种集成方式。请您根据需集成的应用类型,选择合适的集成方式,并参考以下的视频和文档完成SDK的集成。
集成场景 | 操作指导 |
|---|---|
服务端 |
|
说明
服务端SDK/分流Agent仅完成实验分流和上报预置的曝光事件,如果您还需上报实验指标数据,可通过集成客户端SDK上报指标事件,或通过HTTP API、数据集成功能集成实验指标数据,可参考下文的 实验指标上报 章节。
可参考以下验证步骤对实验进行调试验证,调试成功后,可开启实验,后续可查看实验报告。
注意
如果实验是当天创建的实验报告和数据指标均为实时的,如果非当天创建,实验报告为非实时的,如果想查看实时数据,可以通过数据指标,选择5分钟级或小时级查看实时数据。
测试白名单为创建A/B实验时设置的测试用户,主要在实验创建完成、实验SDK集成操作完成后,用来调试实验/feature、检查白名单用户是否可以命中实验/feature,从而验证集成代码是否有误。
调试服务端代码,在控制台看到获取分流结果的信息,如果和添加的版本一致,意味着测试成功,可参考下图
在全局设置-用户细查查看指定用户的细查行为中有没有携带目标实验vid的实验曝光事件上报上来。
DecisionID和TrackID都使用uuid
User user = new User.UserBuilder().create("uuid", "uuid")
注意:python sdk目前暂不支持匿名用户实验,如有需求可联系火山引擎技术支持人员。
说明
匿名是针对火山而言,如何识别匿名用户,目前只能通过客户端SDK。
(1)按照各端集成文档做正常集成即可,以android集成文档为例:Android SDK集成
(2)通过获取设备ID接口拿到火山设备id
Android获取设备id代码
String did = AppLog.getDid(); // 获取设备id
iOS获取设备id代码
#import <RangersApplog/BDAutoTrackNotifications.h> // 在初始化 sdk 之前设置监听 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onRegisterSuccess:) name:BDAutoTrackNotificationRegisterSuccess object:nil]; //SDK 初始化代码部分 //然后在 SDK 初始化之后设置回调 - (void)onRegisterSuccess:(NSNotification *)noti { // 请在初始化完成的3秒后开始获取,否则可能返回为空 NSString *dids = [noti.userInfo objectForKey:kBDAutoTrackNotificationRangersDeviceID]; NSString *ssids = [noti.userInfo objectForKey:kBDAutoTrackNotificationSSID]; NSLog(@"onRegisterSuccess.dids:%@", dids); // 获取设备id }
如果是网页/H5或者小程序(即集成JS SDK和小程序SDK),需要使用以下方法,获取web_id
//网页&H5 window.collectEvent('getToken', (token) => { //token数据内容类似如下: { "web_id":"6748002161499735560", "ssid":"579bc89a-bd45-4021-8314-669c35f38e3d", "user_unique_id":"xxx", } }); //小程序 this.$$Rangers.getToken(function(token) { //token数据内容例如: // { // "web_id":"6748002161499735560", // "ssid":"579bc89a-bd45-4021-8314-669c35f38e3d", // "user_unique_id":"xxx", // } });
(1)参考集成文档集成,以java sdk为例:Java SDK
(2)decisionID(分流id)使用设备id或Webid(小程序和web使用webid);trackID(上报id)需要增加判断:
移动端匿名用户场景 | 网页/H5或者小程序匿名用户场景 |
|---|---|
uuid有值
uuid为空
| uuid有值
uuid为空
|
服务端过滤参数介绍
服务端的请求过滤参数主要用于服务端实验给特定人群做实验进行使用,需要注意服务端过滤参数及值不会实际上报入库,只是用于实时作为当前分流的过滤条件去使用,服务端在分流的时候,通过所构建的User对象,add一个过滤参数传过去。参考帮助文档:服务端请求参数
使用流程说明
第一步:根据业务设计服务端实验。
第二步:思考做实验人群筛选条件,并且确定字段名称及对应的值,比如会员卡等级为金卡的人群,vip。
第三步:在全局设置-服务端请求参数中添加过滤参数,注意参数类型要和SDK代码中的类型匹配。
第四步:创建服务端实验,在用户受众规则选择对应的过滤端参数及值,保存
。第五步:参考服务端集成代码做集成,Java SDK,服务端过滤参数参考下方使用,通过add方法进行添加。
实验报告指标逻辑说明:AB曝光事件之后触发的指标事件算做实验的指标数据,与事件是否携带vid无关。
集成客户端SDK做埋点事件上报,参考文档:iOS SDK集成开发指南。
说明
注意:事件上报的用户标识一定得和服务端SDK里的用户标识保持一致,不然会出现无法关联的情况。
参考文档:HTTP API,body体示例如下:
{ "user": { "user_unique_id": "1234567***" }, "header": { }, "events": [ { "event": "event", "params": "{}", "local_time_ms": 1692866701936 } ] }
移动端匿名用户
{ "user": { "user_unique_id": "", "device_id":"728269350799357****" //注意:device_id为火山设备id }, "header": { }, "events": [ { "event": "event", "params": "{}", "local_time_ms": 1692866701936 } ] }
网页&H5及小程序匿名用户
{ "user": { "user_unique_id": "", "web_id":"477892002****" //注意:web_id为火山设备webid }, "header": { }, "events": [ { "event": "event", "params": "{}", "local_time_ms": 1692866701936 } ] }