Prometheus Exporter 实战宝典:从零开始监控你的所有服务

前言

在上一篇文章中,我们学习了 Prometheus 的核心概念——时间序列、样本、指标类型以及 Job 与 Instance。理论学完了,接下来最实际的问题就是:我怎么才能用 Prometheus 监控我自己的服务器和业务应用?

答案是Exporter。本文将带你从零开始,一步步部署和配置 8 种最常用的 Exporter,覆盖从基础设施到业务应用的完整监控链路。

一、什么是 Exporter?

在开始动手之前,先搞清楚一个核心概念:什么是 Exporter?

简单来说,Exporter 是一个采集监控数据并通过 Prometheus 监控规范对外提供数据的组件。更通俗地讲:

大多数应用(如 MySQL、Redis、Nginx)本身并不支持 Prometheus 的数据格式。Exporter 就像一个 “翻译官” ,它负责从这些应用中拉取监控数据,然后翻译成 Prometheus 能够理解的格式,最后通过一个 HTTP 接口(通常是/metrics)暴露出来,供 Prometheus 定期抓取。

Exporter 的整个工作流程可以概括为三个环节:

  1. 采集:从目标系统(操作系统、数据库、应用等)获取原始监控数据

  2. 加工与转换:将数据标准化为 Prometheus 的指标格式

  3. 暴露:通过 HTTP 端点(/metrics)让 Prometheus 来拉取

Exporter 的两种类型

  • 官方 Exporter:由 Prometheus 官方团队维护,如 Node Exporter、mysqld_exporter

  • 第三方 Exporter:由社区开发者维护,如 redis_exporter、rabbitmq_exporter

所有能够向 Prometheus 提供监控样本数据的程序,都可以被称为一个 Exporter。而每一个 Exporter 的运行实例,在 Prometheus 中被称为一个Target(目标)

现在,让我们开始动手吧!

二、准备工作

在开始部署各种 Exporter 之前,请确保你已经具备以下条件:

  1. 一台 Linux 服务器(CentOS 7/8 或 Ubuntu 20.04+),用于部署所有组件

  2. 已经安装好 Prometheus(参考上一篇文章)

  3. 基本的 Linux 命令行操作能力

  4. 服务器防火墙已开放相应端口,或临时关闭防火墙进行测试

💡 小贴士:如果你是初次接触,建议先在虚拟机或测试环境上操作,熟练后再应用到生产环境。

三、监控 Linux 服务器:Node Exporter

3.1 什么是 Node Exporter

Node Exporter 是 Prometheus 官方提供的用于采集主机级别系统指标的组件。通过部署 Node Exporter,你可以监控服务器的 CPU 使用率、内存占用、磁盘 I/O、网络流量等核心指标。

3.2 安装步骤

步骤一:下载 Node Exporter

进入 Prometheus 官方 GitHub 仓库下载最新版本:

bash

# 下载 Node Exporter(以 v1.7.0 为例) wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz # 解压 tar xvfz node_exporter-1.7.0.linux-amd64.tar.gz # 将二进制文件移动到系统路径 sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/

步骤二:创建专用系统用户(安全最佳实践)

bash

# 创建一个无登录权限的系统用户来运行 Node Exporter[reference:11] sudo useradd --no-create-home --shell /bin/false node_exporter

步骤三:创建 Systemd 服务(实现开机自启)

创建服务配置文件:

bash

sudo tee /etc/systemd/system/node_exporter.service <<EOF [Unit] Description=Node Exporter After=network.target [Service] User=node_exporter Group=node_exporter Type=simple ExecStart=/usr/local/bin/node_exporter [Install] WantedBy=multi-user.target EOF

步骤四:启动并验证

bash

# 重新加载 systemd 配置 sudo systemctl daemon-reload # 启动 Node Exporter sudo systemctl start node_exporter # 设置开机自启 sudo systemctl enable node_exporter # 查看运行状态 sudo systemctl status node_exporter

