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 的标准遍历方式。

Redfish 资源树与标准化指标映射 /redfish/v1/ ServiceRoot Chassis 集合 Power / Thermal / Sensors Systems 集合 Processor / Memory / Storage Managers 集合 NetworkProtocol / LogServices 关键采集字段 PowerConsumedWatts InletTempCelsius Fan Reading / ReadingRPM Voltage ReadingVolts Health / State 关键采集字段 Processor Health / Temp Memory CapacityMiB Storage Drive State PowerState (On/Off) BiosVersion 关键采集字段 FirmwareVersion IPv4Address Manager Health LogService Entries DateTime / TimeZone 标准化指标模型(统一命名 + 标签) metric: smc_chassis_power_watts{host,chassis,health} metric: smc_system_cpu_temp_celsius{host,socket,state} metric: smc_manager_firmware_info{host,manager,version}

二、用 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[].PowerConsumedWattssmc_chassis_power_wattsWhost, chassis, health
Temperature[].ReadingCelsiussmc_chassis_temp_celsius℃host, sensor, upper_critical
Fans[].Reading / ReadingRPMsmc_chassis_fan_rpmRPMhost, fan, state
ProcessorSummary.Countsmc_system_cpu_count个host, model
MemorySummary.TotalSystemMemoryGiBsmc_system_mem_gibGiBhost, health
PowerStatesmc_system_power_state枚举host
FirmwareVersionsmc_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),便于做阈值告警和趋势统计。

采集频率建议:功耗与温度 60 秒一次,CPU/内存/存储健康 300 秒一次,固件版本与 BMC 信息 3600 秒一次。高频采集会增加 BMC 负载,Supermicro BMC 在并发请求过多时可能返回 503,建议单机串行采集并控制并发数不超过 4。

五、结果判读与常见异常

采集完成后,先看三类资源的 Status.Health 是否出现 Warning 或 Critical,再看功耗和温度是否越过阈值。例如某台机器 smc_chassis_power_watts 从 320W 持续升到 480W,同时 smc_chassis_temp_celsius 进风口从 24℃ 升到 31℃,说明机房局部散热可能异常,应联动空调或调整机柜风道,而不是只盯单机告警。

常见异常有三类:一是认证失败,返回 401,检查账号是否被锁定或密码是否含特殊字符;二是资源缺失,返回 404,通常是固件版本较旧或该机型不支持对应子资源,采集器应记录缺失而非报错退出;三是响应超时,BMC 在固件升级或重启期间不可达,采集器应做退避重试,并在连续失败 3 次后产生 smc_redfish_unreachable 告警,避免把采集故障误判为服务器故障。

不要把 Redfish 采集失败直接等同于服务器宕机。BMC 与主机是两套独立系统,BMC 不可达时主机可能仍在正常运行。告警规则中应区分“BMC 不可达”和“主机 PowerState 异常”,前者走管理网告警,后者走业务告警。

至此,Chassis、Systems、Managers 三类资源的采集链路和标准化模型已经打通。后续接入时序数据库时,只需把标准化指标按 measurement + tags + fields + timestamp 写入,即可复用同一套告警规则覆盖不同机型。