Files
nexus/openclaw/yunhan/infrastructure/Prometheus-Grafana-NodeExporter-MacMini.md

11 KiB
Raw Blame History

Prometheus + Grafana + Node Exporter 监控部署方案

部署日期2026-04-15 架构Ubuntu2 (Prometheus + Grafana) + MacMini M4 (Node Exporter 原生安装)


整体架构

┌─────────────────────────────────────────────────────────────────┐
│                        本地网络 (LAN)                            │
│                                                                 │
│   ┌──────────────┐                      ┌──────────────────┐   │
│   │   MacMini    │                      │     Ubuntu2      │   │
│   │   M4 Chip   │◄───── 抓取 ───────► │   (Prometheus    │   │
│   │              │   192.168.3.189      │    + Grafana)    │   │
│   │  Node Exp.   │        :9100        │   192.168.3.45   │   │
│   │  (原生)      │                      │                  │   │
│   │              │                      │  :9090 Prometheus│   │
│   │              │                      │  :3000 Grafana   │   │
│   └──────────────┘                      └──────────────────┘   │
│                                                                 │
│                          └──► 浏览器访问 Dashboard ───►          │
└─────────────────────────────────────────────────────────────────┘

组件说明

组件 服务器 IP 端口 版本
Prometheus Ubuntu2 192.168.3.45 9090 v2.51.0
Grafana Ubuntu2 192.168.3.45 3000 10.4.0
node-exporter MacMini 192.168.3.189 9100 1.11.1

第一部分Ubuntu2 部署 Prometheus + Grafana

1.1 创建目录结构

# 在 Ubuntu2 上执行
mkdir -p ~/docker/prometheus
mkdir -p ~/docker/grafana/provisioning/datasources
mkdir -p ~/docker/grafana/provisioning/dashboards
mkdir -p ~/docker/grafana/data

1.2 Prometheus 配置

文件:~/docker/prometheus/docker-compose.yml

version: '3.8'

services:
  prometheus:
    image: prom/prometheus:v2.51.0
    container_name: prometheus
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--web.enable-lifecycle'
    extra_hosts:
      - "host.docker.internal:host-gateway"

volumes:
  prometheus-data:

文件:~/docker/prometheus/prometheus.yml

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  # Prometheus 自身监控
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # MacMini node-exporter
  - job_name: 'macmini'
    static_configs:
      - targets: ['192.168.3.189:9100']
    scrape_interval: 30s

1.3 Grafana 配置

文件:~/docker/grafana/docker-compose.yml

version: '3.8'

services:
  grafana:
    image: grafana/grafana:10.4.0
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    volumes:
      - ./provisioning/datasources:/etc/grafana/provisioning/datasources
      - ./provisioning/dashboards:/etc/grafana/provisioning/dashboards
      - ./data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin123
      - GF_USERS_ALLOW_SIGN_UP=false
    extra_hosts:
      - "host.docker.internal:host-gateway"

文件:~/docker/grafana/provisioning/datasources/datasource.yml

apiVersion: 1

datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://host.docker.internal:9090
    uid: prometheus
    isDefault: true
    editable: false

文件:~/docker/grafana/provisioning/dashboards/dashboard.yml

apiVersion: 1

providers:
  - name: 'default'
    orgId: 1
    folder: ''
    type: file
    disableDeletion: false
    allowUiUpdates: true
    updateIntervalSeconds: 10
    options:
      path: /etc/grafana/provisioning/dashboards

1.4 启动服务

cd ~/docker/prometheus && docker compose up -d
cd ~/docker/grafana && docker compose up -d

1.5 验证状态

# 检查容器状态
docker ps

# 检查 Prometheus targets
curl http://localhost:9090/api/v1/targets

# 验证指标存在
curl -s http://localhost:9090/api/v1/query?query=up

第二部分MacMini 部署 Node Exporter原生安装

2.1 重要说明

重要:在 MacMini 上必须使用原生安装,不能用 Docker

