From 705c3ba69ef70eb3928f2dc7bf89604cd3e51d71 Mon Sep 17 00:00:00 2001 From: pijiang <419471640@qq.com> Date: Mon, 21 Sep 2026 11:06:34 +0800 Subject: [PATCH 1/2] docs: add Checkly alert integration --- docs.json | 2 + .../alert-sources/checkly.mdx | 133 ++++++++++++++++ integration-docs/src/doc-map.mjs | 1 + .../alert-sources/checkly.mdx | 147 ++++++++++++++++++ 4 files changed, 283 insertions(+) create mode 100644 en/on-call/integration/alert-integration/alert-sources/checkly.mdx create mode 100644 zh/on-call/integration/alert-integration/alert-sources/checkly.mdx diff --git a/docs.json b/docs.json index 1520dfe8..2ebfaa80 100644 --- a/docs.json +++ b/docs.json @@ -1682,6 +1682,7 @@ "zh/on-call/integration/alert-integration/alert-sources/datadog", "zh/on-call/integration/alert-integration/alert-sources/new-relic", "zh/on-call/integration/alert-integration/alert-sources/sumo-logic", + "zh/on-call/integration/alert-integration/alert-sources/checkly", "zh/on-call/integration/alert-integration/alert-sources/zabbix", "zh/on-call/integration/alert-integration/alert-sources/flashcat", "zh/on-call/integration/alert-integration/alert-sources/open-falcon", @@ -3053,6 +3054,7 @@ "en/on-call/integration/alert-integration/alert-sources/datadog", "en/on-call/integration/alert-integration/alert-sources/new-relic", "en/on-call/integration/alert-integration/alert-sources/sumo-logic", + "en/on-call/integration/alert-integration/alert-sources/checkly", "en/on-call/integration/alert-integration/alert-sources/zabbix", "en/on-call/integration/alert-integration/alert-sources/flashcat", "en/on-call/integration/alert-integration/alert-sources/open-falcon", diff --git a/en/on-call/integration/alert-integration/alert-sources/checkly.mdx b/en/on-call/integration/alert-integration/alert-sources/checkly.mdx new file mode 100644 index 00000000..916c3be8 --- /dev/null +++ b/en/on-call/integration/alert-integration/alert-sources/checkly.mdx @@ -0,0 +1,133 @@ +--- +title: "Checkly alert integration" +description: "Send Checkly failure, degradation, recovery, and SSL certificate alerts to Flashduty On-call through a Webhook Alert Channel." +keywords: ["alert integration", "Checkly", "webhook", "synthetic monitoring", "API monitoring"] +--- + +Use a Checkly Webhook Alert Channel to send check-state changes to Flashduty On-call. Failure, degradation, continued failure, and recovery notifications for one Check update the same Flashduty alert. + +
+ +## In Flashduty On-call +--- + +Create either a dedicated or shared **Checkly** alert integration and copy its complete Push URL. + +
+ +## Configure Checkly +--- + + + + +1. In Checkly, open **Alert Settings** +2. Click **Add more channels** and select **Webhook** +3. Enter `Flashduty` as the name +4. Select `POST` as the method +5. Paste the complete Flashduty integration Push URL into URL +6. Add `Content-Type: application/json` under Headers + + + + + +1. Enable **Failure**, **Degradation**, and **Recovery** under **Notification events** +2. Optionally enable **SSL certificate expirations** +3. Subscribe the Checks or Check Groups that should send notifications to Flashduty + +Recovery must be enabled. Otherwise, a recovered Check cannot recover its existing Flashduty alert. + + + + + +Replace Body with this complete JSON template: + +```json +{ + "alert_type": "{{ALERT_TYPE}}", + "alert_title": "{{ALERT_TITLE}}", + "check_id": "{{CHECK_ID}}", + "check_result_id": "{{CHECK_RESULT_ID}}", + "check_name": "{{CHECK_NAME}}", + "check_type": "{{CHECK_TYPE}}", + "group_name": "{{GROUP_NAME}}", + "is_reminder": "{{IS_REMINDER}}", + "reminder_sequence": "{{REMINDER_SEQUENCE}}", + "region": "{{REGION}}", + "run_location": "{{RUN_LOCATION}}", + "started_at": "{{STARTED_AT}}", + "response_time": "{{RESPONSE_TIME}}", + "response_status_code": "{{API_CHECK_RESPONSE_STATUS_CODE}}", + "response_status_text": "{{API_CHECK_RESPONSE_STATUS_TEXT}}", + "result_link": "{{RESULT_LINK}}", + "error_message": "{{CHECK_ERROR_MESSAGE}}", + "tags": [{{#each TAGS}}"{{this}}"{{#unless @last}},{{/unless}}{{/each}}] +} +``` + +Keep `alert_type` and `check_id`. Never add API keys, tokens, passwords, cookies, or other secrets to the payload. + + + + + +Move one subscribed Check through failure, degradation, and recovery. Confirm that one Flashduty alert is triggered, updated, and recovered. + +A Checkly test notification or webhook HTTP 200 proves connectivity only. Use real Check state changes to verify Alert Key correlation and recovery. + + + + +## Alert Key +--- + +Normal check-state notifications use the trimmed `check_id` (Checkly variable `CHECK_ID`) as the Alert Key. Titles, errors, run locations, response times, result IDs, and alert-state changes do not affect it. + + +If `check_id` is missing or empty, Flashduty accepts the request and generates a random UUID for that notification. These notifications cannot correlate: a later update or recovery without `check_id` cannot find the earlier alert. + + +`ALERT_SSL` is an independent one-shot Warning event. It always receives a new random UUID, even when the payload includes `check_id`, and does not update or recover the Check's normal state alert. + +## Status and severity +--- + +| Checkly `ALERT_TYPE` | Flashduty status | Flashduty severity | +| :--- | :--- | :--- | +| `ALERT_FAILURE`, `ALERT_FAILURE_REMAIN`, `ALERT_DEGRADED_FAILURE` | Active | Critical | +| `ALERT_DEGRADED`, `ALERT_DEGRADED_REMAIN`, `ALERT_FAILURE_DEGRADED` | Active | Warning | +| `ALERT_RECOVERY` | Recovered | Critical | +| `ALERT_DEGRADED_RECOVERY` | Recovered | Warning | +| `ALERT_SSL` | Active, one-shot | Warning | +| `NO_ALERT` | Ignored; no event is created | - | + +An empty or unknown `alert_type` returns an invalid-parameter response. Recovery is determined only by `alert_type`, not by the title or error text. + +## Labels and description +--- + +Flashduty creates these labels: + +- `check` and `source=checkly` +- `check_id` and `checkly_alert_type` +- `check_name`, `check_type`, and `group_name` +- `region` and `run_location` +- `is_reminder` and `reminder_sequence` +- JSON-encoded `tags` + +`check_result_id` is a high-cardinality per-run value and is not stored as a label. The bounded alert description contains the error, response status, response time, start time, and result link. + +## Delivery and troubleshooting +--- + +Checkly retries a failed webhook delivery up to five times at approximately 20-second intervals. Use Checkly's Alert Notification Log to inspect the final delivery result. + +- **Flashduty returns an invalid-parameter error**: verify that Body is valid JSON, matches the complete template, and contains a supported `alert_type` +- **One Check creates multiple alerts**: confirm that every notification carries the same non-empty `check_id` +- **The alert does not recover**: enable Recovery and confirm that the recovery payload has the same `check_id` as the trigger +- **No degradation alert arrives**: enable Degradation and configure a degradation condition on the Check +- **No notification arrives**: confirm that the Check or Check Group subscribes to this Webhook Channel, then inspect the Alert Notification Log + +See [Alerting With Checkly](https://www.checklyhq.com/docs/alerting-and-retries/custom-alerts/) for Checkly's state-transition model. diff --git a/integration-docs/src/doc-map.mjs b/integration-docs/src/doc-map.mjs index 32eb494e..e39ad1ca 100644 --- a/integration-docs/src/doc-map.mjs +++ b/integration-docs/src/doc-map.mjs @@ -66,6 +66,7 @@ export const docMap = { Datadog: `${alertBase}/datadog.mdx`, NewRelic: `${alertBase}/new-relic.mdx`, SumoLogic: `${alertBase}/sumo-logic.mdx`, + Checkly: `${alertBase}/checkly.mdx`, AliyunPrometheus: `${alertBase}/aliyun-prometheus.mdx`, AliyunDataWorksOp: `${alertBase}/aliyun-dataworks-op.mdx`, HttpPull: `${alertBase}/http-pull.mdx`, diff --git a/zh/on-call/integration/alert-integration/alert-sources/checkly.mdx b/zh/on-call/integration/alert-integration/alert-sources/checkly.mdx new file mode 100644 index 00000000..f3c8059b --- /dev/null +++ b/zh/on-call/integration/alert-integration/alert-sources/checkly.mdx @@ -0,0 +1,147 @@ +--- +title: "Checkly 告警集成" +description: "通过 Webhook Alert Channel 将 Checkly 的失败、性能降级、恢复和 SSL 证书告警同步到 Flashduty On-call。" +keywords: ["告警集成", "Checkly", "Webhook", "合成监控", "API 监控"] +--- + +通过 Checkly Webhook Alert Channel 将检查状态同步到 Flashduty On-call。同一个 Check 的失败、降级、持续异常和恢复通知会更新同一条 Flashduty 告警。 + +
+ +## 在 Flashduty On-call +--- + +您可通过以下两种方式获取集成推送地址,任选其一即可。 + +### 使用专属集成 + +1. 进入 Flashduty 控制台,选择 **协作空间**,打开一个协作空间 +2. 选择 **集成数据**,点击 **添加一个集成** +3. 选择 **Checkly**,点击 **保存** +4. 打开生成的集成卡片,复制 **推送地址** + +### 使用共享集成 + +1. 进入 Flashduty 控制台,选择 **集成中心 → 告警事件** +2. 选择 **Checkly**,填写集成名称 +3. 配置默认路由并选择协作空间;创建后可在 **路由** 中增加更多规则 +4. 点击 **保存**,复制生成的 **推送地址** + +
+ +## 在 Checkly 中配置 +--- + + + + +1. 登录 Checkly,进入 **Alert Settings** +2. 点击 **Add more channels**,选择 **Webhook** +3. 名称填写 `Flashduty` +4. Method 选择 `POST` +5. 将 Flashduty 集成的完整推送地址粘贴到 URL +6. 在 Headers 中增加 `Content-Type: application/json` + + + + + +1. 在 **Notification events** 中启用 **Failure**、**Degradation** 和 **Recovery** +2. 如需接收证书到期提醒,再启用 **SSL certificate expirations** +3. 在订阅范围中选择需要发送到 Flashduty 的 Checks 或 Check Groups + +必须启用 Recovery,否则 Checkly 恢复后,Flashduty 中的原告警不会自动恢复。 + + + + + +将 Body 替换为以下完整 JSON 模板: + +```json +{ + "alert_type": "{{ALERT_TYPE}}", + "alert_title": "{{ALERT_TITLE}}", + "check_id": "{{CHECK_ID}}", + "check_result_id": "{{CHECK_RESULT_ID}}", + "check_name": "{{CHECK_NAME}}", + "check_type": "{{CHECK_TYPE}}", + "group_name": "{{GROUP_NAME}}", + "is_reminder": "{{IS_REMINDER}}", + "reminder_sequence": "{{REMINDER_SEQUENCE}}", + "region": "{{REGION}}", + "run_location": "{{RUN_LOCATION}}", + "started_at": "{{STARTED_AT}}", + "response_time": "{{RESPONSE_TIME}}", + "response_status_code": "{{API_CHECK_RESPONSE_STATUS_CODE}}", + "response_status_text": "{{API_CHECK_RESPONSE_STATUS_TEXT}}", + "result_link": "{{RESULT_LINK}}", + "error_message": "{{CHECK_ERROR_MESSAGE}}", + "tags": [{{#each TAGS}}"{{this}}"{{#unless @last}},{{/unless}}{{/each}}] +} +``` + +请保留 `alert_type` 和 `check_id`。不要在 Payload 中加入 API Key、Token、密码、Cookie 或其他敏感信息。 + + + + + +让一个已订阅的 Check 依次进入失败、降级和恢复状态,确认 Flashduty 中同一条告警依次触发、更新并恢复。 + +Checkly 的测试发送或 Webhook HTTP 200 只能证明地址可达,不能证明 Alert Key 关联和恢复行为。请使用真实 Check 状态变化完成验证。 + + + + +## Alert Key +--- + +普通检查状态通知使用去除首尾空格后的 `check_id`(Checkly 变量 `CHECK_ID`)作为 Alert Key。标题、错误、执行区域、响应时间、结果 ID 和告警状态变化都不会改变 Alert Key。 + + +当 `check_id` 缺失或为空时,Flashduty 不会拒绝请求,而是为本次通知生成随机 UUID。此时不同通知无法关联:后续更新或恢复不能命中之前同样缺少 `check_id` 的告警。 + + +`ALERT_SSL` 是独立的单次 Warning 事件,即使 Payload 中有 `check_id`,也会使用新的随机 UUID。它不会更新或恢复该 Check 的普通状态告警。 + +## 状态和告警等级 +--- + +| Checkly `ALERT_TYPE` | Flashduty 状态 | Flashduty 等级 | +| :--- | :--- | :--- | +| `ALERT_FAILURE`、`ALERT_FAILURE_REMAIN`、`ALERT_DEGRADED_FAILURE` | 活动 | Critical | +| `ALERT_DEGRADED`、`ALERT_DEGRADED_REMAIN`、`ALERT_FAILURE_DEGRADED` | 活动 | Warning | +| `ALERT_RECOVERY` | 恢复 | Critical | +| `ALERT_DEGRADED_RECOVERY` | 恢复 | Warning | +| `ALERT_SSL` | 活动、单次事件 | Warning | +| `NO_ALERT` | 忽略,不创建事件 | - | + +空值或未知的 `alert_type` 会返回参数错误。恢复只根据 `alert_type` 判断,与标题或错误文本无关。 + +## 标签和描述 +--- + +Flashduty 会生成以下标签: + +- `check`、`source=checkly` +- `check_id`、`checkly_alert_type` +- `check_name`、`check_type`、`group_name` +- `region`、`run_location` +- `is_reminder`、`reminder_sequence` +- JSON 编码后的 `tags` + +`check_result_id` 是每次执行产生的高基数字段,不会写入标签。错误信息、响应状态、响应时间、开始时间和结果链接会进入有长度限制的告警描述。 + +## 投递和排查 +--- + +Checkly 对失败的 Webhook 投递最多重试 5 次,每次间隔约 20 秒。可在 Checkly 的 Alert Notification Log 中查看最终投递结果。 + +- **Flashduty 返回参数错误**:确认 Body 是有效 JSON,并使用上面的完整模板;检查 `alert_type` 是否为支持值 +- **同一个 Check 产生多条告警**:确认每次通知都带有相同且非空的 `check_id` +- **告警没有恢复**:确认 Notification events 已启用 Recovery,且恢复 Payload 的 `check_id` 与触发时一致 +- **没有降级告警**:确认已启用 Degradation,并为 Check 配置了降级条件 +- **没有收到通知**:确认目标 Check 或 Check Group 已订阅该 Webhook Channel,并在 Alert Notification Log 中检查投递状态 + +Checkly 的状态转换说明请参阅 [Alerting With Checkly](https://www.checklyhq.com/docs/alerting-and-retries/custom-alerts/)。 From a6db6044815f1774a529006cb144225327f67bcc Mon Sep 17 00:00:00 2001 From: debidong <1953531014@qq.com> Date: Wed, 23 Sep 2026 16:07:52 +0800 Subject: [PATCH 2/2] docs(api): add AI SRE assignee fields to the work-item OpenAPI spec Create and reset take assignees ({type, id?}) beside the legacy assignee_ids alias. List can filter with assignee_type. Work item responses include structured assignees and the AI session id and venue. --- api-reference/openapi.en.json | 184 ++++++++++++++++++++++++++++++++-- api-reference/openapi.zh.json | 184 ++++++++++++++++++++++++++++++++-- 2 files changed, 352 insertions(+), 16 deletions(-) diff --git a/api-reference/openapi.en.json b/api-reference/openapi.en.json index 9ea6dd53..36e2edaf 100644 --- a/api-reference/openapi.en.json +++ b/api-reference/openapi.en.json @@ -6592,13 +6592,21 @@ "description": "Parameters for creating an incident work item.", "properties": { "assignee_ids": { - "description": "Initial assignee member IDs. Assignees must be active members who can already read the anchor; assignment never grants access.", + "description": "Legacy alias for the initial assignees. Equivalent to `assignees` with every entry `type` `person`. Mutually exclusive with `assignees`: sending both returns an error. Assignees must be active members who can already read the anchor; assignment never grants access.", "items": { "format": "int64", "type": "integer" }, "type": "array" }, + "assignees": { + "description": "Initial assignees. Each entry is `{type, id?}`. `type` is `person` or `ai_sre`; an `ai_sre` entry omits `id`. Mutually exclusive with `assignee_ids`: sending both returns an error. `assignee_ids` is the legacy alias and is equivalent to an all-`person` list. At most 20 entries. Person assignees must be active members who can already read the anchor; assignment never grants access.", + "items": { + "$ref": "#/components/schemas/WorkItemAssignee" + }, + "maxItems": 20, + "type": "array" + }, "description": { "description": "Optional longer description (max 65,535 characters).", "maxLength": 65535, @@ -14456,13 +14464,21 @@ "type": "object" }, "ListWorkItemRequest": { - "description": "Filters for listing work items. At least one of `incident_id`, `post_mortem_id`, or `assignee_id` is required.", + "description": "Filters for listing work items. At least one of `incident_id`, `post_mortem_id`, `assignee_id`, or `assignee_type` = `ai_sre` is required.", "properties": { "assignee_id": { - "description": "Restrict results to items assigned to this member ID. Listing by assignee alone requires being that assignee or an account admin.", + "description": "Restrict results to items assigned to this member ID. Listing by assignee alone requires being that assignee or an account admin. Ignored when `assignee_type` is `ai_sre`.", "format": "int64", "type": "integer" }, + "assignee_type": { + "description": "Filter by assignee type: `person` or `ai_sre`. `ai_sre` returns items assigned to AI SRE (an AI caller uses this to list its own tasks) and does not require `assignee_id`. `person` together with `assignee_id` restricts results to that member. Omitted with a positive `assignee_id` means `person`.", + "enum": [ + "person", + "ai_sre" + ], + "type": "string" + }, "cursor": { "description": "Pagination cursor from a previous response's `next_cursor`.", "type": "string" @@ -18130,13 +18146,21 @@ "description": "Full replacement of a work item's assignee set.", "properties": { "assignee_ids": { - "description": "New assignee member IDs, replacing the current set. An empty array clears all assignees.", + "description": "Legacy alias for the replacement assignee set. Equivalent to `assignees` with every entry `type` `person`. Mutually exclusive with `assignees`: sending both returns an error. An empty array clears all assignees.", "items": { "format": "int64", "type": "integer" }, "type": "array" }, + "assignees": { + "description": "Replacement assignee set. Each entry is `{type, id?}`. `type` is `person` or `ai_sre`; an `ai_sre` entry omits `id`. Mutually exclusive with `assignee_ids`: sending both returns an error. `assignee_ids` is the legacy alias and is equivalent to an all-`person` list. At most 20 entries. An empty array clears all assignees.", + "items": { + "$ref": "#/components/schemas/WorkItemAssignee" + }, + "maxItems": 20, + "type": "array" + }, "version": { "description": "Current item version for optimistic locking. Must match the stored version.", "format": "int64", @@ -28429,6 +28453,28 @@ ], "type": "object" }, + "WorkItemAssignee": { + "description": "One assignee on a work item.", + "properties": { + "id": { + "description": "Member ID. Required when `type` is `person`. Omitted when `type` is `ai_sre`.", + "format": "int64", + "type": "integer" + }, + "type": { + "description": "Assignee kind: `person` (a member) or `ai_sre` (the account AI SRE).", + "enum": [ + "person", + "ai_sre" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, "WorkItemCreateResult": { "description": "Result of creating a work item.", "properties": { @@ -28456,14 +28502,33 @@ "WorkItemItem": { "description": "A structured incident work item (action or post-mortem follow-up) with its assignees.", "properties": { + "agent_session_id": { + "description": "ID of the AI SRE session executing this item. Omitted when no session is recorded.", + "type": "string" + }, + "agent_session_venue": { + "description": "Where that AI SRE session runs: `web` or `im`. Omitted when no session is recorded.", + "enum": [ + "web", + "im" + ], + "type": "string" + }, "assignee_ids": { - "description": "Member IDs of the current assignees. Never null; an empty array means unassigned.", + "description": "Member IDs of the current person assignees. AI SRE is not included. Never null; an empty array means no person assignee.", "items": { "format": "int64", "type": "integer" }, "type": "array" }, + "assignees": { + "description": "Current assignees. Each entry is `{type, id?}`. `type` is `person` or `ai_sre`; an `ai_sre` entry omits `id`. Never null; an empty array means unassigned. `assignee_ids` is the person-only subset of this list.", + "items": { + "$ref": "#/components/schemas/WorkItemAssignee" + }, + "type": "array" + }, "converted_at_seconds": { "description": "Conversion time as a Unix timestamp in seconds. Present only after conversion.", "format": "int64", @@ -28563,6 +28628,7 @@ "source_kind", "version", "assignee_ids", + "assignees", "created_by", "updated_by", "created_at_seconds", @@ -40265,6 +40331,20 @@ 4756301322131, 5068740052131 ], + "assignees": [ + { + "id": 3790925372131, + "type": "person" + }, + { + "id": 4756301322131, + "type": "person" + }, + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495329, "created_by": 5329873302131, "incident_id": "6a5f1e28807515413b384bce", @@ -40321,7 +40401,7 @@ "On-call/Incidents" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- Requires the On-call Pro license.\n- Full replacement of the assignee set — an empty array clears all assignees.\n- Only newly added assignees are notified; removals never notify.\n- Audited — changes are recorded in the audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- Requires the On-call Pro license.\n- Full replacement of the assignee set — an empty array clears all assignees.\n- Set either `assignees` or the legacy `assignee_ids`, not both (sending both returns an error). An `ai_sre` entry omits `id`.\n- Only newly added assignees are notified; removals never notify.\n- Audited — changes are recorded in the audit log.", "href": "/en/api-reference/on-call/incidents/incident-work-item-reset-assignees", "metadata": { "sidebarTitle": "Reset work item assignees" @@ -40361,6 +40441,20 @@ 4756301322131, 5068740052131 ], + "assignees": [ + { + "id": 3790925372131, + "type": "person" + }, + { + "id": 4756301322131, + "type": "person" + }, + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495329, "created_by": 5329873302131, "incident_id": "6a5f1e28807515413b384bce", @@ -40454,6 +40548,20 @@ 4756301322131, 5068740052131 ], + "assignees": [ + { + "id": 3790925372131, + "type": "person" + }, + { + "id": 4756301322131, + "type": "person" + }, + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495329, "created_by": 5329873302131, "incident_id": "6a5f1e28807515413b384bce", @@ -40554,6 +40662,12 @@ "assignee_ids": [ 3790925372131 ], + "assignees": [ + { + "id": 3790925372131, + "type": "person" + } + ], "created_at_seconds": 1785496400, "created_by": 3790925372131, "incident_id": "6a5f1e28807515413b384bce", @@ -40606,7 +40720,7 @@ "On-call/Incidents" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- Requires the On-call Pro license.\n- An `action` anchors to an active incident and must NOT set `post_mortem_id`; a `follow_up` REQUIRES the `post_mortem_id` of a post-mortem linked to `incident_id`.\n- Assignees must be active members who can already read the anchor incident or post-mortem — assignment never grants access.\n- Newly added assignees are notified.\n- Retrying with the same (`creator`, `idempotency_key`) replays the original item with `idempotent_replay: true` instead of creating a duplicate.\n- Audited — changes are recorded in the audit log.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Manage** (`on-call`) |\n\n## Usage\n\n- Requires the On-call Pro license.\n- An `action` anchors to an active incident and must NOT set `post_mortem_id`; a `follow_up` REQUIRES the `post_mortem_id` of a post-mortem linked to `incident_id`.\n- Set either `assignees` or the legacy `assignee_ids`, not both. `assignees` entries are `{type, id?}` with `type` `person` or `ai_sre`; an `ai_sre` entry omits `id`. `assignee_ids` is equivalent to an all-`person` list. Sending both returns an error.\n- Person assignees must be active members who can already read the anchor incident or post-mortem — assignment never grants access.\n- Newly added assignees are notified.\n- Retrying with the same (`creator`, `idempotency_key`) replays the original item with `idempotent_replay: true` instead of creating a duplicate.\n- Audited — changes are recorded in the audit log.", "href": "/en/api-reference/on-call/incidents/incident-work-item-create", "metadata": { "sidebarTitle": "Create a work item" @@ -40717,6 +40831,20 @@ 4756301322131, 5068740052131 ], + "assignees": [ + { + "id": 3790925372131, + "type": "person" + }, + { + "id": 4756301322131, + "type": "person" + }, + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495329, "created_by": 5329873302131, "incident_id": "6a5f1e28807515413b384bce", @@ -40734,6 +40862,12 @@ "assignee_ids": [ 5068740052131 ], + "assignees": [ + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495164, "created_by": 3790925372131, "incident_id": "6a5f1e28807515413b384bce", @@ -40789,7 +40923,7 @@ "On-call/Incidents" ], "x-mint": { - "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Read** (`on-call`) |\n\n## Usage\n\n- At least one of `incident_id`, `post_mortem_id`, or `assignee_id` is required.\n- Cursor pagination sorted by `updated_at_seconds` descending — pass the previous response's `next_cursor` as `cursor` until `has_more` is false.\n- Listing by `incident_id` also includes follow-ups anchored on the incident's post-mortem.\n- Listing by `assignee_id` alone requires being that assignee or an account admin.", + "content": "## Restrictions\n\n| Aspect | Value |\n| ------ | ----- |\n| Rate limits | **1,000 requests/minute**; **50 requests/second** per account |\n| Permissions | **Incidents Read** (`on-call`) |\n\n## Usage\n\n- At least one of `incident_id`, `post_mortem_id`, `assignee_id`, or `assignee_type` = `ai_sre` is required.\n- `assignee_type` = `ai_sre` lists items assigned to AI SRE and can be used on its own.\n- Cursor pagination sorted by `updated_at_seconds` descending — pass the previous response's `next_cursor` as `cursor` until `has_more` is false.\n- Listing by `incident_id` also includes follow-ups anchored on the incident's post-mortem.\n- Listing by `assignee_id` alone requires being that assignee or an account admin.", "href": "/en/api-reference/on-call/incidents/incident-work-item-list", "metadata": { "sidebarTitle": "List work items" @@ -40830,6 +40964,20 @@ 4756301322131, 5068740052131 ], + "assignees": [ + { + "id": 3790925372131, + "type": "person" + }, + { + "id": 4756301322131, + "type": "person" + }, + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495329, "created_by": 5329873302131, "incident_id": "6a5f1e28807515413b384bce", @@ -40847,6 +40995,12 @@ "assignee_ids": [ 5068740052131 ], + "assignees": [ + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495164, "created_by": 3790925372131, "incident_id": "6a5f1e28807515413b384bce", @@ -40941,6 +41095,20 @@ 4756301322131, 5068740052131 ], + "assignees": [ + { + "id": 3790925372131, + "type": "person" + }, + { + "id": 4756301322131, + "type": "person" + }, + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495329, "created_by": 5329873302131, "incident_id": "6a5f1e28807515413b384bce", diff --git a/api-reference/openapi.zh.json b/api-reference/openapi.zh.json index 0f9564bb..25cbdfae 100644 --- a/api-reference/openapi.zh.json +++ b/api-reference/openapi.zh.json @@ -6592,13 +6592,21 @@ "description": "创建故障跟进事项的参数。", "properties": { "assignee_ids": { - "description": "初始负责人成员 ID 列表。负责人须为已能查看锚定对象的活跃成员;指派不会授予访问权限。", + "description": "初始负责人的旧版别名,等价于全部为 `person` 的 `assignees`。与 `assignees` 互斥,同时出现会报错。负责人须为已能查看锚定对象的活跃成员;指派不会授予访问权限。", "items": { "format": "int64", "type": "integer" }, "type": "array" }, + "assignees": { + "description": "初始负责人列表。每项为 `{type, id?}`。`type` 取 `person` 或 `ai_sre`;`ai_sre` 不带 `id`。与 `assignee_ids` 互斥,同时出现会报错。`assignee_ids` 是旧版别名,等价于全部为 `person`。最多 20 项。`person` 须为已能查看锚定对象的活跃成员;指派不会授予访问权限。", + "items": { + "$ref": "#/components/schemas/WorkItemAssignee" + }, + "maxItems": 20, + "type": "array" + }, "description": { "description": "可选的详细描述(最长 65,535 字符)。", "maxLength": 65535, @@ -14456,13 +14464,21 @@ "type": "object" }, "ListWorkItemRequest": { - "description": "查询跟进事项的过滤条件。`incident_id`、`post_mortem_id`、`assignee_id` 至少提供一个。", + "description": "查询跟进事项的过滤条件。`incident_id`、`post_mortem_id`、`assignee_id`,或 `assignee_type` 为 `ai_sre`,至少满足一个。", "properties": { "assignee_id": { - "description": "按负责人成员 ID 过滤结果。仅按负责人查询时,须为本人或账户管理员。", + "description": "按负责人成员 ID 过滤结果。仅按负责人查询时,须为本人或账户管理员。`assignee_type` 为 `ai_sre` 时忽略本字段。", "format": "int64", "type": "integer" }, + "assignee_type": { + "description": "按负责人类型过滤:`person` 或 `ai_sre`。`ai_sre` 返回指派给 AI SRE 的事项(AI 用它查询自己的任务),不需要 `assignee_id`。`person` 与 `assignee_id` 一起使用时,只返回该成员负责的事项。省略本字段且 `assignee_id` 为正数时,按 `person` 过滤。", + "enum": [ + "person", + "ai_sre" + ], + "type": "string" + }, "cursor": { "description": "分页游标,取自上一次响应的 `next_cursor`。", "type": "string" @@ -18130,13 +18146,21 @@ "description": "整体替换跟进事项的负责人集合。", "properties": { "assignee_ids": { - "description": "新的负责人成员 ID 列表,整体替换当前集合。空数组表示清空所有负责人。", + "description": "替换后负责人集合的旧版别名,等价于全部为 `person` 的 `assignees`。与 `assignees` 互斥,同时出现会报错。空数组表示清空所有负责人。", "items": { "format": "int64", "type": "integer" }, "type": "array" }, + "assignees": { + "description": "替换后的负责人集合。每项为 `{type, id?}`。`type` 取 `person` 或 `ai_sre`;`ai_sre` 不带 `id`。与 `assignee_ids` 互斥,同时出现会报错。`assignee_ids` 是旧版别名,等价于全部为 `person`。最多 20 项。空数组表示清空所有负责人。", + "items": { + "$ref": "#/components/schemas/WorkItemAssignee" + }, + "maxItems": 20, + "type": "array" + }, "version": { "description": "事项当前版本号,用于乐观锁。必须与存储的版本一致。", "format": "int64", @@ -28429,6 +28453,28 @@ ], "type": "object" }, + "WorkItemAssignee": { + "description": "跟进事项的一名负责人。", + "properties": { + "id": { + "description": "成员 ID。`type` 为 `person` 时必填;`type` 为 `ai_sre` 时省略。", + "format": "int64", + "type": "integer" + }, + "type": { + "description": "负责人类型:`person` 为成员,`ai_sre` 为账户的 AI SRE。", + "enum": [ + "person", + "ai_sre" + ], + "type": "string" + } + }, + "required": [ + "type" + ], + "type": "object" + }, "WorkItemCreateResult": { "description": "创建跟进事项的结果。", "properties": { @@ -28456,14 +28502,33 @@ "WorkItemItem": { "description": "结构化的故障跟进事项(行动项或复盘后续行动)及其负责人。", "properties": { + "agent_session_id": { + "description": "执行该事项的 AI SRE 会话 ID。没有会话时省略。", + "type": "string" + }, + "agent_session_venue": { + "description": "该 AI SRE 会话所在位置:`web` 或 `im`。没有会话时省略。", + "enum": [ + "web", + "im" + ], + "type": "string" + }, "assignee_ids": { - "description": "当前负责人的成员 ID 列表。不会为 null;空数组表示未指派。", + "description": "当前人员负责人的成员 ID。不含 AI SRE。不会为 null;空数组表示没有人员负责人。", "items": { "format": "int64", "type": "integer" }, "type": "array" }, + "assignees": { + "description": "当前负责人。每项为 `{type, id?}`。`type` 取 `person` 或 `ai_sre`;`ai_sre` 不带 `id`。不会为 null;空数组表示未指派。`assignee_ids` 是其中仅含 `person` 的子集。", + "items": { + "$ref": "#/components/schemas/WorkItemAssignee" + }, + "type": "array" + }, "converted_at_seconds": { "description": "转化时间,Unix 秒级时间戳。仅转化后返回。", "format": "int64", @@ -28563,6 +28628,7 @@ "source_kind", "version", "assignee_ids", + "assignees", "created_by", "updated_by", "created_at_seconds", @@ -40265,6 +40331,20 @@ 4756301322131, 5068740052131 ], + "assignees": [ + { + "id": 3790925372131, + "type": "person" + }, + { + "id": 4756301322131, + "type": "person" + }, + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495329, "created_by": 5329873302131, "incident_id": "6a5f1e28807515413b384bce", @@ -40321,7 +40401,7 @@ "On-call/故障管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **故障管理**(`on-call`) |\n\n## 使用说明\n\n- 需要 On-call Pro 许可。\n- 整体替换负责人集合 —— 空数组表示清空所有负责人。\n- 仅新添加的负责人会收到通知;移除不通知。\n- 已审计 —— 变更会记录到审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **故障管理**(`on-call`) |\n\n## 使用说明\n\n- 需要 On-call Pro 许可。\n- 整体替换负责人集合 —— 空数组表示清空所有负责人。\n- 使用 `assignees` 或旧版 `assignee_ids`。两者同时出现会报错。`ai_sre` 条目不带 `id`。\n- 仅新添加的负责人会收到通知;移除不通知。\n- 已审计 —— 变更会记录到审计日志。", "href": "/zh/api-reference/on-call/incidents/incident-work-item-reset-assignees", "metadata": { "sidebarTitle": "重置跟进事项负责人" @@ -40361,6 +40441,20 @@ 4756301322131, 5068740052131 ], + "assignees": [ + { + "id": 3790925372131, + "type": "person" + }, + { + "id": 4756301322131, + "type": "person" + }, + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495329, "created_by": 5329873302131, "incident_id": "6a5f1e28807515413b384bce", @@ -40454,6 +40548,20 @@ 4756301322131, 5068740052131 ], + "assignees": [ + { + "id": 3790925372131, + "type": "person" + }, + { + "id": 4756301322131, + "type": "person" + }, + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495329, "created_by": 5329873302131, "incident_id": "6a5f1e28807515413b384bce", @@ -40554,6 +40662,12 @@ "assignee_ids": [ 3790925372131 ], + "assignees": [ + { + "id": 3790925372131, + "type": "person" + } + ], "created_at_seconds": 1785496400, "created_by": 3790925372131, "incident_id": "6a5f1e28807515413b384bce", @@ -40606,7 +40720,7 @@ "On-call/故障管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **故障管理**(`on-call`) |\n\n## 使用说明\n\n- 需要 On-call Pro 许可。\n- `action` 锚定活动故障,且不得设置 `post_mortem_id`;`follow_up` 必须设置为关联到 `incident_id` 的故障复盘 ID。\n- 负责人须为已能查看锚定故障或复盘的活跃成员 —— 指派不会授予访问权限。\n- 新添加的负责人会收到通知。\n- 以相同的(`creator`、`idempotency_key`)重试时,返回原事项并标记 `idempotent_replay: true`,不会创建重复事项。\n- 已审计 —— 变更会记录到审计日志。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **故障管理**(`on-call`) |\n\n## 使用说明\n\n- 需要 On-call Pro 许可。\n- `action` 锚定活动故障,且不得设置 `post_mortem_id`;`follow_up` 必须设置为关联到 `incident_id` 的故障复盘 ID。\n- 使用 `assignees`(`person` 带 `id`,或 `ai_sre` 不带 `id`),或使用旧版 `assignee_ids`(全部为 `person`)。两者同时出现会报错。\n- 人员负责人须为已能查看锚定故障或复盘的活跃成员 —— 指派不会授予访问权限。\n- 新添加的负责人会收到通知。\n- 以相同的(`creator`、`idempotency_key`)重试时,返回原事项并标记 `idempotent_replay: true`,不会创建重复事项。\n- 已审计 —— 变更会记录到审计日志。", "href": "/zh/api-reference/on-call/incidents/incident-work-item-create", "metadata": { "sidebarTitle": "创建跟进事项" @@ -40717,6 +40831,20 @@ 4756301322131, 5068740052131 ], + "assignees": [ + { + "id": 3790925372131, + "type": "person" + }, + { + "id": 4756301322131, + "type": "person" + }, + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495329, "created_by": 5329873302131, "incident_id": "6a5f1e28807515413b384bce", @@ -40734,6 +40862,12 @@ "assignee_ids": [ 5068740052131 ], + "assignees": [ + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495164, "created_by": 3790925372131, "incident_id": "6a5f1e28807515413b384bce", @@ -40789,7 +40923,7 @@ "On-call/故障管理" ], "x-mint": { - "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **故障查看**(`on-call`) |\n\n## 使用说明\n\n- `incident_id`、`post_mortem_id`、`assignee_id` 至少提供一个。\n- 按 `updated_at_seconds` 倒序的游标分页 —— 将上一次响应的 `next_cursor` 作为 `cursor` 传入,直到 `has_more` 为 false。\n- 按 `incident_id` 查询时,同时包含锚定在该故障复盘上的后续行动。\n- 仅按 `assignee_id` 查询时,须为本人或账户管理员。", + "content": "## 限制说明\n\n| 项目 | 说明 |\n| ---- | ---- |\n| 速率限制 | 每个账户 **1,000 次/分钟**;**50 次/秒** |\n| 权限要求 | **故障查看**(`on-call`) |\n\n## 使用说明\n\n- `incident_id`、`post_mortem_id`、`assignee_id`,或 `assignee_type` 为 `ai_sre`,至少满足一个。\n- `assignee_type` 为 `ai_sre` 时返回指派给 AI SRE 的事项,可单独作为查询条件。\n- 按 `updated_at_seconds` 倒序的游标分页 —— 将上一次响应的 `next_cursor` 作为 `cursor` 传入,直到 `has_more` 为 false。\n- 按 `incident_id` 查询时,同时包含锚定在该故障复盘上的后续行动。\n- 仅按 `assignee_id` 查询时,须为本人或账户管理员。", "href": "/zh/api-reference/on-call/incidents/incident-work-item-list", "metadata": { "sidebarTitle": "查询跟进事项列表" @@ -40830,6 +40964,20 @@ 4756301322131, 5068740052131 ], + "assignees": [ + { + "id": 3790925372131, + "type": "person" + }, + { + "id": 4756301322131, + "type": "person" + }, + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495329, "created_by": 5329873302131, "incident_id": "6a5f1e28807515413b384bce", @@ -40847,6 +40995,12 @@ "assignee_ids": [ 5068740052131 ], + "assignees": [ + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495164, "created_by": 3790925372131, "incident_id": "6a5f1e28807515413b384bce", @@ -40941,6 +41095,20 @@ 4756301322131, 5068740052131 ], + "assignees": [ + { + "id": 3790925372131, + "type": "person" + }, + { + "id": 4756301322131, + "type": "person" + }, + { + "id": 5068740052131, + "type": "person" + } + ], "created_at_seconds": 1785495329, "created_by": 5329873302131, "incident_id": "6a5f1e28807515413b384bce",