PromQL 查询
1.术语与定义
术语 | 定义 |
|---|---|
Prometheus | 开源监控系统,采集并存储时间序列数据。 |
Blackbox Exporter | Prometheus 生态组件,从外部对目标进行黑盒探测(HTTP/HTTPS/TCP/DNS),返回可用性与性能指标。 |
PromQL | Prometheus 查询语言,用于从时间序列数据库获取并计算监控数据。 |
指标 (Metric) | 带标签的时序数据,例如 |
瞬时向量 (Instant Vector) | 查询时刻每个时间序列的最新值。 |
区间向量 (Range Vector) | 查询时刻往回一段时间窗口内的所有采样点。 |
Gauge | 可增可减的指标类型,Blackbox Exporter 探针数据大多属于此类型。 |
Histogram | 统计数据分布(如请求延迟的分桶)的指标类型,注意与 Gauge 区分。 |
P99 (第99百分位数) | 将一段时间内的数值升序排列,处于99%位置的值,代表“最慢的1%”的延迟。 |
2.核心监控指标一览
Blackbox Exporter 将每次探测的结果通过以下关键指标暴露:
指标名称 | 描述 | 数据类型 | 示例值 |
|---|---|---|---|
| 探测是否成功 | Gauge | 1(成功)/ 0(失败) |
| HTTP 响应状态码 | Gauge | 200, 404, 502... |
| 单次探测总耗时(从开始到结束的全链路时间) | Gauge(秒) | 4.074 |
| 分阶段耗时,通过 | Gauge(秒) |
|
⚠️ 重点:以上指标均为 Gauge 类型,不是 Histogram。因此计算分位数(如 P99)时必须使用 quantile_over_time(),不是使用 histogram_quantile()。
3.标准操作流程
3.1 检查网站瞬时可用性
场景:需要立刻知道某网站当前能否正常打开。
PromQL:
probe_success{app="frontend"}结果示例:
probe_success{app="frontend", env="production", instance="https://www.example.com", job="probe/exporters/frontend-probe", namespace="exporters", tier="frontend"} 1解读:
返回值
1表示最近一次探测成功若为
0,代表探测失败,应立即结合probe_http_status_code或 Blackbox Exporter 日志排查。
3.2 计算一段时间内的成功率 / 失败率
场景:统计过去 5 分钟的可用率,用于 SLA 计算或报表。
成功率(百分比):
PromQL:
avg_over_time(probe_success{app="frontend"}[5m]) * 100关键点:
[5m]为时间窗口,可替换为[10m]、[1h]等。avg_over_time会对该窗口内所有 0/1 采样点求平均值(即成功率),乘 100 转换为百分比。若探测间隔为 30s,则 5 分钟内约有 10 个采样点参与计算。
结果示例:
{app="frontend", env="production", instance="https://www.example.com", job="probe/exporters/frontend-probe", namespace="exporters", tier="frontend"} 100解读:
返回值
100表示最近一次探测成功
3.3 查看最近 5 分钟 HTTP 状态码历史
场景:确认网站是否频繁返回 5xx 错误。
PromQL:
probe_http_status_code{app="frontend"}[5m]结果形式(在 Prometheus UI 中会显示多个采样点):
200 @1776402593.015
200 @1776402623.015
200 @1776402653.015
...解读方法:
@后的数字为 Unix 时间戳,代表采样时刻。快速转换为北京时间示例:
date -d @1776402593 "+%Y-%m-%d %H:%M:%S" # 输出:2026-04-17 11:49:53 CST若 5 分钟内出现 10 个采样点,说明探测间隔约为 30 秒(与 Prometheus 配置的
scrape_interval一致)。
3.4 查询探测总耗时 P99 (过去30分钟)
场景:掌控最近 30 分钟内最慢的 1% 请求的耗时,监控尾延迟。
PromQL:
quantile_over_time(0.99,
probe_duration_seconds{app="vercel-frontend"}[30m]
)返回示例:
{app="frontend", env="production", instance="https://wwww.example.com", job="probe/exporters/frontend-probe", namespace="exporters", tier="frontend"} 4.074420551799996解读:
数值 4.07 秒 代表:过去 30 分钟内,有 99% 的探测请求总耗时 ≤ 4.07 秒;有 1% 的请求耗时 > 4.07 秒。
probe_duration_seconds包含 DNS 解析、TCP 建连、TLS 握手、服务器处理及内容传输的全部时间,是黑盒端到端全链路耗时。
3.5 定位延迟瓶颈:分阶段耗时分析
当 probe_duration_seconds P99 偏高时,必须拆解到具体阶段,才能定位根因。
3.5.1 各阶段 (phase) 含义
probe_http_duration_seconds 通过 phase 标签区分以下阶段:
phase 值 | 对应阶段 | 主要影响因素 |
|---|---|---|
| DNS 解析 | DNS 服务器性能、缓存命中率 |
| TCP 连接建立 | 网络延迟、丢包、防火墙策略 |
| TLS/SSL 握手 | 服务器 CPU、加密套件复杂度、证书链长度 |
| 服务器处理 (TTFB) | 应用代码、数据库查询、后端服务 |
| 内容传输 | 响应体大小、出口带宽 |
注意:各阶段耗时合计应约等于 probe_duration_seconds(可能存在微小误差)。部分旧版 Blackbox Exporter 可能使用 phase="ssl" 而非 tls,请根据实际指标调整。
3.5.2 查询特定阶段耗时 P99
查询服务器处理耗时 P99:
quantile_over_time(0.99,
probe_http_duration_seconds{app="vercel-frontend", phase="processing"}[30m]
)查询内容传输耗时 P99:
quantile_over_time(0.99,
probe_http_duration_seconds{app="frontend", phase="transfer"}[30m]
)根因分析示例:
假设一次探测各阶段值为:resolve 0.31s,connect 0.09s,tls 0.15s,processing 4.07s,transfer 2.58s。
阶段 | 耗时 | 判断 |
|---|---|---|
DNS / TCP / TLS | 均 < 0.5s | 网络基本健康 |
processing | 4.07s | 服务器处理严重缓慢 |
transfer | 2.58s | 可能响应体过大或带宽受限 |
首要优化方向:后端应用性能调优(慢 SQL、高 CPU、未命中缓存)。
✅ 最佳实践:先通过 probe_duration_seconds P99 确认总延迟异常,再逐阶段查询 P99,快速收敛至最慢的一两个阶段。
4.告警规则模板
以下规则可直接用于 Prometheus Rule 配置文件。
4.1 网站不可用告警
- alert: WebsiteDown
expr: probe_success{app="frontend"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "网站 {{ $labels.instance }} 不可用"
description: "探测失败已持续 2 分钟,请立即检查。"4.2 高延迟告警(总耗时 P99)
- alert: WebsiteHighP99Latency
expr: quantile_over_time(0.99, probe_duration_seconds{app="frontend"}[30m]) > 5
for: 10m
labels:
severity: warning
annotations:
summary: "网站 {{ $labels.instance }} 总耗时 P99 超过 5 秒"
description: "过去 30 分钟的 P99 延迟为 {{ $value }} 秒,请排查后端或网络。"4.3 高错误率告警
- alert: WebsiteHighErrorRate
expr: (1 - avg_over_time(probe_success{app="frontend"}[5m])) * 100 > 5
for: 5m
labels:
severity: critical
annotations:
summary: "网站 {{ $labels.instance }} 5 分钟内错误率超过 5%"5.常见问题与排查思路
Q1:probe_success 为 0 但手动可以打开网站?
确认 Blackbox Exporter 所在节点/容器是否存在出口网络限制(防火墙、安全组、代理)
检查目标网站是否启用了反爬机制、IP 黑名单或限流策略
查看
probe_http_status_code具体返回值,确认是否收到 4xx/5xx查看 Blackbox Exporter 日志(Kubernetes 环境示例):
kubectl logs -n monitoring deploy/blackbox-exporterQ2:P99 延迟偶发性突增,但平均耗时正常?
这是典型的长尾效应,应使用分阶段指标聚焦排查:
phase="processing"高 → 检查应用慢日志、数据库负载、GC 停顿phase="tls"高 → 检查 SSL 证书有效期、是否使用弱加密套件、TLS 会话复用情况phase="resolve"高 → 上游 DNS 服务器异常,建议部署本地 DNS 缓存 (如 CoreDNS/NodeLocalDNS)
Q3:quantile_over_time 与 histogram_quantile 有何区别?
Blackbox Exporter 的指标是 Gauge,必须用
quantile_over_time计算一段时间内的统计分位数。如果应用程序自行暴露了 Histogram 类型指标(如
http_request_duration_seconds_bucket),则应使用histogram_quantile()。记忆口诀:外部黑盒探测用
quantile_over_time,内部埋点 Histogram 用histogram_quantile。
Q4:Unix 时间戳如何快速转换为可读时间?
Linux/Mac 命令行:
date -d @1776402593 "+%Y-%m-%d %H:%M:%S"Prometheus Web UI 中直接切换到 Graph 页面,鼠标悬停可显示格式化时间。
6.监控大盘与最佳实践
Grafana 面板建议:
使用
Stat面板展示即时可用状态(0/1)与实时延迟。使用
Time series面板绘制各阶段 P99 趋势图,叠加阈值线。为不同
job创建可复用的 Dashboard,通过变量切换实例。
探测频率控制:生产环境建议
scrape_interval: 30s,关键业务可缩短为15s,但需评估 Blackbox Exporter 负载。多区域探测:对于广州、深圳双数据中心的企业,建议在两地基站各部署一个 Blackbox Exporter,并附加
region标签,对比两地访问质量。指标保留与降准:原始探测数据建议保留至少 7 天,P99 等聚合指标可长期保留用于月度分析。
7.附录
附录 A:PromQL 速查表
需求 | PromQL 示例 |
|---|---|
站点当前是否可用 |
|
过去 5 分钟成功率 |
|
过去 5 分钟失败率 |
|
HTTP 状态码历史 |
|
总耗时 P99(30min) |
|
DNS 解析耗时 P99(1h) |
|
服务器处理耗时 P99 |
|
TLS 握手耗时 P99 |
|
附录 B:Blackbox Exporter 配置示例(Prometheus 端)
以下展示如何在 prometheus.yml 中定义探测目标,是理解 job 与 instance 来源的关键。
scrape_configs:
- job_name: 'blackbox-http-probe'
metrics_path: /probe
params:
module: [http_2xx] # 使用 Blackbox Exporter 中定义的 HTTP 模块
static_configs:
- targets:
- https://charge.example.com # 新能源充电桩云平台
- https://mes.example.com # 制造执行系统入口
- https://oa.example.com
relabel_configs:
- source_labels: [__address__]
target_label: __param_target # 将目标地址传给 Blackbox Exporter
- source_labels: [__param_target]
target_label: instance # 保留原始 URL 作为 instance 标签
- target_label: __address__
replacement: blackbox-exporter.monitoring.svc:9115 # 指向 Blackbox Exporter 地址附录 C:故障排查简明流程图
探测失败 (probe_success=0)
├─ 检查 probe_http_status_code
│ ├─ 返回 4xx → 客户端/权限问题(检查请求头、认证令牌)
│ ├─ 返回 5xx → 服务器应用错误(查看目标服务日志)
│ └─ 无返回 / 超时 → 网络或目标不可达
│ ├─ 从 Blackbox 节点 curl 目标 URL 测试
│ └─ 检查防火墙/安全组、DNS 解析
└─ 延迟高 (probe_duration_seconds P99 > 阈值)
├─ resolve 高 → DNS 故障
├─ connect 高 → 网络丢包/防火墙
├─ tls 高 → 证书/加密问题
├─ processing 高 → 后端应用/数据库瓶颈
└─ transfer 高 → 响应体过大或带宽不足