# 使用Prometheus和Grafana实现实时服务器监控
#### 背景介绍
在现代云原生和分布式系统中，监控应用程序和基础设施的健康状况、性能和可用性是一项重大挑战。随着系统规模的扩大，传统的监控方法难以有效管理实时数据、生成有意义的警报并提供可操作的见解。云环境的复杂性和动态特性，要求解决方案能够高效地跟踪指标、检测异常并可视化数据，以确保系统的可靠性并快速解决问题。
Prometheus是一套开源的系统监控报警框架，广泛用于各种云环境中的指标监控和可视化。Prometheus能够高效的收集、存储和查询时间序列数据，非常适合监控基础设施、应用程序和服务。Prometheus更多概念及详细信息请参见[Prometheus官方文档](https://prometheus.io/docs/introduction/overview/)。
[Grafana](https://grafana.com/)通过提供丰富的可视化功能来补充Prometheus，使用户能够创建动态仪表盘和图表来跟踪性能指标。
Prometheus和Grafana的结合，可以监控服务器的健康状况并可视化网络流量，从而对关键事件发出警报，为动态云环境提供完整的可观测性解决方案。
本文档指导用户在华为云环境中配置Prometheus以收集各种监控指标，并使用Grafana可视化收集到的数据并与Slack集成以接收告警通知。
#### 资源与成本规划
表1资源与成本规划 
| 资源       | 资源说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | 成本说明                                                                                                                                                                                                                                                                                                                                                                                |
|:---|:---|:---|
| 虚拟私有云VPC | VPC网段：192.168.0.0/16                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | 免费                                                                                                                                                                                                                                                                                                                                                                                 |
| 虚拟私有云子网 | 子网网段：192.168.0.0/24                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                | 免费                                                                                                                                                                                                                                                                                                                                                                                 |
| 安全组      | 本示例中所有ECS均使用默认安全组default，且案例涉及端口均开放给本地PC的IP地址。 更多安全组详细信息请参见[安全组概述](https://support.huaweicloud.com/usermanual-ecs/zh-cn_topic_0140323157.html)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | 免费                                                                                                                                                                                                                                                                                                                                                                                  |
| 弹性云服务器  | - 名称：本示例为ECS-Prometheus，用于部署Prometheus和Grafana。  - 规格：4 vCPUs \| 16 GiB \| c7n.xlarge.4  - 镜像：Ubuntu 22.04 server 64bit）  - 系统盘：通用型SSD盘，40GB。  - 弹性公网IP：现在购买  - 公网带宽：按流量计费  - 带宽大小：200 Mbit/s   | ECS涉及以下几项费用： - 云服务器  - 云硬盘  - 弹性公网IP   具体的计费方式及标准请参考[计费模式概述](https://support.huaweicloud.com/price-ecs/ecs_billing_2001.html)。 |
| 弹性云服务器  | - 名称：本示例为ECS-target-0001，作为目标云服务器之一。  - 规格：4 vCPUs \| 8 GiB \| s7n.xlarge.2  - 镜像：Ubuntu 22.04 server 64bit  - 系统盘：通用型SSD盘，40GB  - 弹性公网IP：现在购买  - 公网带宽：按流量计费  - 带宽大小：100 Mbit/s              | ECS涉及以下几项费用： - 云服务器  - 云硬盘  - 弹性公网IP   具体的计费方式及标准请参考[计费模式概述](https://support.huaweicloud.com/price-ecs/ecs_billing_2001.html)。 |
| 弹性云服务器  | - 名称：本示例为ECS-target-0002，作为目标云服务器之一。  - 规格：4 vCPUs \| 8 GiB \| s7n.xlarge.2  - 镜像：Ubuntu 22.04 server 64bit  - 系统盘：通用型SSD盘，40GB  - 弹性公网IP：现在购买  - 公网带宽：按流量计费  - 带宽大小：100 Mbit/s          | ECS涉及以下几项费用： - 云服务器  - 云硬盘  - 弹性公网IP   具体的计费方式及标准请参考[计费模式概述](https://support.huaweicloud.com/price-ecs/ecs_billing_2001.html)。 |
   
#### 操作流程
表2操作流程 
| 操作步骤                                                                | 说明                                                                                                                                          |
|:---|:---|
| [安装并设置Prometheus]                  | 在Prometheus服务器（本示例中为ECS-Prometheus）上安装Prometheus，实现对监控数据的获取、存储以及查询。                                                                       |
| [安装并设置Prometheus Alertmanager] | 在Prometheus服务器上安装Prometheus Alertmanager。Alertmanager主要负责对Prometheus产生的告警进行统一处理。                                                           |
| [安装Grafana]                      | 在Prometheus服务器上安装Grafana。                                                                                                                   |
| [在目标节点上安装Node Exporter]       | 在目标节点（本示例中为ECS-target-0001和ECS-target-0002）上分别安装Node Exporter。Node Exporter安装在目标上的代理程序，它能够采集到主机的运行指标如CPU、 内存、磁盘等信息，向Prometheus提供标准格式的监控数据。 |
| [将目标节点添加到Prometheus服务器]           | 为了能够让Prometheus从目标节点的Node Exporter获取到监控数据，需要将目标节点添加到Prometheus服务器。                                                                          |
| [配置Prometheus告警]               | 在Prometheus服务器上配置告警规则。 在Prometheus中支持基于PromQL创建告警规则，如果满足PromQL定义的规则，则会产生一条告警。                                |
| [配置Grafana]                      | 配置Grafana，包括配置告警消息接收方、添加Prometheus数据源，以及创建自定义的Dashboard以实现监控信息可视化。                                                                          |
| [结果验证]                          | 触发告警规则以验证Prometheus以及Grafana是否能按预期进行监控信息的展示及通知。                                                                                                |
   
#### 前提条件
- 已按照资源与成本规划购买3台ECS，并确保云服务器之间网络互通。
- 已了解PromQL表达式规则，详情请参见[Prometheus官网](https://prometheus.io/docs/prometheus/latest/querying/basics/)。
 
 #### 安装并设置Prometheus
在Prometheus服务器（本示例中为ECS-Prometheus）上执行以下步骤，安装Prometheus并启动服务：
1. 更新软件包仓库。
   ```
   sudo apt update
   ```
   
2. 创建Prometheus用户。
   ```
   sudo useradd --no-create-home --shell /bin/false prometheus
   ```
   
3. 创建Prometheus目录。
   ```
   sudo mkdir /etc/prometheus
   sudo mkdir /var/lib/prometheus
   ```
   
4. 设置目录的所有权，以确保Prometheus服务能够正确读写数据。
   ```
   sudo chown prometheus:prometheus /var/lib/prometheus
   ```
   
5. 下载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
   ```
   
6. 移动配置文件并将其所有权设置为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
   ```
   
7. 查看Prometheus配置文件，确保文件存在且内容正确无误。
   ```
   sudo vim /etc/prometheus/prometheus.yml
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533058805.png "点击放大")
   
8. 创建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
   ```
   
9. 启动Prometheus服务并查看其状态。
   ```
   systemctl daemon-reload
   systemctl start prometheus
   systemctl enable prometheus
   systemctl status prometheus
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533178841.png "点击放大")
   
10. 通过浏览器访问如下地址查看Prometheus页面。 http://*ECS-Prometheus的公网IP*:9090/graph
    ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
    如果页面无法打开，请检查安全组配置，涉及端口（如9090）是否已开放。
    ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501258936.png "点击放大")
    
 
 #### 安装并设置Prometheus Alertmanager
在Prometheus服务器（本示例中为ECS-Prometheus）上执行以下命令安装并设置Alertmanager。
1. 安装Alertmanager。
   ```
   sudo apt install prometheus-alertmanager
   systemctl status prometheus-alertmanager
   ps -u prometheus
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   安装时如遇报错时请按以下步骤清理环境并重新安装：
   1. 先移除包的所有痕迹 sudo dpkg --remove --force-remove-reinstreq prometheus-alertmanager
      如果上面命令失败，请强制删除
      sudo dpkg --purge --force-all prometheus-alertmanager
      
   
   2. 清理相关文件 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 # 如果有备份的话
      
   
   3. 重建dpkg数据库 sudo dpkg --configure -a
      sudo apt-get update
      
   
   4. 修复损坏的包 sudo apt-get install -f
      
   
   5. 启动服务 sudo systemctl start prometheus-alertmanager.service
      
   
   6. 检查状态 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
      
    
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501418794.png "点击放大")
   
2. 修改Prometheus配置文件。
   ```
   sudo vim /etc/prometheus/prometheus.yml
   ```
   修改Prometheus配置文件中的Alertmanager部分。
   ```
   # Alertmanager configuration
   alerting:
     alertmanagers:
       - static_configs:
         - targets: ['localhost:9093']
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533058807.png "点击放大")
   
3. 使用promtool检查Prometheus配置文件，然后重启Prometheus服务。
   ```
   promtool check config /etc/prometheus/prometheus.yml
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533178843.png "点击放大")
   ```
   sudo systemctl restart prometheus
   sudo systemctl status prometheus
   ```
   
 
 #### 安装Grafana
在Prometheus服务器（本示例中为ECS-Prometheus）上执行以下命令安装Grafana。
1. 安装Grafana依赖软件包。
   ```
   sudo apt install -y wget
   sudo apt install -y software-properties-common
   sudo apt install -y apt-transport-https
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501258938.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   安装时如遇报错时请按以下步骤执行：
   # 修复损坏的包
   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
   
2. 添加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
   ```
   
3. 添加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
   ```
   
4. 安装 Grafana。
   ```
   sudo apt install grafana
   ```
   
5. 启动 Grafana 服务并查看状态。
   ```
   sudo grafana-server -v
   sudo systemctl start grafana-server
   sudo systemctl enable grafana-server
   sudo systemctl status grafana-server
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501418796.png "点击放大")
   
6. 通过浏览器访问如下地址，登录Grafana。 http://*ECS-Prometheus的公网IP*:3000/login
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   如果页面无法打开，请检查安全组配置，涉及端口（如3000）是否已开放。
   默认账号/密码为admin/admin，首次登录后，请按界面提示重置密码。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533058809.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533178845.png "点击放大")
   登录成功后，界面显示如下：
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501258940.png "点击放大")
   
 
 #### 在目标节点上安装Node Exporter
在目标节点（本示例中为ECS-target-0001和ECS-target-0002）上分别执行以下命令安装Node Exporter：
1. 更新软件包仓库。
   ```
   sudo apt update
   ```
   
2. 下载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 -
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   该命令执行时间较长，请耐心等待。
   ```
   tar -xvf node_exporter*.tar.gz
   cd node_exporter*/
   cp node_exporter /usr/local/bin
   node_exporter --version
   ```
   
3. 为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
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501418798.png)
   
4. 启动Node Exporter服务并检查服务状态。
   ```
   systemctl daemon-reload
   systemctl start node_exporter
   systemctl status node_exporter
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533058811.png "点击放大")
   
 
 #### 将目标节点添加到Prometheus服务器
在Prometheus服务器（本示例中为ECS-Prometheus）上执行以下命令添加目标节点：
1. 在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']
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533178847.png "点击放大")
   
2. 使用promtool检查配置规则并重启Prometheus。
   ```
   promtool check config /etc/prometheus/prometheus.yml
   sudo systemctl restart prometheus
   sudo systemctl status prometheus
   ```
   
 
 #### 配置Prometheus告警
1. 配置Prometheus告警规则YAML文件。
   ```
   vim /etc/prometheus/rules.yml
   ```
   在告警规则文件中，通过定义告警规则组，可以将逻辑相关的告警规则配置在一起，便于管理和维护。一条告警规则主要由以下几部分组成：
   - alert：告警规则的名称。
   
   - expr：基于PromQL表达式告警触发条件，用于计算是否有时间序列满足该条件。更多PromQL表达式规则信息请参见[Prometheus官网](https://prometheus.io/docs/prometheus/latest/querying/basics/)。
   
   - 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"
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501258942.png "点击放大")
   
2. 配置prometheus.yml以包含告警规则。
   ```
   vim /etc/prometheus/prometheus.yml
   ```
   ```
   rule_files:
     - "rules.yml"
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501418800.png "点击放大")
   
