▌ 技术引导
我见过很多人在搭建Prometheus时,直接跟着官网文档照搬配置,结果连一个指标都没抓到。Prometheus不是什么都能抓的,它需要你懂怎么写exporter,怎么暴露端点,怎么写query。如果你是用Kubernetes,记得用ServiceMonitor,别再手动加静态配置。监控MySQL?别用mysqld_exporter,用Prometheus的JMX配置,会更稳定。别问为什么,我就是踩坑过,每次监控失败,都要回来看看抓的是不是对的端口,是不是有权限,是不是得先启动一个服务。Prometheus的配置不光是写一个remote_write,关键是理解你的目标和采集方式。如果你在云环境,记得用Prometheus的Pushgateway,而不是直接拉取。别问我怎么知道的,我就是干过,而且干得不太好,最后靠日志和抓包把问题解决了。
▌ 技术参考
一 Prometheus的核心是指标采集,你得先知道目标是怎么暴露指标的。比如MySQL如果用JMX,得先确认JMX端口是否开放,并且JMX配置是否允许多个采集器。如果目标是HTTP端点,得用scrape_configs配置,别忘记指定job_name和scrape_interval。例如,要监控本地服务器端口9090,配置应该是:
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
别用动态配置,除非你有ServiceMonitor,否则别搞混了。记得用--web.listen-address参数指定Prometheus服务监听的端口,别暴露在默认端口,否则容易被扫描到。
二 用exporter时要确认它是否支持你当前的系统。比如node exporter,它必须运行在目标主机上,否则根本抓不到系统指标。如果你在Docker里跑,要确保host模式,或者用--network=host参数,否则exporter只能看到自己容器里的指标。有个常见坑是,Docker的默认网络模式让exporter根本无法抓取宿主机的指标,这时候只能用host或者映射端口。比如启动node exporter的命令是:
node_exporter --path.lib=/path/to/lib --web.listen-address=:9100
如果用的是node exporter 1.4.0版本以上,记得启用--collect.default.tags参数,不然某些标签会缺失。
三 如果你用Pushgateway,记得配置job的push_interval和push_timeout。Pushgateway不是用来长期存储指标的,它只是临时存储,所以push_interval设置成30秒左右比较合理。比如:
pushgateway --web.listen-address=:9091 --push-interval=30s
如果你是用阿里云的Prometheus服务,别忘记在系统配置里开启TLS,否则采集会失败。还有一种情况是,你在使用Pushgateway时,要确保目标服务的metric端点正确,否则push会失败。比如,有些服务的指标端点在/metrics,有些在/metrics/,这个符号千万别搞错,否则pushgateway永远抓不到数据。
四 Prometheus的配置文件要记得写本地文件路径,比如/etc/prometheus/prometheus.yml。如果用的是云原生方案,比如用Kubernetes部署,记得用ServiceMonitor来定义采集规则。ServiceMonitor会自动发现你的Service,并根据标签来匹配Pod。比如:
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: myapp-monitor
spec:
selector:
matchLabels:
app: myapp
endpoints:
- port: metrics
path: /metrics
interval: 10s
ServiceMonitor的interval参数要和scrape_interval同步,否则采集可能会有延迟或者失败。
五 在采集MySQL的时候,记得用JMX配置,别用默认的exporter。因为有些版本的MySQL只支持JMX,而有些在Docker里运行的版本,JMX需要额外的配置。比如JMX的配置文件jmx_prometheus_config.yml要放在MySQL的配置目录下,然后启动MySQL时加--enable-metrics参数。如果MySQL的端口不是默认的12345,要记得修改JMX的端口,否则采集会失败。同时,采集的query要检查是否正确,比如mysql_global_status_queries,得确保你的query语法是对的,否则采集的指标会不全。
六 Prometheus的采集配置要考虑到性能,比如如果用默认的scrape_interval,每10秒拉取一次,对于高负载的系统来说压力太大。可以调整成scrape_interval: 60s,这样采集频率降低,但对系统影响也小。不过这要根据你的监控需求来定,如果你需要实时监控,可能得接受更高频率带来的负载。另外,如果用的是remote_write,记得配置write_relabel_configs来过滤不需要的数据,避免写入压力。比如:
write_relabel_configs:
- source_labels: [__name__]
regex: 'up|http_requests_total'
target_label: __name__
action: keep
这样可以只保留up和http_requests_total两个指标,其他都过滤掉,减少存储压力。
七 在监控Kubernetes集群时,记得用kube-state-metrics,它会暴露集群状态的指标。同时要确保kubelet的metrics端口是开放的,比如10250,但这个端口是被限制的,所以要用ServiceMonitor来采集。例如,ServiceMonitor的spec里要指定namespace,比如default,同时确保服务的标签正确。如果你用的是云厂商提供的Kubernetes集群,比如阿里云ACK,可能需要额外的权限配置,比如RBAC策略,否则Prometheus无法访问kubelet的端点。记得配置kube-proxy的metrics端口,比如10249,否则采集会失败。
八 如果你用的是Prometheus的远程写入功能,比如写入到Grafana Loki或者Thanos,记得配置remote_write的地址和基本认证。比如:
remote_write:
- url: http://loki:3100/loki/api/v1/push
basic_auth:
username: user
password: pass
这样可以确保数据写入到对应的目标。但有些时候,远程写入的配置会因为网络策略没有写入权限而失败,这时候要检查目标地址是否可达,以及认证信息是否正确。另外,远程写入的压缩和分片参数也要调整,比如max_chunk_size=5242880,这样可以提升写入效率。
九 如果你在使用Prometheus时发现数据延迟,可能是因为scrape_interval设置太低了。不过别直接调大,要先确认是否是网络问题导致的。比如,如果目标服务器和Prometheus之间有防火墙,或者网络不稳定,采集就会失败。这时候可以用curl测试目标的/metrics端点,看是否能正常获取数据。如果不能,得检查防火墙规则,或者用iptables开放端口。另外,如果采集的指标太多,Prometheus的内存可能会爆掉,这时候得用relabel_configs来过滤掉不必要的指标。
十 在使用Prometheus的alertmanager时,记得配置alert_rules文件,比如放在/etc/alertmanager/config/目录下。alertmanager的配置文件要确保有正确的route和receivers,否则报警不会生效。比如:
route:
receiver: 'email'
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receivers:
- name: 'email'
email_configs:
- to: 'admin@example.com'
send_resolved: true
这样报警会发送到指定邮箱,而且不会重复。不过有时候,alertmanager的模板会出错,比如missing template,这时候要检查alertmanager的日志,找到具体错误,再调整模板参数。
十一 如果你在使用Node Exporter时发现某些指标没有采集到,可能是exporter的版本问题。比如Node Exporter 1.4.0之后,某些指标的标签方式变了,你得确认你的query是否能匹配新的标签。比如原来的query是node_memory_MemTotal_bytes,现在可能是node_memory_MemTotal_bytes{mode="total"}。或者某些指标在新版本里被移除了,比如node_cpu_seconds_total,在某些版本里被重命名成node_cpu_seconds_total{mode="idle"}。所以每次升级exporter,都要检查一下指标是否变更,尤其是系统核心指标。
十二 如果你用的是Prometheus的本地存储,记得配置storage.tsdb.retention和storage.tsdb.min_time。比如:
storage.tsdb.retention: 7d
storage.tsdb.min_time: 1h
这样可以确保数据保留7天,同时避免旧数据被清理。但如果你用的是远程写入,这些参数就不用管了,远程存储会处理这些。不过远程写入的性能会比本地差,所以在高并发的场景下,要确保remote_write的地址和带宽足够。比如,如果你的指标量很大,用Loki的话,要注意它对日志的处理方式,别让日志堆积太多导致磁盘满。
十三 如果你遇到Prometheus的scrape失败,先看日志有没有提示。比如“no metrics found”或者“http 403”,这时候要检查目标是否暴露了/metrics端点,以及是否允许Prometheus访问。如果是http 403,可能是目标服务没有配置正确的header,比如X-Forwarded-For,这时候可以在exporter的配置里加上--web.max-requests-per-second=24000这样的参数。或者用curl测试一下,比如curl -I http://localhost:9100/metrics,看看返回的header是否正确。
十四 在使用Prometheus的表达式时,记得用group_left或者group_right来连接指标。比如,如果要计算CPU使用率,可以这样写:
avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m]))
这样可以按实例分组计算。不过有时候,expr会因为标签不匹配而报错,这时候得确保所有指标的标签都是对等的。比如,如果有一个指标是node_cpu_seconds_total{mode="idle"},而另一个是node_cpu_seconds_total{mode="system"},这时候要确保它们的标签在表达式里是匹配的,否则avg会失败。
十五 如果你想用Prometheus的query来做实时监控,记得用instant vector而不是range vector。比如,用avg(node_memory_MemTotal_bytes)来获取当前内存总量,而不是avg(node_memory_MemTotal_bytes[5m]),后者是过去5分钟的平均值。这两个在性能上是有差异的,instant vector更轻量,但只能获取当前状态。比如,在Grafana里,如果你用的是Prometheus datasource,记得选择正确的查询类型,否则图表会出错。
Prometheus:看完就会搭
我见过很多人在搭建Prometheus时,直接跟着官网文档照搬配置,结果连一个指标都没抓到。Prometheus不是什么都能抓的,它需要你懂怎么写exporter,怎么暴露端点,怎么写query。如果你是用Kubernetes,记得用ServiceMonitor,别再手动加静态配置。监控MySQL?别用mysqld_exporter,用P
DevOps实战AI1 次阅读
Related
延伸阅读

4个MongoDB索引SQL调优,性能提升10倍数据库 · 2026-07-14

OpenAI官方 | Codex定价成本优化 | 文档不再手写Codex智能 · 2026-07-10

12个VS Code settings.json团队规范,避坑必备VS Code指南 · 2026-07-10

保姆级教程 | PostgreSQL优化:性能优化实战数据库 · 2026-07-10

VS Code Copilot性能优化:4个快捷键速查 | 2026最新版VS Code指南 · 2026-07-13

避坑 | SkyWalking镜像仓库(7分钟读完)DevOps实战 · 2026-07-10