简介

在当今的云原生监控领域,Grafana + Prometheus + Node Exporter 构成的黄金三角为开发者提供了完整的系统监控解决方案。这三个开源项目各司其职,形成了「数据采集→存储查询→可视化展示」的完整链路:

Grafana - 可视化呈现专家

作为业界领先的开源数据可视化平台,不直接参与数据采集和存储的核心环节,而是通过对接多种数据源(支持 Prometheus、SQL 数据库等 30+ 数据源类型),将原始监控指标转换为精美的时序数据看板。其特色功能包括:

  • 多层级权限认证体系

  • 可交互式的动态仪表盘变量

  • 支持模板化的告警策略配置

  • 800+ 官方/社区插件生态

Prometheus - 时序数据引擎

采用主动拉取(Pull)模型的分布式监控系统,基于 HTTP 协议定期抓取监控目标暴露的指标接口。核心优势体现在:

  • 内建高效的时间序列数据库 (TSDB)

  • PromQL 查询语言实现多维数据聚合

  • Alertmanager 模块支持多通道告警推送

  • 原生服务发现机制适配动态云环境

Node Exporter - 主机监控探针

作为 Prometheus 生态的标准采集代理,部署在被监控节点后能够收集 500+ 细粒度指标,涵盖:

  • CPU/Memory 资源使用率

  • 磁盘IO与文件系统状态

  • 网络接口流量统计

  • 硬件设备健康状态(通过 IPMI)
    (完整指标清单详见官方 GitHub 仓库

三者通过标准化接口形成松耦合架构:Exporters 标准化数据采集 → Prometheus 统一存储处理 → Grafana 按需查询展示,这种解耦设计使得每个组件都能弹性扩展,适应从单节点到 Kubernetes 集群的不同规模场景。

部署流程

1.安装 Prometheus(服务端)

以下两种方法,任选其一即可

a)使用一键脚本

wget -qO- 'https://raw.githubusercontent.com/kaze-kaze/Prometheus-NodeExporter/refs/heads/main/script/prometheus-install.sh' | sudo bash

若运行结束后,出现 active (running) ,则安装成功。

通过 http://ip_addr:9090 访问 Prometheus Web 界面和仪表板。将 ip_addr 替换为监控服务器的地址。

b)手动安装

下载地址:Download | Prometheus复制最新LTS版本的下载地址

下面脚本自动获取最新版本,并下载安装。一键复制,粘贴到终端执行即可。

# 获取 Prometheus 最新版本
github_project="prometheus/prometheus"
tag=$(wget -qO- -t1 -T2 "https://api.github.com/repos/${github_project}/releases/latest" | grep "tag_name" | head -n 1 | awk -F ":" '{print $2}' | sed 's/\"//g;s/,//g;s/ //g')
# echo ${tag}
# tag2=${tag#*v}
 
# 下载 Prometheus 最新版本并解压
wget https://github.com/prometheus/prometheus/releases/download/${tag}/prometheus-${tag#*v}.linux-amd64.tar.gz && \
tar xvfz prometheus-*.tar.gz && \
rm prometheus-*.tar.gz && cd prometheus-*.linux-amd64
 
# 将 Prometheus 可执行文件放入通用的系统目录下
sudo mv prometheus promtool /usr/local/bin/
# /etc/prometheus 放Prometheus配置文件。 /var/lib/prometheus 存应用程序数据
sudo mkdir -p /etc/prometheus /var/lib/prometheus && \
sudo mv prometheus.yml /etc/prometheus/prometheus.yml
sudo mv consoles/ console_libraries/ /etc/prometheus/
 
# 清理
cd .. && rm -r prometheus-*.linux-amd64
  • prometheuspromtool 目录移动到 /usr/local/bin/ 目录。这使得所有用户都可以访问 Prometheus。

  • prometheus.yml 是配置文件

  • consolesconsole_libraries 目录包含创建自定义控制台所需的资源。此功能更为高级,本文未介绍。但是,这些文件也应移至 etc/prometheus 目录,以备需要时使用。

使用以下命令验证 Prometheus 是否已成功安装:

