用于代理功能实验的实时区段
用于代理功能实验的实时区段
有关使用 Agent 实例实施 Real-Time Segments for Feature Experimentation 的信息。
使用 Real-Time Segments for Feature Experimentation 创建新受众并将其分配给标志规则后,您可以将受众区段集成到代理实例中。
获取合格的区段
您可以通过调用decide
端点:
POST /v1/decide?keys={flagKey}
设置fetchSegments
为True
:
例如:
Pyhton
#============================
# Fetch qualified segments
#============================
params = {"keys": "my-feature-flag"}
payload = {
"userId": "test-user",
"decideOptions": [
"ENABLED_FLAGS_ONLY",
"INCLUDE_REASONS"
],
"userAttributes": {},
"fetchSegments": True,
}
response = s.post(url = 'http://localhost:8080/v1/decide', params=params, json=payload)
print(response.json())
响应示例:
JSON
{
"variationKey": "variation_b",
"enabled": true,
"ruleKey": "ab_experiment",
"flagKey": "my-feature-flag",
"userContext": {
"userId": "test-user",
"attributes": {}
},
"reasons": ["Audiences for experiment ab_experiment collectively evaluated to true."]
}
ODP GraphQL API
<https://api.zaius.com/v3/graphql>
- ODP 公有 API 密钥 = “<odp_api_key>”
示例 GraphQL 请求:使用 fs_user_id 获取 [“has_email”、“has_email_opted_in”、“push_on_sale”] 分段的信息。
Headers
- 内容类型:application/json
- x-api-key:<odp_api_key>
query MyQuery {
customer(vuid: "d66a9d81923d4d2f99d8f64338976322") {
audiences(subset:["has_email", "has_email_opted_in", "push_on_sale"]) {
edges {
node {
name
state
}
}
}
}
}
示例 GraphQL 响应
{
"data": {
"customer": {
"audiences": {
"edges": [
{
"node": {
"name": "has_email",
"state": "qualified",
}
},
{
"node": {
"name": "has_email_opted_in",
"state": "qualified",
}
},
...
]
}
}
}
}
{
"errors": [
{
"message": "Exception while fetching data (/customer) : java.lang.RuntimeException:
could not resolve _fs_user_id = asdsdaddddd",
"locations": [
{
"line": 2,
"column": 3
}
],
"path": [
"customer"
],
"extensions": {
"classification": "InvalidIdentifierException"
}
}
],
"data": {
"customer": null
}
}
在获取所有合格区段时,应用程序、代理和 ODP 服务器之间的网络调用如下所示:

点击放大图片
- 向
fetchQualifiedSegments=true
终端节点/v1/decide
发出 POST 请求。 - 代理对 ODP 进行 GraphQL 调用以获取区段。
- ODP 使用区段进行响应。
- 将缓存将用户 ID 映射到区段的已获取区段。
- 为用户返回适当的变体。
OdpSegmentManager
代理具有一个OdpSegmentManager
模块,该模块管理为所有用户上下文共享的区段缓存。缓存在内存中(非持久),因此当应用程序终止/设备重新启动时,它将重置。
有关缓存的更多细节:
- 缓存存储用户 ID 到区段的映射。
- 代理在缓存未命中/过期时调用 ODP 服务器。
- 缓存最近最少使用 (LRU)。
- 缓存在超时时过期。
- 缓存大小和超时都是可配置的(提供默认值)。
- 默认情况下,缓存处于启用状态,可以通过将大小设置为零来禁用缓存。
- 可以使用自定义缓存(如 redis)而不是默认实现(请参阅 Agent config.yaml 的 segmentsCache 部分)。
如果要绕过缓存,可以将以下选项添加到有效负载 JSON 对象:
- “fetchSegmentsOptions”: [“IGNORE_CACHE”] – 绕过区段缓存进行查找和保存。
- “fetchSegmentsOptions”: [“RESET_CACHE”] – 重置所有区段缓存。
例如:
Python
params = {"keys": "my-feature-flag"}
payload = {
"userId": "test-user",
"decideOptions": [
"ENABLED_FLAGS_ONLY",
"INCLUDE_REASONS"
],
"userAttributes": {},
"fetchSegments": True,
"fetchSegmentsOptions":["RESET_CACHE"]
}
response = s.post(url = 'http://localhost:8080/v1/decide', params=params, json=payload)
print(response.json())
发送 ODP 事件
通过调用send-odp-event
端点来发送数据:
POST /v1/send-odp-event
然后,您可以使用这些数据来分析用户行为并优化不同渠道和接触点的体验。
使用send-odp-event
终端节点
- 将用户合并或拼合在一起,并确定哪个事件与哪个客户关联。
- 发送各种类型的事件和操作,例如浏览量、点击、表单提交等。您可以包含其他数据,以提供有关所跟踪事件的更多上下文和信息。
例如,通过将电子邮件地址标识符与fs_user_id``send-odp-event
标识符连接,您可以使用终端节点发送与这两个标识符关联的事件。这使您能够跟踪和分析特定用户在不同接触点和设备中的行为。
您无法使用send-odp-event
终端节点创建或更新用户配置文件数据,如名称或地址。相反,您可以使用 ODP 创建和更新客户 API 终端节点或 ODP UI 来管理客户配置文件。
参数 | 类型 | 描述 |
---|---|---|
_所需_操作 | 字符串 | 指定事件类型的子类别,用于跟踪应用程序和用户生命周期。调用失败,并显示以下错误:ODP action is not valid (cannot be empty) 若 null 或 empty。 |
类型 | 字符串 | 要发送的事件类型。如果未指定,则设置为 “fullstack” 。 |
标识符 | 字典<string, string> | 用户标识符的键值映射。至少需要一个键值对。 |
数据 | Dictionary<string, object> | 键值映射中的事件数据。该值可以是任何类型(字符串、数字或布尔值)。您可以使用 null 值,但它们会变成空字符串。 Python SDK 将默认事件数据添加到给定的数据字典中。在创建 Dictionary 时发送相同的键会覆盖默认数据值。 * “idempotence_id”:<Python SDK 创建的 UUID> * “data_source_type”:“sdk” * “data_source”:“python-sdk” * “data_source_version”:<已实现 Python SDK 版本> |
Python
#============================
# Send ODP event
#============================
payload = {
"type": "test_type",
"data": {
"idempotence_id": "abc-1234",
"data_source_type": "agent",
},
"identifiers": {"user_id": "test_user_1"},
"action": "test_action",
}
response = s.post(url = 'http://localhost:8080/v1/send-odp-event', params={}, json=payload)
print(response.json())
成功响应示例:
{
"success": true
}
此响应仅指示事件已成功在事件队列中排队。这并不能保证活动已成功传递。
如果事件已成功发送,这意味着它已离开事件队列,则不应记录任何错误。如果不成功,则 Error 应在 Agent 日志中可见,例如400 BadRequest
。
发送 ODP 事件时应用程序、代理和 ODP 服务器之间的网络调用如下所示:

点击放大图片
- 向 /v1/send-odp-event 发出 POST 请求。
- 代理向 ODP 发出 POST 请求。
- ODP 以确认或相关错误进行响应。
- 代理响应应用程序,并显示成功确认或相关错误。