Prometheus + Grafana 搭建

238 阅读11分钟
  1. 背景

项目需要对老服务使用到的ActiveMQ集群机器进行压测,为了记录在压测过程中,机器的指标信息,所以搭了一个Prometheus+Grafana 的面板用来记录机器的指标信息

  1. 整体架构:

  1. 监控服务器 ( CentOS 7):

    1. Prometheus Server: 负责收集和存储指标数据。
    2. Grafana Server: 负责可视化 Prometheus 中的数据。
  2. 被监控服务器 (3 x CentOS 7):

    1. Node Exporter: 负责收集主机系统指标 (CPU, 内存, 磁盘, 网络等)。
    2. JMX Exporter: 负责收集 Java 虚拟机 (JVM) 指标 (GC, 堆内存, 线程等)。

Prometheus Server 会主动从每台被监控服务器上的 Node Exporter 和 JMX Exporter 拉取(scrape)指标数据。Grafana 会连接 Prometheus 数据源来展示这些数据。

  1. 准备工作 (在所有服务器上执行):

  1. 更新系统:
sudo yum update -y
  1. 安装必要的工具:
sudo yum install -y wget tar unzip
  1. 创建 Prometheus 用户和组 (可选但推荐):
  2. 这是一个安全最佳实践,为 Prometheus 和 Exporter 创建专门的用户。
sudo groupadd --system prometheus
sudo useradd -s /sbin/nologin -M -g prometheus prometheus
  1. 在被监控服务器上,同样可以创建 prometheus 用户和组用于 Exporter,或者使用其他非特权用户运行。本手册后续默认使用 prometheus 用户运行 Exporter。

  2. 防火墙设置:

  3. 请根据你的环境开启所需的端口。以下是默认端口:

    1. Prometheus Server (9090 TCP): 监控服务器需要对外开放,以及允许被 Grafana 访问(如果Grafana在另一台机器)。
    2. Grafana Server (3000 TCP): 监控服务器需要对外开放,以便浏览器访问。
    3. Node Exporter (9100 TCP): 每台被监控服务器需要对外开放此端口,允许 Prometheus Server 访问。
    4. JMX Exporter (9091 TCP): 每台运行 Java 应用的被监控服务器需要对外开放此端口,允许 Prometheus Server 访问。
  4. 示例 (使用 firewalld,在对应的服务器上执行):

    1. 监控服务器:
    2. sudo firewall-cmd --permanent --add-port=9090/tcp
      sudo firewall-cmd --permanent --add-port=3000/tcp
      sudo firewall-cmd --reload
      
    3. 被监控服务器 (每台):
    4. sudo firewall-cmd --permanent --add-port=9100/tcp
      sudo firewall-cmd --permanent --add-port=9091/tcp # 仅在运行 Java 应用的服务器上开启
      sudo firewall-cmd --reload
      
  1. 安装和配置 Prometheus Server (在监控服务器上执行)

  1. 下载 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 替换为实际版本号
  1. 解压和安装:
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/
  1. 设置文件权限:
sudo chown -R prometheus:prometheus /etc/prometheus/ /var/lib/prometheus/
sudo chown prometheus:prometheus /usr/local/bin/prometheus /usr/local/bin/promtool
  1. 创建 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
  1. 加载并启动 Prometheus:
sudo systemctl daemon-reload
sudo systemctl enable prometheus
sudo systemctl start prometheus
  1. 检查 Prometheus 状态:
sudo systemctl status prometheus
# 检查日志
sudo journalctl -u prometheus -f
  1. 确保服务正在运行。你可以访问 http://<你的监控服务器IP>:9090 来访问 Prometheus Web UI。
  1. 安装和配置 Node Exporter (在每台被监控服务器上执行)

Node Exporter 用于采集 Linux 主机的系统指标。

  1. 下载 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 替换为实际版本号
  1. 解压和安装:
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/
  1. 设置文件权限:
