恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
windows_exporter diskdrive 采集器详解:基于 WMI Win32_DiskDrive 监控物理磁盘健康状态
首页
资讯中心
/
windows_exporter diskdrive 采集器详解:基于 WMI Win32_DiskDrive 监控物理磁盘健康状态
windows_exporter diskdrive 采集器详解:基于 WMI Win32_DiskDrive 监控物理磁盘健康状态
发布时间:2026/10/14 15:19:01
可观测性指标监控【免费下载链接】windows_exporterPrometheus exporter for Windows machines项目地址https://gitcode.com/gh_mirrors/wi/windows_exporter点击查看免费下载本文围绕windows_exporter的diskdrive采集器展开完整覆盖其启用方式、五项核心指标windows_diskdrive_*的含义与标签结构、状态与可用性的取值枚举并结合仓库源码diskdrive.go剖析其 WMI 查询实现、Build 不探测 WMI 的容错设计以及该采集器与physical_disk采集器在磁盘编号上的关联用法和告警配置示例。一、采集器概览diskdrive采集器通过 WMI 类Win32_DiskDrive暴露物理磁盘而非逻辑卷层面的指标例如磁盘型号、容量、分区数量和运行状态。它是磁盘硬件健康监控的基础数据源常与默认启用的physical_diskI/O 性能、logical_disk卷容量配合使用。官方文档 collector.diskdrive.md 对该采集器的摘要如下项目说明指标名前缀Metric name prefixdiskdriveWMI 类ClassesWin32_DiskDrive是否默认启用Enabled by default?否命令行 Flag无两个关键事实需要特别留意默认不启用。从源码看默认启用列表定义在 types.go 中const DefaultCollectors cpu,memory,logical_disk,physical_disk,net,os,service,system其中并不包含diskdrive因此必须通过配置显式开启。没有任何命令行 Flag。其构造函数NewWithFlags(_ *kingpin.Application)见 diskdrive.go直接返回一个空Collector源码中Config结构体也是空的diskdrive.go所以该采集器行为固定、无参数可调。二、如何启用 diskdrive 采集器采集器启用有三种等价途径全部以采集器名称列表为核心1. 命令行 flag--collectors.enabled.\windows_exporter.exe --collectors.enabled [defaults],diskdrive[defaults]是一个占位符会被展开为所有默认启用的采集器展开逻辑见 main.go。如果只需要部分采集器也可以直接写完整列表。2. 配置文件通过--config.file指定 YAML 配置文件在collectors.enabled中加入diskdrive。参考仓库自带的示例 config.yamlcollectors: enabled: cpu,cpu_info,logical_disk,memory,net,os,service,system,diskdrive注意与某些采集器不同diskdrive没有自己的配置子节collector:下无需任何条目因为它的Config为空。3. 环境变量 / Docker 部署在 Docker 或 Kubernetes 部署中可通过ENABLED_COLLECTORS环境变量传入与--collectors.enabled相同的采集器列表参见 README.md。启用机制在源码中的入口是 map.go 中的注册项diskdrive.Name: NewBuilderWithFlags(diskdrive.NewWithFlags)运行Enable(enabledCollectors)方法见 collection.go时不在启用列表中的采集器会被整体移除。三、指标清单与标签结构文档中列出的全部指标如下前缀均为windows_命名空间见 const.go 中Namespace windows指标名描述类型标签windows_diskdrive_info磁盘驱动器的一般标识信息gaugedevice_id,model,caption,namewindows_diskdrive_availability磁盘驱动器当前可用性one-hot 编码gaugename,availabilitywindows_diskdrive_partitions磁盘上的分区数量gaugenamewindows_diskdrive_size磁盘总容量字节数由磁道数、柱面数、扇区数与每扇区字节数相乘得出gaugenamewindows_diskdrive_status磁盘运行状态one-hot 编码gaugename,status各指标在 diskdrive.go 的Build方法中通过prometheus.NewDesc注册描述文案与上表一致。几个值得注意的实现细节name标签是磁盘设备名取自 WMI 的Name属性形如\.\PHYSICALDRIVE0。在导出前会去掉首尾的\和.strings.Trim(disk.Name, \\.)见 diskdrive.go因此实际看到的标签值通常是PHYSICALDRIVE0、PHYSICALDRIVE1这样的形式。windows_diskdrive_info恒为 1其价值在于四个标签本身device_id如\\.\PHYSICALDRIVE0、model磁盘型号已去除尾部空格、caption磁盘描述、name。它相当于一张磁盘清单指标。status与availability采用 one-hot独热编码对每个可能的状态值都输出一条 gauge 序列当前实际状态取 1其余取 0。这样写 PromQL 时可以直接用windows_diskdrive_status{statusOK} 1这类条件判断而不需要把字符串状态解析成数值。四、状态与可用性取值的完整枚举文档表格中status、availability只有笼统描述而源码中给出了完整的取值集合这也是写告警和仪表盘时必须知道的细节运行状态status标签的可能值定义在 diskdrive.go 的allDiskStatus中OK, Error, Degraded, Unknown, Pred Fail, Starting, Stopping, Service, Stressed, Nonrecover, No Contact, Lost Comm可用性availability标签的可能值由 WMIAvailability数值字段经availMapdiskdrive.go映射而来数值含义数值含义1Other12Install Error2Unknown13Power Save - Unknown3Running / Full Power14Power Save - Low Power Mode4Warning15Power Save - Standby5In Test16Power Cycle6Not Applicable17Power Save - Warning7Power Off18Paused8Off line19Not Ready9Off Duty20Not Configured10Degraded21Quiesced11Not InstalledCollect方法中的转换逻辑diskdrive.go可以印证 one-hot 行为遍历allDiskStatus命中当前状态输出 1.0否则输出 0.0availability同理遍历availMap的 21 个取值。五、实现原理WMI 查询与容错设计diskdrive采集器依赖internal/mi包Windows Management Instrumentation 的 Go 封装执行查询。Build阶段创建的查询语句是diskdrive.goSELECT DeviceID, Model, Caption, Name, Partitions, Size, Status, Availability FROM WIN32_DiskDrive查询结果按mi结构体标签反序列化到diskDrive结构diskdrive.gotype diskDrive struct { DeviceID string mi:DeviceID Model string mi:Model Size uint64 mi:Size Name string mi:Name Caption string mi:Caption Partitions uint32 mi:Partitions Status string mi:Status Availability uint16 mi:Availability }每次抓取时Collect方法在该命名空间下执行查询并对空结果集报错diskdrive.go查询失败时返回WMI query failed错误查询成功但没有返回任何磁盘如某些无本地磁盘的虚拟环境时返回WMI query returned empty result set错误。这两种情况下该采集器当次抓取失败但 exporter 本身继续提供其他采集器的指标。一个刻意的设计选择体现在Build方法结尾的注释与测试用例中Win32_DiskDrive exists on every supported Windows version, so Build does not probe it. WMI can time out shortly after boot. A probe would disable the collector until restart, while a failing Collect only fails the affected scrapes. —— diskdrive.go即构建阶段不主动向 WMI 发起探测查询。原因是 Windows 刚开机时 WMI 可能短暂超时如果在Build阶段探测失败采集器会被禁用直至重启服务而把查询推迟到每次Collect则失败只影响受影响的抓取。这一点有专门的单元测试 TestBuildDoesNotQueryWMI 保证用未初始化的mi.Session构造采集器后Build必须成功而Collect返回mi.ErrNotInitialized。常规的采集器冒烟测试则由 diskdrive_test.go 中的TestCollector与BenchmarkCollector承担需 Windows 环境运行。六、与 physical_disk / logical_disk 的关联用法diskdrive与 I/O 性能采集器physical_disk、卷容量采集器logical_disk之间存在磁盘编号对应关系diskdrive用PHYSICALDRIVEn作为name标签而后两者用n作为disk标签。官方 mixin 仪表盘正是基于这一约定做关联的核心查询构造见 disk.libsonnet// diskdrive names drives PHYSICALDRIVEn; physical_disk and logical_disk use n as disk. local drive(name, labels) label_replace(windows_diskdrive_ name {...}, disk, $1, name, PHYSICALDRIVE(\\\\d)); // Labels physical disk series with the drive model when diskdrive is enabled. local physicalByDisk(on, expr) if on(diskdrive) then ( expr ) * on (disk) group_left (model) max by (disk, model) ( drive(info) ) or on (disk) ( expr ) else expr;其含义是用label_replace把namePHYSICALDRIVE0中的数字提取为新标签disk0从而与physical_disk的disk标签对齐当diskdrive启用时将windows_diskdrive_info的model标签通过group_left附加到磁盘 I/O 指标上让图例直接显示磁盘 0型号而不是裸编号。同样的查询模式也固化在仓库导出的仪表盘 windows-exporter-disk.json 中例如统计状态非 OK 的磁盘数量count(label_replace(windows_diskdrive_status{status!OK}, disk, $1, name, PHYSICALDRIVE(\\d)) 1) or (0 * count(label_replace(windows_diskdrive_info, disk, $1, name, PHYSICALDRIVE(\\d))))因此如果希望磁盘 I/O 曲线带上具体磁盘型号或者在仪表盘里看到非 OK 磁盘数统计面板就需要启用diskdrive。mixin 配置 config.libsonnet 中也把diskdrive作为可选仪表盘组件之一。七、告警配置示例官方文档 collector.diskdrive.md 给出的告警示例prometheus.rules如下groups: - name: Windows Disk Alerts rules: - alert: Drive_Status expr: windows_diskdrive_status{statusOK} ! 1 for: 10m labels: severity: high annotations: summary: Instance: {{ $labels.instance }} has drive status: {{ $labels.status }} on disk {{ $labels.name }} description: Drive Status Unhealthy这条规则利用 one-hot 编码只要某块磁盘的statusOK序列不等于 1即当前状态是Error、Degraded、Pred Fail等异常值之一持续 10 分钟即触发高危告警。其中{{ $labels.status }}在告警恢复/触发时可结合windows_diskdrive_status 1反查具体异常状态值。结合availability指标还可以扩展出磁盘不可用类规则例如对availability标签为Not Ready/Off line/Install Error等取值第四节枚举表中与硬件故障相关的项匹配 1的序列。具体规则阈值请以自身环境为准。八、小结与延伸阅读文档源文件collector.diskdrive.md全部采集器文档索引见 docs/README.md核心实现internal/collector/diskdrive/diskdrive.go指标定义、状态枚举、WMI 查询与 one-hot 输出测试与容错设计验证internal/collector/diskdrive/diskdrive_test.go启用机制与默认列表pkg/collector/map.go、pkg/collector/types.go仪表盘集成contrib/mixin/dashboards/disk.libsonnet、dashboard/windows-exporter-disk.json。diskdrive采集器虽然指标不多、也没有可配置项但它提供了磁盘硬件维度的身份 状态数据是连接 I/O 性能指标与物理磁盘型号的枢纽启用它--collectors.enabled中加入diskdrive配合windows_diskdrive_status、windows_diskdrive_info即可实现硬件级的磁盘健康告警并让physical_disk的性能曲线可读性显著提升。赞分享可观测性指标监控【免费下载链接】windows_exporterPrometheus exporter for Windows machines项目地址https://gitcode.com/gh_mirrors/wi/windows_exporter点击查看免费下载相关推荐Velopack进阶技巧自定义安装流程与更新策略Velopack进阶技巧自定义安装流程与更新策略 Velopack是一款为跨平台dotnet应用提供快速简易安装程序和自动更新功能的工具。本文将深入探讨如何自开发工具Nextcloud AIO 集成 Scrutiny基于 SMART 数据的磁盘健康监控容器实战指南Nextcloud AIO 集成 Scrutiny基于 SMART 数据的磁盘健康监控容器实战指南 本篇技术指南介绍如何在 Nextcloud All in云原生运维后端容器编排Homepage 集成 Scrutiny 磁盘健康监控 Widget从 YAML 配置到源码级状态统计原理Homepage 集成 Scrutiny 磁盘健康监控 Widget从 YAML 配置到源码级状态统计原理 本文是 Homepage 开源仪表盘 docs/前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考