Prometheus 是云原生生态中的核心监控工具,其设计理念与实现方式与传统监控系统有很大不同。下面从 概念、原理、优化策略、查询优化 等维度进行全面介绍。


一、Prometheus 相关概念

概念 说明
时间序列(Time Series) 每一条以时间为索引的数据记录,如某台机器的 CPU 使用率。
指标(Metric) Prometheus 收集的基础单位,如 http_requests_totalnode_cpu_seconds_total
标签(Label) 用于区分同一指标的不同维度,如 method="GET"status="200"
样本(Sample) 某个时间点上的具体值,如时间戳 + 值。
Job / Instance Job 表示一个逻辑服务,Instance 表示某个具体采集地址(主机 + 端口)。
Exporter 用于暴露 Prometheus 可采集指标的组件,如 Node Exporter、MySQL Exporter。
Scrape Prometheus 向目标拉取指标数据的过程。
Pushgateway 用于暂存短生命周期任务的指标,推送给 Prometheus。
PromQL Prometheus 查询语言,功能强大、用于分析和聚合指标。

二、核心原理

1. 拉模式采集(Pull-based)

Prometheus 默认通过 HTTP GET 请求周期性地“拉取”被监控目标的数据(通过 /metrics 接口),不依赖被动接收。

2. 数据模型

Prometheus 的数据模型基于多维度时间序列,每个时间序列由:

arduino


复制编辑
<metric_name>{label1="value1", label2="value2", ...}

组成,支持丰富的聚合和过滤。

3. 本地时序数据库(TSDB)

4. 服务发现(Service Discovery)


三、优化策略

1. 采集优化

策略 说明
降低采集频率 例如:默认 15s,非关键指标可设置为 60s,减少数据量
精简指标数量 配置 metric_relabel_configs 过滤不必要的指标
限制标签基数 避免 high-cardinality label,如 user_iduuid
细分 job 不同 job 设置不同 scrape 配置,提高调度效率

2. 存储优化

策略 说明
TSDB retention 时间控制 如:保留 15d,而不是默认的永久
启用远程存储(Remote Write) 接入 Thanos、VictoriaMetrics、Cortex 等,实现高可用/长期存储
使用压缩格式 Prometheus 使用 Gorilla 压缩算法,默认已启用,不建议修改

3. 部署优化

项目 建议
分片采集 一个 Prometheus 实例负责一部分 job,避免单点压力过大
联邦集群(Federation) 通过上层 Prometheus 汇聚下游数据
异步采集与导入 通过 Pushgateway、remote write 缓解采集压力

四、PromQL 查询优化

1. 查询基本形式

promql复制编辑http_requests_total{job="web", method="GET"}  # 精确匹配标签
rate(http_requests_total[5m])                 # 计算速率
sum by (method) (rate(http_requests_total[1m])) # 按标签聚合

2. 查询优化策略

优化点 示例 / 说明
避免不必要的正则匹配 {job=~"web.*"} 尽量用 {job="web"} 替代
控制时间窗口长度 rate(metric[1h])rate(metric[5m]) 资源消耗大
聚合后再做计算 优化表达式顺序,先 sumrate 通常性能更好
限制 label_replace() 使用 该函数开销大,避免频繁使用
使用 subquery 控制样本量 如:avg_over_time(rate(metric[1m])[10m:1m])
使用 offset 避免读取最新数据 Prometheus TSDB 对“当前时间”的样本查询开销大,可使用 offset 5s 延迟处理

六、prmetheus告警的架构

prometheus告警架构图

相关组件详解:

列数据,同时提供数据的查询和告警策略的配置管理

送给 Alertmanager,Alertmanager 根据路由配置,将告警信息发送给指定的人或

组。Alertmanager 支持邮件、Webhook、微信、钉钉、短信等媒介进行告警通知;

可能是短期的,如果没有采集数据可能会出现丢失。Push Gateway 可以用来解决

此类问题,它可以用来接收数据,也就是客户端可以通过 Push 的方式将数据推送

到 Push Gateway,之后 Prometheus 可以通过 Pull 拉取该数据;

采集,MySQL 的监控数据可以通过 mysql_exporter 采集,之后 Exporter 暴露一个

接口,比如/metrics,Prometheus 可以通过该接口采集到数据;

比如查询数据库的数据,可以通过 SQL 语句,查询 Loki 的数据,可以通过 LogQL,

查询 Prometheus 数据的叫做 PromQL;

Consul、Eureka、文件的自动发现等。