原因Docker Desktop for Mac 运行在 Linux VM 中Docker 版的 node-exporter 只能看到 VM 的资源(约 8GB无法看到真实的 Mac 硬件16GB

Mac Mini M4 (16GB)  ← 原生 node-exporter 才能看到真实硬件
       ↓
Linux VM (Docker)  ← Docker node-exporter 只能看到 VM 资源 (~8GB)
       ↓
Docker 容器        ← 只能看到 VM 的资源

2.2 安装 Node Exporter

# 使用 Homebrew 安装
/opt/homebrew/bin/brew install node_exporter

# 验证安装
node_exporter --version

2.3 创建启动脚本

文件:~/Library/LaunchAgents/homebrew.node_exporter.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>homebrew.node_exporter</string>
    <key>ProgramArguments</key>
    <array>
        <string>/opt/homebrew/opt/node_exporter/bin/node_exporter</string>
        <string>--web.listen-address=:9100</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

2.4 启动服务

# 停止并移除旧的 Docker 版本(如果存在)
/Applications/Docker.app/Contents/Resources/bin/docker stop node-exporter
/Applications/Docker.app/Contents/Resources/bin/docker rm node-exporter

# 加载 launchd 服务
launchctl load ~/Library/LaunchAgents/homebrew.node_exporter.plist

# 启动服务
launchctl start homebrew.node_exporter

2.5 验证安装

# 检查服务状态
launchctl list | grep node

# 检查进程
ps aux | grep node_exporter | grep -v grep

# 检查端口
lsof -i :9100

# 验证指标(本地)
curl http://localhost:9100/metrics | head

# 验证总内存(应该显示 16GB
curl -s http://localhost:9100/metrics | grep total_bytes

2.6 管理命令

# 查看状态
launchctl list | grep node

# 停止服务
launchctl unload ~/Library/LaunchAgents/homebrew.node_exporter.plist

# 重启服务
launchctl unload ~/Library/LaunchAgents/homebrew.node_exporter.plist
launchctl load ~/Library/LaunchAgents/homebrew.node_exporter.plist

# 查看日志
cat /var/log/system.log | grep node_exporter

第三部分:访问和使用

3.1 访问地址

服务 地址 用户名 密码
Prometheus http://192.168.3.45:9090 - -
Grafana http://192.168.3.45:3000 admin admin123

3.2 导入 Dashboard

官方 Dashboard推荐

  1. 打开 Grafana: http://192.168.3.45:3000
  2. 点击左侧菜单 Dashboards → + New → Import
  3. 输入 Dashboard ID: 1860Node Exporter Full
  4. 选择 Prometheus 数据源
  5. 点击 Import

变量设置(官方 Dashboard

官方 Dashboard 使用变量 $node 和 $job需要在 Grafana 中设置:

  1. 打开 Dashboard → 点击右上角 Dashboard settings齿轮图标
  2. 选择 Variables
  3. 添加/编辑变量:
    • node: label_values(node_memory_total_bytes, instance) 或手动输入 192.168.3.189:9100
    • job: label_values(node_memory_total_bytes, job) 或手动输入 macmini

第四部分:运维管理

4.1 重启服务

# Ubuntu2 - Prometheus
cd ~/docker/prometheus && docker compose restart

# Ubuntu2 - Grafana
cd ~/docker/grafana && docker compose restart

# MacMini - Node Exporter
launchctl unload ~/Library/LaunchAgents/homebrew.node_exporter.plist
launchctl load ~/Library/LaunchAgents/homebrew.node_exporter.plist

4.2 更新 Prometheus 配置后重载

# 热重载(无需重启 Prometheus
curl -X POST http://localhost:9090/-/reload

4.3 常见问题排查

问题Grafana 显示 "Datasource not found"

  • 原因Dashboard 中的 datasource UID 与实际不匹配
  • 解决:检查 datasource.yml 中的 uid 是否与 Dashboard 中的匹配

问题Prometheus 无法抓取 MacMini 指标

问题Mac mini 内存显示 7.6GB 而不是 16GB

  • 原因:使用了 Docker 版 node-exporter
  • 解决:改用原生安装(见第二部分)

第五部分:技术备注

5.1 macOS 与 Linux 指标差异

Node Exporter 在 macOS 上的指标名称与 Linux 略有不同:

描述 Linux macOS
总内存 node_memory_MemTotal_bytes node_memory_total_bytes
可用内存 node_memory_MemAvailable_bytes node_memory_free_bytes
CPU node_cpu_seconds_total node_cpu_seconds_total (相同)
负载 node_load1 node_load1 (相同)
磁盘 node_disk_* node_disk_* (相同)
网络 node_network_* node_network_* (相同)

5.2 Docker Desktop for Mac 网络说明

network_mode: host 在 Docker Desktop for Mac 上的行为:

环境 host 模式绑定到
Linux 宿主机 宿主机的网络接口 (正常)
Docker Desktop (Mac/Win) Linux VM 的网络接口 (异常)

因此在 MacMini 上使用 Docker 版会绑定到 VM 网络,导致外部无法访问。

5.3 指标数量对比

安装方式 node_* 指标数 内存显示
Docker 版 ~1348 ~7.6GB (VM)
原生版 ~1966 16GB (真实)

5.4 监控数据流向

MacMini 原生 Node Exporter (:9100)
        ↓ HTTP (LAN)
Ubuntu2 Prometheus (:9090)
        ↓ 查询
Grafana (:3000) ← 浏览器访问

文件清单

Ubuntu2 文件结构

~/docker/
├── prometheus/
│   ├── docker-compose.yml
│   └── prometheus.yml
└── grafana/
    ├── docker-compose.yml
    ├── data/
    └── provisioning/
        ├── datasources/
        │   └── datasource.yml
        └── dashboards/
            ├── dashboard.yml
            └── node-exporter.json (可选)

MacMini 文件结构

~/Library/LaunchAgents/
└── homebrew.node_exporter.plist

相关链接


最后更新2026-04-15 by 云瀚 🌊