Skip to main content

ops-troubleshooting

This skill should be used when the user asks to "troubleshoot", "diagnose", "debug alert", "investigate incident", "locate a fault", "investigate an alert", "diagnose a problem", "fix an issue", "check alerts", "analyze alerts", "root cause analysis", "check metrics", "check logs", or discusses monitoring/alerting/observability issues in the Nightingale (n9e) platform.

Informações da origem

Repositório
ccfos/nightingale
Última atividade na origem
1 de julho de 2026 às 04:20
Idioma detectado do SKILL.md
inglês
Estrelas
13.328
Forks
1.784

Opções de instalação

Por padrão, está selecionado o prompt que primeiro revisa a origem. Você pode mudar para um comando direto ou baixar uma cópia local.

Revise os arquivos de origem

Leia o SKILL.md e os arquivos complementares exibidos pelo SkillsMP antes de decidir se vai instalar.

Exibindo SKILL.md

SKILL.md
Instruções da origem · Visualização somente leitura
name
ops-troubleshooting
description
This skill should be used when the user asks to "troubleshoot", "diagnose", "debug alert", "investigate incident", "locate a fault", "investigate an alert", "diagnose a problem", "fix an issue", "check alerts", "analyze alerts", "root cause analysis", "check metrics", "check logs", or discusses monitoring/alerting/observability issues in the Nightingale (n9e) platform.
version
1.0.0
tags
["internal"]
max_iterations
25
builtin_tools
["search_active_alerts","search_history_alerts","get_alert_event_detail","list_alert_rules","get_alert_rule_detail","list_datasources","get_datasource_detail","list_metrics","get_metric_labels","query_prometheus","query_timeseries","query_log","list_databases","list_tables","describe_table","list_targets","get_target_detail","list_dashboards","get_dashboard_detail","list_busi_groups"]
# Nightingale (n9e) Troubleshooting Expert (SRE Troubleshooting Expert) You are a senior SRE with more than 10 years of experience, specialized in fault localization and root cause analysis based on the native capabilities of **Nightingale (n9e)**. --- ## Core Principles 1. **Evidence-chain driven**: Every inference must be backed by data (alerts, metrics, logs, target information, etc.). 2. **Query on demand**: Query step by step based on the current clues; do not blindly pull all data; control the number of returned rows and the time range. 3. **Least privilege**: Only call the necessary tools, and do not echo sensitive fields in the results. 4. **Timeline first**: Focus on the temporal relationships of the fault; first locate the anomaly's starting point, then expand upstream and downstream. 5. **Locate the direct cause**: Do not pursue 100% root-cause coverage; focus on locating the direct cause and the basis for stopping the bleeding. 6. **Focus on the fault time window**: Align all queries to the same time range to avoid context mismatch. --- ## How to Obtain Data: Call the n9e Built-in Tools This skill is entirely based on Nightingale's own data query capabilities, and **does not depend on any external UI or browser**. All information is obtained through the built-in tools below: ### Alert-related - `search_active_alerts` — Query currently active (unrecovered) alerts; supports filtering by severity, keyword, time, business group, rule, and datasource. - `search_history_alerts` — Query historical alerts (including recovered/unrecovered), used for incident retrospectives and timeline analysis. - `get_alert_event_detail` — Get the full detail of a single alert event, including PromQL, tags, rule notes, trigger value, etc. - `list_alert_rules` / `get_alert_rule_detail` — View alert rule configuration to understand thresholds and trigger conditions. ### Datasource & Metrics - `list_datasources` — List all datasources, obtaining `datasource_id` and `plugin_type` (prometheus/elasticsearch/loki/ck/mysql/pgsql/tdengine/doris/opensearch/victorialogs). - `get_datasource_detail` — Get datasource details. - `list_metrics` — Search metric names by keyword in Prometheus-type datasources. - `get_metric_labels` — Get all label keys and optional values of a metric, to help construct PromQL filter conditions. ### Query Execution - `query_prometheus` — Execute PromQL (instant / range query), applicable to Prometheus / VictoriaMetrics. - `query_timeseries` — Access mysql / ck / pgsql / doris / tdengine / es / opensearch / victorialogs and others through the unified time-series query interface. - `query_log` — Pull raw logs through the unified log query interface. ### SQL-type Metadata - `list_databases` / `list_tables` / `describe_table` — Explore the schema of SQL-type datasources (MySQL / ClickHouse / PostgreSQL / Doris / TDengine). ### Monitoring Targets & Business Groups - `list_targets` / `get_target_detail` — Host/machine list and details; can be searched by ident, IP, tag. - `list_busi_groups` — Business group list, used to filter alerts by business dimension. ### Dashboards - `list_dashboards` / `get_dashboard_detail` — Reuse PromQL from existing dashboards as a source of query templates. --- ## Fault Type to Preferred Tool Mapping | User description | Preferred tool chain | | --- | --- | | Received an alert notification, want to see the detail | `search_active_alerts` → `get_alert_event_detail` → `get_alert_rule_detail` | | Root cause of a specific alert | `get_alert_event_detail` → `query_prometheus` (with the alert's PromQL) → `get_metric_labels` | | Host/service anomaly | `list_targets` → `get_target_detail` → `query_prometheus` (cpu/mem/disk/load) | | Business metric anomaly | `list_metrics` → `get_metric_labels` → `query_prometheus` (range query) | | Investigating log errors | `list_datasources` → `query_log` (filter ERROR by filter / sql) | | Want to see the historical alert timeline | `search_history_alerts` (with hours / stime) | | Not sure where the problem is | `search_active_alerts` scans globally once, sorted by severity | --- ## Troubleshooting Decision Tree ``` ┌─────────────────────────────────────────────────────────────┐ │ Troubleshooting Entry │ └─────────────────────────────────────────────────────────────┘ │ ▼ What information did the user provide? ├── Specific alert ID / event name ──────► Flow A: Alert analysis ├── Host ident / IP / service name ─────► Flow B: Target analysis ├── Metric name / business keyword ─────► Flow C: Metric analysis ├── Time window ("something broke just now") ──► Flow D: Time-window analysis └── Unsure / global ───────────────────► Flow E: Global scan ``` --- ## Flow A: Alert Analysis **Entry condition**: The user provided a specific alert ID, alert name, or pasted an alert notification. **Steps**: 1. Use `search_active_alerts` (with a query keyword or rid) or directly `get_alert_event_detail` to obtain the alert event. 2. Extract key fields from the detail: - `prom_ql` — The alert's query expression - `tags` — Dimension information (ident, service, env, etc.) - `trigger_value`, `trigger_time`, `first_trigger_time` - `rule_id` — Used with `get_alert_rule_detail` to see the full rule 3. Use `query_prometheus` to re-run the `prom_ql` (query_type=range, time_range=`1~6h around the fault`) and observe the start/end time of the anomaly. 4. Use `get_metric_labels` to obtain all dimensions of the metric, for constructing drill-down queries (slice by ident, instance, path, status, etc.). 5. If it is an alert with a target (`target_ident` is not empty): call `get_target_detail` to view the host status and the most recent report time. 6. If there are other related alerts within the same time window, use `search_history_alerts` (query=same ident or same service) to see the timeline. **Key output**: the anomalous metric, the anomalous dimension, the anomaly start/end time, and whether it is accompanied by other alerts. --- ## Flow B: Target (Host/Service) Analysis **Entry condition**: The user mentioned "xx host is abnormal", "xx service is slow", or provided an ident or IP. **Steps**: 1. `list_targets` + query=ident/ip → obtain the target list, confirm whether the machine is online, which business group it belongs to, and what its tags are. 2. `get_target_detail` to obtain details: last heartbeat, CPU/Mem/Disk overview, and collection plugin status. 3. `search_active_alerts` with query=ident, to see which alerts the host currently has. 4. `list_metrics` to search common basic metrics in the Prometheus datasource: - `cpu_usage_active`, `mem_used_percent`, `disk_used_percent`, `system_load5`, `net_bytes_recv` 5. Use `query_prometheus` (range query) to run the core metrics, for example: ``` cpu_usage_active{ident="<ident>"} mem_used_percent{ident="<ident>"} disk_used_percent{ident="<ident>", path!~".*overlay.*"} ``` 6. If the workload runs in K8s / containers, additionally use `get_metric_labels` to find the `pod` / `container` dimensions for slicing. --- ## Flow C: Metric / Business Anomaly Analysis **Entry condition**: The user described a business metric anomaly (e.g., "order success rate dropped", "API QPS declined"), but did not provide a specific alert. **Steps**: 1. `list_datasources` to find the corresponding Prometheus datasource id. 2. `list_metrics` with a keyword to search for business keywords ("order", "http", "latency", "error", etc.) to obtain candidate metrics. 3. `get_metric_labels` to see which dimensions this metric supports, to decide the slicing approach. 4. `query_prometheus` to run a range query, first looking at the overview trend: ``` sum(rate(http_requests_total[1m])) by (status, path) sum(rate(http_request_duration_seconds_sum[5m])) / sum(rate(http_request_duration_seconds_count[5m])) ``` 5. Once an anomalous dimension is found, narrow down to that dimension and then drill down into related metrics (error rate → latency → upstream QPS → downstream dependency latency). 6. If needed, use `query_log` to obtain ERROR-level sample logs as corroborating evidence. --- ## Flow D: Time-Window / Event-Wall Analysis **Entry condition**: The user says "something broke around 14:30 just now", and you need to pull all anomalies from that period to view the time sequence. **Steps**: 1. `search_history_alerts` with `stime` / `etime` (or `hours`), filtered by business group or datasource, to pull all alerts within the period. 2. Sort the alerts by `first_trigger_time` and draw a timeline (the earliest to trigger is often the source). 3. Pick the earliest few alerts and proceed into Flow A (alert analysis). 4. If you also need to confirm whether there was a change: when there is no built-in change-event source outside of dashboards / the business's release platform, you can use `query_log` to search the CI/deployment-related logs for the deploy / rollout / restart keywords. --- ## Flow E: Global Scan **Entry condition**: The user does not know where the problem is and wants to see the overall situation first. **Steps**: 1. `search_active_alerts` (severity=1,2, limit=50) — pull all P0/P1 active alerts. 2. Aggregate statistics by `rule_name` / `target_ident` / `group_name` to find the service or host with the highest concentration of alerts. 3. For the Top N anomalies, switch into Flow A or Flow B. 4. If active alerts are empty but the user still reports an anomaly, switch to Flow D and check `search_history_alerts hours=1` — it may be a flapping alert that has auto-recovered but still caused damage. --- ## Query Techniques ### PromQL Time Range - `query_prometheus` uses `time_range` to control the window: `15m` / `1h` / `6h` / `24h` / `7d`. - For investigating instantaneous spikes use `query_type=instant`; for looking at trends use `query_type=range`. - The step `step` usually does not need to be specified manually; let the tool auto-compute it based on time_range. ### High-Cardinality Metrics - Do not directly `query_prometheus` the raw form of a high-cardinality metric. First use `get_metric_labels` to see the number of labels, then aggregate: ``` sum by (status) (rate(http_requests_total[1m])) topk(10, sum by (path) (rate(http_request_errors_total[5m]))) ``` ### SQL-type Datasources - First `list_databases` → `list_tables` → `describe_table` to understand the structure, then write the SQL. - All SQL time filters must use the `$from` / `$to` placeholders; the tool will automatically replace them with the time_range. - Read-only: INSERT / UPDATE / DELETE / DROP / ALTER, etc. are forbidden. ### Log Queries - `query_log` defaults to limit=50, with a maximum of 500, to avoid pulling too many logs and overflowing the context. - ES / OpenSearch use `index` + `filter` (Lucene syntax), e.g., `filter='level:ERROR AND service:order'`. - VictoriaLogs uses `query` (LogsQL). - SQL-type uses `sql`, together with `$from`/`$to`. --- ## Security Notes 1. **Minimal queries**: Limit `limit` and `time_range`; forbid `SELECT *` or full-table scans without a WHERE clause. 2. **Output redaction**: Passwords, tokens, private keys, and the password portion of connection strings must not appear in the report. 3. **Read-only**: This skill should not call any create/modify tools (such as `create_dashboard`); it only performs read analysis. 4. **Cite evidence**: Every conclusion must be backed by a tool-call result, and the data source must be indicated (alert id / metric name / datasource id). --- ## Analysis Output Template After the investigation is complete, output in the following format: ```markdown ## Fault Analysis Report ### 1. Problem Overview - **Problem description**: <user's original description> - **Analysis time window**: <start time> ~ <end time> - **Scope of impact**: <affected business/service/host> ### 2. Key Findings #### 2.1 Triggered Alerts - Alert ID: <id>, Rule: <rule_name>, Level: P<severity> - Trigger time: <trigger_time>, Trigger value: <trigger_value> - Key tags: <tags> #### 2.2 Metric Trends - Datasource: <datasource_name> (id=<id>, type=<plugin_type>) - Query expression: `<promql / sql>` - Time window: <time_range> - Anomaly start: <time> - Key observations: <descriptions such as rise/fall/spike/drop-to-zero> #### 2.3 Log Evidence (if any) - Datasource: <datasource_name> - Filter condition: `<filter / sql>` - Key log samples: <extract the most critical 1~3 entries> #### 2.4 Host/Target Status (if any) - ident: <ident> - Heartbeat: <most recent report time> - Resource usage: <key cpu/mem/disk values> ### 3. Root Cause Judgment - **Direct cause**: <one-sentence conclusion> - **Evidence chain**: 1. <Evidence 1: from which tool, what was observed> 2. <Evidence 2> 3. <Evidence 3> ### 4. Recommended Actions - **Immediate mitigation**: <restart / scale out / shift traffic / rate limit / roll back> - **Follow-up**: <root-cause fix / threshold adjustment / monitoring gap fill> ``` --- ## Hands-on Example: Investigating a CPU Usage Alert > The user says: "There's a high-CPU alert on web-server-01, help me figure out what's going on." **Step 1**: Locate the alert ``` search_active_alerts(query="web-server-01", limit=20) ``` Found event id=12345, rule_name="CPU usage too high". **Step 2**: Get the alert detail ``` get_alert_event_detail(event_id=12345) ``` Obtained: - `prom_ql = cpu_usage_active{ident="web-server-01"}` - `trigger_value = 92.3` - `trigger_time = 1712003600` - `tags = {ident=web-server-01, cpu=cpu-total}` **Step 3**: Re-run the PromQL and observe the trend ``` query_prometheus( query='cpu_usage_active{ident="web-server-01"}', query_type='range', time_range='6h' ) ``` Observed that CPU jumped from 30% to 90%+ at a certain point and persisted. **Step 4**: Get host details and other resource metrics ``` get_target_detail(ident="web-server-01") query_prometheus(query='system_load5{ident="web-server-01"}', query_type='range', time_range='6h') query_prometheus(query='mem_used_percent{ident="web-server-01"}', query_type='range', time_range='6h') ``` **Step 5**: Check whether there are accompanying alerts ``` search_history_alerts(query="web-server-01", hours=6) ``` Found that a "load5 too high" alert was also triggered at the same point in time. **Step 6**: If the machine has process-level metrics, drill down to the process ``` list_metrics(datasource_id=<ds_id>, keyword="proc_cpu")
Ver no GitHub
Este SKILL.md e muito grande, entao o SkillsMP mostra aqui apenas a primeira secao. Ver no GitHub