成本归属标签
成本归属标签让组织按自己的维度归属用量和成本,例如部门、事业部、子公司、项目或成本中心。组织先声明标签键,再在调用方 API Key、团队和成员上设置 key=value,或者从调用方的 JWT 读取取值。每个请求按其运行时解析出的标签值归属。之后可以在 成本分析 页面按这些值拆分支出,用标签预算为其封顶,并让限流策略按标签匹配和拆分流量。
标签在 AISIX Enterprise 和 AISIX Cloud 中的行为一致。
前提条件
开始之前,请准备以下内容:
- 声明标签键需要组织的 owner 或 admin 角色,或拥有
tag_keys写权限的自定义角色。在某个资源上设置标签,需要该资源的写权限。 - 每个需要归属的环境都使用会在用量上记录标签的网关。1.6.x 及更早版本的网 关不会记录,参见网关版本要求。
- 使用 Admin API 示例时,需要控制面地址和具有写权限的 Admin Token:
# AISIX_CP 包含 /api,末尾不带斜杠。
# 本地 AISIX Enterprise 快速入门使用 http://localhost:8080/api。
export AISIX_CP="YOUR_AISIX_CONTROL_PLANE_API_URL"
export AISIX_TOKEN="YOUR_ADMIN_TOKEN"
export TEAM_ID="YOUR_TEAM_ID"
export ENV_ID="YOUR_ENVIRONMENT_ID"
声明标签键
标签键必须先在组织中声明,资源才能带上它。预先声明可以统一用词,避免 department 同时被写成 dept 或 Department。
- 在组织导航中打开 标签键,选择 新建标签键。
- 输入 键,例如
department。 - 可以填写 显示名称 和 描述。
- 选择 声明标签键。
通过 Admin API 声明标签键:
curl -sS -X POST "${AISIX_CP}/tag_keys" \
-H "Authorization: Bearer ${AISIX_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"key": "department",
"display_name": "Department",
"description": "Cost center the usage is charged to."
}'
标签键遵循以下规则:
- 以小写字母开头,只包含小写字母、数字和下划线,最多 63 个字符:
^[a-z][a-z0-9_]{0,62}$。 - 声明后不能修改键本身。显示名称和描述可以随时编辑。
- 每个组织最多声明 32 个键。超出时返回
400,错误码为TAG_KEY_LIMIT;声明已存在的键返回409。 - 所有成员都可以读取已声明的键,写入需要
tag_keys写权限。
删除标签键
只要有预算、限流策略或信任服务提供方的 tag_claims 在使用某个标签键,删除就会被拒绝,返回 409,错误码为 TAG_KEY_IN_USE。错误信息会列出它们,请先移除。
否则,删除会把该键从所有带有它的调用方 API Key、团队和成员上移除,之后的请求不再归属到它。已记录的用量保留当时的标签,因此已删除键的值仍会出现在已存的历史数据中。只要所选时间范围内的用量带有该键,成本分析 就会继续提供它,并标记为 已删除。
在 API Key、团队和成员上设置标签
可以在三类资源上设置标签。每个资源只带自己的标签,形式为标签键到标签值的对象:
| 资源 | 控制台 | Admin API |
|---|---|---|
| 调用方 API Key | 环境 API 密钥 下 Key 的创建和编辑表单中的 成本归属标签 部分 | POST /environments/{environment_id}/api_keys 和 PATCH /environments/{environment_id}/api_keys/{api_key_id} |
| 团队 | 团队 下团队的创建和编辑表单 | POST /teams 和 PATCH /teams/{team_id} |
| 成员 | 成员 中成员行的 标签 面板,以及 AISIX Enterprise 中的 创建用户 表单 | POST /members 和 PATCH /members/{user_id} |
控制台提供已声明的键供选择,并提示组织中该键已在使用的值。同样的建议值也可以通过 GET /tag_keys/{key}/values 获取,它列出最多 500 个去重值:调用方 API Key、团队和成员当前设置的值,以及最近 30 天用量归属到的值,从 JWT Claim 读取的值就出现在后者中。来自用量的值只填满配置值留下的名额,并且只有同时拥有 usage 读权限的调用方才能看到。组织很大时这部分查询可能超时,响应中就只有配置值。此时仍可手动输入值。
标签值遵循以下规则:
- 值是 1 到 128 个字符的自由文本。
- 值不能包含换行等控制字符,也不能以空白字 符(包括不换行空格和全角空格)开头或结尾。控制面会以
400拒绝这样的值。 - 资源
tags中的每个键都必须已在组织中声明。
在 Admin API 中,PATCH 会整体替换 tags 对象,请发送要保留的完整集合。发送 null 或 {} 清空所有标签,不传 tags 则保持不变。例如,以下请求为团队设置两个标签:
curl -sS -X PATCH "${AISIX_CP}/teams/${TEAM_ID}" \
-H "Authorization: Bearer ${AISIX_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"tags": {
"department": "rnd",
"subsidiary": "emea"
}
}'
成员的标签属于其在本组织中的成员资格,而不属于其账号。admin 可以修改成员的标签;修改成员角色仍然需要 owner。通过邀请、单点登录或 SCIM 目录同步加入的成员一开始没有标签。由目录同步管理的成员,其标签也可以在控制台和 Admin API 中编辑。目录同步既不读取也不写入标签,因此标签不会从身份提供方同步。如果要在请求时从身份提供方取值,参见从 JWT Claim 读取标签。
请求如何解析标签
请求通过身份认证时,网关根据认证所用的调用方 API Key 解析其标签;对于 JWT 调用方,还会读取已验证的 Token。对每个标签键,取最近的值:
- 对于 JWT 调用方,取信任服务提供方的
tag_claims从 Token 读取的值。参见从 JWT Claim 读取标签。 - 否则,取调用方 API Key 自己的值。
- 否则,取该 Key 绑定的团队上设置的值。
- 否则,取拥有该 Key 的成员上设置的值。
只有 Key 自己的团队绑定和成员绑定会参与解析,成员所属的其他团队不提供任何标签。每个请求的每个标签键只有一个值,不同的键可以组合,所以一个请求可以从 Key 取 department、从团队取 business_group、从成员取 subsidiary。请求不能自带标签,网关从不从请求头或请求体中读取标签。
例如,组织声明了 department、business_group 和 subsidiary,并做了如下设置:
| 资源 | 标签 |
|---|---|
团队 platform | department=infra、business_group=cloud |
| 成员 Alice | department=rnd、subsidiary=emea |
Key K1,绑定到 platform |