schema_version: 1
id: top-cpu-overload-nodes-and-log-patterns-in-saas01-during-latest-window
title: Top CPU-overload nodes and error/warn log counts in saas01 during the latest completed Beijing 11:00-11:05 window
status: active
owner: codex
evaluation:
  mode: adhoc_evidence
environment:
  profile: stable-dedicated
  cluster_label: saas01
  cluster_id: '10989049060142230334'
  cluster_type: dedicated
  tidb_version: v8.5.x
time_window:
  resolved_by_output: resolved_window
runtime:
  hooks:
  - id: resolve_runtime_window
    stage: before_acp
    kind: python_script
    path: runtime_hook.py
    output_id: resolved_window
    args:
      - resolve-window
      - --cluster-id
      - '{{environment.cluster_id}}'
      - --cluster-label
      - '{{environment.cluster_label}}'
      - --local-hour
      - '11'
      - --local-minute
      - '0'
      - --duration-minutes
      - '5'
      - --top-n-per-component
      - '3'
  - id: build_runtime_reference
    stage: before_judge
    kind: python_script
    path: runtime_hook.py
    output_id: reference_answer
    args:
      - build-reference
      - --cluster-id
      - '{{environment.cluster_id}}'
      - --cluster-label
      - '{{environment.cluster_label}}'
      - --start
      - '{{runtime.resolved_window.start}}'
      - --end
      - '{{runtime.resolved_window.end}}'
      - --top-n-per-component
      - '3'
prompt:
  text: |
    帮我看下 {{environment.cluster_label}} 这个集群（{{environment.cluster_id}}）在 {{runtime.resolved_window.start}} 到 {{runtime.resolved_window.end}} 这 5 分钟里，CPU 平均 overload 最高的节点分别是谁。

    规则严格如下：
    1. 分三类组件分别统计：`tidb`、`tikv`、`pd`。
    2. 每类组件各取 3 个节点，不是全局混排 top9。
    3. 节点名必须输出 K8s pod 名，例如 `db-tidb-1`、`db-tikv-23`、`db-pd-0`。
    4. `avg_cpu_overload` 的定义固定为：
       - CPU 使用率分子：`rate(process_cpu_seconds_total{component="<component>"}[1m])`
       - CPU quota / maxprocs 分母：
         - `tidb` 用 `tidb_server_maxprocs`
         - `tikv` 用 `tikv_server_cpu_cores_quota`
         - `pd` 用 `pd_service_maxprocs`
       - 先取这 5 分钟内 1 分钟粒度 CPU rate 的均值，再除以对应节点的 quota / maxprocs。
    5. 排名规则：
       - 先按 `avg_cpu_overload` 从高到低；
       - 如果相同，再按节点名字典序。
    6. 对于每个入选节点，再统计同一时间窗内这个节点 `ERROR` 或 `WARN` 日志的总条数。
    7. 日志计数规则固定为：
       - 只统计 `ERROR`、`WARN`、`WARNING`；
       - `WARNING` 按 `WARN` 处理；
       - 同一条原始日志如果因为不同 selector 重复命中，只计 1 次。
    8. 如果某个节点在这 5 分钟里没有任何 `ERROR` / `WARN` 日志，就返回：
       - `error_warn_log_count`: `0`

    我只看最后结果。最终只输出一个 `json` 代码块，字段必须严格为：
    `cluster_id`、`window`、`evidence_sufficient`、`ranked_nodes`

    `ranked_nodes` 必须严格包含 9 个元素，并按下面顺序输出：
    1. 先输出 `tidb` 的第 1、2、3 名；
    2. 再输出 `tikv` 的第 1、2、3 名；
    3. 最后输出 `pd` 的第 1、2、3 名。

    `ranked_nodes` 里的每个元素都只能包含：
    `component`、`rank`、`node`、`avg_cpu_overload`、`error_warn_log_count`

    `avg_cpu_overload` 保留 4 位小数。

    不要输出额外字段，不要输出额外解释，也不要把说明写进 JSON。

    JSON 结构如下：

    ```json
    {
      "cluster_id": "10989049060142230334",
      "window": {
        "start": "2026-01-01T03:00:00Z",
        "end": "2026-01-01T03:05:00Z"
      },
      "evidence_sufficient": true,
      "ranked_nodes": [
        {
          "component": "tidb",
          "rank": 1,
          "node": "db-tidb-1",
          "avg_cpu_overload": 0.9134,
          "error_warn_log_count": 17
        }
      ]
    }
    ```

    如果证据不足，请把 `evidence_sufficient` 设为 `false`，并把 `ranked_nodes` 设为空数组。
tags:
- cpu
- logs
- structured-output
- adhoc-evidence
- saas01
case_tier: P1
cost_tier: low
followup:
  scheduled_max_followups: 0
execution:
  acp_bash_timeout_s: 300