prometheus --version

创建一个系统用户 prometheus

sudo useradd -rs /bin/false prometheus

所有权分配

sudo chown -R prometheus: /etc/prometheus /var/lib/prometheus

将 Prometheus 配置为服务

使用 systemd 守护进程,它能实现程序的后台运行、开机自启、崩溃重启等。

创建 prometheus.service 文件:

sudo vim /etc/systemd/system/prometheus.service

复制进去

[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
 
[Service]
User=prometheus
Group=prometheus
Type=simple
Restart=on-failure
RestartSec=5s
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 \
    --web.listen-address=0.0.0.0:9090 \
    --web.enable-lifecycle \
    --log.level=info
 
[Install]
WantedBy=multi-user.target

说明:

  • ExecStart :就是在终端时开启程序的命令,只不过要用绝对路径。

  • config.file 将 Prometheus 配置文件的位置为 /etc/prometheus/prometheus.yml

  • storage.tsdb.path 告诉 Prometheus 将程序数据存储在 /var/lib/prometheus/ 中。

  • web.listen-address 设置为 0.0.0.0:9090 ,允许 Prometheus 侦听所有网络接口上的连接。

  • web.enable-lifecycle 选项允许用户在不重新启动Prometheus的情况下重新加载配置文件。

重新加载 systemctl 守护进程。

sudo systemctl daemon-reload

设置开机自启,并立即启动运行

sudo systemctl enable --now prometheus

查看状态

sudo systemctl status prometheus
sudo systemctl start prometheus

如果 prometheus 服务无法正常启动,请运行命令 journalctl -u prometheus -f --no-pager 并检查输出是否有错误。

2.安装Node Exporter(客户端)

配置UFW规则

这一步务必不要省略,不然任何人都能连入你的9100端口获取到数据

一键配置脚本:

sudo bash -c "$(curl -fsSL https://raw.githubusercontent.com/kaze-kaze/Prometheus-NodeExporter/main/script/ufw-setup.sh)"

注意这个脚本会覆盖你现有的ufw规则,放开全部端口,仅指定端口设置白名单。

如果你本来就有ufw规则,建议你手动配置ufw策略

配置Node Exporter

以下两种方法,任选其一即可

a)一键脚本

wget -qO- 'https://raw.githubusercontent.com/kaze-kaze/Prometheus-NodeExporter/refs/heads/main/script/nodeexporter.sh' | sudo bash

若运行结束后,出现 active (running) ,则安装成功。

b)手动安装

略(脚本又没加密,自己点开链接看。。。)

3.配置Prometheus

客户端节点现在已准备好进行监控。要将客户端添加到 prometheus.yml ,按照以下步骤操作即可:

在运行Prometheus的服务器上,打开 prometheus.yml 进行编辑。

vim /etc/prometheus/prometheus.yml

找到 scrape_configs ,里面是作业列表。当前有一个名为 prometheus 的作业。此作业监视端口 9090 上的本地 Prometheus 任务。

prometheus 作业下方,添加第二个作业,其 job_namenode_exporter 。包括以下信息。

  • 设置抓取时间间隔: scrape_interval: 10s

  • 添加要监控的 IP 和 端口号 :9100 ,使用逗号分隔每个条目。

  • 要启用对本地服务器的监视,请将 localhost:9100 条目添加到列表中,并在本地安装 Node Exporter。

该条目应类似于以下示例。将 remote_addr 替换为客户端的实际IP地址。

...
 
  - job_name: "node_exporter"
    scrape_interval: 10s
    static_configs:
      - targets: ["remote_addr:9100"]
        labels:
          instance: 'Server HK'
      - targets: ["remote_addr_2:9100"]
        labels:
          instance: 'Server US'

编辑完重启服务

sudo systemctl restart prometheus

配置Grafana

前面完成了监控和数据采集工作。但是很明显人不是计算机,采集完成后的数据你没法直接看,所以还需要安装一个可视化面板Geafana。建议可以将Grafana和Prometheus放在一台服务器上。

1.安装Grafana

