使用Prometheus和Grafana实现实时服务器监控
背景介绍
在现代云原生和分布式系统中,监控应用程序和基础设施的健康状况、性能和可用性是一项重大挑战。随着系统规模的扩大,传统的监控方法难以有效管理实时数据、生成有意义的警报并提供可操作的见解。云环境的复杂性和动态特性,要求解决方案能够高效地跟踪指标、检测异常并可视化数据,以确保系统的可靠性并快速解决问题。
Prometheus是一套开源的系统监控报警框架,广泛用于各种云环境中的指标监控和可视化。Prometheus能够高效的收集、存储和查询时间序列数据,非常适合监控基础设施、应用程序和服务。Prometheus更多概念及详细信息请参见Prometheus官方文档。
Grafana通过提供丰富的可视化功能来补充Prometheus,使用户能够创建动态仪表盘和图表来跟踪性能指标。
Prometheus和Grafana的结合,可以监控服务器的健康状况并可视化网络流量,从而对关键事件发出警报,为动态云环境提供完整的可观测性解决方案。
本文档指导用户在华为云环境中配置Prometheus以收集各种监控指标,并使用Grafana可视化收集到的数据并与Slack集成以接收告警通知。
资源与成本规划
|
资源 |
资源说明 |
成本说明 |
|---|---|---|
|
虚拟私有云VPC |
VPC网段:192.168.0.0/16 |
免费 |
|
虚拟私有云子网 |
子网网段:192.168.0.0/24 |
免费 |
|
安全组 |
本示例中所有ECS均使用默认安全组default,且案例涉及端口均开放给本地PC的IP地址。 更多安全组详细信息请参见安全组概述。 |
免费 |
|
弹性云服务器 |
|
ECS涉及以下几项费用:
具体的计费方式及标准请参考计费模式概述。 |
|
||
|
操作流程
|
操作步骤 |
说明 |
|---|---|
|
在Prometheus服务器(本示例中为ECS-Prometheus)上安装Prometheus,实现对监控数据的获取、存储以及查询。 |
|
|
在Prometheus服务器上安装Prometheus Alertmanager。Alertmanager主要负责对Prometheus产生的告警进行统一处理。 |
|
|
在Prometheus服务器上安装Grafana。 |
|
|
在目标节点(本示例中为ECS-target-0001和ECS-target-0002)上分别安装Node Exporter。Node Exporter安装在目标上的代理程序,它能够采集到主机的运行指标如CPU、 内存、磁盘等信息,向Prometheus提供标准格式的监控数据。 |
|
|
为了能够让Prometheus从目标节点的Node Exporter获取到监控数据,需要将目标节点添加到Prometheus服务器。 |
|
|
在Prometheus服务器上配置告警规则。 在Prometheus中支持基于PromQL创建告警规则,如果满足PromQL定义的规则,则会产生一条告警。 |
|
|
配置Grafana,包括配置告警消息接收方、添加Prometheus数据源,以及创建自定义的Dashboard以实现监控信息可视化。 |
|
|
触发告警规则以验证Prometheus以及Grafana是否能按预期进行监控信息的展示及通知。 |
前提条件
- 已按照资源与成本规划购买3台ECS,并确保云服务器之间网络互通。
- 已了解PromQL表达式规则,详情请参见Prometheus官网。
安装并设置Prometheus
在Prometheus服务器(本示例中为ECS-Prometheus)上执行以下步骤,安装Prometheus并启动服务:
- 更新软件包仓库。
sudo apt update
- 创建Prometheus用户。
sudo useradd --no-create-home --shell /bin/false prometheus
- 创建Prometheus目录。
sudo mkdir /etc/prometheus sudo mkdir /var/lib/prometheus
- 设置目录的所有权,以确保Prometheus服务能够正确读写数据。
sudo chown prometheus:prometheus /var/lib/prometheus
- 下载Prometheus二进制文件。
cd /tmp wget https://github.com/prometheus/prometheus/releases/download/v2.54.1/prometheus-2.54.1.linux-amd64.tar.gz tar -xvf prometheus-2.54.1.linux-amd64.tar.gz
- 移动配置文件并将其所有权设置为Prometheus用户。
cd prometheus-2.54.1.linux-amd64 sudo mv console* /etc/prometheus sudo mv promtool /usr/local/bin/ sudo mv prometheus.yml /etc/prometheus sudo chown -R prometheus:prometheus /etc/prometheus sudo mv prometheus /usr/local/bin/ sudo chown prometheus:prometheus /usr/local/bin/prometheus
- 查看Prometheus配置文件,确保文件存在且内容正确无误。
sudo vim /etc/prometheus/prometheus.yml

