Prometheus通过Pull模型主动拉取应用/metrics端点的时序数据,应用需集成对应语言客户端库并暴露符合格式的指标;Prometheus服务端在prometheus.yml中配置scrape_configs,支持静态目标或服务发现;无法自暴露指标的系统依赖Exporter(如Node Exporter)转换数据;调试需逐层验证端点响应、Targets状态及up指标。

Prometheus 收集应用指标的核心是“拉取(Pull)模型”:它主动向目标应用的 /metrics HTTP 端点发起请求,获取符合 Prometheus 文本格式的时序数据。关键不在 Prometheus 本身写代码,而在于让被监控的应用**正确暴露指标**。
应用端需提供/metrics端点
无论 Java、.NET、Node.js 还是 Go 应用,都必须集成对应语言的 Prometheus 客户端库,并启动一个内置或独立的 HTTP 服务器,监听并响应 /metrics 请求。这个端点返回的内容必须是纯文本、严格遵循 Prometheus 数据格式,例如:
http_requests_total{method="GET",status="200"} 1245<br>process_cpu_seconds_total 3.27<br>jvm_memory_used_bytes{area="heap",id="PS Eden Space"} 1.12e+08常见做法:
- Spring Boot 应用:引入
spring-boot-starter-actuator+micrometer-registry-prometheus,配置management.endpoints.web.exposure.include=metrics,prometheus,自动启用/actuator/prometheus - Java 原生应用:使用
io.prometheus:simpleclient_httpserver启动 HTTP Server,注册Counter/Gauge等指标 - .NET 应用:引用
prometheus-net,调用Metrics.NewCounter()并配置中间件暴露/metrics - Node.js 应用:使用
prom-client创建 Registry,添加默认指标和业务指标,挂载路由app.get('/metrics', ...)
Prometheus服务端配置抓取任务
在 Prometheus 的 prometheus.yml 中,通过 scrape_configs 明确告诉它“去哪拉、怎么拉”:
- 静态配置:适用于固定 IP 和端口,如
- targets: ['myapp:8080'] - 服务发现:Kubernetes 中常用
kubernetes_sd_configs自动发现 Pod;Consul、DNS、文件等也支持 - 关键参数:
job_name(逻辑分组名)、scrape_interval(建议 30s)、metrics_path(默认/metrics,Spring Boot Actuator 可能是/actuator/prometheus) - 标签重写:
relabel_configs可添加环境、实例、服务名等标签,便于后续多维查询
非应用类目标靠Exporter补充
不是所有系统都能自己暴露 /metrics。这时需借助专用 Exporter——它们是轻量代理,负责采集原始数据并转换为 Prometheus 格式:
- Node Exporter:部署在每台 Linux 服务器上,采集 CPU、内存、磁盘、网络等 OS 指标(默认端口 9100)
- Redis Exporter:连接 Redis 实例,拉取 info 命令输出并转为指标
- MySQL Exporter、Kafka Exporter、Blackbox Exporter(探测 HTTP/TCP 可达性)等
- 自定义场景:用 Shell/Python 脚本采集 Nginx 连接数、日志错误行等,写入
.prom文件,由 Node Exporter 的textfile_collector加载
验证与调试要点
配置完成后,别直接看 Grafana——先逐层确认是否真正通路:
- curl -v http://your-app:8080/metrics:确认能返回文本且格式无语法错误(无乱码、无非法字符、无空格在 label value 前)
- Prometheus Web UI → Status → Targets:检查对应 job 是否显示 “UP”,Last Scrape 时间是否更新,Error 列为空
- Graph 页面输入
up{job="myapp"}:返回 1 表示抓取成功;count({job="myapp"})查看有多少时间序列被采集到 - 若指标缺失,优先查应用端是否注册了指标、Registry 是否被正确暴露,而非 Prometheus 配置

