a)使用一键脚本

sudo bash -c "$(curl -sSfL https://raw.githubusercontent.com/kaze-kaze/Prometheus-NodeExporter/main/script/grafana-install.sh)"

b)手动部署

  1. 安装一些必需的实用程序

sudo apt-get install -y apt-transport-https software-properties-common
  1. 导入 Grafana GPG 密钥

sudo wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key
  1. 添加 Grafana“稳定版本”存储库。

echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
  1. 安装 Grafana 的开源版本。

sudo apt-get update && sudo apt-get install grafana

要安装 Grafana 企业版,请使用命令 sudo apt-get install grafana-enterprise

  1. 重新加载 systemctl 守护进程。

sudo systemctl daemon-reload
sudo systemctl enable --now grafana-server.service
sudo systemctl status grafana-server
sudo systemctl start grafana-server

关联 Grafana 和 Prometheus

所有系统组件现已安装,但 Grafana 和 Prometheus 尚未关联。剩下的可以使用 Grafana Web 界面完成。

要集成 Grafana 和 Prometheus,请按照以下步骤操作:

  1. 浏览器访问监控服务器的 3000 端口。例如,输入 http://ip_addr:3000 ,将 ip_addr 替换为实际 IP 地址。

  2. Grafana 显示登录页面。使用用户名和默认密码 都是 admin 。当出现提示时,将密码更改为更安全的值。

  3. 成功更改密码后,Grafana 将显示 Grafana 仪表板。要将 Prometheus 添加为数据源,请单击齿轮符号(代表配置),然后选择数据源。

  4. 在下一个显示中,单击“添加数据源”按钮。

  5. 选择Prometheus作为数据源。

  6. 对于本地 Prometheus 源,将 URL 设置为 http://localhost:9090 。大多数其他设置可以保留默认值。

  7. 对设置满意后,选择屏幕底部的【Save & test】按钮。

  8. 如果所有设置均正确,Grafana 会确认 Data source is working

导入 Grafana 仪表板

可以创建自定义仪表板。然而,Prometheus 已经创建了一个仪表板来支持 Node Exporter,名为 Node Information ,下面是导入的流程。

要创建自定义仪表板,请单击仪表板按钮,该按钮类似于四个正方形。然后选择+新建仪表板。有关更多信息,请参阅 Grafana 构建仪表板指南。

  1. 访问 Grafana 仪表板库: https://grafana.com/grafana/dashboards/ 。输入 Node Information 作为搜索词。

  2. 选择 Node Exporter CN 条目。

  3. 右下角查看 ID 号。该板的 ID 当前为 22869 。(英文版为22403)

  4. 返回 Grafana 仪表板。选择由四个正方形组成的仪表板图标

  5. 右上角选择【New】-【Import】。

  6. 然后在 【Import via grafana.com】, 输入上一步中的 ID 22869 。然后选择【Load】。

  7. 在下一个屏幕确认导入详细信息。选择 Prometheus 作为数据源,然后单击【Import】按钮。

  8. Node Information 仪表板立即生效。它显示客户端节点的性能指标和状态,包括内存、RAM 和 CPU 详细信息。

ps:硬件要求 (个人经验)

10台机器在 1C / 1G内存 / 10G硬盘 的环境下堪堪够用,如果需要监控更多机器,需考虑更高的主机配置

进阶玩法

Media Unlock Monitor实现流媒体解锁监控

1.项目介绍

该项目实际系MediaUnlockTest下的一个子项目,MediaUnlockTest基于lmc的全能检测脚本的思路使用golang重构,提供更快的检测速度。

MediaUnlockTest:https://github.com/nkeonkeo/MediaUnlockTest

lmc的全能检测脚本:https://github.com/lmc999/RegionRestrictionCheck

Media Unlock Monitor:https://github.com/nkeonkeo/MediaUnlockTest/tree/main/monitor

2.部署流程

(1)监控端

首先我们在需要被监控的VPS上,安装Monitor服务,运行以下命令即可:

bash <(curl -Ls unlock.moe/monitor) -service

