PromQL查询生成器 promql-generator

这是一个全面的交互式工具包,用于生成遵循当前标准和约定的最佳实践PromQL查询。适用于创建新的PromQL查询、构建监控仪表板、实施告警规则或构建可观测性仪表板。

监控与告警 0 次安装 0 次浏览 更新于 3/4/2026

PromQL查询生成器

概述

这个工具包提供了一个全面的、交互式的工作流程,用于生成遵循当前标准和约定的最佳实践PromQL(Prometheus查询语言)查询。在创建新的PromQL查询、构建监控仪表板、实施告警规则或构建可观测性仪表板时,使用这个技能。

何时使用这个技能

在以下情况下调用这个技能:

  • 从头开始创建新的PromQL查询
  • 构建监控仪表板(Grafana、Prometheus UI等)
  • 为Prometheus Alertmanager实施告警规则
  • 分析指标以进行故障排除或容量规划
  • 将监控需求转换为PromQL表达式
  • 学习PromQL或教授他人
  • 用户要求“创建”、“生成”、“构建”或“编写”PromQL查询
  • 使用Prometheus指标(计数器、计量器、直方图、摘要)
  • 实施RED(速率、错误、持续时间)或USE(利用率、饱和度、错误)指标

交互式查询规划工作流程

关键:这个技能强调在查询生成前进行交互式规划。始终让用户参与协作规划过程,以确保生成的查询符合他们的确切意图。

在生成PromQL查询时遵循这个工作流程:

第1阶段:了解监控目标

首先了解用户想要监控或测量的内容。提出澄清问题以收集需求:

  1. 主要目标:您想要监控或测量什么?

    • 请求速率(每秒请求数)
    • 错误率(失败请求的百分比)
    • 延迟/持续时间(响应时间,百分位数)
    • 资源使用情况(CPU、内存、磁盘、网络)
    • 可用性/正常运行时间
    • 队列深度、饱和度、吞吐量
    • 自定义业务指标
  2. 用例:这个查询将用于什么?

    • 仪表板可视化(Grafana、Prometheus UI)
    • 告警规则(超出阈值时触发)
    • 临时故障排除/分析
    • 记录规则(预计算聚合)
    • 容量规划或SLO跟踪
  3. 上下文:还有其他上下文吗?

    • 服务/应用程序名称
    • 团队或项目
    • 优先级
    • 现有指标或命名约定

如果未提供,则使用AskUserQuestion工具收集这些信息。

何时提问与推断:如果用户的初始请求已经清楚地指定了目标、用例和上下文(例如,“为支付服务创建P95延迟>500ms的告警”),您可以在响应中确认这些细节,而不是重新提问。仅在缺少或含糊的信息时提出澄清问题。

第2阶段:确定可用指标

确定哪些指标可用且相关:

  1. 指标发现:有哪些指标可用?

    • 向用户询问指标名称
    • 如果不确定,建议使用常见的命名模式
    • 检查名称中的指标类型指示器:
      • _total后缀→计数器
      • _bucket_sum_count后缀→直方图
      • 没有后缀→可能是计量器
      • _created后缀→计数器创建时间戳
  2. 指标类型识别:确认指标类型

    • 计数器:只增加(或重置为零)的累积指标
      • 示例:http_requests_totalerrors_totalbytes_sent_total
      • 使用:rate()irate()increase()
    • 计量器:可以上升或下降的瞬时值
      • 示例:memory_usage_bytescpu_temperature_celsiusqueue_length
      • 使用:avg_over_time()min_over_time()max_over_time()或直接使用
    • 直方图:带有累积计数的观察桶
      • 示例:http_request_duration_seconds_bucketresponse_size_bytes_bucket
      • 使用:histogram_quantile()rate()
    • 摘要:预计算的百分位数,带有计数和总和
      • 示例:rpc_duration_seconds{quantile="0.95"}
      • 使用_sum_count进行平均值计算;不要平均百分位数
  3. 标签发现:这些指标上有哪些标签可用?

    • 常见标签:jobinstanceenvironmentserviceendpointstatus_codemethod
    • 询问哪些标签对于过滤或分组很重要

使用AskUserQuestion工具确认指标名称、类型和可用标签。

第3阶段:确定查询参数

收集查询的具体要求。

用户提供的参数预确认

重要:当用户在初始请求中已经指定了参数(例如,“5分钟窗口”、“500ms阈值”、“>5%错误率”),您必须:

  1. 在您的响应中明确确认提供的值
  2. 在AskUserQuestion中将它们作为预填充的默认值,第一个选项是“使用指定的值”
  3. 允许快速确认,而不是重新询问已经给出的信息

示例:如果用户说“当P95延迟超过500ms时发出告警”,使用:

AskUserQuestion:
- 问题:“确认告警阈值?”
- 选项:
  1. "500ms(如您所指定)" - 使用您的请求中的阈值
  2. "不同的阈值" - 让我指定一个不同的值

这尊重了用户的输入,并加快了工作流程,同时仍然允许修改。

  1. 时间范围:查询应该覆盖什么时间窗口?

    • 即时值(当前)
    • 随时间的速率([5m][1h][1d]
    • 对于速率计算:通常是[1m][5m]用于实时,[1h][1d]用于趋势
    • 经验法则:速率范围应该是抓取间隔的至少4倍
  2. 标签过滤:应该过滤哪些标签?

    • 完全匹配:job="api-server"status_code="200"
    • 负匹配:status_code!="200"
    • 正则匹配:instance=~"prod-.*"
    • 多个条件:{job="api", environment="production"}
  3. 聚合:数据应该被聚合吗?

    • 无聚合:原样返回所有时间序列
    • 按标签聚合sum by (job, endpoint)avg by (instance)
    • 无标签聚合sum without (instance, pod)avg without (job)
    • 常见聚合:sumavgmaxmincounttopkbottomk
  4. 阈值或条件:有特定条件吗?

    • 对于告警:阈值(例如,错误率>5%)
    • 对于过滤:只显示高于/低于某个值的系列
    • 对于比较:与历史数据比较(偏移)

使用AskUserQuestion工具收集或确认这些参数。当用户已经提供值时(例如,“5分钟窗口”、“>5%”),将它们作为默认选项以供确认。

第4阶段:呈现查询计划

在生成任何代码之前,以纯英语查询计划呈现,并请求用户确认:

## PromQL查询计划

根据您