sudo chown prometheus:prometheus /usr/local/bin/node_exporter
  1. 创建 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
  1. 加载并启动 Node Exporter:
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
  1. 检查 Node Exporter 状态:
sudo systemctl status node_exporter
# 检查日志
sudo journalctl -u node_exporter -f
  1. 确保服务正在运行。你可以在被监控服务器本地或通过浏览器访问 http://<被监控服务器IP>:9100/metrics 来查看 Node Exporter 暴露的原始指标数据。

  2. 安装和配置 JMX Exporter (在运行 Java 应用的被监控服务器上执行)

JMX Exporter 用于采集 Java 应用的 JMX 指标,包括 GC、堆内存、线程等。JMX Exporter 通常以 Java Agent 的形式运行,并附加到你的 Java 应用进程上。

  1. 下载 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 文件,以过滤或重命名指标。一个简单的开始是仅包含 startrules 部分,rules 部分可以先使用一个广泛匹配的规则,例如:

startDelaySeconds: 0
ssl: false
lowercaseOutputName: true
lowercaseOutputLabelNames: true
rules:
  - pattern: ".*" # 收集所有指标,这可能会产生大量数据,建议根据需要调整

更复杂的配置请参考 JMX Exporter 的文档。

修改 Java 应用启动脚本:

这是最关键的一步。你需要编辑你的 Java 应用的启动脚本,在 java 命令中添加 -javaagent 参数。 找到你的 Java 应用启动的地方(例如 catalina.sh, spring boot 启动脚本等),在 javajava ${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 的配置文件路径。

  1. 重启 Java 应用:

修改启动脚本后,你需要重启你的 Java 应用,使 -javaagent 参数生效。

  1. 验证 JMX Exporter:

    1. 在 Java 应用重启并启动后,你可以访问 http://<被监控服务器IP>:9091/metrics 来查看 JMX Exporter 暴露的原始指标数据。如果访问失败,请检查 Java 应用日志、防火墙和端口占用情况。
  1. 配置 Prometheus Scrape Targets (回到监控服务器)

现在 Prometheus 已经安装,Node Exporter 和 JMX Exporter 已经在被监控服务器上运行并暴露了指标。我们需要告诉 Prometheus 去哪里拉取这些数据。

  1. 编辑 Prometheus 配置文件:
sudo vi /etc/prometheus/prometheus.yml
  1. 添加 scrape_configs:
  2. 在 scrape_configs 部分添加以下内容,替换 <被监控服务器IP-1>, <被监控服务器IP-2>, <被监控服务器IP-3> 为你的实际IP地址。
  3. 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'
  1. 确保 scrape_configs 的格式正确,特别是缩进。
  2. 检查配置文件语法 (可选但推荐):
promtool check config /etc/prometheus/prometheus.yml
  1. 如果配置有错误,会显示提示。
  2. 重启 Prometheus 使配置生效:
sudo systemctl restart prometheus
  1. 验证 Targets:
  2. 访问 Prometheus Web UI (http://<你的监控服务器IP>:9090),点击顶部的 "Status" -> "Targets"。你应该能看到 node 和 java 两个 job,并且每个 job 下列出了对应的目标 IP:Port,状态应该是 UP。如果状态不是 UP,检查防火墙、IP地址、端口以及对应服务器上的 Exporter 服务是否正常运行。
  1. 安装和配置 Grafana Server (在监控服务器上执行)

Grafana 用于可视化 Prometheus 中的数据。

  1. 添加 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 目录

  1. 安装 Grafana:
sudo yum install grafana -y
## 或者手动方式
sudo yum install grafana-enterprise-9.4.1-1.x86_64.rpm
  1. 加载并启动 Grafana:
sudo systemctl daemon-reload
sudo systemctl enable grafana-server
sudo systemctl start grafana-server
  1. 检查 Grafana 状态:
sudo systemctl status grafana-server
# 检查日志
sudo journalctl -u grafana-server -f
  1. 确保服务正在运行。你可以访问 http://<你的监控服务器IP>:3000 来访问 Grafana Web UI。默认用户名密码是 admin/admin首次登录会强制你修改密码,请务必修改为强密码
  1. 在 Grafana 中添加 Prometheus 数据源

让 Grafana 知道从哪里获取监控数据。

  1. 登录 Grafana: 使用浏览器访问 http://<你的监控服务器IP>:3000,使用默认凭据 admin/admin 登录并修改密码。

  2. 添加 数据源 :

    1. 点击左侧菜单栏的齿轮图标 (Configuration)。
    2. 选择 "Data sources"。
    3. 点击 "Add data source"。
    4. 选择 "Prometheus"。
  3. 配置 Prometheus 数据源 :

    1. Name: 给你的数据源起个名字,例如 PrometheusMyPrometheus.
    2. URL: 输入 Prometheus Server 的地址和端口。如果 Grafana 和 Prometheus 在同一台机器上,可以使用 http://localhost:9090。如果不在同一台机器,使用 http://<你的监控服务器IP>:9090
    3. 其他设置保持默认即可。
    4. 点击 "Save & test"。如果配置正确,会显示 "Data source is working" 或类似的成功消息。
  1. 导入预设的 Grafana Dashboard

Grafana 社区提供了大量预设的 Dashboard,我们可以直接导入来快速获得可视化面板。

  1. 寻找 Dashboard ID:

  2. 访问 Grafana Labs 的 Dashboard 库 (grafana.com/grafana/das… Dashboard:

    1. Node Exporter (主机指标): 搜索 "Node Exporter Full"。通常 ID 是 1860 或更高版本的。选择一个评分高且兼容性好的。
    2. JVM / JMX (Java 应用指标): 搜索 "JVM JMX Exporter" 或 "Generic JVM"。常用的有 ID 8588 (Generic JVM) 或针对特定应用的 Dashboard (如 Tomcat, Kafka 等)。选择一个适合你的。 记下你选择的 Dashboard ID。
  3. 导入 Dashboard:

    1. 在 Grafana Web UI 左侧菜单栏,点击 '+' 图标。
    2. 选择 "Import"。
    3. 在 "Import via grafana.com" 区域,输入你记下的 Dashboard ID。
    4. 点击 "Load"。
    5. 在导入页面,选择你刚刚添加的 Prometheus 数据源。
    6. 点击 "Import"。
  4. 查看 Dashboard:

  5. 导入成功后,Dashboard 会自动打开。你应该能看到基于 Node Exporter 或 JMX Exporter 指标生成的图表。如果图表没有数据,请检查:

    1. Prometheus 的 Targets 页面状态是否 UP。
    2. 数据源是否选择正确。
    3. Dashboard 中的变量(如 job, instance)是否与你的 Prometheus 配置匹配。
  1. 生产环境考虑

  • 安全性:

    • 修改 Grafana 的默认 admin 密码。
    • 通过反向代理 (如 Nginx 或 Apache) 为 Grafana 和 Prometheus UI 添加 SSL/TLS 加密,并配置基本认证或其他身份验证方式,限制外部访问。
    • 确保防火墙规则严格,只允许必要的机器访问监控端口。
  • 数据持久性:

    • Prometheus 的数据默认存储在 /var/lib/prometheus。确保这个目录所在的磁盘空间充足,并且考虑使用LVM或独立分区以方便扩容。
    • 考虑备份 Prometheus 数据目录。
  • 数据保留策略:

    • Prometheus 默认无限期保留数据(直到磁盘满)。生产环境通常需要设置数据保留时间,例如通过 --storage.tsdb.retention.time 参数配置,或使用 Thanos/Cortex 等方案进行长期存储。
  • 资源规划:

    • 根据监控目标的数量、采集频率、保留时间和指标数量,评估监控服务器所需的 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 的版本,以便于后续升级和故障排除。