Prometheus 监控系统:指标采集与 PromQL 查询
FreeGuideOnline
最新
2026-06-13
Prometheus 核心概念:从指标采集到 PromQL 查询
Prometheus 是一款开源的系统监控与报警框架,以多维数据模型和强大的PromQL 查询语言为核心。它通过拉取(Pull)方式主动采集目标的指标数据,并以时间序列的形式存储在本地,非常适合云原生与微服务架构。
本教程助你快速上手指标采集配置,并掌握 PromQL 基本查询技巧。
1. 数据模型:一切皆指标
Prometheus 将监控数据抽象为时间序列,每条序列由唯一标识符构成:
<metric_name>{<label>=<value>, ...} <sample_value> @ <timestamp>
1.1 指标名称与标签
- 指标名(Metric name):描述测量对象的本质,如
http_requests_total(HTTP 请求总数)。 - 标签(Labels):键值对形式,为同一指标增加维度。例如
{method="GET", handler="/api", status="200"}。 - 组合示例:
http_requests_total{method="GET", handler="/api", status="200"} 1027。
通过标签,可灵活地对数据进行过滤、聚合和分组,这是 Prometheus 强大查询能力的基础。
1.2 四种主要指标类型
- Counter(计数器):只增不减的值,如请求数、错误数。重启后会被重置为 0,通常用
rate()分析增速。 - Gauge(仪表盘):可增可减的瞬时值,如内存使用量、当前线程数。
- Histogram(直方图):对观测值进行预分区统计,如请求响应时间分布在
<0.1s、0.1-0.2s……桶中,并提供总和与总数,用于计算百分位数。 - Summary(摘要):在客户端直接计算分位数,比 Histogram 多提供精确的客户端分位值,但聚合能力弱。
2. 指标采集:让 Prometheus 找到你的数据
Prometheus 监控对象被称为Target。采集目标通常按Job分组管理。
2.1 拉取模式工作原理
- Prometheus Server 根据
prometheus.yml中的scrape_configs定时向各 Target 的/metrics端点(默认)发起 HTTP GET 请求。 - 目标需暴露符合 Prometheus
text-based exposition format的指标数据(客户端库自动生成,或借助 Exporter 转换)。 - 拉取到的样本与元数据被打上
job与instance标签,存入本地时序数据库。
2.2 配置静态目标
最简配置示例(prometheus.yml):
global:
scrape_interval: 15s # 全局采集间隔
scrape_configs:
- job_name: 'my-app'
static_configs:
- targets: ['localhost:8080'] # 应用指标暴露地址
labels:
env: 'dev' # 附加自定义标签
保存后重载 Prometheus,即可在 Targets 页面查看状态。
2.3 动态服务发现
云原生环境中 IP 多变,需动态发现目标:
- Kubernetes 服务发现:基于 Pod、Service、Endpoints 等资源自动识别采集目标。
- job_name: 'kubernetes-pods' kubernetes_sd_configs: - role: pod relabel_configs: - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] action: keep regex: true - 其他常见方式:基于 Consul、DNS、文件等。
利用 relabel_configs 可在采集前修改标签,控制保留、丢弃或重写。
2.4 Exporter 生态
许多系统本身不暴露 Prometheus 格式指标,需使用 Exporter:
| Exporter | 作用 | 监听端口示例 |
|---|---|---|
| Node Exporter | 收集 Linux 系统级指标(CPU、内存、磁盘等) | 9100 |
| Blackbox Exporter | 探测 HTTP、TCP、DNS 等端点的可达性 | 9115 |
| MySQL Exporter | 数据库连接、查询等指标 | 9104 |
| Kafka Exporter | Consumer lag、分区状态等 | 9308 |
运行后将其配置为 Prometheus 捕获目标即可。
3. PromQL 查询语言快速上手
PromQL(Prometheus Query Language)是进行指标查询、聚合、分析和告警的灵魂。
3.1 即时查询与范围查询
- 即时向量(Instant vector):当前最后时刻的一组时间序列。
http_requests_total→ 返回每个标签组合最新值。 - 范围向量(Range vector):回溯一段时间内所有样本的序列,供内置函数使用。
http_requests_total[5m]→ 返回过去5分钟每个序列的全部样本。
直接在表达式浏览器中输入即时向量,可绘制当前值;但多数计算函数需要区间向量。
3.2 常用过滤与匹配符
- 标签匹配:
=:等于,如http_requests_total{method="GET"}!=:不等于=~:正则匹配,如{handler=~"/api/.*"}!~:正则排除
- 多标签组合:逗号分隔相当于 AND,如
{method="GET",status=~"2.."}。
3.3 核心函数与实战
3.3.1 速率计算:rate() 与 irate()
rate(http_requests_total{job="my-app"}[5m])
计算5分钟内每秒平均增长率,适合慢变化指标与长时区间趋势。irate(http_requests_total{job="my-app"}[5m])
基于区间最后两个样本计算瞬时速率,对快速变动更灵敏,适合高波动指标。
3.3.2 指标聚合:sum、avg、topk 等
聚合可将多个序列按维度合并:
sum(rate(http_requests_total[5m])) by (status)
按 HTTP 状态码聚合每秒总请求数。topk(3, avg(node_cpu_seconds_total{mode!="idle"}[1m]) by (instance))
找出 CPU 使用率最高的前3个实例。
3.3.3 时间函数与处理
increase(http_requests_total[1h]):一小时内增量(考虑重置)。delta(cpu_temp_celsius[5m]):5分钟内温度变化量(仅适用于 Gauge)。histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))
计算 HTTP 请求持续时间的 P95,依赖 Histogram。predict_linear(node_filesystem_free_bytes[1h], 4*3600)
预测4小时后磁盘剩余空间,结果<0 时触发告警。
3.4 偏移与子查询
- offset 修饰符:查看历史时刻。
http_requests_total offset 1h一小时的请求数快照。 - 子查询
[<duration>:<resolution>]:对内层范围表达式执行更高阶计算。
rate(http_requests_total[5m])[1h:1m]
意思是先计算每个1分钟分片的5m速率,然后返回这一小时的历史速率序列。
3.5 实用查询示例
- 请求成功率(按状态分类)
sum(rate(http_requests_total{status=~"2.."}[5m])) by (job) / sum(rate(http_requests_total[5m])) by (job) * 100 - 内存使用百分比
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 - Kubernetes Pod CPU 利用率(占总 request)
sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (pod) / sum(kube_pod_container_resource_requests{resource="cpu"}) by (pod) * 100
4. 查询调试与可视化
- Prometheus 内置 UI:在 Graph 标签页可实时测试 PromQL,观察表格与图形。
- Grafana 集成:使用 Prometheus 数据源,设定动态变量和重复面板,构建灵活仪表盘。
- 记录规则(Recording rules):将复杂表达式预先计算为新的指标,加速后续查询与告警。
之后直接用groups: - name: example rules: - record: job:http_requests_total:rate5m expr: rate(http_requests_total[5m])job:http_requests_total:rate5m即可。
5. 初学者最佳实践
- 标签命名规范:用
snake_case,避免魔术标签名(如少量固定名称),尽量复用标准维度。 - 避免基数爆炸:绝对不将用户ID、请求ID等高变化值作为指标标签。
- 合理设置采集间隔:通常15s或30s,与指标的波动特性匹配。
- 先计数,后平均:尽量用 Counter 累积原始事件,再通过
rate()获取单位时间值,这比直接用 Gauge 平均更健壮。 - 多用记录规则:预聚合常用查询,防止 Grafana 每次刷新重算大量数据。
掌握指标采集配置与 PromQL 后,你已具备构建完整监控体系的核心能力。下一步可深入学习告警规则、长期存储集成(如 Thanos/Cortex)及集群扩展。