Telegraf hddtemp 输入插件实战:从 hddtemp 守护进程采集硬盘温度监控指标

发布时间:2026/9/14 5:55:52
Telegraf hddtemp 输入插件实战:从 hddtemp 守护进程采集硬盘温度监控指标 Telegraf hddtemp 输入插件实战从 hddtemp 守护进程采集硬盘温度监控指标【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf导读本文围绕 Telegraf 仓库中的 hddtemp 输入插件 展开讲解如何通过hddtemp守护进程采集服务器硬盘温度将其转换为带device、model、unit、status、source标签的hddtemp指标。读完本文你将掌握该插件的安装前提、配置参数、底层网络协议解析原理、指标结构以及测试验证方法并了解在上游项目停止维护时如何改用 smartctl 或 sensors 插件作为替代方案。插件概览与适用场景hddtemp 输入插件从 hddtemp 守护进程读取数据。hddtemp 是一个运行在 Linux 系统上的小型守护进程负责轮询机器上所有硬盘的传感器并将各磁盘温度通过 TCP 端口默认7634对外提供。引入版本⭐ Telegraf v1.0.0自 v1.0.0 起随 Telegraf 一并提供标签分类️ hardware, system硬件与系统类平台支持 all全平台编译在插件的 hddtemp.go 中插件通过inputs.Add(hddtemp, ...)完成注册默认Address为127.0.0.1:7634默认Devices为[*]即采集所有磁盘。该插件也已在 plugins/inputs/all/hddtemp.go 中默认注册进全量构建。前置条件hddtemp 守护进程[!IMPORTANT] 使用本插件的前提是系统已安装hddtemp并作为守护进程运行。不过需要特别注意的是上游 hddtemp 项目已不再积极维护且部分发行版如 Debian Bookworm 及之后版本已不再打包hddtemp因此该二进制文件在新系统上可能无法直接安装例如 Ubuntu 22.04 及之后版本。在部署前请先确认目标系统是否仍提供该软件包否则插件将因无法连接127.0.0.1:7634而报错。[!TIP] 如果无法安装 hddtemp官方建议改用以下替代方案获取硬盘温度smartctl 插件依赖smartmontools工具包中的smartctl命令需 v7.0 及以上版本支持 JSON 输出基于 SMART 信息采集存储设备温度不依赖 hddtemp 守护进程sensors 插件通过lm-sensors读取主板/传感器芯片提供的温度数据。配置详解在 Telegraf 配置文件中启用该插件的最小配置如下对应 sample.conf# Monitor disks temperatures using hddtemp [[inputs.hddtemp]] ## By default, telegraf gathers temps data from all disks detected by the ## hddtemp. ## ## Only collect temps from the selected disks. ## ## A * as the device name will return the temperature values of all disks. ## # address 127.0.0.1:7634 # devices [sda, *]参数说明参数类型默认值说明addressstring127.0.0.1:7634hddtemp 守护进程监听的 TCP 地址与端口支持远程主机如10.0.0.8:7634devices[]string[*]需要采集温度的磁盘设备列表。*表示返回所有磁盘的温度可同时混用具体设备名与*对应源码中的定义位于 hddtemp.goconst defaultAddress 127.0.0.1:7634 type HDDTemp struct { Address string toml:address Devices []string toml:devices fetcher fetcher }设备过滤逻辑devices的过滤逻辑在 hddtemp.go 的Gather方法中实现插件遍历守护进程返回的每一块磁盘只有当chosenDevice *或chosenDevice disk.DeviceName精确匹配设备名如sda时才生成指标。因此devices [*]采集全部磁盘devices [sda]仅采集第一块 SCSI/SATA 磁盘devices [sda, sdb]只采集指定的两块磁盘。注意设备名匹配是精确字符串比较不含通配符扩展除*本身外配置前请通过hddtemp输出的实际设备名核对。底层协议hddtemp 的管道分隔数据格式插件本身并不直接解析 S.M.A.R.T. 数据而是通过内置的 go-hddtemp 客户端连接 hddtemp 守护进程并读取其文本输出。hddtemp 默认返回以|管道符分隔的字段流每组磁盘固定占 5 个字段|/dev/sda|WDC WD740GD-00FLA1|43|C|偏移含义说明0空字段固定占位每条记录以|起始1设备路径如/dev/sda插件会截取最后一个/之后的部分作为device标签2设备型号如WDC WD740GD-00FLA1作为model标签3温度值或状态码正常为十进制数字如43磁盘休眠时可能返回SLP、ERR等非数字状态4温度单位如C摄氏或*无读数作为unit标签解析实现在 go-hddtemp/hddtemp.gofunc (*hddtemp) Fetch(address string) ([]Disk, error) { // 1. 通过 net.Dial(tcp, address) 建立 TCP 连接 // 2. 用 io.Copy 一次性读取守护进程返回的完整数据 // 3. 以 | 切分字段每 5 个字段为一组磁盘记录 // 4. 对温度字段做 ParseInt 解析解析失败如 SLP时温度置 0 // 并把原始字符串写入 Status 字段 }其中关键的行为细节设备名归一化fields[offset1]中的完整路径/dev/sda会被截取为sda因此最终指标中的device标签不带/dev/前缀状态码处理当温度字段无法解析为整数典型如磁盘处于休眠状态的SLP标识时Temperature字段置为0原始文本如SLP写入Status标签供上层判断磁盘状态。这一点在 go-hddtemp/hddtemp_test.go 的TestFetchStatus用例中得到验证多磁盘支持守护进程一次返回多条记录时插件按 5 字段一组循环切分见TestFetchTwoDisks用例不会丢盘。指标结构每次采集输出一个名为hddtemp的指标结构与 README.md 一致tagsdevice磁盘设备名不带/dev/前缀如sdamodel磁盘型号如WDC WD740GD-00FLA1unit温度单位如C无读数时为*status状态码。温度正常时为空字符串磁盘休眠或读取出错时如SLP保留原始状态文本source数据来源主机。由address拆分出的主机名/IP见下文说明source 标签的取值逻辑source标签并非取自守护进程返回的数据而是在 hddtemp.go 中通过net.SplitHostPort(h.Address)从配置的address中拆出的主机部分source, _, err : net.SplitHostPort(h.Address) if err ! nil { source h.Address }即当address 127.0.0.1:7634时source 127.0.0.1若address无法拆分为 host:port如测试中直接传localhost则整个字符串作为source。fieldstemperature磁盘温度int32。正常时为实际温度值磁盘休眠等异常时值为0需结合status标签判别输出示例以下为文档中给出的 InfluxDB line protocol 输出示例时间戳为纳秒hddtemp,sourceserver1,unitC,status,devicesdb,modelWDC\ WD740GD-00FLA1 temperature43i 1481655647000000000 hddtemp,devicesdc,modelSAMSUNG\ HD103UI,unitC,sourceserver1,status temperature38i 148165564700000000 hddtemp,devicesdd,modelSAMSUNG\ HD103UI,unitC,sourceserver1,status temperature36i 1481655647000000000可以看到型号中的空格被转义为\line protocol 对 tag 值中空格的标准转义status为空值表示温度读取正常温度以i后缀标记为整数类型。采集流程与测试验证Gather 调用链插件的核心采集方法为Gatherhddtemp.go完整流程如下若fetcher未初始化则创建gohddtemp.New()客户端从Address拆出source标签值调用fetcher.Fetch(h.Address)建立 TCP 连接并读取 hddtemp 守护进程的全部数据解析出磁盘列表后按Devices白名单过滤对每块命中磁盘构造tagsdevice/model/unit/status/source与fieldstemperature通过acc.AddFields(hddtemp, fields, tags)写入累加器。测试用例佐证hddtemp_test.go插件层使用mockFetcher注入两块假磁盘Disk1/Model1/13/C与Disk2/Model2/14/C断言Gather产生 2 个字段并逐一校验temperature字段与 5 个标签的取值包括status为空串、source取配置地址等细节go-hddtemp/hddtemp_test.go协议层通过net.Listen起临时 TCP 服务模拟守护进程覆盖了单磁盘正常解析、非法地址报错、SLP状态解析、多磁盘混合解析四类场景。这些测试直接印证了上文所述的协议格式与状态码处理逻辑可作为二次开发或排障时理解插件行为的依据。全局配置选项与 Telegraf 其他插件一致[[inputs.hddtemp]]也支持插件的全局配置能力例如通过name_override、name_prefix、name_suffix修改指标名通过tags附加自定义标签通过fieldpass/fielddrop、tagpass/tagdrop过滤字段与标签以及通过order控制插件执行顺序等。完整说明见 docs/CONFIGURATION.md对应公共说明文档 docs/includes/plugin_config.md。快速启用步骤安装并启动 hddtemp确保目标系统仍有hddtemp软件包较新发行版可能已移除请参考上文前置条件安装后启动守护进程并确认监听7634端口编写配置在 Telegraf 配置文件中加入[[inputs.hddtemp]]段按需修改address与devices验证配置运行telegraf --config 配置文件 --test观察是否输出形如上文的hddtemp指标行需注意--test一次性采样模式接入输出将配置并入正式运行配置配合 InfluxDB、Prometheus 等输出插件即可持续采集并监控磁盘温度告警。总结hddtemp 输入插件是一个轻量、零配置默认即采集全部磁盘的硬件温度采集方案其实现核心是TCP 连接 hddtemp 守护进程 → 读取|分隔文本 → 5 字段为一组解析为磁盘温度。使用时的关键注意点有三一是环境必须存在可用的 hddtemp 守护进程二是status标签承载了磁盘休眠等异常状态温度字段为0时需结合它判读三是上游项目已停止维护新环境优先评估 smartctl 与 sensors 插件作为替代。如需深入源码可重点阅读 插件主实现、协议客户端 及对应的 插件层测试 与 协议层测试。【免费下载链接】telegrafAgent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.项目地址: https://gitcode.com/GitHub_Trending/te/telegraf创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考