-
背景
项目需要对老服务使用到的ActiveMQ集群机器进行压测,为了记录在压测过程中,机器的指标信息,所以搭了一个Prometheus+Grafana 的面板用来记录机器的指标信息
-
整体架构:
-
监控服务器 ( CentOS 7):
- Prometheus Server: 负责收集和存储指标数据。
- Grafana Server: 负责可视化 Prometheus 中的数据。
-
被监控服务器 (3 x CentOS 7):
- Node Exporter: 负责收集主机系统指标 (CPU, 内存, 磁盘, 网络等)。
- JMX Exporter: 负责收集 Java 虚拟机 (JVM) 指标 (GC, 堆内存, 线程等)。
Prometheus Server 会主动从每台被监控服务器上的 Node Exporter 和 JMX Exporter 拉取(scrape)指标数据。Grafana 会连接 Prometheus 数据源来展示这些数据。
-
准备工作 (在所有服务器上执行):
- 更新系统:
sudo yum update -y
- 安装必要的工具:
sudo yum install -y wget tar unzip
- 创建 Prometheus 用户和组 (可选但推荐):
- 这是一个安全最佳实践,为 Prometheus 和 Exporter 创建专门的用户。
sudo groupadd --system prometheus
sudo useradd -s /sbin/nologin -M -g prometheus prometheus
-
在被监控服务器上,同样可以创建
prometheus用户和组用于 Exporter,或者使用其他非特权用户运行。本手册后续默认使用prometheus用户运行 Exporter。 -
防火墙设置:
-
请根据你的环境开启所需的端口。以下是默认端口:
- Prometheus Server (9090 TCP): 监控服务器需要对外开放,以及允许被 Grafana 访问(如果Grafana在另一台机器)。
- Grafana Server (3000 TCP): 监控服务器需要对外开放,以便浏览器访问。
- Node Exporter (9100 TCP): 每台被监控服务器需要对外开放此端口,允许 Prometheus Server 访问。
- JMX Exporter (9091 TCP): 每台运行 Java 应用的被监控服务器需要对外开放此端口,允许 Prometheus Server 访问。
-
示例 (使用 firewalld,在对应的服务器上执行):
- 监控服务器:
-
sudo firewall-cmd --permanent --add-port=9090/tcp sudo firewall-cmd --permanent --add-port=3000/tcp sudo firewall-cmd --reload - 被监控服务器 (每台):
-
sudo firewall-cmd --permanent --add-port=9100/tcp sudo firewall-cmd --permanent --add-port=9091/tcp # 仅在运行 Java 应用的服务器上开启 sudo firewall-cmd --reload
-
安装和配置 Prometheus Server (在监控服务器上执行)
- 下载 Prometheus: 访问 Prometheus 官网下载页 (prometheus.io/download/) 获取最新的稳定版本下载链接。选择适合你的服务器架构 (通常是
linux-amd64)
wget https://github.com/prometheus/prometheus/releases/download/vX.Y.Z/prometheus-X.Y.Z.linux-amd64.tar.gz # 将 X.Y.Z 替换为实际版本号
- 解压和安装:
tar -xzf prometheus-X.Y.Z.linux-amd64.tar.gz
cd prometheus-X.Y.Z.linux-amd64/
sudo mv prometheus /usr/local/bin/
sudo mv promtool /usr/local/bin/
sudo mkdir /etc/prometheus /var/lib/prometheus
sudo mv consoles/ console_libraries/ /etc/prometheus/
sudo mv prometheus.yml /etc/prometheus/
- 设置文件权限:
sudo chown -R prometheus:prometheus /etc/prometheus/ /var/lib/prometheus/
sudo chown prometheus:prometheus /usr/local/bin/prometheus /usr/local/bin/promtool
- 创建 systemd 服务文件: 创建一个
/etc/systemd/system/prometheus.service文件,内容如下:
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/
After=network.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus \
--web.listen-address=:9090 \
--web.external-url=http://192.168.18.211:9090
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
- 加载并启动 Prometheus:
sudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl start prometheus
- 检查 Prometheus 状态:
sudo systemctl status prometheus
# 检查日志
sudo journalctl -u prometheus -f
- 确保服务正在运行。你可以访问
http://<你的监控服务器IP>:9090来访问 Prometheus Web UI。
-
安装和配置 Node Exporter (在每台被监控服务器上执行)
Node Exporter 用于采集 Linux 主机的系统指标。
- 下载 Node Exporter: 访问 Node Exporter GitHub Releases 页 (github.com/prometheus/…) 获取最新的稳定版本下载链接。选择适合你的服务器架构。
wget https://github.com/prometheus/node_exporter/releases/download/vX.Y.Z/node_exporter-X.Y.Z.linux-amd64.tar.gz # 将 X.Y.Z 替换为实际版本号
- 解压和安装:
tar -xzf node_exporter-X.Y.Z.linux-amd64.tar.gz
cd node_exporter-X.Y.Z.linux-amd64/
sudo mv node_exporter /usr/local/bin/
- 设置文件权限:
sudo chown prometheus:prometheus /usr/local/bin/node_exporter
- 创建 systemd 服务文件: 创建一个
/etc/systemd/system/node_exporter.service文件,内容如下:
[Unit]
Description=Node Exporter
Documentation=https://github.com/prometheus/node_exporter
After=network.target
[Service]
User=prometheus
Group=prometheus
Type=simple
# 启动命令,监听9100端口
ExecStart=/usr/local/bin/node_exporter --web.listen-address=:9100
# 故障自动重启策略
Restart=on-failure
RestartSec=5s
# 资源限制设置(可选)
# LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
[Unit]
Description=node_exporter Monitoring System
After=network.target
[Service]
User=prometheus
Group=prometheus
ExecStart=/usr/local/bin/node_exporter --web.listen-address=:9100
NotifyAccess=all
RestartSec=10s
Restart=always
[Install]
WantedBy=multi-user.target
- 加载并启动 Node Exporter:
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
- 检查 Node Exporter 状态:
sudo systemctl status node_exporter
# 检查日志
sudo journalctl -u node_exporter -f
-
确保服务正在运行。你可以在被监控服务器本地或通过浏览器访问
http://<被监控服务器IP>:9100/metrics来查看 Node Exporter 暴露的原始指标数据。 -
安装和配置 JMX Exporter (在运行 Java 应用的被监控服务器上执行)
JMX Exporter 用于采集 Java 应用的 JMX 指标,包括 GC、堆内存、线程等。JMX Exporter 通常以 Java Agent 的形式运行,并附加到你的 Java 应用进程上。
- 下载 JMX Exporter: 访问 JMX Exporter GitHub Releases 页 (github.com/prometheus/…) 获取
jmx_exporter.jar文件和示例配置。通常只需要下载jmx_exporter-X.Y.Z-collector.jar和一个config.yaml。
# 下载 Jar 包
wget https://github.com/prometheus/jmx_exporter/releases/download/parent-X.Y.Z/jmx_exporter-X.Y.Z-collector.jar # 将 X.Y.Z 替换为实际版本号
# 下载一个示例配置文件(或自己创建)
wget https://raw.githubusercontent.com/prometheus/jmx_exporter/parent-X.Y.Z/example_configs/kafka-0-8-2-release-2-11.yml -O jmx_exporter_config.yml # 这是一个Kafka的示例,你需要根据你的JVM应用调整
# 将文件放到一个合适的位置,例如 /opt/jmx_exporter/
sudo mkdir /opt/jmx_exporter
sudo mv jmx_exporter-X.Y.Z-collector.jar /opt/jmx_exporter/jmx_exporter.jar
sudo mv jmx_exporter_config.yml /opt/jmx_exporter/config.yml
# 设置权限
sudo chown -R prometheus:prometheus /opt/jmx_exporter # 使用运行exporter的用户
重要: 你可能需要根据你的 Java 应用定制 config.yml 文件,以过滤或重命名指标。一个简单的开始是仅包含 start 和 rules 部分,rules 部分可以先使用一个广泛匹配的规则,例如:
startDelaySeconds: 0
ssl: false
lowercaseOutputName: true
lowercaseOutputLabelNames: true
rules:
- pattern: ".*" # 收集所有指标,这可能会产生大量数据,建议根据需要调整
更复杂的配置请参考 JMX Exporter 的文档。
修改 Java 应用启动脚本:
这是最关键的一步。你需要编辑你的 Java 应用的启动脚本,在 java 命令中添加 -javaagent 参数。 找到你的 Java 应用启动的地方(例如 catalina.sh, spring boot 启动脚本等),在 java 或 java ${JAVA_OPTS} 后添加:
-javaagent:/opt/jmx_exporter/jmx_exporter.jar=9091:/opt/jmx_exporter/config.yml
完整的启动命令可能看起来像这样:
java -server \
... 其他JVM参数 ... \
-javaagent:/opt/jmx_exporter/jmx_exporter.jar=9091:/opt/jmx_exporter/config.yml \
-jar your_application.jar \
... 应用参数 ...
9091: 这是 JMX Exporter 将要监听的端口,Prometheus 将从这里拉取数据。确保此端口没有被占用。
/opt/jmx_exporter/config.yml: 这是 JMX Exporter 的配置文件路径。
- 重启 Java 应用:
修改启动脚本后,你需要重启你的 Java 应用,使 -javaagent 参数生效。
-
验证 JMX Exporter:
- 在 Java 应用重启并启动后,你可以访问 http://<被监控服务器IP>:9091/metrics 来查看 JMX Exporter 暴露的原始指标数据。如果访问失败,请检查 Java 应用日志、防火墙和端口占用情况。
-
配置 Prometheus Scrape Targets (回到监控服务器)
现在 Prometheus 已经安装,Node Exporter 和 JMX Exporter 已经在被监控服务器上运行并暴露了指标。我们需要告诉 Prometheus 去哪里拉取这些数据。
- 编辑 Prometheus 配置文件:
sudo vi /etc/prometheus/prometheus.yml
- 添加 scrape_configs:
- 在 scrape_configs 部分添加以下内容,替换 <被监控服务器IP-1>, <被监控服务器IP-2>, <被监控服务器IP-3> 为你的实际IP地址。
- YAML
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090"]
- job_name: 'node'
static_configs:
- targets: ['192.168.16.131:9100']
labels:
instance: 'node-1'
env: 'prod'
- targets: ['192.168.16.132:9100']
labels:
instance: 'node-2'
env: 'prod'
- targets: ['192.168.16.133:9100']
labels:
instance: 'node-3'
env: 'prod'
- 确保
scrape_configs的格式正确,特别是缩进。 - 检查配置文件语法 (可选但推荐):
promtool check config /etc/prometheus/prometheus.yml
- 如果配置有错误,会显示提示。
- 重启 Prometheus 使配置生效:
sudo systemctl restart prometheus
- 验证 Targets:
- 访问 Prometheus Web UI (http://<你的监控服务器IP>:9090),点击顶部的 "Status" -> "Targets"。你应该能看到 node 和 java 两个 job,并且每个 job 下列出了对应的目标 IP:Port,状态应该是 UP。如果状态不是 UP,检查防火墙、IP地址、端口以及对应服务器上的 Exporter 服务是否正常运行。
-
安装和配置 Grafana Server (在监控服务器上执行)
Grafana 用于可视化 Prometheus 中的数据。
- 添加 Grafana 仓库: 创建一个文件
/etc/yum.repos.d/grafana.repo,内容如下:
[grafana]
name=grafana
baseurl=https://mirrors.aliyun.com/grafana/yum/rpm/
repo_gpgcheck=0
enabled=1
gpgcheck=0
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
yum clean all
yum makecache
yum install grafana
手动下载的方式:参考 blog.csdn.net/weixin_4292…
先下载安装包到本地: dl.grafana.com/enterprise/…
然后上传到服务器的 /usr/local 目录
- 安装 Grafana:
sudo yum install grafana -y
## 或者手动方式
sudo yum install grafana-enterprise-9.4.1-1.x86_64.rpm
- 加载并启动 Grafana:
sudo systemctl daemon-reload
sudo systemctl enable grafana-server
sudo systemctl start grafana-server
- 检查 Grafana 状态:
sudo systemctl status grafana-server
# 检查日志
sudo journalctl -u grafana-server -f
- 确保服务正在运行。你可以访问
http://<你的监控服务器IP>:3000来访问 Grafana Web UI。默认用户名密码是admin/admin。首次登录会强制你修改密码,请务必修改为强密码
-
在 Grafana 中添加 Prometheus 数据源
让 Grafana 知道从哪里获取监控数据。
-
登录 Grafana: 使用浏览器访问
http://<你的监控服务器IP>:3000,使用默认凭据admin/admin登录并修改密码。 -
添加 数据源 :
- 点击左侧菜单栏的齿轮图标 (Configuration)。
- 选择 "Data sources"。
- 点击 "Add data source"。
- 选择 "Prometheus"。
-
配置 Prometheus 数据源 :
- Name: 给你的数据源起个名字,例如
Prometheus或MyPrometheus. - URL: 输入 Prometheus Server 的地址和端口。如果 Grafana 和 Prometheus 在同一台机器上,可以使用
http://localhost:9090。如果不在同一台机器,使用http://<你的监控服务器IP>:9090。 - 其他设置保持默认即可。
- 点击 "Save & test"。如果配置正确,会显示 "Data source is working" 或类似的成功消息。
- Name: 给你的数据源起个名字,例如
-
导入预设的 Grafana Dashboard
Grafana 社区提供了大量预设的 Dashboard,我们可以直接导入来快速获得可视化面板。
-
寻找 Dashboard ID:
-
访问 Grafana Labs 的 Dashboard 库 (grafana.com/grafana/das… Dashboard:
- Node Exporter (主机指标): 搜索 "Node Exporter Full"。通常 ID 是
1860或更高版本的。选择一个评分高且兼容性好的。 - JVM / JMX (Java 应用指标): 搜索 "JVM JMX Exporter" 或 "Generic JVM"。常用的有 ID
8588(Generic JVM) 或针对特定应用的 Dashboard (如 Tomcat, Kafka 等)。选择一个适合你的。 记下你选择的 Dashboard ID。
- Node Exporter (主机指标): 搜索 "Node Exporter Full"。通常 ID 是
-
导入 Dashboard:
- 在 Grafana Web UI 左侧菜单栏,点击 '+' 图标。
- 选择 "Import"。
- 在 "Import via grafana.com" 区域,输入你记下的 Dashboard ID。
- 点击 "Load"。
- 在导入页面,选择你刚刚添加的 Prometheus 数据源。
- 点击 "Import"。
-
查看 Dashboard:
-
导入成功后,Dashboard 会自动打开。你应该能看到基于 Node Exporter 或 JMX Exporter 指标生成的图表。如果图表没有数据,请检查:
- Prometheus 的 Targets 页面状态是否 UP。
- 数据源是否选择正确。
- Dashboard 中的变量(如
job,instance)是否与你的 Prometheus 配置匹配。
-
生产环境考虑
-
安全性:
- 修改 Grafana 的默认
admin密码。 - 通过反向代理 (如 Nginx 或 Apache) 为 Grafana 和 Prometheus UI 添加 SSL/TLS 加密,并配置基本认证或其他身份验证方式,限制外部访问。
- 确保防火墙规则严格,只允许必要的机器访问监控端口。
- 修改 Grafana 的默认
-
数据持久性:
- Prometheus 的数据默认存储在
/var/lib/prometheus。确保这个目录所在的磁盘空间充足,并且考虑使用LVM或独立分区以方便扩容。 - 考虑备份 Prometheus 数据目录。
- Prometheus 的数据默认存储在
-
数据保留策略:
- Prometheus 默认无限期保留数据(直到磁盘满)。生产环境通常需要设置数据保留时间,例如通过
--storage.tsdb.retention.time参数配置,或使用 Thanos/Cortex 等方案进行长期存储。
- Prometheus 默认无限期保留数据(直到磁盘满)。生产环境通常需要设置数据保留时间,例如通过
-
资源规划:
- 根据监控目标的数量、采集频率、保留时间和指标数量,评估监控服务器所需的 CPU、内存和磁盘空间。随着监控目标的增加,可能需要升级服务器。
-
高可用性:
- 对于生产环境,你可能需要考虑 Prometheus 和 Grafana 的高可用性方案,例如运行多个 Prometheus 实例(配合 Thanos 或 Cortex)和 Grafana 实例。
-
告警:
- Prometheus 通常与 Alertmanager 配合使用来发送告警通知(邮件、短信、Webhook等)。你需要安装和配置 Alertmanager,并在 Prometheus 中定义告警规则 (Rules)。这对于生产环境至关重要。虽然用户没有明确要求,但强烈建议部署 Alertmanager。
-
日志监控:
- 虽然 Prometheus 专注于指标,但生产环境通常还需要日志监控。考虑使用 ELK Stack (Elasticsearch, Logstash, Kibana) 或 Loki + Promtail + Grafana 等方案进行日志收集和分析。
-
版本管理:
- 记录并管理你安装的 Prometheus、Grafana 和 Exporter 的版本,以便于后续升级和故障排除。