Prometheus监控体系架构与数据模型解析
Prometheus是云原生监控的事实标准,采用拉取式(Pull)指标采集、时序数据库本地存储、PromQL查询语言三大核心组件。数据模型以时间序列为单位,每条序列由指标名称和一组键值对标签唯一标识。这种标签模型天然支持多维度聚合查询——按实例、服务、集群、环境等维度灵活筛选和分组。
Prometheus的拉取模式与传统的Push模式相比,优势在于服务发现机制自动感知目标变化,无需在客户端配置推送地址;目标挂掉后Prometheus自动标记stale不再写入,避免脏数据。劣势是拉取间隔决定了数据精度上限,不适合亚秒级监控场景。默认scrape_interval=15s,生产环境根据业务需求调整为5s或10s。
四种指标类型与Exporter采集实战
Prometheus定义四种指标类型:Counter(只增计数器,如请求总数)、Gauge(可增可减仪表盘,如CPU使用率)、Histogram(直方图,对观测值采样并统计分布,如请求延迟)、Summary(分位数摘要,客户端计算分位数)。Counter类型必须用rate()或increase()函数计算变化速率,直接展示原始值没有意义。
Exporter是Prometheus生态的指标采集插件。node_exporter采集主机CPU、内存、磁盘、网络指标;mysqld_exporter采集MySQL运行状态;redis_exporter采集Redis实例信息。自定义业务指标推荐使用Prometheus官方客户端库直接埋点:
from prometheus_client import Counter, Histogram, start_http_server
REQUEST_COUNT = Counter(
'http_requests_total',
'Total HTTP requests',
['method', 'endpoint', 'status']
)
REQUEST_LATENCY = Histogram(
'http_request_duration_seconds',
'HTTP request latency',
['method', 'endpoint'],
buckets=[0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1.0, 2.5, 5.0]
)
def handle_request(method, endpoint):
REQUEST_COUNT.labels(method=method, endpoint=endpoint, status=200).inc()
with REQUEST_LATENCY.labels(method=method, endpoint=endpoint).time():
pass
start_http_server(9090)
Histogram比Summary更适合生产环境——Histogram的分位数在服务端通过histogram_quantile()函数计算,支持跨实例聚合,而Summary在客户端预计算分位数后无法再聚合。当需要计算全局P99时,Histogram是唯一选择。
PromQL查询语言核心语法与常用模式
PromQL支持即时查询(instant query)和范围查询(range query)。基础查询语法:指标名称直接查询所有序列;花括号标签筛选;正则匹配。范围向量用方括号指定时间窗口。
常用查询模式:
# QPS计算
rate(http_requests_total{job="api-server"}[5m])
# 按维度聚合
sum by (endpoint) (rate(http_requests_total{job="api-server"}[5m]))
# P99延迟
histogram_quantile(0.99, sum by (le, endpoint) (rate(http_request_duration_seconds_bucket[5m])))
# 错误率
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m]))
# 容量预测
predict_linear(node_filesystem_avail_bytes[1h], 3600 * 24)
# 同比环比
rate(http_requests_total[5m]) / rate(http_requests_total[5m] offset 1w)
rate()和irate()的区别:rate计算范围窗口内的平均速率,适合图表展示趋势;irate取最近两个采样点的瞬时速率,对突发变化更敏感但噪声大。告警规则推荐用rate,实时看板可用irate。
Recording Rule预计算与告警规则配置
高频Dashboard查询和复杂聚合表达式反复执行会拖慢Prometheus。Recording Rule将常用查询结果预先计算存为新指标,Dashboard直接查询预计算指标即可。配置示例:
groups:
- name: api_server_recording
interval: 30s
rules:
- record: api:request_rate:5m
expr: sum by (endpoint) (rate(http_requests_total{job="api-server"}[5m]))
- record: api:error_rate:5m
expr: |
sum by (endpoint) (rate(http_requests_total{status=~"5.."}[5m]))
/ sum by (endpoint) (rate(http_requests_total[5m]))
告警规则同样在rules文件中配置,alert字段指定告警名称,for字段控制持续时长阈值:
groups:
- name: api_server_alerts
rules:
- alert: APIHighErrorRate
expr: api:error_rate:5m > 0.05
for: 5m
labels:
severity: critical
annotations:
summary: "API错误率超过5%"
告警通过Alertmanager路由到不同通知通道,支持分组、抑制、静默等策略避免告警风暴。Prometheus+Alertmanager+Grafana三件套构成完整的监控闭环:Prometheus采集存储,Grafana可视化,Alertmanager告警通知。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/prometheus-zhi-biao-cai-ji-jia-gou-yu-promql-cha-xun-yu-yan/