Loading... # 服务器硬件传感器监控部署实战 # 一、概述 ## 1. 简介 ### A. 是什么 硬件传感器监控是通过 lm-sensors 工具采集服务器硬件数据,包括 CPU 温度、风扇转速、电压等信息,并通过 Categraf 采集上报到监控系统的解决方案。 ### B. 为什么需要 - 及时发现硬件异常,如温度过高、风扇故障 - 预防性维护,避免硬件损坏导致服务中断 - 建立硬件性能基线,辅助容量规划 ### C. 实现目标 - 监控 CPU 温度(Package 和各核心) - 监控风扇转速(RPM) - 输出 Prometheus 格式指标,接入夜莺监控系统 ## 2. 环境信息 ### A. 目标服务器 - 192.168.86.153(已部署) - 192.168.86.152(已部署) ### B. 基础环境 - 操作系统:Ubuntu 22.04 - Categraf 目录:/opt/categraf/conf/input.exec/ - Python 版本:3.10+ # 二、技术方案 ## 1. 架构设计 ```mermaid graph LR A[lm-sensors] -->|sensors -j| B[Python监控脚本] B -->|Prometheus格式| C[Categraf exec插件] C -->|上报| D[夜莺监控系统] ``` ## 2. 技术选型 ### A. 数据采集:lm-sensors + jq - sensors 命令支持 -j 参数输出 JSON 格式 - jq 工具用于后续可能的 JSON 处理 ### B. 脚本语言:Python 3 - 执行效率高(0.1秒内完成) - JSON 处理方便 - 异常处理完善 ### C. 上报方式:Categraf exec 插件 - 支持 Prometheus 格式解析 - 与现有监控体系无缝集成 # 三、部署步骤 ## 1. 安装依赖 ### A. 安装 jq ```bash apt-get update && apt-get install -y jq ``` ### B. 验证依赖 ```bash sensors --version python3 --version jq --version ``` ## 2. 部署监控脚本 ### A. 创建脚本文件 将以下内容保存到 /opt/categraf/conf/input.exec/sensors_monitor.py: ```python #!/usr/bin/env python3 import subprocess import json import re import sys _SENSOR_PATTERN = re.compile(r"^(temp|fan)(d+)_(.+)$") def sanitize_label(s: str) -> str: s = s.replace("\\", "\\\\").replace('"', '\\"') s = re.sub(r"[^a-zA-Z0-9_]", "_", s) return s.strip("_") def get_metric_info(key: str) -> tuple: m = _SENSOR_PATTERN.match(key) if not m: return None, None t, suffix = m.group(1), m.group(3) if t == "temp": mapping = { "input": ("hw_temperature_celsius", "input"), "max": ("hw_temperature_max_celsius", "max"), "crit": ("hw_temperature_crit_celsius", "crit"), "alarm": ("hw_sensor_alarm", "alarm"), } else: mapping = { "input": ("hw_fan_rpm", "input"), "min": ("hw_fan_min_rpm", "min"), "max": ("hw_fan_max_rpm", "max"), } return mapping.get(suffix, (None, None)) def format_value(v) -> str: if isinstance(v, (int, float)): if v == 0: return "0" if 0.001 <= abs(v) < 10000: s = f"{v:.6g}" if "." in s: s = s.rstrip("0").rstrip(".") return s return f"{v:.6g}" return str(v) def main() -> None: try: data = json.loads(subprocess.check_output(["sensors", "-j"], timeout=5, text=True)) for chip, chip_data in data.items(): chip_safe = sanitize_label(chip) for sensor, sensor_data in chip_data.items(): if sensor == "Adapter": continue sensor_safe = sanitize_label(sensor) for key, value in sensor_data.items(): if value is None: continue metric, suffix = get_metric_info(key) if not metric: continue if suffix == "alarm" and value == 0: continue labels = f'chip="{chip_safe}",sensor="{sensor_safe}"' if suffix == "alarm": labels += ',type="temperature"' print(f"{metric}{{{labels}}} {format_value(value)}") except subprocess.TimeoutExpired: sys.stderr.write("Error: sensors command timed out\n") sys.exit(1) except json.JSONDecodeError as e: sys.stderr.write(f"Error: Invalid JSON output: {e}\n") sys.exit(1) except OSError as e: sys.stderr.write(f"Error: Failed to run sensors: {e}\n") sys.exit(1) except Exception as e: sys.stderr.write(f"Unexpected error: {e}\n") sys.exit(1) if __name__ == "__main__": main() ``` ### B. 设置执行权限 ```bash chmod +x /opt/categraf/conf/input.exec/sensors_monitor.py ``` ## 3. 配置 Categraf ### A. 编辑 exec.toml ```bash vi /opt/categraf/conf/input.exec/exec.toml ``` 配置内容: ```toml # 传感器监控配置 - Categraf exec 插件 [[instances]] commands = [ "/opt/categraf/conf/input.exec/sensors_monitor.py" ] data_format = "prometheus" timeout = "10s" ``` ### B. 重启 Categraf ```bash systemctl restart categraf systemctl status categraf ``` # 四、脚本说明 ## 1. 核心功能 ### A. 数据采集 - 调用 sensors -j 获取 JSON 格式传感器数据 - 超时时间设置为 5 秒 ### B. 数据处理 - 自动识别芯片和传感器类型 - 清理标签中的特殊字符 - 格式化数值输出 ### C. 指标输出 | 指标名称 | 说明 | 标签 | |---------|------|------| | hw_temperature_celsius | 当前温度 | chip, sensor | | hw_temperature_max_celsius | 温度上限 | chip, sensor | | hw_temperature_crit_celsius | 温度临界值 | chip, sensor | | hw_sensor_alarm | 温度告警状态 | chip, sensor, type | | hw_fan_rpm | 风扇转速 | chip, sensor | | hw_fan_min_rpm | 风扇最低转速 | chip, sensor | | hw_fan_max_rpm | 风扇最高转速 | chip, sensor | ## 2. 代码优化要点 ### A. 性能优化 - 预编译正则表达式,避免重复编译 - 单次 JSON 解析处理所有数据 - 执行时间控制在 0.1 秒以内 ### B. 安全性 - 标签值中的引号和反斜杠进行转义 - 避免标签注入导致的格式错误 ### C. 异常处理 - 超时异常:命令执行超时 - JSON 解析异常:输出格式错误 - 操作系统异常:sensors 命令不可用 # 五、输出示例 ## 1. CPU 温度指标 ```text hw_temperature_celsius{chip="coretemp_isa_0000",sensor="Package_id_0"} 48 hw_temperature_max_celsius{chip="coretemp_isa_0000",sensor="Package_id_0"} 79 hw_temperature_crit_celsius{chip="coretemp_isa_0000",sensor="Package_id_0"} 99 hw_temperature_celsius{chip="coretemp_isa_0000",sensor="Core_0"} 45 hw_temperature_max_celsius{chip="coretemp_isa_0000",sensor="Core_0"} 79 ``` ## 2. 风扇转速指标 ```text hw_fan_rpm{chip="applesmc_isa_0300",sensor="Main"} 1002 hw_fan_min_rpm{chip="applesmc_isa_0300",sensor="Main"} 1000 hw_fan_max_rpm{chip="applesmc_isa_0300",sensor="Main"} 1900 ``` # 六、验证测试 ## 1. 本地测试脚本 ```bash /opt/categraf/conf/input.exec/sensors_monitor.py ``` 预期输出:Prometheus 格式的指标数据,约 140-146 行 ## 2. 检查服务状态 ```bash systemctl status categraf journalctl -u categraf -n 50 --no-pager ``` ## 3. 验证数据上报 在夜莺监控系统中查询 hw_temperature_celsius 和 hw_fan_rpm 指标 # 七、常见问题 ## 1. 执行超时 ### 问题描述 脚本执行超过 10 秒,Categraf 报错 ### 解决方案 - 检查传感器数量,过多设备可能需要优化 - 增加超时时间配置 ## 2. 格式解析错误 ### 问题描述 Categraf 报错:expected float as value, got "" ### 解决方案 - 检查 format_value 函数对 0 值的处理 - 确保所有数值都有输出 ## 3. 依赖缺失 ### 问题描述 Error: sensors not found 或 Error: jq not found ### 解决方案 ```bash apt-get install lm-sensors jq ``` # 八、部署结果 ## 1. 服务器状态 | 服务器 | jq 版本 | Python | Categraf | 指标数 | 状态 | |--------|---------|--------|----------|--------|------| | 192.168.86.153 | 1.6-2.1ubuntu3.1 | 3.10 | 运行中 | 146 | 正常 | | 192.168.86.152 | 1.6-2.1ubuntu3.1 | 3.10 | 运行中 | 140 | 正常 | ## 2. 监控指标 - CPU 温度监控:Package + 14 个核心 - 风扇转速监控:主风扇 - 温度阈值:max 79°C、crit 99°C - 风扇阈值:min 1000 RPM、max 1900 RPM *** ## 参考资料 1. [lm-sensors 官方文档](https://wiki.archlinux.org/title/Lm_sensors) 2. [Categraf 官方文档](https://flashcat.cloud/docs/categraf/) 3. [Prometheus 数据格式](https://prometheus.io/docs/instrumenting/exposition_formats/) 最后修改:2026 年 04 月 02 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