- 创建systemd服务文件以实现Prometheus服务的自动启动和管理。
sudo vim /etc/systemd/system/prometheus.service
在prometheus.service文件内写入以下配置:
[Unit] Description=Prometheus Wants=network-online.target After=network-online.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.console.templates=/etc/prometheus/consoles \ --web.console.libraries=/etc/prometheus/console_libraries [Install] WantedBy=multi-user.target - 启动Prometheus服务并查看其状态。
systemctl daemon-reload systemctl start prometheus systemctl enable prometheus systemctl status prometheus

- 通过浏览器访问如下地址查看Prometheus页面。
http://ECS-Prometheus的公网IP:9090/graph
如果页面无法打开,请检查安全组配置,涉及端口(如9090)是否已开放。

安装并设置Prometheus Alertmanager
在Prometheus服务器(本示例中为ECS-Prometheus)上执行以下命令安装并设置Alertmanager。
- 安装Alertmanager。
sudo apt install prometheus-alertmanager systemctl status prometheus-alertmanager ps -u prometheus
安装时如遇报错时请按以下步骤清理环境并重新安装:
- 先移除包的所有痕迹
sudo dpkg --remove --force-remove-reinstreq prometheus-alertmanager
如果上面命令失败,请强制删除
sudo dpkg --purge --force-all prometheus-alertmanager
- 清理相关文件
sudo rm -rf /var/lib/dpkg/info/prometheus-alertmanager.*
sudo rm -f /var/lib/dpkg/status
sudo cp /var/lib/dpkg/status-old /var/lib/dpkg/status # 如果有备份的话
- 重建dpkg数据库
sudo apt-get update
- 修复损坏的包
- 启动服务
- 检查状态
sudo systemctl status prometheus-alertmanager.service
如果显示“active"表示启动正常,可直接执行ps -u prometheus进行查看。
如果显示“inactive”报错unmask,可执行以下命令取消屏蔽服务,然后再重新启动服务、检查状态。
sudo systemctl unmask prometheus-alertmanager.service
sudo systemctl start prometheus-alertmanager.service
sudo systemctl status prometheus-alertmanager.service
ps -u prometheus

- 先移除包的所有痕迹
- 修改Prometheus配置文件。
sudo vim /etc/prometheus/prometheus.yml
修改Prometheus配置文件中的Alertmanager部分。
# Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: ['localhost:9093']
- 使用promtool检查Prometheus配置文件,然后重启Prometheus服务。
promtool check config /etc/prometheus/prometheus.yml

sudo systemctl restart prometheus sudo systemctl status prometheus
安装Grafana
在Prometheus服务器(本示例中为ECS-Prometheus)上执行以下命令安装Grafana。
- 安装Grafana依赖软件包。
sudo apt install -y wget sudo apt install -y software-properties-common sudo apt install -y apt-transport-https

安装时如遇报错时请按以下步骤执行:
# 修复损坏的包
sudo dpkg --configure -a
# 修复依赖关系
sudo apt --fix-broken install
# 清理可能的锁文件
sudo rm -f /var/lib/dpkg/lock
sudo rm -f /var/lib/apt/lists/lock
sudo rm -f /var/cache/apt/archives/lock
# 更新包列表
sudo apt update
# 检查 needrestart 状态
dpkg -l | grep needrestart
# 如果需要,重新配置 needrestart
sudo dpkg-reconfigure needrestart
# 或者暂时跳过 needrestart(在容器或不需要重启的环境中)
echo '$nrconf{restart} = "l";' | sudo tee -a /etc/needrestart/needrestart.conf
# 重新安装
sudo apt install -y wget
sudo apt install -y software-properties-common
sudo apt install -y apt-transport-https
- 添加Grafana GPK密钥。
sudo mkdir -p /etc/apt/keyrings/ wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
- 添加Grafana APT仓库。
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list sudo apt update
- 安装 Grafana。
sudo apt install grafana
- 启动 Grafana 服务并查看状态。
sudo grafana-server -v sudo systemctl start grafana-server sudo systemctl enable grafana-server sudo systemctl status grafana-server

- 通过浏览器访问如下地址,登录Grafana。
http://ECS-Prometheus的公网IP:3000/login
如果页面无法打开,请检查安全组配置,涉及端口(如3000)是否已开放。
默认账号/密码为admin/admin,首次登录后,请按界面提示重置密码。


