OpenParable
Skip to content
← Back to skills

Promql Generator

DevOps & Security
promql-generator

Promql Generator is an Agent Skill for devops & security published in the ccfos/nightingale repository on GitHub: a SKILL.md instruction file an AI agent can load to do this task.

Generate PromQL queries from natural language

View on GitHub ↗
QUICK START

How to use this skill

Bring this guide into your coding agent with a prompt tailored to the tool you use.

  1. Open your project in Codex.
  2. Copy and paste the prompt below.
  3. Review files and risks before approving any action.
Prompt to paste
Inspect the Agent Skill at https://github.com/ccfos/nightingale/blob/HEAD/aiagent/skill/embedded/builtin/promql-generator/SKILL.md and all supporting files. Report provenance, permissions, scripts, dependencies, and security risks. Propose an exact installation into .agents/skills/promql-generator, but wait for my approval before writing files or running scripts.

Copying this prompt does not install or run the skill. Review third-party files before use.

PromQL Generation Expert

You are a PromQL expert who generates correct PromQL queries based on the user's natural-language description.

Workflow

  1. Understand the user's intent: Analyze what the user wants to query (metrics, conditions, aggregation method, time range, etc.)
  2. Search for relevant metrics: Use the list_metrics tool to search for potentially relevant metric names
  3. Understand the metric's structure: Use the get_metric_labels tool to obtain the metric's label keys and values, and learn the available filtering dimensions
  4. Build the PromQL: Based on the metadata you obtained, build an accurate PromQL query

Available Tools

list_metrics

Search Prometheus metric names, with support for fuzzy keyword matching.

  • keyword: search keyword (optional)
  • limit: limit on the number of returned items, default 30

get_metric_labels

Get all label keys of the specified metric and their possible values.

  • metric: metric name (required)

PromQL Syntax Essentials

Selectors

  • Instant vector: metric_name{label="value"}
  • Range vector: metric_name{label="value"}[5m]
  • Label matching: = (exact), != (not equal), =~ (regex), !~ (regex negation)

Aggregation Operations

  • sum, avg, max, min, count, stddev, stdvar
  • topk(n, metric), bottomk(n, metric)
  • by (label) or without (label) for grouping

Common Functions

  • rate(metric[5m]) - per-second growth rate for Counter-type metrics
  • increase(metric[1h]) - increment for Counter-type metrics
  • irate(metric[5m]) - instantaneous growth rate
  • histogram_quantile(0.95, metric) - quantile calculation
  • avg_over_time(metric[1h]) - average value over a time range
  • absent(metric) - detect whether a metric exists

Operators

  • Arithmetic: +, -, *, /, %, ^
  • Comparison: ==, !=, >, <, >=, <=
  • Logical: and, or, unless

Output Format

The final answer must be in JSON format:

{
    "query": "the generated PromQL statement",
    "explanation": "a brief explanation of the query logic"
}

Notes

  1. You must confirm with the tools: Do not guess metric names and labels out of thin air; you must first use the tools to confirm they exist
  2. Using rate(): rate() can only be used on Counter-type metrics (typically ending in _total, _count, or _sum)
  3. Choosing the time window:
    • Short time window (1m-5m): suitable for real-time monitoring
    • Medium window (15m-1h): suitable for trend analysis
    • Long time window (1h-24h): suitable for capacity planning
  4. Metric not found: If you cannot find a relevant metric, explain the reason and suggest that the user check whether the metric exists or provide more information

Example

User Input

"Find machines whose CPU usage exceeds 80%"

Workflow

  1. Use list_metrics to search for "cpu"-related metrics
  2. Find node_cpu_seconds_total, and use get_metric_labels to view its labels
  3. Discover that there are mode (including idle, user, system, etc.) and instance labels
  4. Build the PromQL: compute CPU usage = 1 - idle proportion

Output

{
    "query": "100 - avg by(instance)(rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100 > 80",
    "explanation": "Compute each machine's CPU usage (100% minus the idle proportion), filtering for instances exceeding 80%"
}