twells89/sigma-source-parameter-repair
GitHub: twells89/sigma-source-parameter-repair
一个 Sigma Computing 工作簿源参数批量修复工具,解决替换数据源后参数绑定失效的问题。
Stars: 0 | Forks: 0
# sigma-source-parameter-repair
在替换数据源后,检测并修复 [Sigma](https://www.sigmacomputing.com/) 工作簿中损坏的**源参数**(source parameters)。
如果你使用模板数据模型(data model)和模板工作簿(workbook),并为每个新团队、租户(tenant)或环境克隆它们,你可能遇到过这个问题:当你将新工作簿替换到新数据模型上时,所有源参数会立刻失效。此工具可以一次性修复它们。
无依赖项 — 仅需 Python 3.9+ 标准库。
## 问题所在
工作簿控件可以驱动定义在数据模型内部的控件。这种绑定被称为*源参数*(source parameter),在工作簿规格(spec)中它看起来像这样:
```
- kind: control
controlId: RegionControl # the workbook-side control
id: aBcDeFgHiJcon
filters:
- source: { kind: table, elementId: KLm0nOpQrS }
columnId: TuVwXyZ012
parameters: # <-- the source parameter
- kind: data-model
dataModelId: 11111111-1111-1111-1111-111111111111
controlId: Store-Region # the control inside the data model
```
`swapSources` 接受 `columnMapping` 和 `metricMapping`,仅此而已。这里没有参数映射。因此,当你替换工作簿的源时,Sigma 会重写每个元素的 `source.dataModelId`,但会让每个 `parameters[].dataModelId` 仍然指向**旧**的数据模型。此时,每个源参数都会引用一个工作簿不再从中读取数据的模型,因此 Sigma 会将其标记为无效。
修复方法并不复杂:重写那个字段即可。棘手的是,一个真实的模板工作簿有几十个分布在几十个元素上的参数,而 Sigma UI 要求你逐一访问。
## 为什么自动化是安全的
克隆数据模型会**逐字保留其控件 ID**。除了标识字段外,模板模型及其副本是完全相同的,一直到每个控件的 `controlId` 都是如此。因此,修复过程只是直接的 ID 重写,而不是模糊名称匹配,并且该工具可以验证其选择:在重写绑定之前,它会确认目标数据模型确实定义了具有该 ID 的控件。
如果无法确认这一点,它会拒绝猜测。参见[解析规则](#resolution-rules)。
## 安装
```
git clone https://github.com/twells89/sigma-source-parameter-repair.git
cd sigma-source-parameter-repair
```
就这样。你也可以选择将其添加到你的 `PATH` 中:
```
chmod +x sigma_source_params.py
ln -s "$PWD/sigma_source_params.py" ~/.local/bin/sigma-source-params
```
## 凭证
在 Sigma 的 **Administration → APIs and Tokens** 下创建 API 凭证,然后导出它们。`SIGMA_BASE_URL` 是你的云和区域的 **API host**,而不是你的应用 URL — 你可以在 **Administration → Developer Access** 下,或者在 [Sigma 的区域支持表格](https://help.sigmacomputing.com/docs/region-warehouse-and-feature-support)中查找它。
```
export SIGMA_BASE_URL="https://aws-api.sigmacomputing.com" # adjust to your region
export SIGMA_CLIENT_ID="..."
export SIGMA_CLIENT_SECRET="..."
```
凭证所有者需要对工作簿拥有 **Can edit** 访问权限,并且其账户类型需要具有*创建、编辑和发布工作簿*(Create, edit, and publish workbooks)的权限。
## 使用方法
从工作簿的 URL 中获取工作簿 ID — 可以是 UUID,也可以是短 URL ID。
### 检查
在不更改任何内容的情况下报告工作簿的状态。如果任何绑定需要处理,它会以代码 `1` 退出,因此可以用作流水线闸门。
```
python3 sigma_source_params.py check WORKBOOK_ID
```
```
workbook : Regional Template (version 3)
reads from: 22222222-2222-2222-2222-222222222222
source parameters: 3
[REPAIR ] 'City' (element aBcDeFgHiJcon)
data model control: Store-City
11111111-1111-1111-1111-111111111111
-> 22222222-2222-2222-2222-222222222222
live source defines control 'Store-City'
...
3 source parameter(s) need attention.
```
添加 `--json` 以获取机器可读的输出。
### 修复
默认为预运行(dry run)— 它会准确打印出将要进行的更改,但不会触动任何实际内容:
```
python3 sigma_source_params.py repair WORKBOOK_ID
```
写入更改:
```
python3 sigma_source_params.py repair WORKBOOK_ID --apply
```
`--apply` 会创建一个**新的工作簿版本**。以前的版本在 Sigma 的版本历史记录中仍然可用,因此该更改是可还原的。
写入后,该工具会重新读取工作簿并报告仍有多少绑定需要处理,而不是假设写入已成功。
## 解析规则
对于每个 `dataModelId` 不属于工作簿有效数据模型源之一的源参数,工具会选择一个目标:
| 情况 | 结果 |
| --- | --- |
| 已经指向有效的源 | `ok` — 保持不变 |
| 恰好有一个有效源定义了具有该 ID 的控件 | `REPAIR` — 重写为该源 |
| 多个有效源定义了该控件 ID | `AMBIGUOUS` — 保持不变,并报告 |
| 没有有效源定义该控件 ID | `NO MATCH` — 保持不变,并报告 |
后两种情况是刻意为之。如果在新的数据模型中控件被重命名或删除,正确的目标需要基于意图进行主观判断,而静默地将其重新绑定到看似合理的目标上,还不如明确指出问题。`--apply` 会修复它能确认的部分,保留其余部分不变,并以非零代码退出,让你知道还有剩余工作。
修复是幂等的 — 运行两次是空操作(no-op)。
## 退出代码
| 代码 | 含义 |
| --- | --- |
| `0` | 无需关注任何内容(或预运行已完成) |
| `1` | 发现过期绑定,或部分绑定无法自动解析 |
| `2` | 缺少凭证或凭证无效 |
| `3` | Sigma API 返回错误 |
## 将其用作发布闸门
基于模板进行配置的持久模式是将修复过程纳入流水线,而不是依靠人工记忆:
```
# 1. clone 模板 data model
# 2. clone 模板 workbook
# 3. 将新 workbook 替换到新 data model 上
# 4. 修复步骤 3 无法保留的 source parameters
python3 sigma_source_params.py repair "$NEW_WORKBOOK_ID" --apply
# 5. 如果仍有任何未解决的问题,则使 rollout 失败
python3 sigma_source_params.py check "$NEW_WORKBOOK_ID"
```
## 一个有用的副作用
Sigma 的写入路径会验证源参数。`POST /v2/workbooks/spec` 和 `PUT /v2/workbooks/{id}/spec` 会拒绝过期的绑定,并返回一条消息,准确指明出问题的项:
```
{
"message": "Invalid parameter on control: aBcDeFgHiJcon targeting data model: 11111111-1111-1111-1111-111111111111, controlId: Store-City.",
"code": "invalid_request"
}
```
因此,能够顺利写入的 spec 没有损坏的源参数。请注意,`GET` **不会**进行验证 — 它会正常返回过期的绑定 — 因此仅仅读回数据并不能证明任何问题。只有写入路径才是真正的检查。
## 限制
- 仅处理 `kind: data-model` 参数。其他类型的参数将被忽略。
- 工作簿规格(spec)端点是 Sigma 的 **beta** API,可能会发生更改。
- 该工具在 API 层验证修复。它无法替你点击仪表板 — 你需要自行打开工作簿以确认控件行为符合预期。
## 延伸阅读
- [工作原理](docs/how-it-works.md) — 该工具背后的 spec 结构和 API 契约
- [以代码形式管理工作簿](https://help.sigmacomputing.com/docs/manage-workbooks-as-code)
- [Sigma REST API 参考](https://help.sigmacomputing.com/reference)
## 许可证
[Apache-2.0](LICENSE)
非官方 Sigma Computing 产品。
标签:BI工具, Python, SOC Prime, 动态分析, 开发工具, 数字取证, 数据治理, 无后门, 自动化脚本