云计算百科
云计算领域专业知识百科平台

Prometheus 监控 macOS 全栈实战:从硬件温度到系统负载的苹果设备可观测性

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="macosnode"} == 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 流水线和混合办公保驾护航。

赞(0)
未经允许不得转载:网硕互联帮助中心 » Prometheus 监控 macOS 全栈实战:从硬件温度到系统负载的苹果设备可观测性
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!