4. Redfish API监控集成
Redfish 是 DMTF 定义的基于 RESTful 的带外管理接口标准,Supermicro 的 X11、X12、H12、G12 等平台 BMC 均提供 Redfish 服务。相比 IPMI 的二进制语义和 SNMP 的 MIB 依赖,Redfish 用 JSON 描述资源树,天然适合做监控采集。本节聚焦三件事:用 curl 快速验证资源可达性,用 Python 批量采集 Chassis、Systems、Managers 三类资源,再把异构字段归一成可入库、可告警的标准化指标模型。
一、先看清 Redfish 的资源树与三类核心资源
Redfish 服务入口是 /redfish/v1/,其下 ServiceRoot 会列出 Chassis、Systems、Managers、SessionService、UpdateService 等集合。监控最关心三类:
- Chassis:机箱级资源,包含 Power、Thermal、Sensors、NetworkAdapters。电源功耗、进风口温度、风扇转速、电压轨都在这里,是容量与散热告警的主来源。
- Systems:主机系统资源,包含 Processor、Memory、Storage、EthernetInterfaces、LogServices。CPU 温度、内存容量与健康、硬盘状态、BIOS 版本、开机状态来自这里。
- Managers:BMC 自身资源,包含 NetworkProtocol、EthernetInterfaces、LogServices、VirtualMedia。BMC 固件版本、管理口 IP、BMC 健康、事件日志是运维基线。
三类资源通过 Links 字段互相引用,例如 Chassis 的 Links.ComputerSystems 指向 Systems,Systems 的 Links.ManagedBy 指向 Managers。采集时先取集合成员列表,再逐个取成员详情,这是 Redfish 的标准遍历方式。
二、用 curl 做最小可用验证
采集脚本写之前,先用 curl 确认认证方式和资源路径。Redfish 支持 Basic Auth 和 Session 两种方式。Basic Auth 最简单,适合脚本快速验证:
# 1. 查看 ServiceRoot,确认服务可用
curl -sk -u ADMIN:ADMIN https://10.0.0.21/redfish/v1/ | python -m json.tool
# 2. 列出 Chassis 集合成员
curl -sk -u ADMIN:ADMIN https://10.0.0.21/redfish/v1/Chassis | python -m json.tool
# 3. 取具体 Chassis 的 Power 与 Thermal
curl -sk -u ADMIN:ADMIN https://10.0.0.21/redfish/v1/Chassis/1/Power
curl -sk -u ADMIN:ADMIN https://10.0.0.21/redfish/v1/Chassis/1/Thermal
# 4. 取 Systems 与 Managers
curl -sk -u ADMIN:ADMIN https://10.0.0.21/redfish/v1/Systems/1
curl -sk -u ADMIN:ADMIN https://10.0.0.21/redfish/v1/Managers/1
注意 -k 跳过自签证书校验,生产环境应导入 BMC 证书或指定 CA。返回中 Members@odata.count 给出成员数量,Members[].@odata.id 给出成员路径。若返回 401,检查账号权限;若返回 404,确认固件版本是否支持该资源;若返回 503,BMC 可能正在重启。
三、Python 采集:会话复用与分页处理
批量采集时不要每次请求都重新认证,应创建 Session 并复用 X-Auth-Token。下面是一个可直接运行的最小采集器,使用 requests 库,带超时、重试和资源遍历:
import requests, json, time
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
requests.packages.urllib3.disable_warnings()
class RedfishCollector:
def __init__(self, host, user, pwd, timeout=8):
self.base = f"https://{host}/redfish/v1"
self.host = host
self.timeout = timeout
self.s = requests.Session()
self.s.verify = False
retry = Retry(total=3, backoff_factor=0.5,
status_forcelist=[500, 502, 503, 504])
self.s.mount("https://", HTTPAdapter(max_retries=retry))
self.token = None
def login(self):
r = self.s.post(f"{self.base}/SessionService/Sessions",
json={"UserName": self.user, "Password": self.pwd},
timeout=self.timeout)
r.raise_for_status()
self.token = r.headers["X-Auth-Token"]
self.s.headers.update({"X-Auth-Token": self.token})
def get(self, path):
url = path if path.startswith("http") else f"https://{self.host}{path}"
r = self.s.get(url, timeout=self.timeout)
r.raise_for_status()
return r.json()
def members(self, collection_path):
data = self.get(collection_path)
return [m["@odata.id"] for m in data.get("Members", [])]
登录后,members() 负责把集合展开成成员路径列表。采集 Chassis 时,对每个成员再取 Power 和 Thermal 子资源;采集 Systems 时取 Processor、Memory、Storage 子资源。这里要注意:部分子资源路径不一定存在,例如某些机型没有独立的 Storage 资源,需用 try/except 或先判断 @odata.id 是否存在,避免整批采集中断。
四、构建标准化指标模型
原始 JSON 字段名长、层级深、不同机型还有差异,直接入库会导致查询和告警规则难以维护。标准化模型要做三件事:统一指标名、统一单位、统一标签。
| 原始字段 | 标准化指标名 | 单位 | 标签 |
|---|---|---|---|
| PowerControl[].PowerConsumedWatts | smc_chassis_power_watts | W | host, chassis, health |
| Temperature[].ReadingCelsius | smc_chassis_temp_celsius | ℃ | host, sensor, upper_critical |
| Fans[].Reading / ReadingRPM | smc_chassis_fan_rpm | RPM | host, fan, state |
| ProcessorSummary.Count | smc_system_cpu_count | 个 | host, model |
| MemorySummary.TotalSystemMemoryGiB | smc_system_mem_gib | GiB | host, health |
| PowerState | smc_system_power_state | 枚举 | host |
| FirmwareVersion | smc_manager_firmware_info | 版本 | host, manager |
标准化时有两个关键约定。第一,单位统一:温度统一摄氏度,功耗统一瓦,内存统一 GiB,避免同一指标混用 MB 和 MiB。第二,健康状态映射:Redfish 的 Health 取值为 OK、Warning、Critical,State 取值为 Enabled、Disabled、Absent、StandbyOffline。入库时保留原始枚举,同时派生一个数值型 health_score(OK=0,Warning=1,Critical=2),便于做阈值告警和趋势统计。
五、结果判读与常见异常
采集完成后,先看三类资源的 Status.Health 是否出现 Warning 或 Critical,再看功耗和温度是否越过阈值。例如某台机器 smc_chassis_power_watts 从 320W 持续升到 480W,同时 smc_chassis_temp_celsius 进风口从 24℃ 升到 31℃,说明机房局部散热可能异常,应联动空调或调整机柜风道,而不是只盯单机告警。
常见异常有三类:一是认证失败,返回 401,检查账号是否被锁定或密码是否含特殊字符;二是资源缺失,返回 404,通常是固件版本较旧或该机型不支持对应子资源,采集器应记录缺失而非报错退出;三是响应超时,BMC 在固件升级或重启期间不可达,采集器应做退避重试,并在连续失败 3 次后产生 smc_redfish_unreachable 告警,避免把采集故障误判为服务器故障。
至此,Chassis、Systems、Managers 三类资源的采集链路和标准化模型已经打通。后续接入时序数据库时,只需把标准化指标按 measurement + tags + fields + timestamp 写入,即可复用同一套告警规则覆盖不同机型。