登录成功后,界面显示如下:

在目标节点上安装Node Exporter
在目标节点(本示例中为ECS-target-0001和ECS-target-0002)上分别执行以下命令安装Node Exporter:
- 更新软件包仓库。
sudo apt update
- 下载Node Exporter二进制文件。
curl -s https://api.github.com/repos/prometheus/node_exporter/releases/latest| grep browser_download_url|grep linux-amd64|cut -d '"' -f 4|wget -qi -
该命令执行时间较长,请耐心等待。
tar -xvf node_exporter*.tar.gz cd node_exporter*/ cp node_exporter /usr/local/bin node_exporter --version
- 为Node Exporter创建systemd服务。
sudo useradd -rs /bin/false nodeusr sudo vim /etc/systemd/system/node_exporter.service
配置文件内容如下:
[Unit] Description=Node Exporter After=network.target [Service] User=nodeusr Group=nodeusr Type=simple ExecStart=/usr/local/bin/node_exporter [Install] WantedBy=multi-user.target

- 启动Node Exporter服务并检查服务状态。
systemctl daemon-reload systemctl start node_exporter systemctl status node_exporter

将目标节点添加到Prometheus服务器
在Prometheus服务器(本示例中为ECS-Prometheus)上执行以下命令添加目标节点:
- 在Prometheus配置中设置任务。
sudo vim /etc/prometheus/prometheus.yml
配置文件中增加如下内容,其中目标节点(本示例中为ECS-target-0001和ECS-target-0002)的公网IP请根据实际填写。
- job_name: 'node_exporter_ubuntu' scrape_interval: 5s static_configs: - targets: ['10.x.x.196:9100', '10.x.x.198:9100']
- 使用promtool检查配置规则并重启Prometheus。
promtool check config /etc/prometheus/prometheus.yml sudo systemctl restart prometheus sudo systemctl status prometheus
配置Prometheus告警
- 配置Prometheus告警规则YAML文件。
vim /etc/prometheus/rules.yml
在告警规则文件中,通过定义告警规则组,可以将逻辑相关的告警规则配置在一起,便于管理和维护。一条告警规则主要由以下几部分组成:
- alert:告警规则的名称。
- expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。更多PromQL表达式规则信息请参见Prometheus官网。
- for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。
- labels:自定义标签。
- annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等。
本示例告警规则如下:
groups: - name: instance-down interval: 15s rules: - alert: InstanceDown expr: up == 0 for: 5m labels: severity: high annotations: message: "the {{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes" - name: cpu-usage interval: 15s rules: - alert: CPUHigh expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 50 for: 2m labels: severity: warning annotations: message: "CPU usage is above 25% for the last 5 minutes on instance {{ $labels.instance }} of job {{ $labels.job }}" - name: network-traffic interval: 15s rules: - alert: HighNetworkTraffic expr: rate(node_network_receive_bytes_total[3m]) > 1000000 for: 3m labels: severity: warning annotations: message: "Incoming network traffic is higher than 1MB/s on instance {{ $labels.instance }} for more than 3 minutes"
- 配置prometheus.yml以包含告警规则。
vim /etc/prometheus/prometheus.yml
rule_files: - "rules.yml"

- 使用promtool检查配置规则无误后,重启Prometheus。
promtool check rules /etc/prometheus/rules.yml promtool check config /etc/prometheus/prometheus.yml sudo systemctl restart prometheus sudo systemctl status prometheus

配置Grafana
- 配置Grafana告警接收方信息,确保告警通知能够及时发送到指定的接收渠道,如Slack、Email等,本案例使用Slack。
- 配置数据源,选择Prometheus数据源,进入数据源配置页面。
在URL上配置Prometheus的地址(http://localhost:9090),其他选项保持默认。

单击下方的 Save&test,数据源连接成功则如下图所示,若连接失败,检查Prometheus端口是否被占用。

- 查看Prometheus已配置的告警规则,确保告警规则符合预期。
- 配置Dashboard面板,可以自定义需要查询的监控指标。

- 数据源选择Prometheus。
- 监控指标查询方式建议选择code。
- 输入要查询的内容,这里不仅支持简单指标查询,也支持指标之间的运算。
- 选择查询监控指标的时间范围。
- 单击Run queries,测试查询结果是否符合预期。
- 设置面板标题后保存。