Node Exporter 默认监听在9100 端口。你可以通过浏览器或 curl 访问验证:

bash

curl http://localhost:9100/metrics | head -20

如果能看到以# HELP# TYPE开头的 Prometheus 格式输出,说明 Node Exporter 运行成功!

步骤五:配置防火墙(如有需要)

bash

# CentOS 7 sudo firewall-cmd --permanent --add-port=9100/tcp sudo firewall-cmd --reload # Ubuntu sudo ufw allow 9100/tcp

3.3 配置 Prometheus 抓取

编辑 Prometheus 配置文件prometheus.yml,添加以下内容:

yaml

scrape_configs: - job_name: 'node' static_configs: - targets: ['<你的服务器IP>:9100']

重启 Prometheus 使配置生效:

bash

sudo systemctl restart prometheus

在 Prometheus Web UI(http://<服务器IP>:9090/targets)中,如果node作业的状态显示为UP,说明抓取成功!

四、监控 Nginx 服务器:Nginx Exporter

4.1 前置条件:开启 stub_status 模块

Nginx Prometheus Exporter 是通过 Nginx 的stub_status模块来获取监控数据的。因此,首先需要确保 Nginx 已启用该模块。

检查是否已启用

bash

nginx -V 2>&1 | grep -o with-http_stub_status_module

如果输出with-http_stub_status_module,说明已启用。如果没有输出任何结果,则需要重新编译 Nginx 添加该模块。

server { listen 8080; server_name localhost; location = /stub_status { stub_status; } }

配置 stub_status 页面

在 Nginx 配置文件中添加以下 location:

nginx

server { listen 8080; server_name localhost; location = /stub_status { stub_status; } }

重新加载 Nginx 配置:

bash

nginx -t && nginx -s reload

验证 stub_status 是否可用:

bash

curl http://localhost:8080/stub_status

正常输出类似:

text

Active connections: 45 server accepts handled requests 1056958 1156958 4491319 Reading: 0 Writing: 25 Waiting: 7

4.2 安装 Nginx Exporter

Nginx Exporter 由 Nginx 官方维护,GitHub 地址为nginxinc/nginx-prometheus-exporter

bash

# 下载 Nginx Exporter wget https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v1.1.0/nginx-prometheus-exporter_1.1.0_linux_amd64.tar.gz # 解压 tar xvfz nginx-prometheus-exporter_1.1.0_linux_amd64.tar.gz # 移动到系统路径 sudo mv nginx-prometheus-exporter /usr/local/bin/

4.3 启动 Nginx Exporter

bash

# 直接启动(指定 stub_status 的访问地址) nohup /usr/local/bin/nginx-prometheus-exporter \ -nginx.scrape-uri=http://localhost:8080/stub_status & # 或创建 Systemd 服务(推荐)

Nginx Exporter 默认监听9113 端口

验证:

bash

curl http://localhost:9113/metrics | head -20

4.4 配置 Prometheus 抓取

prometheus.yml中添加:

yaml

scrape_configs: - job_name: 'nginx' static_configs: - targets: ['<服务器IP>:9113']

五、监控 Redis 服务器:redis_exporter

5.1 什么是 redis_exporter

Redis 本身不支持直接输出 Prometheus 格式的指标,而 redis_exporter 就是一个“中间翻译官”。它独立部署,无需修改 Redis 配置,兼容 Redis 单机、哨兵、集群等几乎所有部署形态。

redis_exporter 可以采集的指标非常全面:

  • 资源指标:内存使用、内存碎片率

  • 连接指标:客户端连接数、拒绝连接数

  • 数据指标:Key 总数、缓存命中率

  • 命令指标:各命令调用次数和耗时

  • 持久化指标:RDB/AOF 状态

  • 集群/哨兵指标:节点状态、主从同步延迟

5.2 安装 redis_exporter

bash

# 下载 redis_exporter wget https://github.com/redis-performance/redis_exporter/releases/download/v1.55.0/redis_exporter-v1.55.0.linux-amd64.tar.gz # 解压 tar xvfz redis_exporter-v1.55.0.linux-amd64.tar.gz # 移动到系统路径 sudo mv redis_exporter-v1.55.0.linux-amd64/redis_exporter /usr/local/bin/

5.3 启动 redis_exporter

监控单个 Redis 实例

bash

# 如果 Redis 没有密码 nohup /usr/local/bin/redis_exporter -redis.addr localhost:6379 & # 如果 Redis 有密码 nohup /usr/local/bin/redis_exporter \ -redis.addr localhost:6379 \ -redis.password '你的Redis密码' &

监控多个 Redis 实例

bash

nohup /usr/local/bin/redis_exporter \ -redis.addr redis://localhost:6379,redis://localhost:6380 &

redis_exporter 默认监听9121 端口

验证:

bash

curl http://localhost:9121/metrics | grep redis

5.4 配置 Prometheus 抓取

prometheus.yml中添加:

yaml

scrape_configs: - job_name: 'redis' static_configs: - targets: ['<服务器IP>:9121']

六、监控 RabbitMQ:rabbitmq_exporter

6.1 前置条件

rabbitmq_exporter 通过 RabbitMQ 的Management Plugin来获取监控数据。因此需要确保 RabbitMQ 已启用 Management 插件:

bash

rabbitmq-plugins enable rabbitmq_management

6.2 安装 rabbitmq_exporter

⚠️ 重要提示:kbudde/rabbitmq_exporter 仅支持 RabbitMQ 3.x 版本。如果你使用的是 RabbitMQ 4.x 或更新版本,请使用 RabbitMQ 官方提供的 Prometheus 插件。

bash

# 下载 rabbitmq_exporter wget https://github.com/kbudde/rabbitmq_exporter/releases/download/v1.0.0-RC22/rabbitmq_exporter_1.0.0-RC22_linux_amd64.tar.gz # 解压 tar xvfz rabbitmq_exporter_1.0.0-RC22_linux_amd64.tar.gz # 移动到系统路径 sudo mv rabbitmq_exporter /usr/local/bin/

6.3 启动 rabbitmq_exporter

rabbitmq_exporter 通过环境变量进行配置:

bash

# 设置 RabbitMQ 管理接口地址、用户名和密码 export RABBIT_URL="http://localhost:15672" export RABBIT_USER="guest" export RABBIT_PASSWORD="guest" # 启动(默认监听 9419 端口) nohup /usr/local/bin/rabbitmq_exporter &

注意:RabbitMQ 的用户需要拥有monitoring标签才能被 exporter 采集数据。

验证:

bash

curl http://localhost:9419/metrics | head -20

6.4 配置 Prometheus 抓取

yaml

scrape_configs: - job_name: 'rabbitmq' static_configs: - targets: ['<服务器IP>:9419']

七、监控 MongoDB:mongodb_exporter

7.1 安装 mongodb_exporter

bash

# 下载 mongodb_exporter wget https://github.com/percona/mongodb_exporter/releases/download/v0.40.0/mongodb_exporter-0.40.0.linux-amd64.tar.gz # 解压 tar xvfz mongodb_exporter-0.40.0.linux-amd64.tar.gz # 移动到系统路径 sudo mv mongodb_exporter-0.40.0.linux-amd64/mongodb_exporter /usr/local/bin/

7.2 启动 mongodb_exporter

通过--mongodb.uri参数指定 MongoDB 连接地址:

bash

# 无认证的 MongoDB nohup /usr/local/bin/mongodb_exporter \ --mongodb.uri="mongodb://localhost:27017" & # 有认证的 MongoDB nohup /usr/local/bin/mongodb_exporter \ --mongodb.uri="mongodb://用户名:密码@localhost:27017/admin" &

mongodb_exporter 默认监听9216 端口

验证:

bash

curl http://localhost:9216/metrics | grep mongodb

7.3 配置 Prometheus 抓取

yaml

scrape_configs: - job_name: 'mongodb' static_configs: - targets: ['<服务器IP>:9216']

八、监控 Docker:多种方案选择

Docker 的监控方案比较特殊,主要有以下几种选择:

8.1 方案一:cAdvisor(推荐)

cAdvisor(Container Advisor)是 Google 开源的项目,专门用于监控容器资源使用情况,是 Kubernetes 中默认的容器监控组件。

bash

# 使用 Docker 运行 cAdvisor docker run -d \ --name=cadvisor \ -p 8080:8080 \ --volume=/:/rootfs:ro \ --volume=/var/run:/var/run:ro \ --volume=/sys:/sys:ro \ --volume=/var/lib/docker/:/var/lib/docker:ro \ --volume=/dev/disk/:/dev/disk:ro \ google/cadvisor:latest

cAdvisor 默认监听8080 端口,访问http://<服务器IP>:8080/metrics即可看到 Prometheus 格式的指标。

8.2 方案二:docker-exporter(轻量级)

如果只需要基础的容器监控(CPU、内存、网络、I/O),可以使用轻量级的 docker-exporter。

bash

# 使用 Docker 运行 docker-exporter[reference:39] docker run -d \ --name docker-exporter \ -v /var/run/docker.sock:/var/run/docker.sock \ -p 12345:12345 \ kerams/docker-exporter

docker-exporter 默认监听12345 端口

8.3 配置 Prometheus 抓取

yaml

scrape_configs: # cAdvisor - job_name: 'cadvisor' static_configs: - targets: ['<服务器IP>:8080'] # docker-exporter(如使用) - job_name: 'docker' static_configs: - targets: ['<服务器IP>:12345']

九、监控 MySQL 8.0:mysqld_exporter

9.1 创建 MySQL 监控用户

首先需要在 MySQL 中创建一个专用的监控用户,并授予最小化权限。

登录 MySQL:

bash

mysql -u root -p

执行以下 SQL:

sql

-- 创建监控用户(MySQL 8.0 需要分开执行 CREATE USER 和 GRANT)[reference:43] CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'StrongExporterPass123!';
-- 授予必要权限
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';
-- 刷新权限 FLUSH PRIVILEGES;

权限说明:

  • PROCESS:允许读取进程列表和 InnoDB 状态

  • REPLICATION CLIENT:暴露复制延迟指标

  • SELECT:允许读取表统计信息

9.2 安装 mysqld_exporter

bash

# 下载 mysqld_exporter wget https://github.com/prometheus/mysqld_exporter/releases/download/v0.15.1/mysqld_exporter-0.15.1.linux-amd64.tar.gz # 解压 tar xvfz mysqld_exporter-0.15.1.linux-amd64.tar.gz # 移动到系统路径 sudo mv mysqld_exporter-0.15.1.linux-amd64/mysqld_exporter /usr/local/bin/

9.3 创建凭证文件

为了安全,不建议在命令行中直接传递密码,而是使用配置文件。

bash

# 创建配置目录 sudo mkdir -p /etc/mysqld_exporter # 创建凭证文件[reference:46] sudo tee /etc/mysqld_exporter/.my.cnf <<EOF [client] user=exporter password=StrongExporterPass123! EOF # 设置文件权限(仅允许 mysqld_exporter 用户读取) sudo chmod 600 /etc/mysqld_exporter/.my.cnf

9.4 启动 mysqld_exporter

bash

# 使用凭证文件启动 nohup /usr/local/bin/mysqld_exporter \ --config.my-cnf=/etc/mysqld_exporter/.my.cnf & # 或直接使用 DSN 连接字符串[reference:47] nohup /usr/local/bin/mysqld_exporter \ --mysql.addr=localhost:3306 \ --mysql.user=exporter \ --mysql.password=StrongExporterPass123! &

mysqld_exporter 默认监听9104 端口

验证:

bash

curl http://localhost:9104/metrics | grep mysql

9.5 配置 Prometheus 抓取

yaml

scrape_configs: - job_name: 'mysql' static_configs: - targets: ['<服务器IP>:9104']

十、监控 Spring Boot 2.0 应用

Spring Boot 应用的监控与其他组件不同——它不需要额外安装 Exporter,因为 Spring Boot Actuator 本身就支持暴露 Prometheus 格式的指标。

10.1 添加 Maven 依赖

在 Spring Boot 项目的pom.xml中添加以下依赖:

xml

<!-- Spring Boot Actuator --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- Micrometer Prometheus 注册器 --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>

10.2 配置 application.properties

application.propertiesapplication.yml中暴露 Prometheus 端点:

properties

# 暴露所有 actuator 端点(生产环境建议按需暴露) management.endpoints.web.exposure.include=* # 或只暴露 Prometheus 端点 management.endpoints.web.exposure.include=prometheus # 设置 Actuator 端口(默认与主端口相同) management.server.port=8080

如果是application.yml格式:

yaml

management: endpoints: web: exposure: include: prometheus server: port: 8080

10.3 验证指标端点

启动 Spring Boot 应用后,访问:

bash

curl http://localhost:8080/actuator/prometheus

你应该能看到大量以jvm_tomcat_http_server_requests_等开头的 Prometheus 格式指标。

Spring Boot Actuator 默认提供的指标包括:

  • JVM 指标:内存、GC、线程

  • Tomcat 指标:连接数、请求数

  • HTTP 请求指标:请求次数、响应时间、状态码分布

  • 系统指标:CPU 使用率、系统负载

10.4 配置 Prometheus 抓取

yaml

scrape_configs: - job_name: 'spring-boot-app' metrics_path: '/actuator/prometheus' static_configs: - targets: ['<应用服务器IP>:8080']

10.5 自定义业务指标(进阶)

你还可以在代码中自定义业务指标:

java

import io.micrometer.core.instrument.MeterRegistry; import org.springframework.stereotype.Service; @Service public class OrderService { private final Counter orderCounter; public OrderService(MeterRegistry registry) { // 创建一个计数器:统计订单创建数量 this.orderCounter = Counter.builder("orders.created.total") .description("Total number of orders created") .register(registry); } public void createOrder() { // 业务逻辑... orderCounter.increment(); // 每次创建订单,计数器 +1 } }

十一、总结与速查表

本文介绍了 8 种常用的 Prometheus Exporter,涵盖了从基础设施到业务应用的完整监控链路:

监控目标Exporter默认端口关键命令/配置
Linux 服务器Node Exporter9100./node_exporter
NginxNginx Exporter9113-nginx.scrape-uri=http://localhost:8080/stub_status
Redisredis_exporter9121-redis.addr localhost:6379
RabbitMQrabbitmq_exporter9419环境变量RABBIT_URLRABBIT_USER
MongoDBmongodb_exporter9216--mongodb.uri="mongodb://localhost:27017"
DockercAdvisor8080Docker 容器运行
MySQL 8.0mysqld_exporter9104--config.my-cnf=/etc/mysqld_exporter/.my.cnf
Spring BootActuator + Micrometer应用端口/actuator/prometheus

快速上手三步走:

  1. 下载并启动 Exporter → 访问http://localhost:端口/metrics验证

  2. 配置 Prometheus → 在prometheus.yml中添加scrape_configs

  3. 重启 Prometheus → 在 Targets 页面确认状态为UP

监控数据采集只是第一步,后续你还可以:

  • 使用 Grafana 创建可视化仪表盘

  • 配置 Alertmanager 实现告警

  • 编写 PromQL 查询进行深入分析

希望这篇教程能帮助你快速上手 Prometheus 监控!如果在部署过程中遇到任何问题,欢迎留言交流。