文档首页/ 弹性云服务器 ECS/ 最佳实践/ 云服务器运维与监控/ 使用Prometheus和Grafana实现实时服务器监控
更新时间:2026-01-07 GMT+08:00
分享

使用Prometheus和Grafana实现实时服务器监控

背景介绍

在现代云原生和分布式系统中,监控应用程序和基础设施的健康状况、性能和可用性是一项重大挑战。随着系统规模的扩大,传统的监控方法难以有效管理实时数据、生成有意义的警报并提供可操作的见解。云环境的复杂性和动态特性,要求解决方案能够高效地跟踪指标、检测异常并可视化数据,以确保系统的可靠性并快速解决问题。

Prometheus是一套开源的系统监控报警框架,广泛用于各种云环境中的指标监控和可视化。Prometheus能够高效的收集、存储和查询时间序列数据,非常适合监控基础设施、应用程序和服务。Prometheus更多概念及详细信息请参见Prometheus官方文档

Grafana通过提供丰富的可视化功能来补充Prometheus,使用户能够创建动态仪表盘和图表来跟踪性能指标。

Prometheus和Grafana的结合,可以监控服务器的健康状况并可视化网络流量,从而对关键事件发出警报,为动态云环境提供完整的可观测性解决方案。

本文档指导用户在华为云环境中配置Prometheus以收集各种监控指标,并使用Grafana可视化收集到的数据并与Slack集成以接收告警通知。

资源与成本规划

表1 资源与成本规划

资源

资源说明

成本说明

虚拟私有云VPC

VPC网段:192.168.0.0/16

免费

虚拟私有云子网

子网网段:192.168.0.0/24

免费

安全组

本示例中所有ECS均使用默认安全组default,且案例涉及端口均开放给本地PC的IP地址。

更多安全组详细信息请参见安全组概述

免费

弹性云服务器

  • 名称:本示例为ECS-Prometheus,用于部署Prometheus和Grafana。
  • 规格:4 vCPUs | 16 GiB | c7n.xlarge.4
  • 镜像:Ubuntu 22.04 server 64bit)
  • 系统盘:通用型SSD盘,40GB。
  • 弹性公网IP:现在购买
  • 公网带宽:按流量计费
  • 带宽大小:200 Mbit/s

ECS涉及以下几项费用:

  • 云服务器
  • 云硬盘
  • 弹性公网IP

具体的计费方式及标准请参考计费模式概述

  • 名称:本示例为ECS-target-0001,作为目标云服务器之一。
  • 规格:4 vCPUs | 8 GiB | s7n.xlarge.2
  • 镜像:Ubuntu 22.04 server 64bit
  • 系统盘:通用型SSD盘,40GB
  • 弹性公网IP:现在购买
  • 公网带宽:按流量计费
  • 带宽大小:100 Mbit/s
  • 名称:本示例为ECS-target-0002,作为目标云服务器之一。
  • 规格:4 vCPUs | 8 GiB | s7n.xlarge.2
  • 镜像:Ubuntu 22.04 server 64bit
  • 系统盘:通用型SSD盘,40GB
  • 弹性公网IP:现在购买
  • 公网带宽:按流量计费
  • 带宽大小:100 Mbit/s

操作流程

表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官网

安装并设置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

  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

  10. 通过浏览器访问如下地址查看Prometheus页面。

    http://ECS-Prometheus的公网IP:9090/graph

    如果页面无法打开,请检查安全组配置,涉及端口(如9090)是否已开放。

安装并设置Prometheus Alertmanager

在Prometheus服务器(本示例中为ECS-Prometheus)上执行以下命令安装并设置Alertmanager。

  1. 安装Alertmanager。
    sudo apt install prometheus-alertmanager
    systemctl status prometheus-alertmanager
    ps -u prometheus

    安装时如遇报错时请按以下步骤清理环境并重新安装:

    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

  2. 修改Prometheus配置文件。
    sudo vim /etc/prometheus/prometheus.yml

    修改Prometheus配置文件中的Alertmanager部分。

    # Alertmanager configuration
    alerting:
      alertmanagers:
        - static_configs:
          - targets: ['localhost:9093']

  3. 使用promtool检查Prometheus配置文件,然后重启Prometheus服务。
    promtool check config /etc/prometheus/prometheus.yml

    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

    安装时如遇报错时请按以下步骤执行:

    # 修复损坏的包

    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

  6. 通过浏览器访问如下地址,登录Grafana。

    http://ECS-Prometheus的公网IP:3000/login

    如果页面无法打开,请检查安全组配置,涉及端口(如3000)是否已开放。

    默认账号/密码为admin/admin,首次登录后,请按界面提示重置密码。

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

在目标节点上安装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 -

    该命令执行时间较长,请耐心等待。

    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

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

将目标节点添加到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']

  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官网
    • 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"

  2. 配置prometheus.yml以包含告警规则。
    vim /etc/prometheus/prometheus.yml
    rule_files:
      - "rules.yml"

  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

配置Grafana

  1. 配置Grafana告警接收方信息,确保告警通知能够及时发送到指定的接收渠道,如Slack、Email等,本案例使用Slack。

  2. 配置数据源,选择Prometheus数据源,进入数据源配置页面。

    在URL上配置Prometheus的地址(http://localhost:9090),其他选项保持默认。

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

  3. 查看Prometheus已配置的告警规则,确保告警规则符合预期。

  4. 配置Dashboard面板,可以自定义需要查询的监控指标。

    • 数据源选择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中目标云服务器配置是否正确。

    如果目标云服务器状态不是UP,请检查云服务器的安全组配置中涉及端口(如9100),是否对Prometheus服务器开放。

  2. 查看Prometheus中告警规则是否配置正确。

  3. 在Prometheus使用PromQL查询语句查询指标。

  4. 当目标云服务器关机后,告警被触发,可以在Prometheus、Grafana中查看告警信息,并在Slack中收到告警消息。

相关文档