diff --git a/api-reference/monitors.openapi.en.json b/api-reference/monitors.openapi.en.json index 220226fe..2afd5a4d 100644 --- a/api-reference/monitors.openapi.en.json +++ b/api-reference/monitors.openapi.en.json @@ -5839,7 +5839,7 @@ } }, "TooManyRequests": { - "description": "Rate limit hit (per-account limit or the operation's platform-wide limit). Wait for the number of seconds in `Flashcat-Request-Rate-Limit-Delay`, then retry.", + "description": "Rate limit hit. Wait for the number of seconds in `Flashcat-Request-Rate-Limit-Delay`, then retry.", "content": { "application/json": { "schema": { diff --git a/api-reference/monitors.openapi.zh.json b/api-reference/monitors.openapi.zh.json index 50dac916..9abf26a4 100644 --- a/api-reference/monitors.openapi.zh.json +++ b/api-reference/monitors.openapi.zh.json @@ -5839,7 +5839,7 @@ } }, "TooManyRequests": { - "description": "触发频率限制(账户级限制或该接口的平台级上限)。请等待响应头 `Flashcat-Request-Rate-Limit-Delay` 给出的秒数后重试。", + "description": "触发频率限制。请等待响应头 `Flashcat-Request-Rate-Limit-Delay` 给出的秒数后重试。", "content": { "application/json": { "schema": { diff --git a/api-reference/on-call.openapi.en.json b/api-reference/on-call.openapi.en.json index 50ec5cb3..508b0b9c 100644 --- a/api-reference/on-call.openapi.en.json +++ b/api-reference/on-call.openapi.en.json @@ -19112,7 +19112,7 @@ } }, "TooManyRequests": { - "description": "Rate limit hit (per-account limit or the operation's platform-wide limit). Wait for the number of seconds in `Flashcat-Request-Rate-Limit-Delay`, then retry.", + "description": "Rate limit hit. Wait for the number of seconds in `Flashcat-Request-Rate-Limit-Delay`, then retry.", "content": { "application/json": { "schema": { diff --git a/api-reference/on-call.openapi.zh.json b/api-reference/on-call.openapi.zh.json index d9db047a..6948e64e 100644 --- a/api-reference/on-call.openapi.zh.json +++ b/api-reference/on-call.openapi.zh.json @@ -19112,7 +19112,7 @@ } }, "TooManyRequests": { - "description": "触发频率限制(账户级限制或该接口的平台级上限)。请等待响应头 `Flashcat-Request-Rate-Limit-Delay` 给出的秒数后重试。", + "description": "触发频率限制。请等待响应头 `Flashcat-Request-Rate-Limit-Delay` 给出的秒数后重试。", "content": { "application/json": { "schema": { diff --git a/api-reference/openapi.en.json b/api-reference/openapi.en.json index b60f13af..355ada1e 100644 --- a/api-reference/openapi.en.json +++ b/api-reference/openapi.en.json @@ -107,7 +107,7 @@ "description": "The service is temporarily unavailable. Include the request_id when reporting." }, "TooManyRequests": { - "description": "Rate limit hit (per-account limit or the operation's platform-wide limit). Wait for the number of seconds in `Flashcat-Request-Rate-Limit-Delay`, then retry.", + "description": "Rate limit hit. Wait for the number of seconds in `Flashcat-Request-Rate-Limit-Delay`, then retry.", "content": { "application/json": { "schema": { diff --git a/api-reference/openapi.zh.json b/api-reference/openapi.zh.json index 24bc1fee..5d1f7526 100644 --- a/api-reference/openapi.zh.json +++ b/api-reference/openapi.zh.json @@ -107,7 +107,7 @@ "description": "服务暂时不可用。反馈问题时请附带 request_id。" }, "TooManyRequests": { - "description": "触发频率限制(账户级限制或该接口的平台级上限)。请等待响应头 `Flashcat-Request-Rate-Limit-Delay` 给出的秒数后重试。", + "description": "触发频率限制。请等待响应头 `Flashcat-Request-Rate-Limit-Delay` 给出的秒数后重试。", "content": { "application/json": { "schema": { diff --git a/api-reference/platform.openapi.en.json b/api-reference/platform.openapi.en.json index 9108a8b5..50882774 100644 --- a/api-reference/platform.openapi.en.json +++ b/api-reference/platform.openapi.en.json @@ -2601,7 +2601,7 @@ } }, "TooManyRequests": { - "description": "Rate limit hit (per-account limit or the operation's platform-wide limit). Wait for the number of seconds in `Flashcat-Request-Rate-Limit-Delay`, then retry.", + "description": "Rate limit hit. Wait for the number of seconds in `Flashcat-Request-Rate-Limit-Delay`, then retry.", "content": { "application/json": { "schema": { diff --git a/api-reference/platform.openapi.zh.json b/api-reference/platform.openapi.zh.json index fa4e8aa6..f85e4b88 100644 --- a/api-reference/platform.openapi.zh.json +++ b/api-reference/platform.openapi.zh.json @@ -2601,7 +2601,7 @@ } }, "TooManyRequests": { - "description": "触发频率限制(账户级限制或该接口的平台级上限)。请等待响应头 `Flashcat-Request-Rate-Limit-Delay` 给出的秒数后重试。", + "description": "触发频率限制。请等待响应头 `Flashcat-Request-Rate-Limit-Delay` 给出的秒数后重试。", "content": { "application/json": { "schema": { diff --git a/api-reference/rum.openapi.en.json b/api-reference/rum.openapi.en.json index ff0a3334..db596a30 100644 --- a/api-reference/rum.openapi.en.json +++ b/api-reference/rum.openapi.en.json @@ -104,7 +104,7 @@ } } }, - "description": "Rate limit hit (per-account limit or the operation's platform-wide limit). Wait for the number of seconds in `Flashcat-Request-Rate-Limit-Delay`, then retry.", + "description": "Rate limit hit. Wait for the number of seconds in `Flashcat-Request-Rate-Limit-Delay`, then retry.", "headers": { "Flashcat-Request-Rate-Limit-Delay": { "description": "Seconds until the current rate-limit window resets. Absent when the request was rejected by the gateway's global protection limit.", diff --git a/api-reference/rum.openapi.zh.json b/api-reference/rum.openapi.zh.json index 0a5e8514..2550aae9 100644 --- a/api-reference/rum.openapi.zh.json +++ b/api-reference/rum.openapi.zh.json @@ -104,7 +104,7 @@ } } }, - "description": "触发频率限制(账户级限制或该接口的平台级上限)。请等待响应头 `Flashcat-Request-Rate-Limit-Delay` 给出的秒数后重试。", + "description": "触发频率限制。请等待响应头 `Flashcat-Request-Rate-Limit-Delay` 给出的秒数后重试。", "headers": { "Flashcat-Request-Rate-Limit-Delay": { "description": "距当前限流窗口重置的秒数。请求被网关全局保护限流拒绝时不返回该响应头。", diff --git a/api-reference/safari.openapi.en.json b/api-reference/safari.openapi.en.json index 65024dc5..753ffeb0 100644 --- a/api-reference/safari.openapi.en.json +++ b/api-reference/safari.openapi.en.json @@ -5207,7 +5207,7 @@ } }, "TooManyRequests": { - "description": "Rate limit hit (per-account limit or the operation's platform-wide limit). Wait for the number of seconds in `Flashcat-Request-Rate-Limit-Delay`, then retry.", + "description": "Rate limit hit. Wait for the number of seconds in `Flashcat-Request-Rate-Limit-Delay`, then retry.", "content": { "application/json": { "schema": { diff --git a/api-reference/safari.openapi.zh.json b/api-reference/safari.openapi.zh.json index 2c2f283c..3d86b043 100644 --- a/api-reference/safari.openapi.zh.json +++ b/api-reference/safari.openapi.zh.json @@ -5207,7 +5207,7 @@ } }, "TooManyRequests": { - "description": "触发频率限制(账户级限制或该接口的平台级上限)。请等待响应头 `Flashcat-Request-Rate-Limit-Delay` 给出的秒数后重试。", + "description": "触发频率限制。请等待响应头 `Flashcat-Request-Rate-Limit-Delay` 给出的秒数后重试。", "content": { "application/json": { "schema": { diff --git a/docs.json b/docs.json index 9a8375d4..079bf224 100644 --- a/docs.json +++ b/docs.json @@ -3010,6 +3010,14 @@ { "source": "/webhook/history/list", "destination": "/zh/api-reference/on-call/integrations/webhook-history-list" + }, + { + "source": "/zh/rum/error-tracking/erro-reporting/web", + "destination": "/zh/rum/error-tracking/error-reporting/web" + }, + { + "source": "/en/rum/error-tracking/erro-reporting/web", + "destination": "/en/rum/error-tracking/error-reporting/web" } ], "navigation": { diff --git a/en/ai-sre/agents.mdx b/en/ai-sre/agents.mdx index ef88b567..ec824a4c 100644 --- a/en/ai-sre/agents.mdx +++ b/en/ai-sre/agents.mdx @@ -154,9 +154,19 @@ OAuth 2.1 appears only on the **member authorization** axis. The service authori -Saved sensitive fields (such as tokens, API keys and client secrets) are shown **masked**. Leaving one blank when editing keeps the current value rather than clearing it. +Saved sensitive fields (such as tokens, API keys, and client secrets) are shown as a fixed `****` mask that reveals neither the first nor the last characters. Saving the mask unchanged keeps the current value; saving the field empty clears it. +#### Changing the Card URL discards stored credentials + +Pointing an agent at a different Card URL means a new destination, and the credentials stored for the old one don't come along: + +- **Re-enter every sensitive field of the agent's authentication settings as plaintext in the same edit.** Saving fails and lists the field names to re-enter when a value is left empty, sent back as the mask, or the field is omitted entirely (an omitted field counts as reusing the old value). The error reads: `The connection destination changed, so stored secrets are not sent to it. Re-enter these values in the same edit: `. +- **Every member's credential under member authorization (Secret (Header) / OAuth 2.1) is revoked.** After the change, each member enters their key again or authorizes again. Revocation happens before the save, so members re-authorize even when the save fails. +- **Replacing only the OAuth metadata without touching the Card URL** also revokes members' credentials, but does not require re-entering the values shared account-wide. Emptying it only triggers rediscovery from the unchanged Card URL. + +Members who can view but not edit an agent get the Card URL with its `user:password` part removed and every query value replaced by `****`; a URL that doesn't parse is hidden entirely. + Use HTTPS for member authorization (OAuth 2.1) discovery whenever possible. Enable "Allow fetching OAuth configuration over HTTP (testing only)" for a non-local HTTP Card URL only in controlled test environments. If an HTTPS endpoint uses a self-signed certificate, enable "Skip TLS certificate verification" only temporarily and only inside a trusted network. diff --git a/en/ai-sre/apps.mdx b/en/ai-sre/apps.mdx index 12646fc5..ad3e6d56 100644 --- a/en/ai-sre/apps.mdx +++ b/en/ai-sre/apps.mdx @@ -103,6 +103,9 @@ Authorization happens on GitHub's official install page, opened in a popup. Choose the **organization** (or personal account) to install into, and grant a repository scope — **All repositories** or **Only select repositories**. The set of granted repositories determines which repositories AI SRE can access afterward. + + After you pick the organization and repositories, GitHub takes the browser to the Flashduty App's OAuth **Authorize** page; confirm it and the browser returns to Flashduty on its own. This step is what proves the installation belongs to you: Flashduty binds the installation to your account only once the authorizing GitHub user is shown to have access to it, so an installation nobody can access is never bound. A private deployment must set the GitHub App's **Callback URL** to the install callback address and fill in the OAuth client id and secret; without them, installations do not take effect. + After you confirm on GitHub, the popup closes and the new organization appears in the installation list. diff --git a/en/ai-sre/automations.mdx b/en/ai-sre/automations.mdx index 0ae6315f..ace8cf59 100644 --- a/en/ai-sre/automations.mdx +++ b/en/ai-sre/automations.mdx @@ -113,6 +113,8 @@ Runs automatically on a time cadence. The cadence supports two cron forms: | Month | `*` or `1`–`12` | | Day of week | `*` or `0`–`7` (both `0` and `7` mean Sunday) | +You can't set both day of month and day of week: one of the two must be `*`, or the save is rejected with this message under the cron field: "Do not set both a day of month and a day of week. Change one of them to *." A 4-field expression works the same way, so its day of month and day of week also can't both be set. + To avoid hand-writing the expression, the UI offers four modes: | Mode | Meaning | diff --git a/en/ai-sre/context.mdx b/en/ai-sre/context.mdx index 1829b508..5740f708 100644 --- a/en/ai-sre/context.mdx +++ b/en/ai-sre/context.mdx @@ -40,6 +40,8 @@ Everything under Customize (skills, knowledge, MCP, agents, environments) uses t | Loaded in a session | A session bound to a team loads shared resources and that team's resources only, including for account owners and admins. A personal session loads shared resources and the resources of the teams the session creator belongs to. | | List | Management pages show shared resources and resources of your teams. | +A resource the list doesn't show is the same when opened by ID: the MCP, A2A Agent, and Skill detail pages, and Skill downloads, report that the resource does not exist rather than revealing that the ID exists. + For troubleshooting that spans teams, ask the other team to set the relevant resources to shared. ## Read next diff --git a/en/ai-sre/mcp.mdx b/en/ai-sre/mcp.mdx index 4ff7258b..77f6250c 100644 --- a/en/ai-sre/mcp.mdx +++ b/en/ai-sre/mcp.mdx @@ -172,6 +172,20 @@ Service authorization shows a dash ("—"). Click the authorization entry to ope - **Member authorization (key)**: click **Enter Key** or **Update Key**. - **Revoke**: deletes your saved credential. +### Changing the destination leaves stored secrets behind + +A save that changes the **transport**, the **command**, the **args**, or the **endpoint** (URL) counts as switching to a different connection destination. Args are compared as a list, so an unchanged list is not a change. Stored shared credentials do not go to the new destination: the protected values in the environment variables and Headers (key rules in [Authentication](#authentication) above) must be re-entered as plaintext in the same edit. If you leave one out, send it empty, or send the mask back as-is, the save is refused and the form shows this error listing the affected key names: + +```text +The connection destination changed, so stored secrets are not sent to it. Re-enter these values in the same edit: GITHUB_TOKEN, X-API-Key +``` + +The same edit also revokes every member's credential for this server: member authorization (key) needs the key again, and member authorization (OAuth) needs a fresh authorization. The revocation happens before the save, so a save that ultimately fails can still cost members one more authorization. Replacing only the OAuth metadata (the value that names the token endpoint), through the API, does not require re-entering shared credentials, but it still revokes members' credentials; emptying that value only triggers rediscovery from the unchanged endpoint and revokes nothing. + +### How protected values are shown + +Protected values (environment variable and Header names that match those rules) always come back as the fixed mask `****`, with no first or last characters revealed; sending `****` back means "keep the stored value". Members who can view but not edit the server see less of the connection config: **args** are not returned at all, and the **endpoint** (plus a proxy address set through the API) comes back with any `user:password` removed and every query-string value replaced by `****`; an endpoint that cannot be parsed is left empty. Editors see the endpoint and args as entered. + ## Management & inspection The MCP list shows each server you added with its name and description, scope (Shared or team), transport and enabled state. You can filter by All / Shared / Team and search by name, description, transport or URL. The built-in Flashduty MCP server is not listed. diff --git a/en/changelog/changelog.mdx b/en/changelog/changelog.mdx index 714963ef..00b92192 100644 --- a/en/changelog/changelog.mdx +++ b/en/changelog/changelog.mdx @@ -4,6 +4,18 @@ description: "This page documents important updates and feature releases for Fla keywords: ["Changelog", "Product Release", "Feature Updates", "Flashduty", "Version History"] --- + + +### Routing rules in a table or card view + +The routing-rule list now offers two presentations, chosen at the top right: **table** and **card**. Cards are laid out in routing order; the number at a card's top right turns into a drag handle on hover, and dropping it on another card reorders the rules exactly like dragging the order column in the table. Each card keeps the **more actions** (⋯) menu. In the card view the **View** menu gains an **Last modified** switch that hides that line at the bottom of each card. The choice is remembered per member: reloading the page, opening another tab, or switching to another collaboration space shows the last view you picked. See [Routing rules](/en/on-call/channel/escalation-rule). + +### Connector credentials no longer follow a changed destination + +The people who can edit an MCP server or an A2A agent are not necessarily the people who enter its credentials, so a credential only holds for the destination it was entered for. Changing an MCP server's **transport / command / args / URL**, or an A2A agent's **Card URL**, moves the destination: every shared secret already stored in the config must be typed again in the same edit, otherwise the save fails and lists the keys to re-enter; every member's per-user credential is revoked at the same time, so each member re-enters their key or authorises again against the new destination. Replacing only the OAuth metadata revokes members' per-user credentials alone. Protected values in lists and detail pages are now shown as a plain `****` with no leading or trailing characters, and a member who can view but not edit also loses the MCP args and sees the credentials and every query value in a URL masked. See [MCP](/en/ai-sre/mcp) and [Agent](/en/ai-sre/agents). + + + ### RUM custom dashboards: build your own under Insights diff --git a/en/monitors/alert-rules/investigation-entries.mdx b/en/monitors/alert-rules/investigation-entries.mdx index 0a69d1b3..47499c95 100644 --- a/en/monitors/alert-rules/investigation-entries.mdx +++ b/en/monitors/alert-rules/investigation-entries.mdx @@ -27,7 +27,7 @@ A rule can hold many investigation entries. Each entry has three parts: the entr | Entry type | Button | Jumps to | Notes | |---------|------|--------|------| | **Dashboard entry** | Add dashboard entry | The dashboard viewer | Can target the whole dashboard, a tab, a section or a panel, and sets the values of that dashboard's template variables | -| **Query entry** | Add query entry | The Query Workbench | Stores one editable initial query (query type + query + query parameters) and optionally the data source it runs on | +| **Query entry** | Add query entry | The Query Workbench | Stores one editable initial query (query type + query + minimum step + query parameters) and optionally the data source it runs on | Neither type supports runbooks, tickets or arbitrary URLs. @@ -83,7 +83,8 @@ Time range semantics: | **Data source** | Defaults to `Alert event datasource` (the query is written against the rule's data source type); you can also pick a specific data source. When the rule's data source type is not queryable in the workbench, the `Alert event datasource` option is disabled and labelled `Alert event datasource (not supported for this rule type)`, so the entry must name a data source explicitly. **Changing the data source resets the query**, because the query language changed | | **Query type** | Only shown for data sources with more than one query type (Prometheus: Graph only / Raw only; Loki: Range / Instant; VictoriaLogs: Raw logs / Instant stats / Range stats). Prometheus "Graph + Raw" is not offered here because it is two executions and cannot be stored as one query. SQL-type data sources, SLS and Tencent CLS each have a single query mode and therefore no such row | | **Initial query** | The query editor, with the same syntax and completion as the Query Workbench. The whole expression is rendered as a Go template and inserted **verbatim — no automatic quoting or escaping** | -| **Query parameters** | The data source's named parameters, per data source type (Limit, Direction, Min step (s), the SLS project / logstore, the Tencent CLS region / topic / syntax). Parameter values are **not templated**; a `{{` is rejected (`query args do not support templates`) | +| **Minimum step** | Only for Prometheus / Loki when **Query type** is a range query; in seconds, minimum 1. It is the lower bound on the query step: the backend still derives the step from `max_data_points` but never goes below this value. Leave it empty for no lower bound | +| **Query parameters** | The data source's named parameters, per data source type (Limit, Direction, the SLS project / logstore, the Tencent CLS region / topic / syntax). Parameter values are **not templated**; a `{{` is rejected (`query args do not support templates`) | With the event data source selected, a rule type that the workbench does not support shows `Choose a datasource type under "Datasource and query" first, or pick a datasource for this entry`; an explicitly selected data source that was deleted or that you cannot use shows `The selected datasource is unavailable`. The data source's real type, permissions and provider-specific restrictions are re-checked by the workbench as the current user when the entry is opened or run. diff --git a/en/monitors/alert-rules/mysql.mdx b/en/monitors/alert-rules/mysql.mdx index a5fd7f02..833d2c65 100644 --- a/en/monitors/alert-rules/mysql.mdx +++ b/en/monitors/alert-rules/mysql.mdx @@ -21,6 +21,18 @@ Variables require alert engine `v0.76.0` or later; if any instance in the cluste The SQL after variable substitution is only known at runtime, so it can't be pre-checked at save time. The alert engine renders the variables per alert instance and then checks that the rendered text is a read-only query; if it isn't a read-only query, that evaluation run fails. +## Query restrictions + +A MySQL rule's SQL must be a single read-only statement. The main query, relate queries, and recovery queries are checked by the same rules, and a rule that breaks them is rejected at save time with an error that starts with the field name, for example `rule config invalid: query(A) expr: …`. + +- The statement must start with `SELECT`, `WITH`, `SHOW`, `DESC`, `DESCRIBE`, or `EXPLAIN`; anything else is refused with `MySQL statement must start with SELECT, WITH, SHOW, DESC, DESCRIBE, or EXPLAIN`. +- `INTO`, `INSERT`, `UPDATE`, and `DELETE` may not appear anywhere in the statement, which is what stops `SELECT … INTO OUTFILE`, `WITH … DELETE`, and `INSERT … SELECT`. The message is `MySQL keyword INTO is not allowed`, with the keyword upper-cased, and the `INSERT(...)` string function is not affected. +- Only one statement is allowed; more than one returns `multiple MySQL statements are not allowed`. +- Executable comments are refused with `executable SQL comments are not allowed`. This covers MySQL `/*! … */`, MariaDB `/*M! … */`, and TiDB `/*T! … */`; ordinary `/* … */` comments are fine. +- `EXPLAIN ANALYZE` is refused with `MySQL EXPLAIN ANALYZE is not allowed`; plain `EXPLAIN` and `DESC` work. + +This is a lexical read-only policy that stops obvious writes; a read-only datasource account remains the real boundary. + ## Threshold evaluation mode This mode is suitable for scenarios requiring threshold comparison on aggregated values. diff --git a/en/monitors/alert-rules/sls.mdx b/en/monitors/alert-rules/sls.mdx index 9e430561..ac44eb91 100644 --- a/en/monitors/alert-rules/sls.mdx +++ b/en/monitors/alert-rules/sls.mdx @@ -70,7 +70,14 @@ See [Alert recovery](/en/monitors/quickstart/quickstart#alert-recovery) for the This mode is used to monitor scenarios where "data is expected but actually missing". -SLS does not support per-series no-data detection. Only "**Alert when all queries return no data**" is available; "Alert if previously found data is now missing" is not supported. +SLS offers two no-data conditions; enable either one, or both as you need: + +| Condition | Fires when | Recovery | +|------|----------|----------| +| **Alert if previously found data is now missing** | Evaluated per series: that series returned data before and is missing now | Choose **Close automatically when data reappears**, **Close automatically after data recovers or the timeout elapses** (fill in **Auto-close time**, in seconds, minimum 1), or **Manual close only** | +| **Alert when all queries return no data** | All queries return empty results for N consecutive checks, where N comes from the **Trigger condition** shared by the tab | Fixed to **recover automatically once any query returns data again**; not configurable | + +Among log-service data sources only Tencent Cloud CLS lacks the per-series condition; see [Tencent Cloud CLS](/en/monitors/alert-rules/tencent-cls). ### Configuration @@ -79,16 +86,7 @@ SLS does not support per-series no-data detection. Only "**Alert when all querie ```sql * | SELECT host, max(__time__) as last_seen GROUP BY host ``` -2. **Evaluation Rules**: The alert fires when all queries return empty results for N consecutive checks. N comes from the **Trigger condition** shared by the tab. - -### Existing rules with per-series detection enabled - -If an existing SLS rule has per-series no-data detection enabled, opening its edit page turns that condition off automatically; the change takes effect when you save. The rule does not change unless you open the edit page. - -- If the rule has other enabled conditions (threshold evaluation, data exists), you can save directly. -- If this was its only condition, enable at least one condition before saving. - -Switch to "Alert when all queries return no data" and make sure at least one condition is enabled before saving. +2. **Evaluation Rules**: Enable a condition from the table above. With "Alert when all queries return no data", N comes from the **Trigger condition** shared by the tab; with "Alert if previously found data is now missing", each series is evaluated on its own and you can also set the recovery mode from the table. ### Recovery logic diff --git a/en/monitors/folders/folders.mdx b/en/monitors/folders/folders.mdx index 260c4a21..e007504a 100644 --- a/en/monitors/folders/folders.mdx +++ b/en/monitors/folders/folders.mdx @@ -35,6 +35,7 @@ You can move alert rules to a different folder. The rules themselves do not chan - **One rule**: choose **Move** in the `⋮` menu at the end of its row. - **Several rules**: select them, then click **Move** above the list. +- **On the rule's edit page**: **Group** in block 1 is a dropdown; pick the target group and save to move the rule there. Both open the **Move to another folder** dialog: diff --git a/en/monitors/quickstart/quickstart.mdx b/en/monitors/quickstart/quickstart.mdx index f5e84488..e67b7e55 100644 --- a/en/monitors/quickstart/quickstart.mdx +++ b/en/monitors/quickstart/quickstart.mdx @@ -70,7 +70,7 @@ The create / edit alert rule page is one form with six sections, from top to bot | Config Item | Description | |--------|------| -| **Group** | The group path of the rule (for example, "Default / Database Alerts"). If the group has been deleted or you cannot access it, go back to the rule list and pick a group again | +| **Group** | The group path of the rule (for example, "Default / Database Alerts"). When you edit an existing rule this row is a dropdown listing, by full path, the groups you can write to: pick one and save to move the rule there. If the group has been deleted or you cannot access it, the row is not editable — go back to the rule list and pick a group again | | **Rule Name** | Name of the alert rule; does not support variable references (fixed names facilitate filtering and grouping operations). It must be unique within its group; imports, edits, and moves fail if the target group already contains that name | | **Additional Labels** | Similar to `labels` in Prometheus; attached to all alert events for filtering, routing, and inhibition. See below for value syntax | @@ -214,15 +214,15 @@ The repeat notification maximum count and interval, and the match and recovery c ### Event configuration -Event Configuration covers **Custom Fields & Related Queries** (collapsed by default), the notes description, and repeat notification settings. +Event configuration runs from the channel through the notes description and repeat notification settings to two flat subsections, custom fields and related queries. | Config Item | Description | |--------|------| -| **Custom Fields** | Similar to `annotations` in Prometheus; can attach dashboard URLs, SOP URLs, and so on | -| **Related Query** | Not used for threshold evaluation, but can be included in notes as variable references (for example, attach log samples) | -| **Notes Description** | Unstructured text field; supports variable references to help responders quickly locate issues | | **Channel** | Specify a channel in Flashduty On-call; if not specified, delivery follows integration routing rules | +| **Notes Description** | Unstructured text field; supports variable references to help responders quickly locate issues | | **Repeat Notification** | Continues notifying when alert is not recovered; configurable interval and maximum count (default 10000) | +| **Custom Fields** | Similar to `annotations` in Prometheus; can attach dashboard URLs, SOP URLs, and so on. Click `+` next to the heading and fill in **Field name** and **Field value** in the dialog; the fields you add are listed as `key=value` tags — click a tag to edit it, click the × on it to delete it, and a field name cannot be empty or repeated | +| **Related Query** | A separate subsection with its own add button; the result is not used for threshold evaluation, but can be referenced as a variable in the notes (for example, attach log samples) | The maximum notification count does not represent the number of message reminders end users receive. Because alert events generated by Monitors are delivered to On-call, they may be grouped and noise-reduced; the final send count depends on On-call configuration. diff --git a/en/on-call/channel/escalation-rule.mdx b/en/on-call/channel/escalation-rule.mdx index 5cc2adfc..10ef83eb 100644 --- a/en/on-call/channel/escalation-rule.mdx +++ b/en/on-call/channel/escalation-rule.mdx @@ -11,6 +11,8 @@ An escalation rule contains six core elements. The system matches rules from top You can enable or disable individual escalation rules. Flashduty skips disabled rules during matching, so they trigger no notifications. You can also copy an escalation rule to the current channel or another channel to quickly reuse existing configurations; see [Copy an Escalation Rule](#copy-an-escalation-rule). **Edit**, **Copy**, **Enable**/**Disable**, and **Delete** all live in the **More actions** (⋯) menu at the end of each row: an enabled rule offers **Disable**, and only after it is disabled does the menu offer **Enable** and **Delete**. **Disable** and **Delete** both ask you to confirm first. +The list offers two views, **table** and **card**, switched at its top right and remembered per member. Cards are laid out in routing order; the number at a card's top right turns into a drag handle on hover, and dropping it on another card reorders the rules. Each card keeps the **More actions** (⋯) menu. In the card view the **View** menu at the top right can hide the **Last modified** line at the bottom of each card. + ### 1. Trigger conditions Determines which incidents trigger the current rule. diff --git a/en/on-call/incident/search-view-incident.mdx b/en/on-call/incident/search-view-incident.mdx index ccbb5d44..473440d7 100644 --- a/en/on-call/incident/search-view-incident.mdx +++ b/en/on-call/incident/search-view-incident.mdx @@ -172,7 +172,7 @@ Each entry is one row showing the entry-type icon (query or dashboard), the **pu - Hovering an entry opens a detail card with the full query expression (copyable), the named **variables** (filled in from the alert's labels; unresolved ones are highlighted in red), and the **time range** — the relative window on one line (for example "60 min before → 10 min after the alert") and the absolute start and end on the next. An **Open** button at the bottom opens the corresponding view in the Query Workbench or dashboard in a new tab - The number next to the heading is how many entries the snapshot holds; the **N with issues** badge counts the entries that render with a problem (query failed to render, dashboard variable unresolved, data source or dashboard deleted or unauthorized) - Only the first **3** entries show by default; the rest sit behind **N more**, which expands and collapses -- Below the entries are the **Related alert rule** card (rule name plus data source, clickable through to the rule) and the rule's **Queries**: main queries are listed by `A` / `B` with the **value at trigger time**, hover for the full expression with a copy button, and a no-data alert is marked **No data** on the matching main query; related queries show the **result table at trigger time** +- Below the entries are the **Related alert rule** card (rule name plus data source, clickable through to the rule) and the rule's **Queries**: main queries are listed by `A` / `B` with the **value at trigger time**, hover for the full expression with a copy button, and a no-data alert is marked **No data** on the matching main query; related queries show the **result at trigger time**: a result table for statistical queries, and for a VictoriaLogs / Loki related query whose query mode is **Raw** one log line per row with its fields laid out as `k=v` and the fields that do not fit collapsed into **+N fields**; the hover card shows at most 3 rows, and **View full data** next to its heading opens the query workbench with everything When the rule has no investigation entries configured, the block says "No investigation entries configured on the rule" and offers a **Configure** link. Other cases where entries cannot be shown: diff --git a/en/on-call/integration/alert-integration/alert-sources/chronosphere.mdx b/en/on-call/integration/alert-integration/alert-sources/chronosphere.mdx index 5dfdcbd4..3d7f2567 100644 --- a/en/on-call/integration/alert-integration/alert-sources/chronosphere.mdx +++ b/en/on-call/integration/alert-integration/alert-sources/chronosphere.mdx @@ -1,29 +1,29 @@ --- title: "Chronosphere alert integration" sidebarTitle: "Chronosphere" -description: "Receive Chronosphere alerts through Chronosphere's webhook notifier using a Flashduty Prometheus integration; with resolved notifications on, alerts close automatically." +description: "Receive Chronosphere alerts through Chronosphere's webhook notifier using a Flashduty Prometheus Alertmanager integration; with resolved notifications on, alerts close automatically." keywords: ["alert integration", "Chronosphere", "webhook", "Prometheus", "Alertmanager", "observability"] --- -Chronosphere's webhook notifier sends an HTTP POST to the URL you enter. The body is Prometheus Alertmanager JSON (`version` is `4`, with `status`, `alerts`, `fingerprint`, `labels`, `annotations`, `startsAt`, `endsAt`, plus an extra `notifier` field). The Flashduty [Prometheus integration](/en/on-call/integration/alert-integration/alert-sources/prometheus) accepts this format, so no separate Chronosphere integration is needed: create a Prometheus integration in Flashduty and paste its push URL into Chronosphere. +Chronosphere's webhook notifier sends an HTTP POST to the URL you enter. The body is Prometheus Alertmanager JSON (`version` is `4`, with `status`, `alerts`, `fingerprint`, `labels`, `annotations`, `startsAt`, `endsAt`, plus an extra `notifier` field). The Flashduty [Prometheus Alertmanager integration](/en/on-call/integration/alert-integration/alert-sources/prometheus) accepts this format, so no separate Chronosphere integration is needed: create a Prometheus Alertmanager integration in Flashduty and paste its push URL into Chronosphere.
## In Flashduty On-call -Get an integration push URL in either of the two ways below. **Choose the Prometheus integration type** in both, not Chronosphere. +Get an integration push URL in either of the two ways below. **Choose the Prometheus Alertmanager integration type** in both, not Chronosphere. ### Use a dedicated integration 1. In the Flashduty console, go to **Channels** and open a channel 2. Go to **Settings** → **Integrations** → **Dedicated integrations** and click **Add an integration** -3. Select **Prometheus** and click **Save** +3. Select **Prometheus Alertmanager** and click **Save** 4. Open the generated integration card and copy the **Push URL**, in the form `https://api.flashcat.cloud/event/push/alert/prometheus?integration_key=` ### Use a shared integration 1. In the Flashduty console, go to **Integration Center → Alert Events** -2. Select **Prometheus** and enter an integration name +2. Select **Prometheus Alertmanager** and enter an integration name 3. Configure the default route and select a channel. You can add more rules under **Routing** after creation 4. Click **Save** and copy the generated **Push URL** @@ -91,6 +91,6 @@ One notification can carry several alerts, and Flashduty handles each one separa ## Troubleshooting -- **Flashduty returns `Invalid parameters`**: the push URL is incomplete and lacks `integration_key`, or the integration type is not Prometheus +- **Flashduty returns `Invalid parameters`**: the push URL is incomplete and lacks `integration_key`, or the integration type is not Prometheus Alertmanager - **Alerts do not recover**: confirm the notifier has **Notify when resolved** selected (`send_resolved` is `true` in Terraform, `skip_resolved` is `false` in Chronoctl) and that the resolved notification's `fingerprint` matches the trigger - **No alerts arrive**: confirm a notification policy routes the relevant severities to this notifier, and that Chronosphere can reach `api.flashcat.cloud` diff --git a/en/on-call/integration/alert-integration/alert-sources/cubeapm.mdx b/en/on-call/integration/alert-integration/alert-sources/cubeapm.mdx index a2f2adce..66ace155 100644 --- a/en/on-call/integration/alert-integration/alert-sources/cubeapm.mdx +++ b/en/on-call/integration/alert-integration/alert-sources/cubeapm.mdx @@ -1,29 +1,29 @@ --- title: "CubeAPM alert integration" sidebarTitle: "CubeAPM" -description: "Receive CubeAPM alerts through CubeAPM's webhook receiver using a Flashduty Prometheus integration; alerts close automatically when they resolve." +description: "Receive CubeAPM alerts through CubeAPM's webhook receiver using a Flashduty Prometheus Alertmanager integration; alerts close automatically when they resolve." keywords: ["alert integration", "CubeAPM", "webhook", "Prometheus", "Alertmanager", "observability"] --- -CubeAPM can send alert notifications by HTTP POST to any webhook URL. The default JSON body is compatible with the Prometheus Alertmanager webhook format (`receiver`, `status`, `alerts`, `groupLabels`, `commonLabels`, `commonAnnotations`, `externalURL`, and so on; each alert carries `status`, `labels`, `annotations`, `startsAt`, `endsAt`, `generatorURL`, `fingerprint`, plus CubeAPM's own `cubeImageURL` and `cubeSampleLog`). The Flashduty [Prometheus integration](/en/on-call/integration/alert-integration/alert-sources/prometheus) accepts this format, so no separate CubeAPM integration is needed: create a Prometheus integration in Flashduty and paste its push URL into CubeAPM. +CubeAPM can send alert notifications by HTTP POST to any webhook URL. The default JSON body is compatible with the Prometheus Alertmanager webhook format (`receiver`, `status`, `alerts`, `groupLabels`, `commonLabels`, `commonAnnotations`, `externalURL`, and so on; each alert carries `status`, `labels`, `annotations`, `startsAt`, `endsAt`, `generatorURL`, `fingerprint`, plus CubeAPM's own `cubeImageURL` and `cubeSampleLog`). The Flashduty [Prometheus Alertmanager integration](/en/on-call/integration/alert-integration/alert-sources/prometheus) accepts this format, so no separate CubeAPM integration is needed: create a Prometheus Alertmanager integration in Flashduty and paste its push URL into CubeAPM.
## In Flashduty On-call -Get an integration push URL in either of the two ways below. **Choose the Prometheus integration type** in both, not CubeAPM. +Get an integration push URL in either of the two ways below. **Choose the Prometheus Alertmanager integration type** in both, not CubeAPM. ### Use a dedicated integration 1. In the Flashduty console, go to **Channels** and open a channel 2. Go to **Settings** → **Integrations** → **Dedicated integrations** and click **Add an integration** -3. Select **Prometheus** and click **Save** +3. Select **Prometheus Alertmanager** and click **Save** 4. Open the generated integration card and copy the **Push URL**, in the form `https://api.flashcat.cloud/event/push/alert/prometheus?integration_key=` ### Use a shared integration 1. In the Flashduty console, go to **Integration Center → Alert Events** -2. Select **Prometheus** and enter an integration name +2. Select **Prometheus Alertmanager** and enter an integration name 3. Configure the default route and select a channel. You can add more rules under **Routing** after creation 4. Click **Save** and copy the generated **Push URL** @@ -81,6 +81,6 @@ One notification can carry several alerts, and Flashduty handles each one separa ## Troubleshooting -- **Flashduty returns `Invalid parameters`**: the push URL is incomplete, `integration_key` is missing, or the integration type is not Prometheus +- **Flashduty returns `Invalid parameters`**: the push URL is incomplete, `integration_key` is missing, or the integration type is not Prometheus Alertmanager - **Alerts do not resolve**: confirm that every alert in a customized Payload has `status` and `fingerprint`, and that the recovery notification carries the same `fingerprint` as the trigger - **No alerts arrive**: confirm CubeAPM can reach `api.flashcat.cloud` and that the alert rule uses this webhook receiver diff --git a/en/on-call/integration/alert-integration/alert-sources/prometheus.mdx b/en/on-call/integration/alert-integration/alert-sources/prometheus.mdx index c172591d..9780733a 100644 --- a/en/on-call/integration/alert-integration/alert-sources/prometheus.mdx +++ b/en/on-call/integration/alert-integration/alert-sources/prometheus.mdx @@ -34,7 +34,7 @@ Choose this option if all alerts go to one channel. It's the simpler setup. 1. In the Flashduty console, select **Channel** and open a channel 2. Select **Configuration** → **Integrations** → **Private integration**, then click **Add an integration**, and enter the integration page - 3. Select **Prometheus** integration, click **Save** to generate a card + 3. Select **Prometheus Alertmanager** integration, click **Save** to generate a card 4. Open the generated integration card and copy the **Push URL** @@ -48,7 +48,7 @@ Choose this method when you need to route alert events to different channels bas 1. In the Flashduty console, go to **Integration Center → Alert Events** - 2. Select **Prometheus** integration: + 2. Select **Prometheus Alertmanager** integration: - **Integration Name**: Define a name for this integration 3. Configure the default route and select a channel. You can add more rules under **Routing** after creation 4. Click **Save** and copy the generated **Push URL** diff --git a/en/on-call/integration/alert-integration/alert-sources/red-hat-openshift.mdx b/en/on-call/integration/alert-integration/alert-sources/red-hat-openshift.mdx index acc83b5a..21367091 100644 --- a/en/on-call/integration/alert-integration/alert-sources/red-hat-openshift.mdx +++ b/en/on-call/integration/alert-integration/alert-sources/red-hat-openshift.mdx @@ -1,29 +1,29 @@ --- title: "Red Hat OpenShift alert integration" sidebarTitle: "Red Hat OpenShift" -description: "Receive OpenShift cluster alerts through the webhook receiver of OpenShift monitoring's built-in Alertmanager using a Flashduty Prometheus integration; alerts close automatically when they resolve." +description: "Receive OpenShift cluster alerts through the webhook receiver of OpenShift monitoring's built-in Alertmanager using a Flashduty Prometheus Alertmanager integration; alerts close automatically when they resolve." keywords: ["alert integration", "Red Hat OpenShift", "OpenShift", "Alertmanager", "webhook", "Prometheus", "Kubernetes"] --- -The OpenShift Container Platform monitoring stack ships its own Alertmanager (`alertmanager-main` in the `openshift-monitoring` project). The official documentation lists PagerDuty, Webhook, Email, Slack and Microsoft Teams as receiver types, and states that the features of a supported upstream Alertmanager version are supported in OpenShift as well. The webhook receiver sends Alertmanager JSON to the URL you set (`version` is `4`; each alert carries `status`, `labels`, `annotations`, `startsAt`, `endsAt`, `generatorURL`, `fingerprint`). The Flashduty [Prometheus integration](/en/on-call/integration/alert-integration/alert-sources/prometheus) accepts this format, so no separate OpenShift integration is needed: create a Prometheus integration in Flashduty and configure its push URL as a webhook receiver in the OpenShift Alertmanager. +The OpenShift Container Platform monitoring stack ships its own Alertmanager (`alertmanager-main` in the `openshift-monitoring` project). The official documentation lists PagerDuty, Webhook, Email, Slack and Microsoft Teams as receiver types, and states that the features of a supported upstream Alertmanager version are supported in OpenShift as well. The webhook receiver sends Alertmanager JSON to the URL you set (`version` is `4`; each alert carries `status`, `labels`, `annotations`, `startsAt`, `endsAt`, `generatorURL`, `fingerprint`). The Flashduty [Prometheus Alertmanager integration](/en/on-call/integration/alert-integration/alert-sources/prometheus) accepts this format, so no separate OpenShift integration is needed: create a Prometheus Alertmanager integration in Flashduty and configure its push URL as a webhook receiver in the OpenShift Alertmanager.
## In Flashduty On-call -Get an integration push URL in either of the two ways below. **Choose the Prometheus integration type** in both, not Red Hat OpenShift. +Get an integration push URL in either of the two ways below. **Choose the Prometheus Alertmanager integration type** in both, not Red Hat OpenShift. ### Use a dedicated integration 1. In the Flashduty console, go to **Channels** and open a channel 2. Go to **Settings** → **Integrations** → **Dedicated integrations** and click **Add an integration** -3. Select **Prometheus** and click **Save** +3. Select **Prometheus Alertmanager** and click **Save** 4. Open the generated integration card and copy the **Push URL**, in the form `https://api.flashcat.cloud/event/push/alert/prometheus?integration_key=` ### Use a shared integration 1. In the Flashduty console, go to **Integration Center → Alert Events** -2. Select **Prometheus** and enter an integration name +2. Select **Prometheus Alertmanager** and enter an integration name 3. Configure the default route and select a channel. You can add more rules under **Routing** after creation 4. Click **Save** and copy the generated **Push URL** @@ -133,6 +133,6 @@ One notification can carry several alerts, and Flashduty handles each one separa ## Troubleshooting -- **Flashduty returns `Invalid parameters`**: the push URL is incomplete, `integration_key` is missing, or the integration type is not Prometheus +- **Flashduty returns `Invalid parameters`**: the push URL is incomplete, `integration_key` is missing, or the integration type is not Prometheus Alertmanager - **Alerts do not resolve**: confirm the receiver does not set `send_resolved: false` - **No alerts arrive**: confirm the route `matchers` or **Routing labels** match the alert labels and the cluster can reach `api.flashcat.cloud` (with a cluster-wide HTTP proxy, see the `proxy_from_environment` note in the OpenShift documentation); `oc exec alertmanager-main-0 -n openshift-monitoring -- amtool config routes show --alertmanager.url http://localhost:9093` shows the effective routes diff --git a/en/on-call/integration/alert-integration/alert-sources/robusta.mdx b/en/on-call/integration/alert-integration/alert-sources/robusta.mdx index 1c8061bd..606f7fae 100644 --- a/en/on-call/integration/alert-integration/alert-sources/robusta.mdx +++ b/en/on-call/integration/alert-integration/alert-sources/robusta.mdx @@ -94,7 +94,7 @@ The checklist item "Receive the first event" is then complete as well. -If your Prometheus alerts do not go through Robusta, Alertmanager can also push them straight to the Flashduty [Prometheus integration](/en/on-call/integration/alert-integration/alert-sources/prometheus). +If your Prometheus alerts do not go through Robusta, Alertmanager can also push them straight to the Flashduty [Prometheus Alertmanager integration](/en/on-call/integration/alert-integration/alert-sources/prometheus). ## Alert key diff --git a/en/openapi/rate-limits.mdx b/en/openapi/rate-limits.mdx index e33c8031..88374ae7 100644 --- a/en/openapi/rate-limits.mdx +++ b/en/openapi/rate-limits.mdx @@ -5,7 +5,7 @@ description: "Flashduty Open API rate limits, permission checks, error codes, an ## Rate limits -Every operation is rate limited. Limits are counted per account (all APP Keys and console sessions of the account share one budget), in a per-second and a per-minute window; each operation also has a platform-wide limit shared by all accounts. The exact numbers for an operation are on its page under **Restrictions**. +Every operation is rate limited. Limits are counted per account (all APP Keys and console sessions of the account share one budget), in a per-second and a per-minute window. The exact numbers for an operation are on its page under **Restrictions**. Default limits per account: diff --git a/en/rum/error-tracking/source-mapping.mdx b/en/rum/error-tracking/source-mapping.mdx index c73cd9bb..edddaa35 100644 --- a/en/rum/error-tracking/source-mapping.mdx +++ b/en/rum/error-tracking/source-mapping.mdx @@ -523,6 +523,7 @@ On the Flashduty platform, symbol file management is done through the "Applicati | Feature | Description | |---------|-------------| | View Uploaded Symbol Files | List all uploaded files (SourceMaps, Mini Program SourceMaps, ProGuard mapping files, dSYMs, NDK native symbol files, Flutter symbol files, Electron Breakpad symbol files, and React Native bundle sourcemaps), including path, service name, version, size, and upload time. The Android tab shows both ProGuard mapping files and NDK native symbol files; NDK rows display build_id, arch, and lib_name columns. The Electron tab shows one row per native module with Module (lib_name), Debug ID (build_id), Architecture (arch), Service, Version, and Size columns, and supports searching by Debug ID | +| Filter by Upload Time | The list can be filtered by upload time. One filter spans at most 30 days, and the earliest start is 365 days back; symbol files uploaded earlier cannot be listed | | Filter by Platform | Switch between Web, iOS, Android, WeChat Mini Program, HarmonyOS, Flutter, Electron, and React Native tabs to view symbol files for each platform | | Version Management | Manage different application versions separately through `service` and `release-version` parameters | | Mini Program Dimensions | The WeChat Mini Program list shows AppID and Subpackage columns; the main package shows "Main Package", and an AppID that was not uploaded shows `-` | diff --git a/zh/ai-sre/agents.mdx b/zh/ai-sre/agents.mdx index d83e5e2f..55873f82 100644 --- a/zh/ai-sre/agents.mdx +++ b/zh/ai-sre/agents.mdx @@ -154,9 +154,19 @@ OAuth 2.1 只出现在**成员授权**这条轴上。服务授权是账户内共 -已保存的敏感字段(如令牌、API Key、Client Secret)会**掩码**显示。编辑时留空表示保留原值,不会清空。 +已保存的敏感字段(如令牌、API Key、Client Secret)显示为固定的 `****` 掩码,不露出首尾任何字符。编辑时把掩码原样保存表示保留原值,留空保存表示清除该字段。 +#### 修改 Card URL 会作废已存的凭证 + +改 Card URL 等于把 Agent 指向了新的目的地,已存的凭证不会跟着搬过去: + +- **认证配置里的敏感字段必须在同一次编辑中重填明文**:留空提交、或把掩码原样提交,保存都会失败,并列出需要重填的字段名;整个字段不提交也按“沿用旧值”处理,同样失败。报错原文:`The connection destination changed, so stored secrets are not sent to it. Re-enter these values in the same edit: <字段名>`。 +- **成员授权(密钥 / OAuth 2.1)下每位成员的凭证全部作废**:改完 Card URL,每位成员都要重新填写自己的密钥或重新授权。作废发生在保存之前,所以即使保存失败,成员也需要重新授权。 +- **只更换 OAuth 元数据、不改 Card URL**:同样作废成员的凭证,但不要求重填账户内共用的值;把它清空则只按原 Card URL 重新发现元数据。 + +只能查看、不能编辑 Agent 的成员拿到的 Card URL 会去掉 `user:password` 部分,每个查询参数的值替换为 `****`;地址无法解析时整段不显示。 + 成员授权(OAuth 2.1)的发现地址优先使用 HTTPS。只有在受控测试环境中,才为非本地 HTTP Card URL 勾选“允许通过 HTTP 获取 OAuth 配置(仅限测试环境)”。如果 HTTPS 端点使用自签证书,也只应在可信网络内临时开启“跳过 TLS 证书校验”。 diff --git a/zh/ai-sre/apps.mdx b/zh/ai-sre/apps.mdx index c439fdb5..33e7e1fc 100644 --- a/zh/ai-sre/apps.mdx +++ b/zh/ai-sre/apps.mdx @@ -103,6 +103,9 @@ Kubernetes App 将集群中的 Agent 接入 AI SRE。创建后,AI SRE 可以 选择要安装到的**组织**(或个人账户),并授予仓库范围——**所有仓库(All repositories)**或**仅选定仓库(Only select repositories)**。授予的仓库集合决定了 AI SRE 之后能访问哪些仓库。 + + 选好组织与仓库后,GitHub 会把浏览器带到 Flashduty App 的 OAuth **Authorize** 页;确认授权,浏览器会自动回到 Flashduty。这一步用于确认安装归属于您:只有当授权的 GitHub 用户被证实能访问该安装时,Flashduty 才会把它绑定到您的账户,因此无人可访问的安装不会被绑定。私有化部署需要在 GitHub App 上把 **Callback URL** 配成安装回调地址,并填好 OAuth client id 与 secret,否则安装不会生效。 + 在 GitHub 上确认后,弹窗自动关闭,新组织出现在安装列表中。 diff --git a/zh/ai-sre/automations.mdx b/zh/ai-sre/automations.mdx index 288826ec..f7525d8d 100644 --- a/zh/ai-sre/automations.mdx +++ b/zh/ai-sre/automations.mdx @@ -111,6 +111,8 @@ sidebarTitle: 自动化 | 月份 | `*` 或 `1`–`12` | | 星期 | `*` 或 `0`–`7`(`0` 与 `7` 均表示周日) | +日期与星期不能同时指定:两个字段里必须有一个是 `*`,否则保存被拒绝,cron 字段下方会提示“日期和星期不能同时指定,请把其中一个改成 *”。4 段表达式同理,其中日期与星期同样不能同时为非 `*`。 + 为免手写表达式,界面提供四种模式: | 模式 | 含义 | diff --git a/zh/ai-sre/context.mdx b/zh/ai-sre/context.mdx index cbe0c4b8..b4a0b97f 100644 --- a/zh/ai-sre/context.mdx +++ b/zh/ai-sre/context.mdx @@ -40,6 +40,8 @@ sidebarTitle: "上下文" | 会话中加载 | 绑定了团队的会话只加载共享资源和该团队的资源,账户 Owner 和管理员也一样。个人会话加载共享资源和会话创建者所属团队的资源。 | | 列表 | 管理页显示共享资源和您所在团队的资源。 | +列表里看不到的资源,直接按 ID 打开(MCP、A2A Agent、Skill 的详情,以及 Skill 下载)会提示该资源不存在,不会暴露这个 ID 的存在。 + 需要跨团队联合排障时,请对方团队把相关资源设为共享。 ## 接着看 diff --git a/zh/ai-sre/mcp.mdx b/zh/ai-sre/mcp.mdx index 02b153aa..658720c5 100644 --- a/zh/ai-sre/mcp.mdx +++ b/zh/ai-sre/mcp.mdx @@ -172,6 +172,20 @@ MCP 服务器支持三种**授权模式**,决定凭证如何提供给服务器 - **成员授权(密钥)**:点击 **填密钥** 或 **更新密钥**。 - **撤销**:删除您保存的凭证。 +### 改连接目的地时已存的密钥不会跟过去 + +保存时改动**传输方式**、**命令**、**参数**或**端点**(URL)中的任意一项,就算换了连接目的地。参数按列表内容比较,内容没变不算改动。此时已存的共享凭证不会带到新目的地:环境变量与 Headers 里受保护的值(键名规则见上文[认证](#认证)),必须在同一次编辑里重新以明文填写。留空、不填或把掩码原样提交都会被拒绝,页面显示下面的错误,并列出涉及的键名: + +```text +The connection destination changed, so stored secrets are not sent to it. Re-enter these values in the same edit: GITHUB_TOKEN, X-API-Key +``` + +同一次编辑还会撤销这台服务器的全部成员凭证:成员授权(密钥)要重新填密钥,成员授权(OAuth)要重新授权。撤销在保存之前执行,因此即使这次保存最终失败,成员也可能要重新授权一次。通过 API 只替换 OAuth 元数据(指向令牌端点的那个值)时,不需要重填共享凭证,但成员凭证同样会被撤销;把它清空只会按原端点重新发现,不撤销任何凭证。 + +### 受保护的值怎么显示 + +受保护的值(环境变量与 Headers 里键名符合上述规则的那些)读取时一律显示为固定的掩码 `****`,不保留任何首尾字符;把 `****` 原样提交表示保留已存的值。只能查看、不能编辑的成员看到的连接配置更少:**参数**完全不返回,**端点**(以及通过 API 设置的代理地址)会去掉其中的 `用户名:密码`,并把查询串里每个参数的值替换成 `****`,端点无法解析时留空。有编辑权限的成员看到的是原样的端点与参数。 + ## 管理与检视 MCP 列表显示您添加的每台服务器的名称与描述、范围(共享或团队)、传输方式和启用状态。可以按“全部 / 共享 / 团队”筛选,并按名称、描述、传输方式或 URL 搜索。内置的 Flashduty MCP 服务器不在此列表中。 diff --git a/zh/changelog/changelog.mdx b/zh/changelog/changelog.mdx index 9befc10a..abd23b0a 100644 --- a/zh/changelog/changelog.mdx +++ b/zh/changelog/changelog.mdx @@ -4,6 +4,18 @@ description: "本页面记录 Flashduty 产品的重要更新和功能发布" keywords: ["更新日志", "产品发布", "功能更新", "Flashduty", "版本记录"] --- + + +### 分派策略支持表格与卡片视图 + +分派策略列表右上角新增 **表格 / 卡片** 两种展示方式。卡片按分派顺序平铺,右上角的序号在悬停时变成拖拽手柄,拖到目标卡片上即调整分派顺序,与表格里拖动顺序列一致;卡片上也保留 **更多操作**(⋯)菜单。卡片视图下「视图」下拉多出一个 **上次修改** 开关,用来收起卡片底部这行信息。选择按成员记忆:刷新页面、换标签页,或切到别的协作空间,都按上次选的方式展示。详见[分派策略](/zh/on-call/channel/escalation-rule)。 + +### 连接器更换目的地后,已存的凭证不会跟过去 + +能编辑一台 MCP 服务器或一个 A2A Agent 的人,不一定是往里填凭证的人,所以凭证只对它填写时指向的目的地有效。改 MCP 服务器的 **传输方式 / 命令 / 参数 / URL**,或改 A2A Agent 的 **Card URL**,就是换了目的地:配置里已存的共享密钥必须在同一次编辑里重新填一遍明文,否则保存失败并列出需要重填的键;所有成员为它授权的个人凭证同时作废,每位成员要对新目的地重新填写密钥或重新授权。只替换 OAuth 元数据时,仅作废成员的个人凭证。另外,列表与详情里的受保护值一律显示为 `****`,不再露出首尾字符;只能查看、不能编辑的成员还看不到 MCP 的参数,地址里的账号密码与每个查询参数的值也会被打码。详见 [MCP 外部工具](/zh/ai-sre/mcp) 与 [Agent](/zh/ai-sre/agents)。 + + + ### RUM 自定义看板:在分析看板里自己搭看板 diff --git a/zh/monitors/alert-rules/investigation-entries.mdx b/zh/monitors/alert-rules/investigation-entries.mdx index d957b542..7424c80f 100644 --- a/zh/monitors/alert-rules/investigation-entries.mdx +++ b/zh/monitors/alert-rules/investigation-entries.mdx @@ -27,7 +27,7 @@ keywords: ["调查入口", "排查入口", "告警规则", "仪表盘入口", " | 入口类型 | 按钮 | 跳转到 | 说明 | |---------|------|--------|------| | **仪表盘入口** | 添加仪表盘入口 | 仪表盘查看器 | 可定位到整个仪表盘、某个标签页、某个分组或某个图表,并为该仪表盘的模板变量指定取值 | -| **查询入口** | 添加查询入口 | 查询工作台 | 保存一份可编辑的初始查询(查询类型 + 查询语句 + 查询参数),并可指定在哪个数据源上执行 | +| **查询入口** | 添加查询入口 | 查询工作台 | 保存一份可编辑的初始查询(查询类型 + 查询语句 + 最小步长 + 查询参数),并可指定在哪个数据源上执行 | 两类入口都不支持 Runbook、工单或任意 URL。 @@ -83,7 +83,8 @@ keywords: ["调查入口", "排查入口", "告警规则", "仪表盘入口", " | **数据源** | 默认是 `告警事件的数据源`(查询按规则的数据源类型书写),也可以选择一个具体数据源。当前规则的数据源类型不支持查询工作台时,`告警事件的数据源` 一项被禁用并显示 `当前规则类型不支持`,此时入口必须显式指定数据源。**更换数据源会重置查询**(查询语言变了,旧语句没有意义) | | **查询类型** | 只有多查询类型的数据源才出现这一行(Prometheus:仅图表 / 仅原始;Loki:Range / Instant;VictoriaLogs:原始日志 / 即时统计 / 趋势统计)。Prometheus 的「图表 + 原始」不会出现在这里,因为它对应两次执行,一份查询存不下。SQL 类数据源与 SLS、腾讯云 CLS 都只有一种查询方式,因此没有这一行 | | **初始查询** | 查询语句编辑器,写法与查询工作台一致,可按数据源类型使用补全。整个表达式按 Go template 渲染,**原样输出,不自动加引号或转义** | -| **查询参数** | 数据源的命名参数,按数据源类型给出(如返回条数、检索方向、最小 step(秒)、SLS 的项目 / 日志库、腾讯云 CLS 的地域 / 日志主题 / 语法)。参数值**不做模板渲染**,出现 `{{` 会被拒绝(`query args do not support templates`) | +| **最小步长** | 仅 Prometheus / Loki 且 **查询类型** 为范围查询时出现,单位秒、最小 1。它是查询步长的下限:后端仍按 `max_data_points` 计算步长,但不会低于这里填的值。留空表示不设下限 | +| **查询参数** | 数据源的命名参数,按数据源类型给出(如返回条数、检索方向、SLS 的项目 / 日志库、腾讯云 CLS 的地域 / 日志主题 / 语法)。参数值**不做模板渲染**,出现 `{{` 会被拒绝(`query args do not support templates`) | 选择了事件数据源时,规则类型不是工作台支持的类型会显示 `请先在「数据源与查询」中选择数据源类型,或为该入口指定数据源`;指定的数据源已被删除或您无权使用时会显示 `所选数据源不可用`。数据源的真实类型、权限与专属限制由工作台在打开或执行时按当前用户重新校验。 @@ -150,7 +151,7 @@ outcome:="failure" 去重的身份判定: - **仪表盘入口**:同一仪表盘 + 同一定位对象即为重复,**与变量取值、时间范围无关**。重复项不能用来表达变量 fallback 或多实例。 -- **查询入口**:按标准化后的数据源、查询(模式、表达式、参数、最小 step)与时间范围判重;未指定数据源(使用事件数据源)作为独立取值参与比较。同一数据源上可以配置多份**不同**的查询。 +- **查询入口**:按标准化后的数据源、查询(模式、表达式、参数、最小步长)与时间范围判重;未指定数据源(使用事件数据源)作为独立取值参与比较。同一数据源上可以配置多份**不同**的查询。 这些校验同时在两个地方执行:入口弹窗里(只校验当前这一项,方便逐项修复),以及保存规则时(整组校验,错误文案显示在区块下方)。 diff --git a/zh/monitors/alert-rules/mysql.mdx b/zh/monitors/alert-rules/mysql.mdx index c746787a..2c269db3 100644 --- a/zh/monitors/alert-rules/mysql.mdx +++ b/zh/monitors/alert-rules/mysql.mdx @@ -22,6 +22,18 @@ Monitors 支持使用标准 SQL 语法对 MySQL 进行查询,并根据查询 变量替换后的 SQL 到运行期才确定,保存时无法预检。告警引擎按告警实例渲染变量,再检查渲染结果是否为只读查询,不是只读查询时该次评估失败。 +## 查询语句限制 + +MySQL 规则的 SQL 必须是单条只读语句。查询、关联查询和恢复查询按同一套规则校验,不符合时保存被拒绝,错误提示以字段名开头,例如 `rule config invalid: query(A) expr: …`。 + +- 语句必须以 `SELECT`、`WITH`、`SHOW`、`DESC`、`DESCRIBE` 或 `EXPLAIN` 开头,否则提示 `MySQL statement must start with SELECT, WITH, SHOW, DESC, DESCRIBE, or EXPLAIN`。 +- 语句中任何位置都不能出现 `INTO`、`INSERT`、`UPDATE` 和 `DELETE` 这四个关键字,因此 `SELECT … INTO OUTFILE`、`WITH … DELETE`、`INSERT … SELECT` 都会被拒绝,提示为 `MySQL keyword INTO is not allowed`(关键字以大写回显);作为字符串函数写法的 `INSERT(...)` 不受影响。 +- 只能包含一条语句,多条时提示 `multiple MySQL statements are not allowed`。 +- 不接受可执行注释,提示 `executable SQL comments are not allowed`。MySQL 的 `/*! … */`、MariaDB 的 `/*M! … */` 和 TiDB 的 `/*T! … */` 都属于可执行注释,普通 `/* … */` 注释可以使用。 +- 不接受 `EXPLAIN ANALYZE`,提示 `MySQL EXPLAIN ANALYZE is not allowed`;单用 `EXPLAIN` 或 `DESC` 可以。 + +这是一条按词法判断的只读策略,挡的是明显的写操作;数据源账号本身的只读权限才是真正的边界。 + ## 阈值判定模式 此模式适用于需要对聚合后的数值进行阈值比对的场景。 diff --git a/zh/monitors/alert-rules/sls.mdx b/zh/monitors/alert-rules/sls.mdx index ab450d7a..c6397f79 100644 --- a/zh/monitors/alert-rules/sls.mdx +++ b/zh/monitors/alert-rules/sls.mdx @@ -71,7 +71,14 @@ Monitors 按配置的时间范围执行 SLS 查询,按标签字段区分告警 此模式用于监控"预期应该有数据,但实际没有数据"的场景。 -SLS 不支持按曲线(per-series)的无数据检测,只能使用“**所有查询均无返回数据时告警**”判定,不支持“之前查到过数据,现在查不到了,就告警”。 +SLS 提供两种无数据判定,二选一或按需分别启用: + +| 判定 | 触发条件 | 恢复方式 | +|------|----------|----------| +| **之前查到过数据,现在查不到了,就告警** | 按曲线判定,每条曲线各自计算:这条曲线之前查到过数据、现在查不到即告警 | 可选 **数据重新出现后自动结束**、**数据恢复或超时后自动结束**(需填 **自动关闭时间**,单位秒、最小 1)或 **仅允许手工关闭** | +| **所有查询均无返回数据时告警** | 所有查询在连续 N 次检测中都返回空结果时告警,N 由该页签共享的 **触发条件** 决定 | 固定为 **任一查询重新查到数据后自动恢复**,不可配置 | + +云日志类数据源里只有腾讯云 CLS 不支持按曲线判定,见[腾讯云 CLS](/zh/monitors/alert-rules/tencent-cls)。 ### 配置方式 @@ -80,16 +87,7 @@ SLS 不支持按曲线(per-series)的无数据检测,只能使用“**所 ```sql * | SELECT host, max(__time__) as last_seen GROUP BY host ``` -2. **判定规则**:所有查询在连续 N 次检测中都返回空结果时,触发"数据缺失"告警。N 由该页签共享的“触发条件”决定。 - -### 存量已启用按曲线检测的规则 - -如果已有的 SLS 规则开启了按曲线的无数据检测,打开编辑页时该判定会被自动关闭,保存后生效;不打开编辑页,规则不会变化。 - -- 规则还有其他已启用的判定(阈值判定、数据存在)时,可以直接保存。 -- 这是规则唯一的判定时,需要先启用至少一项判定才能保存。 - -建议改用“所有查询均无返回数据时告警”,确认至少启用了一项判定后再保存。 +2. **判定规则**:选择上表中的判定方式并启用。选「所有查询均无返回数据时告警」时,N 由该页签共享的 **触发条件** 决定;选「之前查到过数据,现在查不到了,就告警」时,按曲线分别判定,可另外配置上表中的恢复方式。 ### 恢复逻辑 diff --git a/zh/monitors/folders/folders.mdx b/zh/monitors/folders/folders.mdx index 7f06756f..619cb3f4 100644 --- a/zh/monitors/folders/folders.mdx +++ b/zh/monitors/folders/folders.mdx @@ -35,6 +35,7 @@ Monitors 使用树形文件夹结构来组织和管理告警规则。每条告 - **单条规则**:点击行尾 `⋮` 菜单里的 **移动**。 - **多条规则**:勾选规则后,点击列表上方的 **移动**。 +- **在规则编辑页**:打开规则后,区块 1 的 **所属分组** 是一个下拉框,选中目标分组并保存即完成移动。 两种入口都打开 **移动到其他分组** 对话框: diff --git a/zh/monitors/quickstart/quickstart.mdx b/zh/monitors/quickstart/quickstart.mdx index 34b2b1d8..1a5151d9 100644 --- a/zh/monitors/quickstart/quickstart.mdx +++ b/zh/monitors/quickstart/quickstart.mdx @@ -71,7 +71,7 @@ keywords: ["入门指南", "monitedge", "数据源", "告警规则", "快速开 | 配置项 | 说明 | |--------|------| -| **所属分组** | 规则所在的分组路径(如“默认分组 / 数据库告警”)。如果分组已被删除或您无权访问,需要返回规则列表重新选择分组 | +| **所属分组** | 规则所在的分组路径(如“默认分组 / 数据库告警”)。编辑已有规则时这一行是可编辑的下拉框,按全路径列出您有权限的分组,选中并保存即把规则移到新分组;分组已被删除或您无权访问时不可编辑,需要返回规则列表重新选择分组 | | **规则名称** | 告警规则的名称,不支持引用变量(固定名称便于过滤、聚合操作)。同一分组内必须唯一;导入、编辑或移动规则时如与目标分组中已有规则重名,操作会失败 | | **附加标签** | 类似 Prometheus 中的 `labels`,会附加到所有告警事件上,便于过滤、路由、抑制。值的写法见下文 | @@ -215,15 +215,15 @@ Go 模板可以使用以下变量: ### 事件配置 -事件配置包括自定义字段与关联查询(默认折叠)、备注描述和重复发送配置。 +事件配置依次为协作空间、备注描述、重复发送配置,以及自定义字段与关联查询两个平铺小节。 | 配置项 | 说明 | |--------|------| -| **自定义字段** | 类似 Prometheus 中的 `annotations`,可附加仪表盘 URL、SOP URL 等 | -| **关联查询** | 不作为阈值判定依据,但可放到备注中作为变量引用(如附加日志样例) | -| **备注描述** | 非结构化文本字段,支持引用变量,便于值班人员快速定位问题 | | **协作空间** | 指定 Flashduty On-call 中的协作空间,不指定则根据集成路由规则投递 | +| **备注描述** | 非结构化文本字段,支持引用变量,便于值班人员快速定位问题 | | **重复通知** | 告警未恢复时持续通知,可配置间隔和最大次数(默认 10000 次) | +| **自定义字段** | 类似 Prometheus 中的 `annotations`,可附加仪表盘 URL、SOP URL 等。点标题右侧的 `+` 在弹窗里填 **字段名** 与 **字段值**;已添加的字段以 `键=值` 标签列出,点标签可再次修改、点标签上的 × 删除,字段名不能为空也不能重复 | +| **关联查询** | 独立小节,有自己的新增按钮;查询结果不作为阈值判定依据,但可在备注中作为变量引用(如附加日志样例) | 最大通知次数并不代表终端用户收到的消息提醒次数。因为 Monitors 产生的告警事件会投递到 On-call,可能会被聚合降噪,最终发送次数取决于 On-call 配置。 diff --git a/zh/on-call/channel/escalation-rule.mdx b/zh/on-call/channel/escalation-rule.mdx index d839b808..5b84fbdd 100644 --- a/zh/on-call/channel/escalation-rule.mdx +++ b/zh/on-call/channel/escalation-rule.mdx @@ -12,6 +12,8 @@ keywords: ["分派策略", "告警分派", "升级规则", "值班通知", "多 您可以对每条分派策略进行启用或禁用操作。禁用的策略在匹配时会被跳过,不会触发通知。此外,您还可以将分派策略复制到当前协作空间或其他协作空间,快速复用已有配置,详见[复制分派策略](#复制分派策略)。**编辑**、**复制**、**启用**/**停用**、**删除** 都在列表每行末尾的 **更多操作**(⋯)菜单里:策略启用时菜单提供 **停用**,停用后才提供 **启用** 与 **删除**;**停用** 与 **删除** 都会先弹出确认框。 +列表有 **表格** 和 **卡片** 两种展示方式,在列表右上角切换,选过的按成员记住。卡片按分派顺序平铺,右上角的序号悬停后变成拖拽手柄,拖到别的卡片上就调整了分派顺序;卡片上也保留 **更多操作**(⋯)菜单。卡片视图下,列表右上角的「视图」下拉里可以关掉卡片底部的 **上次修改**。 + ### 1. 触发条件 决定了哪些故障会触发当前策略。 diff --git a/zh/on-call/incident/search-view-incident.mdx b/zh/on-call/incident/search-view-incident.mdx index 05955870..ee9c88be 100644 --- a/zh/on-call/incident/search-view-incident.mdx +++ b/zh/on-call/incident/search-view-incident.mdx @@ -173,7 +173,7 @@ AI 总结仅适用于由告警自动触发的故障,手动创建的故障不 - 悬停任意一条会弹出详情卡:完整的查询语句(可复制)、按名称列出的**变量**(由告警标签填入,`未解析` 的变量标红)、以及 **时间范围**(上一行是相对告警的前后时长,如「告警前 60 分钟 → 后 10 分钟」,下一行是绝对起止时间),底部是 **打开入口** 按钮,点击在新页签打开查询工作台或仪表盘对应视图 - 标题旁的数字是快照里的入口条数;**N 个异常** 徽标统计其中渲染有问题的入口(查询渲染失败、仪表盘变量未解析、数据源或仪表盘已删除 / 无权限) - 默认只显示前 **3** 条,其余收在 **还有 N 个** 后面,点击展开或收起 -- 入口列表下方是 **关联告警规则** 卡片(规则名称 + 数据源,点击跳转到规则)与 **查询语句**:主查询按 `A` / `B` 逐条给出**触发时刻的值**,悬停可看完整表达式并复制,无数据告警会在对应主查询上标注 **无数据**;关联查询给出**触发时刻的结果表格** +- 入口列表下方是 **关联告警规则** 卡片(规则名称 + 数据源,点击跳转到规则)与 **查询语句**:主查询按 `A` / `B` 逐条给出**触发时刻的值**,悬停可看完整表达式并复制,无数据告警会在对应主查询上标注 **无数据**;关联查询给出**触发时刻的结果**:统计类查询是结果表格,VictoriaLogs / Loki 且查询方式为「原文」的关联查询按一行一条日志展示,字段以 `k=v` 排开、放不下的字段收成「+N 个字段」;悬停卡里最多展示 3 条结果,标题右侧的 **查看完整数据** 会打开查询工作台看全量 规则尚未配置排查入口时,区块会提示「规则还没配排查入口」并提供 **去配置** 跳转。其他无法显示的情况: diff --git a/zh/on-call/integration/alert-integration/alert-sources/chronosphere.mdx b/zh/on-call/integration/alert-integration/alert-sources/chronosphere.mdx index b97b9164..a116bf49 100644 --- a/zh/on-call/integration/alert-integration/alert-sources/chronosphere.mdx +++ b/zh/on-call/integration/alert-integration/alert-sources/chronosphere.mdx @@ -1,29 +1,29 @@ --- title: "Chronosphere 告警集成" sidebarTitle: "Chronosphere" -description: "通过 Chronosphere 的 Webhook 通知器,使用 Flashduty 的 Prometheus 集成接收 Chronosphere 告警,开启恢复通知后自动关闭告警。" +description: "通过 Chronosphere 的 Webhook 通知器,使用 Flashduty 的 Prometheus Alertmanager 集成接收 Chronosphere 告警,开启恢复通知后自动关闭告警。" keywords: ["告警集成", "Chronosphere", "Webhook", "Prometheus", "Alertmanager", "可观测性"] --- -Chronosphere 的 Webhook 通知器(Notifier)向您填写的 URL 发送 HTTP POST 请求,请求体是 Prometheus Alertmanager 格式的 JSON(`version` 为 `4`,包含 `status`、`alerts`、`fingerprint`、`labels`、`annotations`、`startsAt`、`endsAt`,另有一个 `notifier` 字段)。Flashduty 的 [Prometheus 集成](/zh/on-call/integration/alert-integration/alert-sources/prometheus) 与该格式兼容,因此不需要单独的 Chronosphere 集成:在 Flashduty 创建 Prometheus 集成,把它的推送地址填进 Chronosphere 即可。 +Chronosphere 的 Webhook 通知器(Notifier)向您填写的 URL 发送 HTTP POST 请求,请求体是 Prometheus Alertmanager 格式的 JSON(`version` 为 `4`,包含 `status`、`alerts`、`fingerprint`、`labels`、`annotations`、`startsAt`、`endsAt`,另有一个 `notifier` 字段)。Flashduty 的 [Prometheus Alertmanager 集成](/zh/on-call/integration/alert-integration/alert-sources/prometheus) 与该格式兼容,因此不需要单独的 Chronosphere 集成:在 Flashduty 创建 Prometheus Alertmanager 集成,把它的推送地址填进 Chronosphere 即可。
## 在 Flashduty On-call -您可通过以下两种方式获取集成推送地址,任选其一即可。**集成类型都选择 Prometheus**,不是 Chronosphere。 +您可通过以下两种方式获取集成推送地址,任选其一即可。**集成类型都选择 Prometheus Alertmanager**,不是 Chronosphere。 ### 使用专属集成 1. 进入 Flashduty 控制台,选择 **协作空间**,打开一个协作空间 2. 选择 **配置** → **集成数据** → **专属集成**,点击 **新增一个集成** -3. 选择 **Prometheus**,点击 **保存** +3. 选择 **Prometheus Alertmanager**,点击 **保存** 4. 打开生成的集成卡片,复制 **推送地址**,形如 `https://api.flashcat.cloud/event/push/alert/prometheus?integration_key=<集成密钥>` ### 使用共享集成 1. 进入 Flashduty 控制台,选择 **集成中心 → 告警事件** -2. 选择 **Prometheus**,填写集成名称 +2. 选择 **Prometheus Alertmanager**,填写集成名称 3. 配置默认路由并选择协作空间;创建后可在 **路由** 中增加更多规则 4. 点击 **保存**,复制生成的 **推送地址** @@ -91,6 +91,6 @@ Chronosphere 的 Webhook 通知器(Notifier)向您填写的 URL 发送 HTTP ## 排查问题 -- **Flashduty 返回 `Invalid parameters`**:推送地址不完整,缺少 `integration_key`,或集成类型不是 Prometheus +- **Flashduty 返回 `Invalid parameters`**:推送地址不完整,缺少 `integration_key`,或集成类型不是 Prometheus Alertmanager - **告警没有恢复**:确认通知器已选择 **Notify when resolved**(Terraform 的 `send_resolved` 为 `true`、Chronoctl 的 `skip_resolved` 为 `false`),并且恢复通知的 `fingerprint` 与触发时一致 - **收不到任何告警**:确认通知策略把该通知器加入了对应严重程度的路由,并检查 Chronosphere 能否访问 `api.flashcat.cloud` diff --git a/zh/on-call/integration/alert-integration/alert-sources/cubeapm.mdx b/zh/on-call/integration/alert-integration/alert-sources/cubeapm.mdx index b2475b8f..21f1138f 100644 --- a/zh/on-call/integration/alert-integration/alert-sources/cubeapm.mdx +++ b/zh/on-call/integration/alert-integration/alert-sources/cubeapm.mdx @@ -1,29 +1,29 @@ --- title: "CubeAPM 告警集成" sidebarTitle: "CubeAPM" -description: "通过 CubeAPM 的 Webhook 接收器,使用 Flashduty 的 Prometheus 集成接收 CubeAPM 告警,恢复时自动关闭告警。" +description: "通过 CubeAPM 的 Webhook 接收器,使用 Flashduty 的 Prometheus Alertmanager 集成接收 CubeAPM 告警,恢复时自动关闭告警。" keywords: ["告警集成", "CubeAPM", "Webhook", "Prometheus", "Alertmanager", "可观测性"] --- -CubeAPM 支持把告警通知以 HTTP POST 的方式发送到任意 Webhook URL,默认的 JSON 请求体与 Prometheus Alertmanager 的 Webhook 格式兼容(包含 `receiver`、`status`、`alerts`、`groupLabels`、`commonLabels`、`commonAnnotations`、`externalURL` 等;每条告警带 `status`、`labels`、`annotations`、`startsAt`、`endsAt`、`generatorURL`、`fingerprint`,另有 CubeAPM 自己的 `cubeImageURL`、`cubeSampleLog`)。Flashduty 的 [Prometheus 集成](/zh/on-call/integration/alert-integration/alert-sources/prometheus) 与该格式兼容,因此不需要单独的 CubeAPM 集成:在 Flashduty 创建 Prometheus 集成,把它的推送地址填进 CubeAPM 即可。 +CubeAPM 支持把告警通知以 HTTP POST 的方式发送到任意 Webhook URL,默认的 JSON 请求体与 Prometheus Alertmanager 的 Webhook 格式兼容(包含 `receiver`、`status`、`alerts`、`groupLabels`、`commonLabels`、`commonAnnotations`、`externalURL` 等;每条告警带 `status`、`labels`、`annotations`、`startsAt`、`endsAt`、`generatorURL`、`fingerprint`,另有 CubeAPM 自己的 `cubeImageURL`、`cubeSampleLog`)。Flashduty 的 [Prometheus Alertmanager 集成](/zh/on-call/integration/alert-integration/alert-sources/prometheus) 与该格式兼容,因此不需要单独的 CubeAPM 集成:在 Flashduty 创建 Prometheus Alertmanager 集成,把它的推送地址填进 CubeAPM 即可。
## 在 Flashduty On-call -您可通过以下两种方式获取集成推送地址,任选其一即可。**集成类型都选择 Prometheus**,不是 CubeAPM。 +您可通过以下两种方式获取集成推送地址,任选其一即可。**集成类型都选择 Prometheus Alertmanager**,不是 CubeAPM。 ### 使用专属集成 1. 进入 Flashduty 控制台,选择 **协作空间**,打开一个协作空间 2. 选择 **配置** → **集成数据** → **专属集成**,点击 **新增一个集成** -3. 选择 **Prometheus**,点击 **保存** +3. 选择 **Prometheus Alertmanager**,点击 **保存** 4. 打开生成的集成卡片,复制 **推送地址**,形如 `https://api.flashcat.cloud/event/push/alert/prometheus?integration_key=<集成密钥>` ### 使用共享集成 1. 进入 Flashduty 控制台,选择 **集成中心 → 告警事件** -2. 选择 **Prometheus**,填写集成名称 +2. 选择 **Prometheus Alertmanager**,填写集成名称 3. 配置默认路由并选择协作空间;创建后可在 **路由** 中增加更多规则 4. 点击 **保存**,复制生成的 **推送地址** @@ -81,6 +81,6 @@ CubeAPM 文档说明,Webhook 的 JSON 请求体默认与 Alertmanager 格式 ## 排查问题 -- **Flashduty 返回 `Invalid parameters`**:推送地址不完整,缺少 `integration_key`,或集成类型不是 Prometheus +- **Flashduty 返回 `Invalid parameters`**:推送地址不完整,缺少 `integration_key`,或集成类型不是 Prometheus Alertmanager - **告警没有恢复**:确认自定义 Payload 中每条告警的 `status` 和 `fingerprint` 都存在,且恢复通知的 `fingerprint` 与触发时一致 - **收不到任何告警**:确认 CubeAPM 能访问 `api.flashcat.cloud`,并且告警规则选择了该 Webhook 接收器 diff --git a/zh/on-call/integration/alert-integration/alert-sources/prometheus.mdx b/zh/on-call/integration/alert-integration/alert-sources/prometheus.mdx index 20b71ee9..8961c013 100644 --- a/zh/on-call/integration/alert-integration/alert-sources/prometheus.mdx +++ b/zh/on-call/integration/alert-integration/alert-sources/prometheus.mdx @@ -35,7 +35,7 @@ keywords: ["告警集成", "Prometheus", "监控告警", "数据接入"] 1. 进入 Flashduty 控制台,选择 **协作空间**,打开一个协作空间 2. 选择 **配置** → **集成数据** → **专属集成**,点击 **新增一个集成** - 3. 选择 **Prometheus** 集成,点击 **保存**,生成卡片。 + 3. 选择 **Prometheus Alertmanager** 集成,点击 **保存**,生成卡片。 4. 打开生成的集成卡片,复制 **推送地址** @@ -49,7 +49,7 @@ keywords: ["告警集成", "Prometheus", "监控告警", "数据接入"] 1. 进入 Flashduty 控制台,选择 **集成中心 → 告警事件** - 2. 选择 **Prometheus** 集成: + 2. 选择 **Prometheus Alertmanager** 集成: - **集成名称**:为当前集成定义一个名称。 3. 配置默认路由并选择协作空间;创建后可在 **路由** 中增加更多规则 4. 点击 **保存**,复制生成的 **推送地址** diff --git a/zh/on-call/integration/alert-integration/alert-sources/red-hat-openshift.mdx b/zh/on-call/integration/alert-integration/alert-sources/red-hat-openshift.mdx index 47457a80..8122a495 100644 --- a/zh/on-call/integration/alert-integration/alert-sources/red-hat-openshift.mdx +++ b/zh/on-call/integration/alert-integration/alert-sources/red-hat-openshift.mdx @@ -1,29 +1,29 @@ --- title: "Red Hat OpenShift 告警集成" sidebarTitle: "Red Hat OpenShift" -description: "通过 OpenShift 监控内置 Alertmanager 的 Webhook 接收器,使用 Flashduty 的 Prometheus 集成接收 OpenShift 集群告警,恢复时自动关闭告警。" +description: "通过 OpenShift 监控内置 Alertmanager 的 Webhook 接收器,使用 Flashduty 的 Prometheus Alertmanager 集成接收 OpenShift 集群告警,恢复时自动关闭告警。" keywords: ["告警集成", "Red Hat OpenShift", "OpenShift", "Alertmanager", "Webhook", "Prometheus", "Kubernetes"] --- -OpenShift Container Platform 的监控栈自带 Alertmanager(`openshift-monitoring` 项目中的 `alertmanager-main`)。官方文档列出的接收器类型包括 PagerDuty、Webhook、Email、Slack 和 Microsoft Teams,并说明上游 Alertmanager 支持的配置项在 OpenShift 中同样支持。Webhook 接收器向您填写的地址发送 Alertmanager 格式的 JSON(`version` 为 `4`,每条告警带 `status`、`labels`、`annotations`、`startsAt`、`endsAt`、`generatorURL`、`fingerprint`)。Flashduty 的 [Prometheus 集成](/zh/on-call/integration/alert-integration/alert-sources/prometheus) 与该格式兼容,因此不需要单独的 OpenShift 集成:在 Flashduty 创建 Prometheus 集成,把它的推送地址配置为 OpenShift Alertmanager 的 Webhook 接收器。 +OpenShift Container Platform 的监控栈自带 Alertmanager(`openshift-monitoring` 项目中的 `alertmanager-main`)。官方文档列出的接收器类型包括 PagerDuty、Webhook、Email、Slack 和 Microsoft Teams,并说明上游 Alertmanager 支持的配置项在 OpenShift 中同样支持。Webhook 接收器向您填写的地址发送 Alertmanager 格式的 JSON(`version` 为 `4`,每条告警带 `status`、`labels`、`annotations`、`startsAt`、`endsAt`、`generatorURL`、`fingerprint`)。Flashduty 的 [Prometheus Alertmanager 集成](/zh/on-call/integration/alert-integration/alert-sources/prometheus) 与该格式兼容,因此不需要单独的 OpenShift 集成:在 Flashduty 创建 Prometheus Alertmanager 集成,把它的推送地址配置为 OpenShift Alertmanager 的 Webhook 接收器。
## 在 Flashduty On-call -您可通过以下两种方式获取集成推送地址,任选其一即可。**集成类型都选择 Prometheus**,不是 Red Hat OpenShift。 +您可通过以下两种方式获取集成推送地址,任选其一即可。**集成类型都选择 Prometheus Alertmanager**,不是 Red Hat OpenShift。 ### 使用专属集成 1. 进入 Flashduty 控制台,选择 **协作空间**,打开一个协作空间 2. 选择 **配置** → **集成数据** → **专属集成**,点击 **新增一个集成** -3. 选择 **Prometheus**,点击 **保存** +3. 选择 **Prometheus Alertmanager**,点击 **保存** 4. 打开生成的集成卡片,复制 **推送地址**,形如 `https://api.flashcat.cloud/event/push/alert/prometheus?integration_key=<集成密钥>` ### 使用共享集成 1. 进入 Flashduty 控制台,选择 **集成中心 → 告警事件** -2. 选择 **Prometheus**,填写集成名称 +2. 选择 **Prometheus Alertmanager**,填写集成名称 3. 配置默认路由并选择协作空间;创建后可在 **路由** 中增加更多规则 4. 点击 **保存**,复制生成的 **推送地址** @@ -133,6 +133,6 @@ OpenShift 官方文档提供两种方式配置接收器,任选其一。操作 ## 排查问题 -- **Flashduty 返回 `Invalid parameters`**:推送地址不完整,缺少 `integration_key`,或集成类型不是 Prometheus +- **Flashduty 返回 `Invalid parameters`**:推送地址不完整,缺少 `integration_key`,或集成类型不是 Prometheus Alertmanager - **告警没有恢复**:确认接收器没有关闭 `send_resolved` - **收不到任何告警**:确认路由的 `matchers` 或 **Routing labels** 与告警标签匹配,集群能访问 `api.flashcat.cloud`(集群使用 HTTP 代理时,参考 OpenShift 文档中 `proxy_from_environment` 的说明),可用 `oc exec alertmanager-main-0 -n openshift-monitoring -- amtool config routes show --alertmanager.url http://localhost:9093` 查看生效的路由 diff --git a/zh/on-call/integration/alert-integration/alert-sources/robusta.mdx b/zh/on-call/integration/alert-integration/alert-sources/robusta.mdx index b9cc4d98..af2727a4 100644 --- a/zh/on-call/integration/alert-integration/alert-sources/robusta.mdx +++ b/zh/on-call/integration/alert-integration/alert-sources/robusta.mdx @@ -92,7 +92,7 @@ kubectl run crashy --image=busybox --restart=Always -- sh -c 'exit 1' -如果您的 Prometheus 告警不经过 Robusta,也可以让 Alertmanager 直接推送到 Flashduty 的 [Prometheus 集成](/zh/on-call/integration/alert-integration/alert-sources/prometheus)。 +如果您的 Prometheus 告警不经过 Robusta,也可以让 Alertmanager 直接推送到 Flashduty 的 [Prometheus Alertmanager 集成](/zh/on-call/integration/alert-integration/alert-sources/prometheus)。 ## Alert Key diff --git a/zh/openapi/rate-limits.mdx b/zh/openapi/rate-limits.mdx index 5ea46ddd..725e52b5 100644 --- a/zh/openapi/rate-limits.mdx +++ b/zh/openapi/rate-limits.mdx @@ -6,7 +6,7 @@ keywords: ["API限流", "错误码", "频率限制", "权限限制", "重试"] ## 频率限制 -每个接口都有频率限制。限制按账户计算(同一账户下的所有 APP Key 和控制台会话共用一份额度),分每秒和每分钟两个窗口;此外每个接口还有一个所有账户共享的平台级上限。某个接口的具体数值见其页面的 **限制说明**。 +每个接口都有频率限制。限制按账户计算(同一账户下的所有 APP Key 和控制台会话共用一份额度),分每秒和每分钟两个窗口。某个接口的具体数值见其页面的 **限制说明**。 每个账户的默认限制: diff --git a/zh/rum/error-tracking/source-mapping.mdx b/zh/rum/error-tracking/source-mapping.mdx index 41397709..29c42a91 100644 --- a/zh/rum/error-tracking/source-mapping.mdx +++ b/zh/rum/error-tracking/source-mapping.mdx @@ -524,6 +524,7 @@ FLASHCAT_API_KEY=your-api-key npx @flashcatcloud/flashcat-cli sourcemaps upload- | 功能 | 说明 | |------|------| | 查看已上传的符号文件 | 列出所有已上传的文件(SourceMap、小程序 SourceMap、ProGuard mapping 文件、dSYM、NDK 原生符号文件、Flutter 符号文件、Electron Breakpad 符号文件、React Native bundle sourcemap),包括路径、服务名、版本号、大小和上传时间。Android 标签页同时展示 ProGuard mapping 文件和 NDK 原生符号文件,NDK 行会显示 build_id、arch 和 lib_name 列;Electron 标签页每个原生模块一行,展示模块(lib_name)、Debug ID(build_id)、架构(arch)、服务、版本和大小列,并支持按 Debug ID 搜索 | +| 按上传时间筛选 | 列表支持按上传时间筛选符号文件。单次筛选的时间跨度最多 30 天,最早只能回溯到 365 天前;更早上传的符号文件无法筛出 | | 按平台筛选 | 在 Web、iOS、Android、微信小程序、HarmonyOS、Flutter、Electron 和 React Native 标签页之间切换,查看不同平台的符号文件 | | 版本管理 | 通过 `service` 和 `release-version` 参数为不同版本的应用分别管理 | | 小程序维度 | 微信小程序列表展示 AppID 和分包两列;主包显示「主包」,未上传 AppID 时显示 `-` |