PromQL查询生成器
概述
这个工具包提供了一个全面的、交互式的工作流程,用于生成遵循当前标准和约定的最佳实践PromQL(Prometheus查询语言)查询。在创建新的PromQL查询、构建监控仪表板、实施告警规则或构建可观测性仪表板时,使用这个技能。
何时使用这个技能
在以下情况下调用这个技能:
- 从头开始创建新的PromQL查询
- 构建监控仪表板(Grafana、Prometheus UI等)
- 为Prometheus Alertmanager实施告警规则
- 分析指标以进行故障排除或容量规划
- 将监控需求转换为PromQL表达式
- 学习PromQL或教授他人
- 用户要求“创建”、“生成”、“构建”或“编写”PromQL查询
- 使用Prometheus指标(计数器、计量器、直方图、摘要)
- 实施RED(速率、错误、持续时间)或USE(利用率、饱和度、错误)指标
交互式查询规划工作流程
关键:这个技能强调在查询生成前进行交互式规划。始终让用户参与协作规划过程,以确保生成的查询符合他们的确切意图。
在生成PromQL查询时遵循这个工作流程:
第1阶段:了解监控目标
首先了解用户想要监控或测量的内容。提出澄清问题以收集需求:
-
主要目标:您想要监控或测量什么?
- 请求速率(每秒请求数)
- 错误率(失败请求的百分比)
- 延迟/持续时间(响应时间,百分位数)
- 资源使用情况(CPU、内存、磁盘、网络)
- 可用性/正常运行时间
- 队列深度、饱和度、吞吐量
- 自定义业务指标
-
用例:这个查询将用于什么?
- 仪表板可视化(Grafana、Prometheus UI)
- 告警规则(超出阈值时触发)
- 临时故障排除/分析
- 记录规则(预计算聚合)
- 容量规划或SLO跟踪
-
上下文:还有其他上下文吗?
- 服务/应用程序名称
- 团队或项目
- 优先级
- 现有指标或命名约定
如果未提供,则使用AskUserQuestion工具收集这些信息。
何时提问与推断:如果用户的初始请求已经清楚地指定了目标、用例和上下文(例如,“为支付服务创建P95延迟>500ms的告警”),您可以在响应中确认这些细节,而不是重新提问。仅在缺少或含糊的信息时提出澄清问题。
第2阶段:确定可用指标
确定哪些指标可用且相关:
-
指标发现:有哪些指标可用?
- 向用户询问指标名称
- 如果不确定,建议使用常见的命名模式
- 检查名称中的指标类型指示器:
_total后缀→计数器_bucket、_sum、_count后缀→直方图- 没有后缀→可能是计量器
_created后缀→计数器创建时间戳
-
指标类型识别:确认指标类型
- 计数器:只增加(或重置为零)的累积指标
- 示例:
http_requests_total、errors_total、bytes_sent_total - 使用:
rate()、irate()、increase()
- 示例:
- 计量器:可以上升或下降的瞬时值
- 示例:
memory_usage_bytes、cpu_temperature_celsius、queue_length - 使用:
avg_over_time()、min_over_time()、max_over_time()或直接使用
- 示例:
- 直方图:带有累积计数的观察桶
- 示例:
http_request_duration_seconds_bucket、response_size_bytes_bucket - 使用:
histogram_quantile()、rate()
- 示例:
- 摘要:预计算的百分位数,带有计数和总和
- 示例:
rpc_duration_seconds{quantile="0.95"} - 使用
_sum和_count进行平均值计算;不要平均百分位数
- 示例:
- 计数器:只增加(或重置为零)的累积指标
-
标签发现:这些指标上有哪些标签可用?
- 常见标签:
job、instance、environment、service、endpoint、status_code、method - 询问哪些标签对于过滤或分组很重要
- 常见标签:
使用AskUserQuestion工具确认指标名称、类型和可用标签。
第3阶段:确定查询参数
收集查询的具体要求。
用户提供的参数预确认
重要:当用户在初始请求中已经指定了参数(例如,“5分钟窗口”、“500ms阈值”、“>5%错误率”),您必须:
- 在您的响应中明确确认提供的值
- 在AskUserQuestion中将它们作为预填充的默认值,第一个选项是“使用指定的值”
- 允许快速确认,而不是重新询问已经给出的信息
示例:如果用户说“当P95延迟超过500ms时发出告警”,使用:
AskUserQuestion:
- 问题:“确认告警阈值?”
- 选项:
1. "500ms(如您所指定)" - 使用您的请求中的阈值
2. "不同的阈值" - 让我指定一个不同的值
这尊重了用户的输入,并加快了工作流程,同时仍然允许修改。
-
时间范围:查询应该覆盖什么时间窗口?
- 即时值(当前)
- 随时间的速率(
[5m]、[1h]、[1d]) - 对于速率计算:通常是
[1m]到[5m]用于实时,[1h]到[1d]用于趋势 - 经验法则:速率范围应该是抓取间隔的至少4倍
-
标签过滤:应该过滤哪些标签?
- 完全匹配:
job="api-server"、status_code="200" - 负匹配:
status_code!="200" - 正则匹配:
instance=~"prod-.*" - 多个条件:
{job="api", environment="production"}
- 完全匹配:
-
聚合:数据应该被聚合吗?
- 无聚合:原样返回所有时间序列
- 按标签聚合:
sum by (job, endpoint)、avg by (instance) - 无标签聚合:
sum without (instance, pod)、avg without (job) - 常见聚合:
sum、avg、max、min、count、topk、bottomk
-
阈值或条件:有特定条件吗?
- 对于告警:阈值(例如,错误率>5%)
- 对于过滤:只显示高于/低于某个值的系列
- 对于比较:与历史数据比较(偏移)
使用AskUserQuestion工具收集或确认这些参数。当用户已经提供值时(例如,“5分钟窗口”、“>5%”),将它们作为默认选项以供确认。
第4阶段:呈现查询计划
在生成任何代码之前,以纯英语查询计划呈现,并请求用户确认:
## PromQL查询计划
根据您