本文档提供「A/B测试」应用中开放接口V3版本的说明。
可用范围包括
如需使用老版本开放接口,请参考:A/B测试开放接口
为了保证您和用户的数据安全,开放接口权限默认是关闭的。
在开始使用之前,您需要联系我们开通。(您可以通过服务对接的飞书/微信群或页面右下角的在线客服与我们取得联系)
为了方便集成和使用OpenAPI,我们提供了SDK。其主要功能是提供了对签名过程和复杂查询参数的包装。
SDK已经在 Github 上开源,建议使用Github 源码的方式进行集成。
基本使用流程为:
request接口或者data_tester来调用具体API(具体的方法名称在不同的语言上会有命名格式的区别)由于中国区和非中国区是隔离不互通的,OpenAPI 的服务地址需要根据所在地区进行设置:
String ak = "{使用AK替换}"; String sk = "{使用SK替换}"; // SDK 的默认url地址是指向中国区 SAAS 的 RangersClient bc = new RangersClient(ak, sk); // 海外和私有化需要指定url地址, 可以参考上文 String url="{使用非中国区或者Tester服务域名替换}"; RangersClient bc = new RangersClient(ak, sk, url); String result = bc.dataTester("/openapi/v1/openapi-test", "GET"); System.out.println(result);
Python SDK 软件包的形式下载后在shell执行以下命令完成安装:
# python需要3.7及以上版本 pip install rangersdk-${version}.tar.gz
from rangersdk import RangersClient ak = '{使用AK替换}' sk = '{使用SK替换}' bc = RangersClient(ak, sk) # 海外和私有化需要指定url地址, 可以参考上文, url = '{使用非中国区或者Tester服务域名替换}' # 注意这里传参数,一定要写成 url=url bc = RangersClient(ak, sk, url=url) re = bc.data_tester("/openapi/v1/openapi-test", method="GET") print(re.json())
var ( ak = "{使用AK替换}" sk = "{使用SK替换}" ) bc := dslcontent.NewRangersClient(ak, sk) // 海外和私有化需要指定url地址, 可以参考上文 url = '{使用非中国区或者Tester服务域名替换}' bc := dslcontent.NewRangersClientWithUrl(ak, sk, url) res, _ := bc.DataTester("/openapi/v1/openapi-test", "GET") data, err := ioutil.ReadAll(res.Body) fmt.Println(err, string(data))
ak = "{使用AK替换}" sk = "{使用SK替换}" bc = new RangersClient(ak, sk) // 海外和私有化需要指定url地址, 可以参考上文 url = '{使用非中国区或者Tester服务域名替换}' bc = RangersClient(ak, sk, url=url) bc.dataTester("/openapi/v1/openapi-test", {method: "GET"}) .then(res => res.json()) .then(response => { if (200 !== response['code']) { throw " result is not ok, code: " + response['code'] + ", message: " + response['message']; } console.log(response) console.log('success.') }) .catch(error => console.error('error:', error));
$ak = "{使用AK替换}"; $sk = "{使用SK替换}"; $bc = new RangersClient($ak, $sk); // 海外和私有化需要指定url地址, 可以参考上文 $url = '{使用非中国区或者Tester服务域名替换}' $bc = new RangersClient($ak, $sk, $url); echo $bc->dataTester("/openapi/v1/openapi-test", "GET");
获取列表的相关接口(实验、指标、互斥组)支持根据关键字查询,如需查询中文,Java、Python、PHP需要调用前自行进行url转码,转码方法如下
golang SDK和nodeJs SDK不需要自行转码
Java
import java.net.URLEncoder; String keyword = URLEncoder.encode("中文关键字", "UTF-8")
Python
import urllib.parse keyword = urllib.parse.quote("中文关键字", encoding="UTF-8")
PHP
$keyword = urlencode("中文关键字");
注意
开放接口所创建的实验,仅管理员可编辑
接口描述: 创建一个编程实验或MAB实验。
请求路径:/openapi/v3/apps/{app_id}/experiments
请求方法:POST
请求参数
参数名称 | 参数类型 | 是否必填 | 描述 | 备注 |
|---|---|---|---|---|
name | string | 是 | 实验名称 | 不能与当前APP下已有实验重名,长度限制200字符 |
description | string | 否 | 实验描述 | 长度限制1000字符 |
tags | string | 否 | 实验标签 | ["123", "456"] |
owners | object | 否 | 创建人 | 实验owner列表,owner的object数据结构包括id和name两个参数:
您可以使用用户信息查询接口获取实验owners的数值。 |
endpoint_type | int | 是 | 实验类型 | 0-客户端实验,1-服务端实验 |
duration | int | 是 | 实验时长 | 单位天,范围:[1, 365] |
major_metric | int | 是 | 核心指标ID | 必须在metrics中 |
metrics | int[] | 是 | 关注的指标ID列表 | 必须包含major_metric |
versions | object[] | 是 | 实验版本配置 | 数组长度要大于等于2,详见version结构说明 |
layer_info | object | 是 | 实验层配置 | 详见layer_info说明 |
mab_info | object | 否 | MAB实验配置信息 | 如果是创建MAB实验,该字段必传。详细介绍请参见下文的mab_info结构说明。 |
rehash_info | object | 否 | 重随机信息。如果创建非重随机实验,该参数无需传入值。详情请参见下文的 rehash_info 章节。 注意 重随机能力当前不能用于 mab 实验、客群实验及特型实验。 | 传入时校验 |
注意
version结构说明
参数名称 | 参数类型 | 是否必填 | 描述 | 备注 |
|---|---|---|---|---|
type | int | 是 | 对照版本/实验版本 | 0-对照版本,1-实验版本 versions数组中只能有一个对照版本 |
name | string | 是 | 版本名称 | 长度50字符 |
description | string | 否 | 版本描述 | 长度1000字符 |
weight | float | 否 | 实验版本的流量分配 | 范围[0.001, 1] 0.1% ~ 100% |
config | object | 是 | 版本配置 | version数组中所有config的key需要保持一致 { "key1": "value1", "key2": "value2" } |
users | string[] | 否 | 白名单用户 | 不同版本的白名单用户不能有交集 |
is_mab | int | 否 | 是否为mab智能流量组,取值:0或1 |
layer_info结构说明
参数名称 | 参数类型 | 是否必填 | 描述 | 备注 |
|---|---|---|---|---|
layer_id | int | 否 | 互斥组ID | 使用的实验层,使用默认层则传-1或不传 |
version_resource | float | 是 | 实验流量占比 | 范围[0.001, 1],最小精度千分之一 |
mab_info结构说明
参数名称 | 参数类型 | 是否必填 | 描述 | 备注 |
|---|---|---|---|---|
interval_time | int | 是 | 调优间隔,单位:秒 | 单位秒,最小间隔30分钟,并且按照30分钟增加,例如1800, 3600, 5400。 |
non_mab_traffic | int | 是 | 评估流量占比 | 百分比,例如6就是6%,每个实验组最低需要3%的评估流量,例如三个实验组最低需要9%的评估流量。 |
rehash_info结构说明
参数名称 | 参数类型 | 是否必填 | 描述 | 备注 |
|---|---|---|---|---|
cohorts | list | 否 | 分群信息 | 其他字段和编程实验一致,此处略去 |
└ cohort_id | int | 是 | 分群 ID | 无 |
└ type | string | 否 | 分群类型 | 固定取值 |
metrics | list | 否 | 指标信息 | 传入时校验 |
└ metric_group_id | int | 是 | 指标组 ID | 分群 ID |
└ metrics | list | 是 | 指标信息 | 最多 3 个指标 |
└└ metric_id | int | 是 | 指标 ID | 无 |
start_ts | int | 否 | 开始时间 | 当 metrics 指定时,必填,精确到秒 |
end_ts | int | 否 | 结束时间 | 当 metrics 指定时,必填,精确到秒 |
launch_times | int | 否 | 尝试次数 | 默认 10,即尝试 10 个随机种子 |
statistic_type | string | 否 | 统计类型 | 统计类型,固定值: |
threshold_value | float | 否 | 统计阈值 | 默认 0.05 |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | int | 新创建实验ID |
示例
编程实验,两个评估组,两个智能调优组,一共4个组,调优间隔30分钟,评估流量6%。
{ "name": "test-mab", "duration": 14, "versions": [ { "name": "对照组", "label": "对照组", "weight": 0.47, "is_mab": 1, "type": 0, "config": { "HcCVhO": "_Lf5XM" }, "users": [] }, { "name": "实验组1", "label": "实验组1", "weight": 0.47, "is_mab": 1, "type": 1, "config": { "HcCVhO": "TAqqd4" }, "users": [] }, { "name": "对照组-Besfw", "label": "对照组", "weight": 0.03, "is_mab": 0, "type": 1, "config": { "HcCVhO": "ij45wC" }, "users": [] }, { "name": "实验组1-fL17k", "label": "实验组1", "weight": 0.03, "is_mab": 0, "type": 1, "config": { "HcCVhO": "WRDoSW" }, "users": [] } ], "major_metric": 100942, "metrics": [ 100940, 100941, 100942, 100943, 100944, 100945, 100946 ], "mode": 1, "mab_info": { "interval_time": 1800, "non_mab_traffic": 6 }, "endpoint_type": 0, "layer_info": { "layer_id": -1, "version_resource": 1 } }
说明: 根据实验ID获取实验详情
请求路径:/openapi/v3/apps/{app_id}/experiments/{experiment_id}
请求方法:GET
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | 接口返回的实验信息 |
data信息
参数名称 | 类型 | 说明 |
|---|---|---|
experiment | object | 实验信息 |
experiment结构说明
参数名称 | 类型 | 说明 |
|---|---|---|
id | int | 实验的experiment_id |
name | string | 实验名称 |
tags | string | 实验标签列表 |
owners | object | owner信息列表,包含以下字段:
|
launch_start_time | long | 实验开始时间,Unix时间戳 |
end_time | long | 实验结束时间,Unix时间戳 |
create_time | long | 实验创建时间,Unix时间戳 |
modify_time | long | 实验修改时间,Unix时间戳 |
test_start_time | long | 实验调试开始时间,Unix时间戳 |
duration | long | 实验运行时间,单位秒 |
confidence_level | int | 置信度水平,95代表置信度水平为95% |
version_resource | float | 实验所占流量,范围[0.001, 1],1为100% |
layer_id | int | 实验层id |
freeze_status | int | 实验冻结状态 1-冻结,0-没冻结 |
freeze_time | long | 实验冻结时间,Unix时间戳(只有冻结状态为1时才有效) |
version_freeze_status | boolean | 是否进组不出组
|
pause_status | boolean | 实验是否暂停
|
endpoint_type | int | 0-客户端实验,1-服务端实验 |
versions | object[] | 实验版本信息 |
metrics | object[] | 实验关注指标信息 |
status | int/enum | 实验状态, 0:已结束 1:运行中 2: 待调度 3:调试中 |
filters | string | 实验受众目标,json字符串 |
description | string | 实验描述 |
rehash_info | object | 重随机信息,详情请参见下文rehash_info结构说明章节 |
metric结构说明
参数名称 | 类型 | 说明 |
|---|---|---|
id | int | 指标id |
name | string | 指标名称 |
description | string | 指标描述 |
is_primary | int | 是否核心指标:0-否 1-是 |
calculate_type | string | 指标计算类型 |
dsl | object | 指标dsl |
status | int | 指标状态 0: 已下线 1:没下线 |
is_composed | boolean | 是否组合指标:true/false |
data_type | string | 指标展现数值格式 |
metric_type | string | 指标类型,枚举值如下:
|
version结构说明
参数名称 | 类型 | 说明 |
|---|---|---|
id | int | 版本id |
type | int | 版本类型:0-对照版本,1-实验版本 |
name | string | 版本名称 |
description | string | 版本描述 |
config | object | 版本配置 { "key1": "value1", "key2": "value2" } |
weight | int | 版本权重,和为1000,1代表0.1% 为0则为均匀分配 |
user_list | string[] | 白名单列表 |
rehash_info结构说明
参数名称 | 类型 | 说明 |
|---|---|---|
rehash_id | int | 重随机任务 ID |
status | int | 重随机任务状态:
|
说明: 分页获取APP下的实验列表
注意:如果搜索关键字keyword包含中文,则需要先进行url转义,再进行调用
请求路径:/openapi/v3/apps/<app_id>/experiments
请求方法:GET
URL查询参数
参数 | 类型 | 说明 |
|---|---|---|
status | int | 实验状态,0-已结束,1-运行中,3-测试中;不传则默认所有状态 |
page | int | 分页参数,1表示第一页,不传默认为1 |
page_size | int | 每页数量,不传默认99 |
keyword | string | 搜索关键字,当前支持按照实验name和description模糊搜索 |
sort_by | string | 排序规则。当前仅支持 end_time结束时间、launch_start_time实验启动时间、test_start_time测试开始时间; 不传默认实验创建时间 |
sort_order | string | 排序顺序。desc/asc。不传默认desc降序 |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | { |
experiments结构说明
参数名称 | 类型 | 说明 |
|---|---|---|
id | int | 实验ID |
name | string | 实验名称 |
end_time | long | 实验结束时间,Unix时间戳 |
test_start_time | long | 实验调试开始时间,Unix时间戳 |
launch_start_time | long | 实验开始时间,Unix时间戳 |
duration | long | 实验运行时间,单位秒 |
version_resource | float | 实验所占流量,范围[0.001, 1],1为100% |
layer_id | int | 实验层id |
freeze_status | int | 实验冻结状态 1-冻结,0-没冻结 |
freeze_time | long | 实验冻结时间,Unix时间戳(只有冻结状态为1时才有效) |
version_freeze_status | boolean | 是否进组不出组
|
pause_status | boolean | 实验是否暂停
|
endpoint_type | int | 0-客户端实验,1-服务端实验 |
description | string | 实验描述 |
status | int/enum | 实验状态, 0:已结束 1:运行中 2: 待调度 3:调试中 |
owner | 字符串 | 实验创建人 |
versions | object[] | 实验版本信息 |
re
说明: 修改实验的配置信息。通过Method来区分是全量修改还是部分修改。
注意:由于使用的网络库本身不支持不支持PATCH方法,因此Java SDK暂不支持PATCH方法
请求路径:/openapi/v3/apps/{app_id}/experiments/<experiment_id>
请求方法:PUT/PATCH
请求参数
参数名称 | 参数类型 | 是否必须 | 描述 | 备注 |
|---|---|---|---|---|
name | string | 是 | 实验名称 | 不能与已有实验重名,长度50字符 |
description | string | 否 | 实验描述 | 长度1000字符 |
tags | string | 否 | 实验标签 | ["123", "456"] |
owners | object | 否 | 创建人 | 实验owner列表 |
duration | int | 是 | 实验时长 | 单位天,[1, 365],整数 |
major_metric | int | 是 | 核心指标 ID | 运行中不可修改 测试中可以修改 |
metrics | int[] | 是 | 指标ID列表 | |
versions | object[] | 是 | 实验版本 | version数量不可变动,只可以修改version内容 |
layer_info | object | 否 | 互斥组 |
version结构
参数名称 | 参数类型 | 是否必填 | 描述 | 备注 |
|---|---|---|---|---|
id | int | 是 | 版本ID | 修改version信息必填 |
name | string | 是 | 版本名称 | 长度50字符 |
description | string | 否 | 版本描述 | 长度1000字符 |
weight | float | 否 | 流量分配 | 范围[0.001, 1] 0.1% ~ 100% |
config | object | 是 | 版本参数不同版本的 key | version数组中所有config的key需要保持一致 |
users | string[] | 否 | 白名单用户 |
layer_info结构
参数名称 | 参数类型 | 是否必填 | 描述 | 备注 |
|---|---|---|---|---|
layer_id | int | 否 | 互斥组 ID | |
version_resource | float | 是 | 占用流量百分比 | 范围[0.001, 1],最小精度千分之一 |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | 实验ID |
说明: 修改实验关联的指标组,设置结果会直接覆盖实验关联指标的配置。
请求路径: /openapi/v3/apps/<app_id>/metric_groups/experiments/{experiment_id}/update_watching_metric_groups
请求方法: PUT
请求体请求参数如下。
参数名称 | 类型 | 是否必须 | 描述 | |
|---|---|---|---|---|
relation_metric_groups | [object] | 是 | 修改后实验关联的指标组列表。指标组列表中的每个指标对象包含:metric_group_id、metric_ids、type三个字段,详细说明可参见表格下方的参数说明。 注意 调用此接口修改实验关联指标组时,会将本次设置结果直接覆盖实验的指标配置,而非基于此前实验的指标配置基础上进行新增、删除的操作。因此建议在进行修改前,您可调用“获取实验详情”接口先了解当前实验的指标有哪些,需要保留的指标组需同时添加在本次的修改指标中。 | |
metric_ids | [int] | 是 | 指标ID列表,配置为修改后实验的指标ID列表。您可以通过“获取指标列表”接口获取指标ID。 注意 此处配置的指标需要为当前实验所在应用下创建的指标。 | |
metric_group_id | int | 是 | 指标组ID,您可以通过“获取指标详情”接口,基于指标ID获取指标组ID。 | |
type | string | 是 | 修改后实验的指标类型,支持设置为:
| |
请求示例
{ "relation_metric_groups": [ { "metric_group_id": 1679062, "metric_ids": [ 114314 ], "type": "core" }, { "metric_group_id": 158338, "metric_ids": [ 83731 ], "type": "watching" } ] }
返回参数
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | int | NULL |
说明: 开始一个测试中的实验。使其状态变为运行中。
请求路径: /openapi/v3/apps/<app_id>/experiments/<experiment_id>/launch
请求方法: PUT
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | 实验ID |
说明: 暂停指定实验
请求路径 : /openapi/v3/apps/<app_id>/experiments/<experiment_id>/pause
请求方法: POST
请求参数
参数名称 | 类型 | 说明 |
|---|---|---|
duration | int | 暂停某个实验时,实验流量是平滑生效的,通过此参数设置平滑生效的时间是多少分钟 |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
说明: 恢复指定实验
请求路径 : /openapi/v3/apps/<app_id>/experiments/<experiment_id>/restore
请求方法: POST
请求参数
参数名称 | 类型 | 说明 |
|---|---|---|
duration | int | 恢复某个实验时,实验流量是平滑生效的,通过此参数设置平滑生效的时间是多少分钟 |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
说明: 结束指定实验
请求路径 : /openapi/v3/apps/<app_id>/experiments/<experiment_id>/stop
请求方法: PUT
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | 实验ID |
说明: 创建一个A/B测试指标
请求路径: /openapi/v3/apps/<app_id>/metrics
请求方法:POST
请求参数
参数名称 | 类型 | 是否必须 | 描述 | 备注 |
|---|---|---|---|---|
name | string | 是 | 指标名称 | 长度限制 50,不可与相同APP下其他指标重复 |
description | string | 否 | 指标描述 | 长度限制 1000 |
dsl | object | 是 | 指标DSL | dsl详情可咨询对接人员 |
composed | boolean | 是 | 是否是组合指标 | true/false |
data_type | string | 否 | 数据展示类型 | 枚举值 |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | int | 指标ID |
说明: 基于现存的A/B测试指标,通过修改其中的属性过滤信息,创建新的A/B测试指标。只会替换模板指标中同名的属性值,模板指标中不存在的属性会忽略。如果传入多个 metrics,要修改的属性信息会分别应用于每个 metric。
可以简单理解为把每个模板指标都复制一份,然后修改其已存在的 property 信息。
请求路径: /openapi/v3/apps/<app_id>/metrics/create-from-templates
请求方法: POST
请求参数
参数名称 | 类型 | 是否必须 | 描述 | 备注 |
|---|---|---|---|---|
metrics | list[metric] | 是 | 指标信息列表 | metric 见下表说明 |
properties | list[property] | 是 | 需要修改的属性信息 | property 见下表说明 |
metric字段说明
参数名称 | 类型 | 是否必须 | 描述 | 备注 |
|---|---|---|---|---|
metric_id | int | 是 | 模板指标id | 已存在的指标id |
name | string | 是 | 根据模板指标,新建指标的名称 | 长度限制 50,不可与相同APP下其他指标重复 |
description | string | 否 | 根据模板指标,新建指标的指标信息 | 长度限制 1000 |
property字段说明
参数名称 | 类型 | 是否必须 | 描述 | 备注 |
|---|---|---|---|---|
property_name | string | 是 | 属性名称 | 模板中不存在的属性名会直接忽略,不报错 |
property_values | string/int/float数组 | 是 | 属性值 | 长度限制255,如果为空,则是[];属性值类型需要与模板指标的属性类型保持一致。具体字段说明可参考 V3 DSL 字段详细说明 |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | list[object] | 新创建的指标信息 |
object字段说明
参数名称 | 类型 | 说明 |
|---|---|---|
id | int | 新创建的指标ID |
name | string | 新创建的指标名称 |
curl --location --request POST '{host}/datatester/openapi/v3/apps/253047/metrics/create-from-template' \ --header 'Content-Type: application/json' \ --data-raw '{ "metrics": [ { "metric_id": 33487, "name": "测试一下事件指标5", "description": "这是一个description" }, { "metric_id": 33488, "name": "测试一下事件指标6", "description": "这是一个description" } ], "properties": [ { "property_name": "app_channel", "property_values": [ "channel3", "channel4" ] }, { "property_name": "account_id", "property_values": [ "1234556", "7654321" ] } ] }'
说明: 删除指定的指标。如果指标有已经关联的实验,则无法删除
请求路径: /openapi/v3/apps/<app_id>/metrics/<metric_id>
请求方法: DELETE
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | int | 指标ID |
说明: 获取指定指标的详情数据
请求路径: /openapi/v3/apps/<app_id>/metrics/<metric_id>
请求方法: GET
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | 指标信息 {"metric_info": } |
指标信息说明
参数名称 | 类型 | 说明 |
|---|---|---|
id | int | 指标ID |
name | string | 指标名 |
description | string | 描述 |
dsl | object | 指标dsl |
composed | boolean | 是否是组合指标 |
status | int | 状态 0-下线 1-上线 |
is_support_major | boolean | 是否支持设置为核心指标 |
is_required | int | 是否是必看指标,0:不是,1:是 |
metric_group | object | 该指标所属的指标组信息,详情见下文的metric_group结构说明 |
metric_group结构说明
参数名称 | 参数类型 | 描述 |
|---|---|---|
id | int | 指标组ID |
name | string | 指标组名称 |
uba_report_type | int | 指标组类型,枚举值:1-事件指标;2-留存指标;3-漏斗指标 |
说明: 分页获取APP下的指标列表
请求路径:/openapi/v3/apps/<app_id>/metrics
请求方法:GET
URL查询参数
参数 | 类型 | 说明 |
|---|---|---|
status | int | 指标状态,0-下线 1-上线,不传则默认所有状态 |
page | int | 分页参数,1表示第一页,不传默认为1 |
page_size | int | 每页数量,不传默认99 |
keyword | string | 搜索关键字,当前支持按照指标name和description模糊搜索 |
only_confidence | int | 只查询支持置信度计算的指标,1 为有效值,不传或其他值无效 |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | { |
指标信息说明
参数名称 | 类型 | 说明 |
|---|---|---|
id | int | 指标ID |
name | string | 指标名 |
description | string | 描述 |
dsl | object | 指标dsl |
composed | boolean | 是否是组合指标 |
status | int | 状态 0-下线 1-上线 |
is_support_major | boolean | 是否支持设置为核心指标 |
说明: 全量修改指标的信息,DSL暂时无法修改,只可以修改名称、描述和数据类型
请求路径: /openapi/v3/apps/<app_id>/metrics/<metric_id>
请求方法: PUT
请求体
参数名称 | 类型 | 是否必须 | 描述 | 备注 |
|---|---|---|---|---|
name | string | 是 | 指标名称 | 最大长度50,不可重复 |
description | string | 否 | 指标描述 | 最大长度1000 |
data_type | string | 否 | 指标数据类型 | 枚举值 |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | int | 指标ID |
说明: 修改指标的状态(上线、下线)。JAVA SDK暂不支持此接口
请求路径: /openapi/v3/apps/<app_id>/metrics/<metric_id>
请求方法: PATCH
请求体
参数名称 | 类型 | 是否必须 | 描述 | 备注 |
|---|---|---|---|---|
status | int | 是 | 指标状态 | 0-下线 1-上线 |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | int | 指标ID |
说明
当前实验报告相关数据获取仅支持天粒度的数据获取,暂不支持小时等更细粒度的数据。
说明:用于获取实验报告分组结论概览。
请求路径 : /openapi/v3/apps/<app_id>/experiments/<experiment_id>/summary-data
请求方法: GET
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | 报告数据,详情请参见下文的报告数据结构说明。 |
报告数据结构说明
参数名称 | 参数类型 | 描述 |
|---|---|---|
summary_infos | list[object] | 报告概览数据,详情请参见下文的summary_infos结构说明。 |
report_type | string | 报告类型:day。表示报告的查询时间粒度为天级 |
start_ts | int | 查询开始时间,UNIX时间戳 |
end_ts | int | 查询结束时间,UNIX时间戳 |
user_data | object | 各版本进组人数 |
summary_infos结构说明
参数名称 | 参数类型 | 描述 |
|---|---|---|
major_metric_name | string | 核心指标名称 |
summary | list[object] | 指标概览数据 |
返回示例
{ "code": 200, "data": { "summary_infos": [ { "major_metric_name": "any转化率", "summary": [ { "vid": 339601, "version_name": "8b4b2cfdbd73941123bce96f9ce541e2", "confidence": 3, "conf_interval": [ -0.08904, 0.08904 ], "p": 1.0 } ] } ], "user_data": { "339600": 799, "339601": 799 }, "start_ts": 1708822800, "end_ts": 1713801599, "report_type": "day" }, "message": "success" }
说明:用于获取实验报告分组结论概览
请求路径 : /openapi/v3/apps/<app_id>/experiments/<experiment_id>/metric-data
请求方法: POST
请求参数
参数名称 | 类型 | 是否必须 | 描述 | 备注 |
|---|---|---|---|---|
metric_id | int | 是 | 指标ID | 您可以通过获取指标列表接口获取指标ID。 |
report_type | string | 是 | 查询类型 | 默认天级。当前仅支持 day,表示报告的查询时间粒度为天级。 |
start_ts | int | 是 | 查询开始时间,UNIX时间戳 | 默认实验开始时间,不可以早于实验开始时间 |
end_ts | int | 是 | 查询结束时间,UNIX时间戳 | 默认当前时间,不可以晚于实验结束时间 |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | 报告数据,详情请参见下文的报告数据结构说明。 |
报告数据结构说明
参数名称 | 参数类型 | 描述 |
|---|---|---|
versions | list[object] | 实验版本信息,详情请参见下文的版本信息结构说明。 |
start_ts | int | 查询开始时间,UNIX时间戳 |
end_ts | int | 查询结束时间,UNIX时间戳 |
available_start_ts | int | 可用报告开始时间,UNIX时间戳 说明 当查询的时间范围超出了真实的报告数据产出的时间范围时,调用接口的返回结果为报告有数据的时间范围内的数据,这里的可用报告开始/结束时间,指的是真实返回的报告数据的时间范围。 |
available_end_ts | int | 可用结束时间,UNIX时间戳 |
confidence_level | int | 置信度 |
metric_id | int | 指标ID |
distribution | object | 统计分布数据 |
daily_data | object | 天级报告数据 |
user_data | object | 各版本进组人数 |
版本信息结构说明
参数名称 | 参数类型 | 描述 |
|---|---|---|
id | int | 版本ID |
name | string | 版本名称 |
config | object | 版本配置信息 |
type | int | 0:对照版本 1:实验版本 |
weight | int | 版本权重,0为均分 |
disabled | bool | 是否禁用 |
返回示例
{ "code": 200, "data": { "available_start_ts": 1708822800, "available_end_ts": 1713801599, "start_ts": 1708822800, "end_ts": 1713801599, "versions": [ { "id": "339600", "name": "版本1", "config": { "0304": "111" }, "type": 0, "weight": 0, "disabled": false }, { "id": "339601", "name": "版本2", "config": { "0304": "222" }, "type": 1, "weight": 0, "disabled": false } ], "confidence_level": 80, "metric_id": 99196, "distribution": { "339600": { "339601": { "p": 1.0, "m": 0.3416771, "change": 0.0, "change_rate": 0.0, "conf_interval": [ -0.08904, 0.08904 ], "half_interval": 0.0890367, "confidence": 3, "mean": { "339600": 0.3416771, "339601": 0.3416771 }, "variance": { "339600": 0.00028152, "339601": 0.00028152 }, "mde": 0.14750037, "sample_size": { "339600": 799, "339601": 799 }, "details": { "numerator": 273, "denominator": 799 } } }, "339601": { "339600": { "p": 0, "m": 0.3416771, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "339601": 0, "339600": 0 }, "variance": { "339601": 0, "339600": 0 }, "details": { "numerator": 273, "denominator": 799 } } } }, "daily_data": { "2024-03-04": { "339600": { "339601": { "p": 1.0, "m": 0.3416771, "change": 0.0, "change_rate": 0.0, "conf_interval": [ -0.08904, 0.08904 ], "half_interval": 0.0890367, "confidence": 3, "mean": { "339600": 0, "339601": 0 }, "variance": { "339600": 0, "339601": 0 }, "mde": 0.14750037, "details": { "numerator": 273, "denominator": 799 } } }, "339601": { "339600": { "p": 0, "m": 0.3416771, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "339601": 0, "339600": 0 }, "variance": { "339601": 0, "339600": 0 }, "details": { "numerator": 273, "denominator": 799 } } } } }, "boxplot": "The current indicator does not support box plots. Please refer to the explanation below for the specific reason.", "user_data": { "339600": 799, "339601": 799 } }, "message": "success" }
说明:根据重随机任务ID,查询重随机任务详情
路径:/openapi/v3/apps/{app_id}/rehashes/{rehash_id}
请求方法:GET
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | 接口返回的实验信息 |
data信息
参数名称 | 类型 | 描述 |
|---|---|---|
cohorts | list | 分群信息,结构同提交参数 |
└ p_value | float | 统计p值 |
metrics | list | 指标信息,结构同提交参数 |
└ p_value | float | 统计p值 |
start_ts | int | 开始时间 |
end_ts | int | 结束时间 |
launch_times | int | 尝试次数 |
statistic_type | string | 统计类型 |
threshold_value | float | 统计阈值 |
optimal_result | object | 任务结果 |
└ rehash_id | int | 重随机任务ID |
└ status | int | 重随机任务状态:
|
└ fail_reason | string | 失败原因 |
└ best_hash_seed | string | 最优种子 |
└ metric_target | object | 指标重随机任务结果 |
└ cohort_target | object | 分群重随机任务结果 |
说明:分页获取APP下的指标列表,增加支持置信度计算的指标的过滤参数
路径:/openapi/v3/apps/{app_id}/rehashes/{rehash_id}
请求方法:PATCH
请求参数
参数名称 | 类型 | 说明 |
|---|---|---|
status | int | 目标状态:5-放弃重随机 4-重试 3-采用 |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | 接口返回的实验信息 |
data信息
参数名称 | 类型 | 描述 |
|---|---|---|
rehash_id | int | 重随机任务ID |
original_status | int | 原来的状态,状态信息枚举:
|
new_status | int | 更新后的状态,状态信息枚举:
|
参数名 | 类型 | 说明 |
|---|---|---|
| Integer | 业务状态码。 |
| String | 响应信息。成功时通常为 |
| Object / Array / Integer / Null | 接口返回数据,不同接口结构不同。 |
字段 | 取值 | 说明 |
|---|---|---|
|
| 客户端层。 |
|
| 服务端层。 |
说明:分页获取APP下互斥组的流量层
请求路径:/openapi/v3/apps/<app_id>/layers
请求方法:GET
请求参数
参数名 | 位置 | 类型 | 是否必填 | 说明 |
|---|---|---|---|---|
| Path | Integer | 是 | 应用 ID。 |
| Query | Integer | 否 | 只查询某个互斥域下绑定的层。 |
| Query | Integer | 否 | 只查询某个互斥域组下绑定的层。 |
| Query | string | 否 | 查询关键字,可以根据名称或描述模糊查询。 |
| Query | Integerint | 否 | 互斥组的端类型。 |
| Query | Integerint | 否 | 查询页码。默认为1 |
| Query | Integerint | 否 | 每页数量,默认为99。 |
响应参数
参数名 | 类型 | 说明 |
|---|---|---|
| Array | 互斥层列表。 |
| Integer | 互斥层 ID。 |
| String | 互斥层名称。 |
| String | 互斥层描述。 |
| Integer | 端类型。 |
| Integer / Null | 层绑定的互斥域 ID。未绑定时为空。 |
| Integer / Null | 层所属互斥域组 ID。未绑定互斥域时为空。 |
| Float | 层当前可用流量。 |
| Integer | 当前页码。 |
| Integer | 总页数。 |
| Integer | 总条数。 |
请求示例
GET /datatester/openapi/v3/apps/20000930/layers?endpoint_type=1&domain_id=456
响应示例
{ "code": 200, "message": "success", "data": { "layers": [ { "id": 1001, "name": "域 A 层", "description": "created by openapi", "endpoint_type": 1, "domain_id": 456, "domain_group_id": 123, "available_traffic": 0.9 } ], "page": { "current_page": 1, "total_pages": 1, "total_items": 1 } } }
说明:互斥域创建流量层
请求路径:/openapi/v3/apps/<app_id>/layers
请求方法:POST
请求参数
参数名称 | 位置 | 类型 | 是否必须 | 说明 |
|---|---|---|---|---|
| Path | Integer | 是 | 应用 ID。 |
| Body | String | 是 | 互斥层名称。同一应用下不可重复。 |
| Body | Integer | 是 | 端类型。 |
| Body | String | 否 | 互斥层描述。 |
| Body | Integer | 否 | 互斥域 ID。传入时服务端校验互斥域存在、未删除、属于当前应用,且端类型与 |
响应参数
参数名称 | 类型 | 说明 |
|---|---|---|
| Integer | 创建成功的互斥层 ID。 |
请求示例
{ "name": "域 A 层", "description": "created by openapi", "endpoint_type": 1, "domain_id": 456 }
响应示例
{ "code": 200, "message": "success", "data": 1001 }
说明:获取互斥域组列表数据,包括互斥域组名称、端类型、域组下绑定的互斥层总数等信息。
路径:/openapi/v3/apps/{app_id}/domain-groups
请求方法:GET
请求参数
参数名 | 位置 | 类型 | 是否必填 | 说明 |
|---|---|---|---|---|
| Path | Integer | 是 | 应用 ID。 |
| Query | Integer | 否 | 端类型。 |
响应参数
参数名 | 类型 | 说明 |
|---|---|---|
| Array | 互斥域组列表。 |
| Integer | 互斥域组 ID。 |
| String | 互斥域组名称。 |
| Integer | 端类型。 |
| Integer | 域组下绑定的互斥层总数。 |
| Integer | 域组下互斥域数量。 |
请求示例
GET /datatester/openapi/v3/apps/20000930/domain-groups?endpoint_type=1
响应示例
{ "code": 200, "message": "success", "data": { "domain_group": [ { "id": 123, "name": "服务端域组", "endpoint_type": 1, "total_layer_count": 2, "total_domain_count": 2 } ] } }
说明:指定应用 ID、互斥域组名称、端类型等信息创建互斥域组。
路径:/openapi/v3/apps/{app_id}/domain-groups
请求方法:POST
请求参数
参数名 | 位置 | 类型 | 是否必填 | 说明 |
|---|---|---|---|---|
| Path | Integer | 是 | 应用 ID。 |
| Body | String | 是 | 互斥域组名称。 |
| Body | Integer | 是 | 端类型。 |
| Body | Array | 是 | 互斥域列表,至少包含两个互斥域。 |
| Body | String | 是 | 互斥域名称。 |
| Body | Float | 是 | 互斥域流量比例,示例 |
| Body | Array | 是 | 绑定到该互斥域的互斥层 ID 列表。空数组表示不绑定层。 |
| Body | Array | 是 | 绑定到该互斥域的子互斥域组 ID 列表。空数组表示不绑定子域组。 |
注意
请求参数仅支持以上字段,不支持传入其他字段。
响应参数
参数名 | 类型 | 说明 |
|---|---|---|
| Integer | 创建成功的互斥域组 ID。 |
请求示例
{ "name": "服务端域组", "endpoint_type": 1, "domain_list": [ { "name": "域 A", "traffic": 0.5, "layer_ids": [1001], "domain_group_ids": [] }, { "name": "域 B", "traffic": 0.5, "layer_ids": [], "domain_group_ids": [2001] } ] }
响应示例
{ "code": 200, "message": "success", "data": 123 }
说明:基于源互斥域组复制一个新的互斥域组,需设置复制后的互斥域组名称。
路径:/openapi/v3/apps/{app_id}/domain-groups
请求方法:POST
请求参数
参数名 | 位置 | 类型 | 是否必填 | 说明 |
|---|---|---|---|---|
| Path | Integer | 是 | 应用 ID。 |
| Body | Integer | 是 | 被复制的源互斥域组 ID。 |
| Body | String | 是 | 复制后互斥域组名称。 |
响应参数
参数名 | 类型 | 说明 |
|---|---|---|
| Integer | 复制成功后新的互斥域组 ID。 |
请求示例
{ "origin_id": 123, "name": "服务端域组-copy" }
响应示例
{ "code": 200, "message": "success", "data": 124 }
说明:查询互斥域组的详细信息,包括名称、端类型、域组下的互斥域列表、互斥域信息等。
路径:/openapi/v3/apps/{app_id}/domain-groups/{domain_group_id}
请求方法:GET
请求参数
参数名 | 位置 | 类型 | 是否必填 | 说明 |
|---|---|---|---|---|
| Path | Integer | 是 | 应用 ID。 |
| Path | Integer | 是 | 互斥域组 ID。 |
响应参数
参数名 | 类型 | 说明 |
|---|---|---|
| Integer | 互斥域组 ID。 |
| String | 互斥域组名称。 |
| Integer | 端类型。 |
| Array | 域组下的互斥域列表。 |
| Integer | 互斥域 ID。 |
| String | 互斥域名称。 |
| Float | 互斥域流量比例。 |
| Array | 该域下绑定的互斥层 ID 列表。 |
| Array | 该域下绑定的子互斥域组 ID 列表。 |
响应示例
{ "code": 200, "message": "success", "data": { "id": 123, "name": "服务端域组", "endpoint_type": 1, "domain_list": [ { "id": 456, "name": "域 A", "traffic": 0.5, "layer_ids": [1001], "domain_group_ids": [] } ] } }
说明:编辑指定互斥域组的名称、互斥域列表、绑定的互斥层等信息。
注意
编辑使用全量替换语义:传入的 domain_list 是完整域列表;某个域传空 layer_ids 或 domain_group_ids 表示解绑对应对象。
路径:/openapi/v3/apps/{app_id}/domain-groups/{domain_group_id}
请求方法:PUT
请求参数
参数名 | 位置 | 类型 | 是否必填 | 说明 |
|---|---|---|---|---|
| Path | Integer | 是 | 应用 ID。 |
| Path | Integer | 是 | 互斥域组 ID。 |
| Body | String | 是 | 互斥域组名称。 |
| Body | Array | 是 | 完整互斥域列表,至少包含两个互斥域。 |
| Body | Integer | 否 | 已有互斥域 ID。新增域不传。 |
| Body | String | 是 | 互斥域名称。 |
| Body | Float | 是 | 互斥域流量比例。 |
| Body | Array | 是 | 该域绑定的互斥层 ID 列表。 |
| Body | Array | 是 | 该域绑定的子互斥域组 ID 列表。 |
注意
请求参数仅支持以上字段,不支持传入其他字段。
响应参数
参数名 | 类型 | 说明 |
|---|---|---|
| Integer | 编辑成功后的互斥域组 ID。 |
请求示例
{ "name": "服务端域组-v2", "domain_list": [ { "id": 456, "name": "域 A", "traffic": 0.4, "layer_ids": [1001], "domain_group_ids": [] }, { "name": "域 C", "traffic": 0.6, "layer_ids": [], "domain_group_ids": [2001] } ] }
响应示例
{ "code": 200, "message": "success", "data": 123 }
说明:删除指定互斥域组。删除后不可恢复,请谨慎操作。
路径:/openapi/v3/apps/{app_id}/domain-groups/{domain_group_id}
请求方法:DELETE
请求参数
参数名 | 位置 | 类型 | 是否必填 | 说明 |
|---|---|---|---|---|
| Path | Integer | 是 | 应用 ID。 |
| Path | Integer | 是 | 互斥域组 ID。 |
响应参数
参数名 | 类型 | 说明 |
|---|---|---|
| Integer | 成功被删除的互斥域组 ID。 |
响应示例
{ "code": 200, "message": "success", "data": 123 }
说明:用于编辑互斥域时选择可绑定到某个互斥域下的子互斥域组。接口会排除自身、已形成非法嵌套链路的域组,并可按端类型过滤。
路径:/openapi/v3/apps/{app_id}/domain-groups/bind-list
请求方法:GET
请求参数
参数名 | 位置 | 类型 | 是否必填 | 说明 |
|---|---|---|---|---|
| Path | Integer | 是 | 应用 ID。 |
| Query | Integer | 否 | 端类型。 |
| Query | Integer | 否 | 当前正在编辑的互斥域组 ID。传入后会排除自身和非法父子链路。 |
响应参数
参数名 | 类型 | 说明 |
|---|---|---|
| Array | 可绑定的互斥域组列表。 |
| Integer | 互斥域组 ID。 |
| String | 互斥域组名称。 |
| Integer | 端类型。 |
| Integer | 域组下绑定的互斥层总数。 |
| Integer | 域组下互斥域数量。 |
响应示例
{ "code": 200, "message": "success", "data": [ { "id": 2001, "name": "可绑定子域组", "endpoint_type": 1, "total_layer_count": 0, "total_domain_count": 2 } ] }
说明:解绑子互斥域组。
路径:/openapi/v3/apps/{app_id}/domain-groups/unbind
请求方法:POST
请求参数
参数名 | 位置 | 类型 | 是否必填 | 说明 |
|---|---|---|---|---|
| Path | Integer | 是 | 应用 ID。 |
| Body | Integer | 是 | 待解绑的子互斥域组 ID。 |
请求示例
{ "domain_group_id": 2001 }
响应示例
{ "code": 200, "message": "success", "data": null }
返回消息体里的code详细的定义
错误码 | 含义 |
|---|---|
200 | 成功 |
403 | 对请求的资源(app、实验等)无权限 |
404 | 请求的资源不存在,如查询了不存在的实验ID或指标ID |
410 | 请求的资源已被删除 |
40000 | 缺少必填参数 |
40001 | 参数值错误 |
40003 | 对请求的接口无访问权限 |
40010 | 调用过于频繁(超过每秒调用次数限制) |
40011 | 超过每天调用次数限制 |
60001 | DSL格式错误 |
60002 | 指标有已关联实验,无法删除 |
60010 | 流量不足,无法创建实验 |
60011 | 实验的endpoint_type与所属互斥组不一致 |
60012 | 测试中实验无法被结束 |
60013 | 草稿态实验不可被openAPI查询或修改 |