Prometheus 监控 macOS 全栈实战:从硬件温度到系统负载的苹果设备可观测性
在混合办公与 DevOps 流水线中,macOS 设备正承担着越来越多的关键角色:iOS 构建节点、开发者工作站、持续集成 runner。一旦它的 CPU 负载飙升、内存压力濒临红色、磁盘空间枯竭、电池健康下降或温度异常,轻则拖慢开发进度,重则阻塞整个发布流水线。Prometheus 通过官方 node_exporter(天然支持 Darwin 内核)以及社区 osx_exporter,能将 macOS 的系统指标转化为标准 Prometheus 时序数据,让苹果设备也完全融入你的全栈可观测体系。本文将带你从安装导出器、配置 LaunchDaemon、到解读核心指标、创建 Grafana 大屏与告警落地,让你的 Mac 像服务器一样被悉心监控。

1. 方案选型:node_exporter vs osx_exporter
| node_exporter(官方推荐) | CPU、内存、磁盘、网络、文件系统、系统负载等常规 OS 指标 | Prometheus 官方项目,直接提供 macOS 二进制,无需额外开发;覆盖 Linux 监控的常用指标 |
| osx_exporter (社区) | 电池、温度、风扇转速、电源状态、pmset 设置等 Mac 专属硬件 | 基于 IOKit 和 macOS 系统命令,暴露 Mac 特有的健康数据 |
| textfile 收集器 + 自定义脚本 | 任意无法被 exporter 直接采集的指标(如 Time Machine 备份状态、应用版本) | 灵活补充,配合 node_exporter 的 –collector.textfile.directory 使用 |
最佳组合:node_exporter 负责通用系统指标,osx_exporter 负责 Mac 硬件指标,自定义脚本负责业务特有数据。三者不冲突,可并行部署。
2. 部署 node_exporter (通用系统指标)
node_exporter 为 macOS 提供了预编译的 amd64/arm64 二进制,开箱即用。
2.1 下载与安装
# 确定芯片架构
uname -m
# x86_64 选 amd64,arm64 选 arm64
# 下载最新版(以 1.7.0 为例)
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.darwin-arm64.tar.gz
tar xzf node_exporter-1.7.0.darwin-arm64.tar.gz
sudo cp node_exporter-1.7.0.darwin-arm64/node_exporter /usr/local/bin/
2.2 创建 LaunchDaemon 实现开机自启
macOS 使用 launchd 管理服务,无需手动编写 systemd 文件。创建一个 plist 文件:
sudo nano /Library/LaunchDaemons/io.prometheus.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>io.prometheus.node_exporter</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/node_exporter</string>
<string>–collector.textfile.directory=/var/lib/node_exporter/textfile</string>
<string>–web.listen-address=:9100</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/var/log/node_exporter.log</string>
<key>StandardErrorPath</key>
<string>/var/log/node_exporter.err</string>
</dict>
</plist>
创建 textfile 目录并设置权限:
sudo mkdir -p /var/lib/node_exporter/textfile
sudo chmod 755 /var/lib/node_exporter/textfile
加载并启动服务:
sudo launchctl bootstrap system /Library/LaunchDaemons/io.prometheus.node_exporter.plist
sudo launchctl start io.prometheus.node_exporter
验证:curl localhost:9100/metrics,应输出以 node_ 开头的指标。
3. 部署 osx_exporter (Mac 硬件指标)
osx_exporter 提供电池、温度、风扇、电源等苹果特定指标。
3.1 通过 Homebrew 安装(推荐)
brew install prometheus-community/osx-exporter/osx-exporter
brew services start osx-exporter
或手动下载二进制运行:
wget https://github.com/prometheus-community/osx_exporter/releases/download/v0.3.0/osx_exporter-0.3.0.darwin-amd64.tar.gz
tar xzf osx_exporter-0.3.0.darwin-amd64.tar.gz
sudo cp osx_exporter /usr/local/bin/
创建 LaunchDaemon(参考 node_exporter),监听端口默认 9101。
验证:curl localhost:9101/metrics,应看到 osx_battery_charge_percent 等。
4. 配置 Prometheus 抓取
在 prometheus.yml 中添加 macOS 主机的两个 Job:
scrape_configs:
# 通用 OS 指标
– job_name: 'macos-node'
scrape_interval: 30s
static_configs:
– targets: ['mac-mini.local:9100']
labels:
device: 'mac-mini'
env: 'office'
os: 'macos'
# 苹果硬件指标
– job_name: 'macos-osx'
scrape_interval: 30s
static_configs:
– targets: ['mac-mini.local:9101']
labels:
device: 'mac-mini'
5. 核心监控指标与 PromQL
5.1 node_exporter 通用指标
| node_cpu_seconds_total{mode="idle"} | CPU 空闲时间(用于计算使用率) |
| node_memory_MemTotal_bytes / node_memory_MemAvailable_bytes | 内存总量 / 可用量 |
| node_filesystem_avail_bytes{mountpoint="/"} | 根分区可用字节 |
| node_filesystem_size_bytes{mountpoint="/"} | 根分区总大小 |
| node_network_receive_bytes_total{device="en0"} | 网络接收字节(Wi-Fi 通常 en0) |
| node_load1 / node_load5 / node_load15 | 系统负载 |
PromQL 示例:
- CPU 使用率:100 – (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
- 内存使用率:(1 – node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
- 磁盘使用率(根分区):(1 – node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100
5.2 osx_exporter 硬件指标
| osx_battery_charge_percent | 当前电量百分比 |
| osx_battery_cycle_count | 电池循环次数 |
| osx_battery_health | 电池健康状态(Good/Fair/Poor) |
| osx_cpu_temperature_celsius | CPU 温度(摄氏度) |
| osx_fan_speed_rpm | 风扇转速(RPM) |
| osx_power_source | 电源状态(AC/Battery) |
| osx_thermal_pressure | 散热压力等级(Nominal/Moderate/Heavy) |
PromQL 示例:
- 电池低于 20%:osx_battery_charge_percent < 20
- CPU 温度过高:osx_cpu_temperature_celsius > 80
- 风扇异常低速:osx_fan_speed_rpm < 1000(取决于机型)
6. Grafana 仪表盘推荐
- Node Exporter Full (ID: 1860):通用系统监控,CPU、内存、磁盘、网络一应俱全,直接适配 macOS node_exporter 指标。
- macOS Hardware Monitor (ID: 14567 或社区自建):可使用 osx_exporter 数据源创建电池仪表、温度表盘。
- 自定义苹果设备监控大屏:将电量、温度、负载组合在同一行,适合 CI 节点看板。
导入后选择数据源,使用变量 device 区分不同 Mac。
7. 告警规则实战
groups:
– name: macos_alerts
rules:
– alert: MacOSHighCPU
expr: 100 – (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
for: 10m
labels:
severity: warning
annotations:
summary: "Mac {{ $labels.instance }} CPU 使用率超过 90%"
– alert: MacOSLowDiskSpace
expr: (1 – node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 > 85
for: 5m
labels:
severity: critical
annotations:
summary: "Mac 根分区使用率超过 85%"
– alert: MacOSBatteryLow
expr: osx_battery_charge_percent < 20
for: 2m
labels:
severity: warning
annotations:
summary: "Mac {{ $labels.instance }} 电量低于 20%,请充电"
– alert: MacOSHighTemperature
expr: osx_cpu_temperature_celsius > 80
for: 5m
labels:
severity: warning
annotations:
summary: "Mac CPU 温度超过 80℃,当前 {{ $value }}℃"
– alert: MacOSBatteryHealthDegraded
expr: osx_battery_health != 0 # 假设0=Good, 1=Fair, 2=Poor
labels:
severity: info
annotations:
summary: "Mac 电池健康度下降,建议检查"
– alert: MacOSNoMetric
expr: up{job="macos–node"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Mac 设备 {{ $labels.instance }} 指标不可达"
可根据实际电池健康指标格式微调。
8. 进阶:自定义 Textfile 指标与自动化
8.1 利用 textfile 收集器监控 Time Machine 状态
编写脚本 /usr/local/bin/time-machine-metrics.sh:
#!/bin/bash
OUTPUT="/var/lib/node_exporter/textfile/tm.prom"
LAST_BACKUP=$(tmutil latestbackup 2>/dev/null)
if [ -n "$LAST_BACKUP" ]; then
SEC=$(date -j -f "%Y-%m-%d-%H%M%S" "$(basename $LAST_BACKUP)" "+%s" 2>/dev/null || echo 0)
echo "time_machine_last_backup_timestamp $SEC" > $OUTPUT.tmp
else
echo "time_machine_last_backup_timestamp 0" > $OUTPUT.tmp
fi
mv $OUTPUT.tmp $OUTPUT
设置 cron 或 launchd 每分钟执行,即可获得 time_machine_last_backup_timestamp 指标。
8.2 监控 Xcode 版本或构建状态
同样编写脚本,通过 xcodebuild -version 将版本信息输出为 gauge,或读取 CI 日志统计成功/失败次数。
8.3 性能与安全
- node_exporter 和 osx_exporter 均消耗极低资源,抓取间隔 30s 完全无感。
- 监听端口绑定 127.0.0.1 以增强安全(修改 –web.listen-address)。
- 若需远程抓取,使用防火墙或 SSH 隧道,避免公网暴露。
9. 总结
macOS 不再是监控视野中的盲区。通过 node_exporter 与 osx_exporter 的组合,你能够用 Prometheus 完整捕捉 Mac 的 CPU 负载、内存压力、磁盘占用、网络流量以及电池、温度、风扇等专属硬件信号。Grafana 大屏上,每一个构建节点、每一台开发者工作站都变得透明;当 CPU 过热、磁盘告急或电量不足时,Alertmanager 的告警将及时触达。从此,苹果设备也融入统一的 Prometheus 可观测体系,为 DevOps 流水线和混合办公保驾护航。
网硕互联帮助中心






评论前必须登录!
注册