本文档提供「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("中文关键字");
说明: 获取App实验过滤条件,用于受众规则圈选,当前仅支持编程实验-服务端实验。
说明
私有化4.9.0版本开始新增支持此接口。
请求路径:/openapi/v3/apps/{app_id}/para-filters
请求方法:GET
请求参数
参数名称 | 参数类型 | 是否必填 | 描述 |
|---|---|---|---|
experiment_mode | string | 是 | 实验类型,当前仅支持编程实验,需配置为“coding”。 |
side_type | string | 是 | 实验端类型,当前仅支持服务端实验,需配置为“server”。 |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | 接口返回的服务端过滤条件。结构如下:
注意 私有化-CDP联合部署环境下,服务端编程实验会返回用户分群列表。 |
data结构说明
参数名称 | 类型 | 说明 |
|---|---|---|
id | int | 过滤参数ID |
name | string | 过滤参数名称 |
description | string | 描述信息 |
key | string | 过滤参数Key |
type | string | 过滤参数Value类型 |
owner | object | owner信息列表 |
modify_time | int | 参数更新时间戳(秒) |
attribute | string | 过滤参数属性 |
options | object | 过滤参数可取值列表,直接参考下方样例 |
op | object | 过滤参数可以进行的操作符, 直接参考下方样例 |
property_type | string | 过滤参数参数类型 |
说明
返回的数据中,主要需要关注下面几个字段,用于拼接实验的受众过滤规则:
示例
{ "code": 200, "data": { "list":[ { "id": 12463, "name": "姓名", "key": "name", "type": "string", "owner": [ { "id": 238434, "name": "zhangsan", "avatar": "https://sf3-ttcdn-tos.pstatp.com/obj/byterangers-avatar/NPTDy24097558461*****.png" } ], "modify_time": 1695108262, "attribute": "profile", "options": [ { "label": "", "value": "syz" }, { "label": "", "value": "cy" } ], }, { "id": 0, "name": "用户分群", "description": "", "key": "cohort", "type": "int", "owner": [], "modify_time": 0, "attribute": "common_param", "options": [ { "label": "昨天做了任意事件_20231206174256586", "value": 1022367 }, ... }, ... ] } "message": "success" }
注意
开放接口所创建的实验,仅管理员可编辑
接口描述: 创建一个编程实验或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结构说明。 |
user_group_filter_rules | object[] | 否 | 客群实验受众规则列表。详情请参见下文的user_group_filter_rules结构说明章节。 | 4.9.0版本开始,与CDP联合部署时,新增支持创建客群实验,使用客群进行受众规则配置时需配置此参数。 |
manage_sub_type | string | 否 | 特性实验子类型,仅可配置为:user_group。 | null |
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%的评估流量。 |
user_group_filter_rules结构说明
参数名称 | 参数类型 | 是否必填 | 描述 |
|---|---|---|---|
name | string | 是 | 客群名称 |
type | int | 是 | 对照客群/实验客群
user_group_filter_rules数组中只能有一个对照客群 |
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 } { "user_group_filter_rules": [ { "name": "\u5ba2\u7fa4A", "type": 0, "filter_rule": [ { "logic": "||", "conditions": [ { "logic": "&&", "condition": { "key": "automation_copy_aaaessrssb_Int", "type": "int", "op": "==", "value": [ 1 ], "property_type": "common_param" } } ] } ] }, { "name": "\u5ba2\u7fa4B", "type": 1, "filter_rule": [ { "logic": "||", "conditions": [ { "logic": "&&", "condition": { "key": "cohort", "type": "int", "op": "==", "value": [ 1000004 ], "property_type": "cdp_cohort" } } ] } ] } ], "manage_sub_type": "user_group", // 实验的子类型字段,这里是客群传递user_group,若用户编辑rollback后传递空串或者不传都可以,后端会判断对应更新实验表 } }
说明: 根据实验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 | 实验描述 |
user_group_filter_rules | List[Dict] | 客群实验受众规则列表 |
manage_sub_type | 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[] | 实验版本信息 |
说明: 修改实验的配置信息。通过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 | 否 | 互斥组 | |
user_group_filter_rules | object[] | 否 | 客群实验受众规则列表。详情请参见下文的user_group_filter_rules结构说明章节。 | |
manage_sub_type | string | 否 | 特性实验子类型,仅可配置为:user_group。 |
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],最小精度千分之一 |
user_group_filter_rules结构
参数名称 | 参数类型 | 是否必填 | 描述 |
|---|---|---|---|
name | string | 是 | 客群名称 |
type | int | 是 | 对照客群/实验客群
user_group_filter_rules数组中只能有一个对照客群 |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | 实验ID |
说明: 开始一个测试中的实验。使其状态变为运行中。
请求路径: /openapi/v3/apps/<app_id>/experiments/<experiment_id>/launch
请求方法: PUT
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | 实验ID |
说明: 暂停指定实验,4.9.0版本开始支持此接口
请求路径 : /openapi/v3/apps/<app_id>/experiments/<experiment_id>/pause
请求方法: POST
请求参数
参数名称 | 类型 | 说明 |
|---|---|---|
duration | int | 暂停某个实验时,实验流量是平滑生效的,通过此参数设置平滑生效的时间是多少分钟 |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
说明: 恢复指定实验,4.9.0版本开始支持此接口
请求路径 : /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为成功,非200的错误码说明如下:
|
message | string | 接口返回信息,成功时默认为success |
data | object | 实验ID |
说明: 关闭某个实验组
请求路径 : /openapi/v3/apps/<app_id>/experiments/:flight_id/versions/:version_id/close
请求方法: POST
请求参数
参数 | 类型 | 说明 |
|---|---|---|
app_id | integer | 路径参数,实验所属app_id |
flight_id | integer | 路径参数,实验ID |
version_id | integer | 路径参数,实验组ID |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功,非200的错误码说明如下:
|
message | string | 接口返回信息,成功时默认为success |
说明: 创建一个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 | 是否支持设置为核心指标 |
说明: 分页获取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 | 是否支持设置为核心指标 |
说明: 获取指定指标组的详情数据
请求路径: /openapi/v3/apps/<app_id>/metric-groups/<metric_group_id>
请求方法: GET
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | 指标组信息 {"metric_info": } |
指标组信息说明
body.data
字段名 | 描述 |
|---|---|
id | 指标组id |
name | 指标组名称 |
body.metrics[0]
字段名 | 描述 |
|---|---|
id | 指标id |
name | 指标名称 |
type | 指标类型
|
composed | 是否组合指标
|
is_experimental_property_filter | 是否支持灵活属性
|
body.metrics[0].experimental_property_filter_tpl
{ "A": { "event_id": 89, "event_name": "any_event", "properties": [ { "property_type": "common_param", "property_value_type": "string", "property_name": "user_agent" } ] }, "B": { "event_id": 91, "event_name": "app_launch", "properties": [ { "property_type": "user_profile", "property_value_type": "datetime", "property_name": "first_event_time" } ] }, "all": { "properties": [ { "property_type": "user_profile", "property_value_type": "string", "property_name": "gender" } ] } }
灵活属性详情的返回结果字段详情与DataFinder的DSL结构说明类似,主要字段如下:
字段名 | 描述 |
|---|---|
A、B | 对应DSL中的show_label。 |
all | 对所有事件生效的属性 |
properties | 指标属性描述 |
property_name | 属性名称 |
property_type | 属性类型
|
property_value_type | 属性值类型 |
返回示例
查询数仓指标组详情
{ "code": 0, "data": { "id": 60, "name": "portable(单一+组合指标)45712", "status": 1, "description": "", "type": "portable", "uba_report_type": 1, "uba_app_id": 0, "owners": [ { "id": 1, "name": "admin", "avatar": null, "is_superuser": null } ], "app_ids": [ 10000001 ], "import_app_ids": [], "tags": [], "merge_types": { "total_start_time": 0, "support_accumulate": 0, "support_total": 0, "support_avg": 1 }, "metric_scenes": [], "sla": "", "metrics": [ { "id": 10397, "name": "SUM/UV-灵活", "description": "", "status": 1, "dsl": { "version": 3, "content": { "queries": [ [ { "dataset_id": 9, "event_indicator": "measure", "filters": [], "measure_info": { "field_name": "amount", "measure_type": "sum", "property_type": "profile", "value_type": "int" }, "nickname": "", "show_label": "A" } ], [ { "dataset_id": 9, "event_indicator": "event_users", "filters": [], "nickname": "", "show_label": "B" } ], [ { "formula": "A/B", "show_label": "metric_relation", "show_name": "指标关系" } ] ], "profile_filters": [], "show_option": null, "option": null } }, "composed": true, "data_type": "number_4", "type": "portable", "is_required": 0, "permission_type": "public", "calculate_type": "events_per_user", "create_time": 1724056602, "modify_time": 1724056637, "support_confidence": true, "is_support_major": true, "experiment_num": 2, "key": "", "file": "", "is_hourly": 0, "support_bayes": 0, "need_weighted": 0, "weighted_metric_id": null, "visible": true, "major_metric_num": 0, "has_running_experiments": true, "is_defense_metric": 0, "defenses": [], "use_pre_sql": 0, "pre_alert": 0, "merge_pre_sql": "", "avg_pre_sql": "", "first_entry_avg_pre_sql": "", "extra_info": "{\"is_experimental_property_filter\":1,\"experimental_property_filter_tpl\":{\"A\":{\"properties\":[{\"property_value_type\":\"int\",\"property_name\":\"amount\"}]},\"B\":{\"properties\":[{\"property_value_type\":\"string\",\"property_name\":\"order_no\"}]},\"all\":{\"properties\":[{\"property_value_type\":\"string\",\"property_name\":\"product_type\"}]}}}", "is_experimental_property_filter": 1, "experimental_property_filter_tpl": { "A": { "properties": [ { "property_value_type": "int", "property_name": "amount" } ] }, "B": { "properties": [ { "property_value_type": "string", "property_name": "order_no" } ] }, "all": { "properties": [ { "property_value_type": "string", "property_name": "product_type" } ] } }, "is_experimental_property_filter_editable": 0 } ], "permission_type": "public", "modify_time": 1724056601, "metric_num": null, "libra_analysis_type": 0, "dimensions": [], "new_format": 1, "dataset_id": 5, "ab_analysis_type": 0 }, "message": "" }
查询UBA指标组详情
{ "code": 0, "data": { "id": 2, "name": "default", "status": 1, "description": "应用接入测试指标组(系统自建)", "type": "uba", "uba_report_type": 1, "uba_app_id": 0, "owners": [ { "id": -2, "name": "InnerAPI", "avatar": null, "is_superuser": null } ], "app_ids": [ 10000001 ], "import_app_ids": [], "tags": [], "merge_types": { "total_start_time": 0, "support_accumulate": 0, "support_total": 0, "support_avg": 1 }, "metric_scenes": [], "sla": "", "metrics": [ { "id": 10425, "name": "组合指标-1-灵活", "description": "组合指标-1-灵活", "status": 1, "dsl": { "version": 3, "content": { "queries": [ [ { "event_id": 89, "event_indicator": "pv_per_dau", "event_name": "any_event", "event_type": "origin", "filters": [ { "expression": { "conditions": [], "logic": "and" } } ], "nickname": "", "show_label": "A" } ], [ { "event_id": 91, "event_indicator": "pv_per_dau", "event_name": "app_launch", "event_type": "origin", "filters": [], "nickname": "", "show_label": "B" } ], [ { "formula": "A/B", "show_label": "metric_relation", "show_name": "指标关系" } ] ], "profile_filters": [], "show_option": null, "option": null } }, "composed": true, "data_type": "number_4", "type": "tea", "is_required": 0, "permission_type": "public", "calculate_type": "", "create_time": 1726024310, "modify_time": 1726024483, "support_confidence": false, "is_support_major": false, "experiment_num": 0, "key": "", "file": "", "is_hourly": 0, "support_bayes": 0, "need_weighted": 0, "weighted_metric_id": null, "visible": true, "major_metric_num": 0, "has_running_experiments": false, "is_defense_metric": 0, "defenses": [], "use_pre_sql": 0, "pre_alert": 0, "merge_pre_sql": "", "avg_pre_sql": "", "first_entry_avg_pre_sql": "", "extra_info": "{\"is_experimental_property_filter\":1,\"experimental_property_filter_tpl\":{\"A\":{\"event_id\":89,\"event_name\":\"any_event\",\"properties\":[{\"property_type\":\"common_param\",\"property_value_type\":\"string\",\"property_name\":\"user_agent\"}]},\"B\":{\"event_id\":91,\"event_name\":\"app_launch\",\"properties\":[{\"property_type\":\"user_profile\",\"property_value_type\":\"datetime\",\"property_name\":\"first_event_time\"}]},\"all\":{\"properties\":[{\"property_type\":\"user_profile\",\"property_value_type\":\"string\",\"property_name\":\"gender\"}]}}}", "is_experimental_property_filter": 1, "experimental_property_filter_tpl": { "A": { "event_id": 89, "event_name": "any_event", "properties": [ { "property_type": "common_param", "property_value_type": "string", "property_name": "user_agent" } ] }, "B": { "event_id": 91, "event_name": "app_launch", "properties": [ { "property_type": "user_profile", "property_value_type": "datetime", "property_name": "first_event_time" } ] }, "all": { "properties": [ { "property_type": "user_profile", "property_value_type": "string", "property_name": "gender" } ] } }, "is_experimental_property_filter_editable": 1 } ], "permission_type": "public", "modify_time": 1724814787, "metric_num": null, "libra_analysis_type": 0, "dimensions": [], "new_format": 1, "dataset_id": null, "ab_analysis_type": 0 }, "message": "" }
说明: 全量修改指标的信息,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] | 报告概览数据,详情请参见下文的summa_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 | 是 | 查询类型 | 时间粒度:天、小时、分钟。
|
start_ts | int | 是 | 查询开始时间,UNIX时间戳 | 默认实验开始时间,不可以早于实验开始时间 |
end_ts | int | 是 | 查询结束时间,UNIX时间戳 | 默认当前时间,不可以晚于实验结束时间 |
dim | string | 否 | 查询数据统计维度,默认为实验组维度 | 对于客群实验,支持实验和客群维度交叉查询:abversion_usergroup |
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | 报告数据,详情请参见下文的报告数据结构说明。 |
data(报告数据)结构说明
参数名称 | 参数类型 | 描述 |
|---|---|---|
versions | list[object] | 实验版本信息,详情请参见下文的版本信息结构说明。 |
user_groups | list[object] | 客群信息,只有客群实验且包含客群维度时才返回。 |
version_usergroups | list[object] | 客群信息,只有客群实验且dim=abversion_usergroup时才返回。 |
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 | 天级、小时级、5分钟级报告数据 |
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, "m": 0.3416771, "change": 0, "change_rate": 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": { "339600": 0, "339601": 0 }, "variance": { "339600": 0, "339601": 0 }, "details": { "numerator": 273, "denominator": 799 } } } }, "daily_data": { "2024-03-04": { "339600": { "339601": { "p": 1, "m": 0.3416771, "change": 0, "change_rate": 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": { "339600": 0, "339601": 0 }, "variance": { "339600": 0, "339601": 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" }
包含客群维度的返回示例:
{ "code": 200, "data": { "available_start_ts": 1716775273, "available_end_ts": 1716998399, "start_ts": 1716775273, "end_ts": 1716911999, "versions": [ { "id": "217", "name": "版本1", "config": { "zgtest0524": "a" }, "type": 0, "weight": 0, "disabled": false }, { "id": "218", "name": "版本2", "config": { "zgtest0524": "b" }, "type": 1, "weight": 0, "disabled": false } ], "confidence_level": 90, "metric_id": 10393, "distribution": { "217_2": { "218_1": { "p": 0, "m": 0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_2": 0, "218_1": 0 }, "variance": { "217_2": 0, "218_1": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "218_2": { "p": 0, "m": 1.5, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_2": 0, "218_2": 0 }, "variance": { "217_2": 0, "218_2": 0 }, "details": { "numerator": 258, "denominator": 172 } }, "217_1": { "p": 0, "m": 1.5045, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_2": 0, "217_1": 0 }, "variance": { "217_2": 0, "217_1": 0 }, "details": { "numerator": 3009, "denominator": 2000 } } }, "218_1": { "217_2": { "p": 0, "m": 0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_1": 0, "217_2": 0 }, "variance": { "218_1": 0, "217_2": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "218_2": { "p": 0, "m": 1.5, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_1": 0, "218_2": 0 }, "variance": { "218_1": 0, "218_2": 0 }, "details": { "numerator": 258, "denominator": 172 } }, "217_1": { "p": 0, "m": 1.5045, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_1": 0, "217_1": 0 }, "variance": { "218_1": 0, "217_1": 0 }, "details": { "numerator": 3009, "denominator": 2000 } } }, "218_2": { "217_2": { "p": 0, "m": 0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_2": 0, "217_2": 0 }, "variance": { "218_2": 0, "217_2": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "218_1": { "p": 0, "m": 0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_2": 0, "218_1": 0 }, "variance": { "218_2": 0, "218_1": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "217_1": { "p": 0, "m": 1.5045, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_2": 0, "217_1": 0 }, "variance": { "218_2": 0, "217_1": 0 }, "details": { "numerator": 3009, "denominator": 2000 } } }, "217_1": { "217_2": { "p": 0, "m": 0, "change": -1.5045, "change_rate": -1.0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_1": 0, "217_2": 0 }, "variance": { "217_1": 0, "217_2": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "218_1": { "p": 0, "m": 0, "change": -1.5045, "change_rate": -1.0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_1": 0, "218_1": 0 }, "variance": { "217_1": 0, "218_1": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "218_2": { "p": 0.9, "m": 1.5, "change": -0.0045, "change_rate": -0.00299103, "conf_interval": [ -0.04927, 0.04329 ], "half_interval": 0.04628192, "confidence": 3, "mean": { "217_1": 1.5045, "218_2": 1.5 }, "variance": { "217_1": 0.00012505, "218_2": 0.00146199 }, "mde": 0.06856722, "sample_size": { "217_1": 2000, "218_2": 172 }, "details": { "numerator": 258, "denominator": 172 } } } }, "daily_data": { "2024-05-27": { "217_1": { "217_2": { "p": 0, "m": 0, "change": -1.009, "change_rate": -1.0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_1": 0, "217_2": 0 }, "variance": { "217_1": 0, "217_2": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "218_1": { "p": 0, "m": 0, "change": -1.009, "change_rate": -1.0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_1": 0, "218_1": 0 }, "variance": { "217_1": 0, "218_1": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "218_2": { "p": 0.001, "m": 1.5, "change": 0.491, "change_rate": 0.48662042, "conf_interval": [ 0.44702, 0.52622 ], "half_interval": 0.03959949, "confidence": 1, "mean": { "217_1": 0, "218_2": 0 }, "variance": { "217_1": 0, "218_2": 0 }, "mde": 0.07158988, "details": { "numerator": 258, "denominator": 172 } } }, "217_2": { "217_1": { "p": 0, "m": 1.009, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_2": 0, "217_1": 0 }, "variance": { "217_2": 0, "217_1": 0 }, "details": { "numerator": 1009, "denominator": 1000 } }, "218_1": { "p": 0, "m": 0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_2": 0, "218_1": 0 }, "variance": { "217_2": 0, "218_1": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "218_2": { "p": 0, "m": 1.5, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_2": 0, "218_2": 0 }, "variance": { "217_2": 0, "218_2": 0 }, "details": { "numerator": 258, "denominator": 172 } } }, "218_1": { "217_1": { "p": 0, "m": 1.009, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_1": 0, "217_1": 0 }, "variance": { "218_1": 0, "217_1": 0 }, "details": { "numerator": 1009, "denominator": 1000 } }, "217_2": { "p": 0, "m": 0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_1": 0, "217_2": 0 }, "variance": { "218_1": 0, "217_2": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "218_2": { "p": 0, "m": 1.5, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_1": 0, "218_2": 0 }, "variance": { "218_1": 0, "218_2": 0 }, "details": { "numerator": 258, "denominator": 172 } } }, "218_2": { "217_1": { "p": 0, "m": 1.009, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_2": 0, "217_1": 0 }, "variance": { "218_2": 0, "217_1": 0 }, "details": { "numerator": 1009, "denominator": 1000 } }, "217_2": { "p": 0, "m": 0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_2": 0, "217_2": 0 }, "variance": { "218_2": 0, "217_2": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "218_1": { "p": 0, "m": 0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_2": 0, "218_1": 0 }, "variance": { "218_2": 0, "218_1": 0 }, "details": { "numerator": 0, "denominator": 0 } } } }, "2024-05-28": { "217_1": { "217_2": { "p": 0, "m": 0, "change": -1.0, "change_rate": -1.0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_1": 0, "217_2": 0 }, "variance": { "217_1": 0, "217_2": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "218_1": { "p": 0, "m": 0, "change": -1.0, "change_rate": -1.0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_1": 0, "218_1": 0 }, "variance": { "217_1": 0, "218_1": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "218_2": { "p": 0, "m": 0, "change": -1.0, "change_rate": -1.0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_1": 0, "218_2": 0 }, "variance": { "217_1": 0, "218_2": 0 }, "details": { "numerator": 0, "denominator": 0 } } }, "217_2": { "217_1": { "p": 0, "m": 1.0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_2": 0, "217_1": 0 }, "variance": { "217_2": 0, "217_1": 0 }, "details": { "numerator": 2000, "denominator": 2000 } }, "218_1": { "p": 0, "m": 0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_2": 0, "218_1": 0 }, "variance": { "217_2": 0, "218_1": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "218_2": { "p": 0, "m": 0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "217_2": 0, "218_2": 0 }, "variance": { "217_2": 0, "218_2": 0 }, "details": { "numerator": 0, "denominator": 0 } } }, "218_1": { "217_1": { "p": 0, "m": 1.0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_1": 0, "217_1": 0 }, "variance": { "218_1": 0, "217_1": 0 }, "details": { "numerator": 2000, "denominator": 2000 } }, "217_2": { "p": 0, "m": 0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_1": 0, "217_2": 0 }, "variance": { "218_1": 0, "217_2": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "218_2": { "p": 0, "m": 0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_1": 0, "218_2": 0 }, "variance": { "218_1": 0, "218_2": 0 }, "details": { "numerator": 0, "denominator": 0 } } }, "218_2": { "217_1": { "p": 0, "m": 1.0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_2": 0, "217_1": 0 }, "variance": { "218_2": 0, "217_1": 0 }, "details": { "numerator": 2000, "denominator": 2000 } }, "217_2": { "p": 0, "m": 0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_2": 0, "217_2": 0 }, "variance": { "218_2": 0, "217_2": 0 }, "details": { "numerator": 0, "denominator": 0 } }, "218_1": { "p": 0, "m": 0, "change": 0, "change_rate": 0, "conf_interval": [ 0, 0 ], "half_interval": 0, "confidence": 3, "mean": { "218_2": 0, "218_1": 0 }, "variance": { "218_2": 0, "218_1": 0 }, "details": { "numerator": 0, "denominator": 0 } } } } }, "boxplot": "当前指标不支持箱型图,具体原因见下方解读", "user_data": { "217_1": 2000, "217_2": 0, "218_1": 0, "218_2": 172 }, "sql": { "user_data": [ null ], "distribution_data": [ null ], "daily_data": [ null ], "boxplot_data": [ null ] }, "user_groups": [ { "id": "1", "name": "测试", "type": 0 }, { "id": "2", "name": "测试1", "type": 1 } ], "version_usergroups": [ { "id": "217_1", "name": "版本1_测试" }, { "id": "217_2", "name": "版本1_测试1" }, { "id": "218_1", "name": "版本2_测试" }, { "id": "218_2", "name": "版本2_测试1" } ] }, "message": "success" }
失败情况说明:
失败情况 | Response |
|---|---|
超出查询范围:
|
|
实验第一天运行时,要查询天级数据,因天级数据是T+1的,所以此时会报错 |
|
说明:获取MAB智能调优实验的各版本获胜概率
请求路径:/openapi/v3/apps/<app_id>/experiments/<experiment_id>/mab-probability
请求方法:GET
返回值
参数名称 | 类型 | 说明 |
|---|---|---|
code | int | 接口返回状态,200为成功 |
message | string | 接口返回信息,成功时默认为success |
data | object | 报表数据,详情见下文的报表数据说明。 |
报表数据说明
参数名称 | 类型 | 说明 |
|---|---|---|
versions | list of object | 各实验版本基本信息,详情见下文的实验版本基本信息。 |
probs | list of object | 各实验版本获胜概率,详情见下文的实验版本获胜概率。 |
实验版本基本信息
参数名称 | 类型 | 说明 |
|---|---|---|
id | int | 版本ID |
name | string | 版本名称 |
type | int | 版本类型,0:对照组,1:实验组 |
is_mab | int | 是否为mab实验版本,0:否,1:是 |
实验版本获胜概率
参数名称 | 类型 | 说明 |
|---|---|---|
version_id | int | 版本ID |
probability_to_beat_all | float | 获胜概率,取值范围0-1 |
返回示例
{ "code": 200, "data": { "versions": [ { "id": "251", "name": "版本1", "type": 0, "is_mab": 0, }, { "id": "252", "name": "版本2", "type": 1, "is_mab": 0, }, { "id": "253", "name": "版本3", "type": 1, "is_mab": 0, }, { "id": "254", "name": "版本1-mab", "type": 0, "is_mab": 1, }, { "id": "255", "name": "版本2-mab", "type": 1, "is_mab": 1, }, { "id": "256", "name": "版本3-mab", "type": 1, "is_mab": 1, } ], "probs": [ { "version_id": "251", "probability_to_beat_all": 0.0, }, { "version_id": "252", "probability_to_beat_all": 0.85939893 }, { "version_id": "253", "probability_to_beat_all": 0.14060107 } ], }, "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查询或修改 |