3. 使用promtool检查配置规则无误后，重启Prometheus。
   ```
   promtool check rules /etc/prometheus/rules.yml
   promtool check config /etc/prometheus/prometheus.yml
   sudo systemctl restart prometheus
   sudo systemctl status prometheus
   ```
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533058813.png "点击放大")
   
 
 #### 配置Grafana
1. 配置Grafana告警接收方信息，确保告警通知能够及时发送到指定的接收渠道，如Slack、Email等，本案例使用Slack。 ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533178849.png "点击放大")
   
2. 配置数据源，选择Prometheus数据源，进入数据源配置页面。 ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501258944.png "点击放大")
   在URL上配置Prometheus的地址（http://localhost:9090），其他选项保持默认。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501418802.png "点击放大")
   单击下方的 Save\&test，数据源连接成功则如下图所示，若连接失败，检查Prometheus端口是否被占用。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533058815.png "点击放大")
   
3. 查看Prometheus已配置的告警规则，确保告警规则符合预期。 ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533178851.png "点击放大")
   
4. 配置Dashboard面板，可以自定义需要查询的监控指标。 ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501258946.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501418804.png "点击放大")
   - 数据源选择Prometheus。
   
   - 监控指标查询方式建议选择code。
   
   - 输入要查询的内容，这里不仅支持简单指标查询，也支持指标之间的运算。
     例如查询节点的CPU使用率，查询语句如下：
     ```
     (1 - sum(rate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) / sum(rate(node_cpu_seconds_total[5m])) by (instance) ) * 100
     ```
     
   
   - 选择查询监控指标的时间范围。
   
   - 单击Run queries，测试查询结果是否符合预期。
   
   - 设置面板标题后保存。
    
 
 #### 结果验证
1. 查看Prometheus中目标云服务器配置是否正确。
   ![](https://support.huaweicloud.com/bestpractice-ecs/public_sys-resources/note_3.0-zh-cn.png)
   如果目标云服务器状态不是UP，请检查云服务器的安全组配置中涉及端口（如9100），是否对Prometheus服务器开放。
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533058817.png "点击放大")
   
2. 查看Prometheus中告警规则是否配置正确。 ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533178853.png "点击放大")
   
3. 在Prometheus使用PromQL查询语句查询指标。 ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501258948.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501418806.png "点击放大")
   
4. 当目标云服务器关机后，告警被触发，可以在Prometheus、Grafana中查看告警信息，并在Slack中收到告警消息。 ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533058819.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002533178855.png "点击放大")
   ![](https://support.huaweicloud.com/bestpractice-ecs/zh-cn_image_0000002501258950.png "点击放大")
   
 