默认监控国际主流流媒体,如果需要监控指定区域的流媒体情况,运行上面命令的时候加上后缀即可:

  -hk
        Hong Kong
  -jp
        Japan
  -mul
        Multination (default true)
  -na
        North America
  -sa
        South America
  -tw
        Taiwan

或者安装后,修改service:

vi /etc/systemd/system/multi-user.target.wants/unlock-monitor.service

在下面这行加上后缀即可:

ExecStart=/usr/bin/unlock-monitor -特定区域2字母代码

(2).配置Prometheus

在prometheus.yml 中添加job:

- job_name: checkmedia
    scrape_interval: 30s
    static_configs:
      - targets:
        - <your ip/domain>:9101
        - <your ip/domain>:9101
        - ... ##有多台Monitor就继续写下去

(3).Grafana配置

建议自己可视化编辑,如果要抄作业的话可以复制这个json,自己填入自己的配置信息

{
  "datasource": {
    "type": "prometheus",
    "uid": "d5dc8985-25a8-4199-921e-c64ce62fb93d"
  },
  "description": "",
  "fieldConfig": {
    "defaults": {
      "custom": {
        "lineWidth": 3,
        "fillOpacity": 100,
        "spanNulls": false,
        "insertNulls": false,
        "hideFrom": {
          "tooltip": false,
          "viz": false,
          "legend": false
        }
      },
      "color": {
        "mode": "continuous-GrYlRd"
      },
      "mappings": [],
      "thresholds": {
        "mode": "absolute",
        "steps": [
          {
            "color": "green",
            "value": null
          }
        ]
      }
    },
    "overrides": [
      {
        "matcher": {
          "id": "byValue",
          "options": {
            "op": "neq",
            "reducer": "allValues",
            "value": 0
          }
        },
        "properties": [
          {
            "id": "mappings",
            "value": [
              {
                "options": {
                  "0": {
                    "color": "dark-blue",
                    "index": 8,
                    "text": "Unknown"
                  },
                  "1": {
                    "color": "semi-dark-green",
                    "index": 0,
                    "text": "YES"
                  },
                  "2": {
                    "color": "dark-yellow",
                    "index": 1,
                    "text": "Restricted"
                  },
                  "3": {
                    "color": "dark-red",
                    "index": 2,
                    "text": "NO"
                  },
                  "4": {
                    "color": "dark-orange",
                    "index": 3,
                    "text": "BANNED"
                  },
                  "5": {
                    "color": "#494949",
                    "index": 4,
                    "text": "FAILED"
                  },
                  "6": {
                    "color": "purple",
                    "index": 5,
                    "text": "UNEXPECTED"
                  },
                  "-1": {
                    "color": "light-red",
                    "index": 6,
                    "text": "NET ERR"
                  },
                  "-2": {
                    "color": "semi-dark-red",
                    "index": 7,
                    "text": "ERROR"
                  }
                },
                "type": "value"
              }
            ]
          }
        ]
      }
    ]
  },
  "gridPos": {
    "h": 20,
    "w": 6,
    "x": 0,
    "y": 1
  },
  "id": 1,
  "options": {
    "mergeValues": true,
    "showValue": "auto",
    "alignValue": "center",
    "rowHeight": 0.9,
    "legend": {
      "showLegend": true,
      "displayMode": "list",
      "placement": "bottom"
    },
    "tooltip": {
      "mode": "single",
      "sort": "none",
      "maxHeight": 600
    }
  },
  "pluginVersion": "10.1.1",
  "targets": [
    {
      "datasource": {
        "type": "prometheus",
        "uid": "d5dc8985-25a8-4199-921e-c64ce62fb93d"
      },
      "disableTextWrap": false,
      "editorMode": "builder",
      "expr": "media_unblock_status{node=\"hk-1\"}",
      "fullMetaSearch": false,
      "includeNullMetadata": true,
      "instant": false,
      "legendFormat": "{{region}} {{mediaName}}",
      "range": true,
      "refId": "A",
      "useBackend": false
    }
  ],
  "title": "HK-1",
  "type": "state-timeline"
}