HardwareExporterWindows

May 22, 2026 · View on GitHub

ビルドステータス リリース ダウンロード ライセンス .NET プラットフォーム Stars

English | 简体中文 | 日本語

LibreHardwareMonitor を使用した Windows ハードウェアメトリクス用 Prometheus エクスポーター。

Grafana ダッシュボード

Grafana ダッシュボード

すぐに使える Grafana ダッシュボードが docs/grafana-dashboard.json に含まれています。Grafana UI からインポートできます(ダッシュボード > インポート > JSON ファイルをアップロード)。

ダッシュボードのセクション: CPU 概要、CPU 温度、CPU 電力と電圧、ファン、メモリ、GPU(温度 / 負荷 / VRAM / 電力 / クロック / PCIe)、ディスク(温度 / 容量 / 健康状態 / IO / スループット)、ネットワーク(使用率 / スループット / データ転送量)。

今後の破壊的変更:LHM レガシーメトリクス名は 2026-08-15 以降に削除されます

ee6b1c2(2026-05-08)まで、LHM 由来のメトリクスは hardware_<type>_<sensor_type>_<name> として LHM ネイティブ単位(Data は GB、SmallData は MB、Throughput は B/s)で出力されていました。この命名は単位が暗黙で、さらに Data は GB 量子化された整数のため rate(hardware_storage_data_*[5m]) が短いウィンドウで 0 を返してしまっていました。

exporter は現在、Prometheus 規約に沿った別名を並行で出力します:Throughput は *_bytes_per_second、Data / SmallData は *_bytes、値は SI 基本単位に正規化されています。レガシー名は 2026-08-15 以降にタグ付けされたリリースで削除されます。完全な対応表は CHANGELOG.md を参照してください。

移行手順:

  1. docs/grafana-dashboard.json を再 import してください。このダッシュボードは 2026-05-08 に別名へ移行済みです。
  2. カスタムダッシュボード / アラートルールを監査:
    {__name__=~"hardware_(storage|memory|network|gpu)_(throughput|data)_.*"}
    
    返ってくるすべての series は、消える予定の名前を使っています。
  3. appsettings.jsonHardwareMonitor:EmitLegacyMetricNamesfalse に設定すると、「削除後の /metrics がどう見えるか」をプレビューできます。気になるメトリクスがそこで消えるなら、移行のどこかを見落としています。

単位を持たないセンサー(温度、ファン、電圧、電力、クロック、load、level、factor)は影響を受けません——元々この命名しかなく、EmitLegacyMetricNames=false で一緒にミュートされることはありません。

SMART ディスク属性

LibreHardwareMonitor は SAS HBA(LSI/Avago、Adaptec など)の背後にあるディスクの SMART データを読み取れません。これらのディスクは SCSI デバイスとして見え、SAT(SCSI/ATA Translation)パススルーが必要ですが、ライブラリはこれを実装していないためです。このギャップを埋めるため、本 exporter は smartctl を同梱し、hardware_storage_smart_* プレフィックスで並列のメトリクス群を出力します。

同梱バイナリは <インストール先>\smartctl\ に配置されます(合計約 1.4 MB)。これらは別プロセスとして呼び出されます。smartmontools は GPLv2+ で、未改変の独立した実行ファイルとして同梱されています。完全なクレジットは smartctl\COPYING.txt および smartctl\README.txt を参照してください。

別のバージョンの smartctl.exe(より新しいものなど)を使いたい場合は、appsettings.jsonSmartMonitor:SmartctlPath を設定します。SMART 採集を完全に無効化するには SmartMonitor:Enablefalse にします。

SMART メトリクスの例

# ディスク温度(SAS HBA 接続の SATA ディスクを含む)
hardware_storage_smart_temperature_celsius{device="/dev/sda", model="WDC  WUH721816ALE6L4", serial="3HGHU16P", protocol="ata", firmware="PCGNW232"} 34

# 全体ヘルス自己診断(1 = 合格、0 = 不合格)
hardware_storage_smart_health_passed{device="/dev/sda", ...} 1

# ATA SMART 属性表(id 別)
hardware_storage_smart_ata_attribute_raw{device="/dev/sda", ..., id="5", name="Reallocated_Sector_Ct"} 0
hardware_storage_smart_ata_attribute_raw{device="/dev/sda", ..., id="9", name="Power_On_Hours"} 31120

# NVMe 固有
hardware_storage_smart_nvme_percentage_used{device="/dev/sdi", model="SAMSUNG MZWLL3T2HAJQ-00005", ...} 6
hardware_storage_smart_nvme_media_errors{device="/dev/sdi", ...} 0

SMART 設定

オプションデフォルト説明
SmartMonitor:EnablebooltrueSMART コレクターを有効化
SmartMonitor:SmartctlPathstring""smartctl.exe のパスをオーバーライド(空なら同梱版を使用)
SmartMonitor:RefreshIntervalSecondsint60smartctl を再ポーリングする間隔。リフレッシュは非同期で、/metrics は常にキャッシュされた最新スナップショットを返すため、Prometheus の scrape レイテンシには影響しません。注意:SMART を読み取るとアイドル中の HDD が起き上がるので、過度に短くしないでください。
SmartMonitor:InvocationTimeoutSecondsint15ディスク 1 台あたりの smartctl 呼び出しタイムアウト
SmartMonitor:DeviceExcludePatternsstring[][]/dev/sdN 名にマッチさせる glob パターン。マッチしたデバイスはスキップされる

キャッシュとリフレッシュモデル

両方のコレクターは独立したバックグラウンドリフレッシュループを持ち、/metrics はメモリ内キャッシュから応答します。Prometheus の scrape はハードウェア読み取りを直接トリガーしません。独立した 2 つのキャッシュがあります:

キャッシュ設定項目デフォルト下限
LibreHardwareMonitor(CPU / GPU / メモリ / マザーボード / ネットワーク / ネイティブ SATA SMART / NVMe)HardwareMonitor:ScrapeIntervalSeconds15s1s
smartctl(全ディスクの完全な SMART 表、SAS HBA 背後のディスクを含む)SmartMonitor:RefreshIntervalSeconds60s15s

サービス起動時に両方とも即座に 1 回リフレッシュするため、起動後初回の scrape からデータが揃っています。ウォームアップギャップはありません。

デフォルト値が異なる理由

  • HardwareMonitor は変化の速いテレメトリ(CPU 温度、GPU 負荷、ファン回転数)をカバーします。15s は Prometheus のデフォルト scrape 間隔と同期しているため、クライアント側の遅延は知覚できないレベルです。
  • SmartMonitor は変化の遅いヘルス属性(温度は分単位で変動、reallocated_sectors は日単位で変動)を読み取ります。さらに重要なのは、アイドル中の HDD に対する smartctl 呼び出しは毎回その HDD を起き上がらせることです——scrape 経路で実行するとディスクが永久に休止できなくなります。60s は実際に許容できる下限です。

実効的な古さ

Prometheus クライアントが見るメトリクスは最大で cache_interval + scrape_interval 古くなります。デフォルト設定では:

  • LibreHardwareMonitor メトリクス:≤ 30 秒
  • SMART メトリクス:≤ 75 秒

チューニングのタイミング

  • 1Hz のリアルタイムダッシュボードが欲しい場合:HardwareMonitor:ScrapeIntervalSeconds=1SmartMonitor は触らないでください——15s が既に下限で、それ以下にするとアイドルドライブを酷使します。
  • AHCI 接続の SATA HDD を実際にスピンダウンさせたい場合:HardwareMonitor:ScrapeIntervalSeconds を 60s 以上に上げます。LHM の Update() はそれらのディスクに対して IOCTL_ATA_PASS_THROUGH SMART READ DATA を発行し、ATA standby_timer 上はアクティビティとしてカウントされます。(SAS HBA 接続のディスクは影響なし——LHM は SAT 経路を通せず perfmon のみを読むため、ディスクを起こしません。)
  • NVMe のみで省電力を気にしないホスト:デフォルトのままでよいです。

なぜこのプロジェクトが必要か

windows_exporter の温度ゾーンデータは正確ではありません

このエクスポーターは、LibreHardwareMonitor ライブラリを直接使用することで、正確なハードウェア監視データを提供します。

機能

  • ✅ 正確な CPU、GPU、メモリ、マザーボード、ネットワーク、ストレージメトリクス
  • ✅ NVIDIA / AMD / Intel GPU 対応(Intel Arc ディスクリート GPU を含む)
  • ✅ Windows サービスとして実行
  • ✅ 設定可能なハードウェア監視(特定コンポーネントの有効/無効)
  • ✅ Prometheus 互換のメトリクス形式
  • ✅ シングルトンパターンによる低リソース使用
  • ✅ 構造化ログ

インストール

前提条件

  • Windows 10/11 または Windows Server 2016+
  • .NET 10.0 ランタイム(開発には SDK が必要)
  • 管理者権限(ハードウェアアクセスに必要)

PawnIO(低レベルセンサー用カーネルドライバー)

LibreHardwareMonitor は CPU MSR(温度、電圧)とマザーボードの Super-I/O チップ(ファン回転数、ボード電圧)を ring-0 カーネルドライバー経由で読み取ります。LibreHardwareMonitor 0.9.5 以降、そのドライバーは PawnIO —— 署名済みで HVCI / メモリ整合性に対応した、旧 WinRing0 ドライバーの置き換え —— になりました。

PawnIO は本 exporter に同梱され、自動的にインストールされます。 MSI インストーラー(および install.ps1)が HardwareExporterWindows.exe --install-pawnio を実行し、Root\PawnIO デバイスを作成して <インストール先>\pawnio\ のドライバーパッケージをインストールします —— ヘッドレス、追加ツール不要。この処理は冪等(PawnIO が既にあればスキップ)で、失敗してもインストールは中断されません。

PawnIO が無い場合でも exporter は動作し、GPU・メモリ・ネットワーク・ストレージ・SMART メトリクスは通常どおり出力されます。ただし hardware_cpu_temperature_*hardware_cpu_voltage_*、すべての hardware_motherboard_* センサーは欠落します。失敗ではなく、機能の縮退です。

ソースから実行する場合(dotnet run)PawnIO はインストールされません。開発時は https://pawnio.eu/ から一度インストールするか、昇格プロンプトで HardwareExporterWindows.exe --install-pawnio を実行してください。

PawnIO は GPLv2 —— 独立した未改変の署名済みドライバーとして同梱されています。<インストール先>\pawnio\COPYINGpawnio\README.txt を参照してください。

クイックスタート

方法1:MSI インストーラー(推奨)

  1. 最新リリース から HardwareExporterWindows-win-x64.msi をダウンロード
  2. MSI ファイルをダブルクリックしてインストール
  3. インストーラーは自動的に:
    • C:\Program Files\HardwareExporter にファイルをコピー
    • Windows サービスをインストールして起動
    • ファイアウォールルールを設定

方法2:PowerShell スクリプトによる手動インストール

  1. 最新リリース から HardwareExporterWindows-win-x64.zip をダウンロード
  2. C:\Program Files\HardwareExporter に解凍
  3. 管理者として PowerShell を実行
  4. インストールスクリプトを実行:
cd "C:\Program Files\HardwareExporter"
.\install.ps1

スクリプトは以下を実行します:

  • インストールディレクトリにファイルをコピー
  • Windows ファイアウォールルールを作成
  • Windows サービスを登録して起動

手動インストール

# Windows サービスとして登録
New-Service -Name "HardwareExporter" `
    -BinaryPathName "C:\Program Files\HardwareExporter\HardwareExporterWindows.exe" `
    -StartupType "Automatic" `
    -Description "Hardware Exporter Service"

# サービスを起動
Start-Service -Name "HardwareExporter"

設定

appsettings.json を編集してエクスポーターをカスタマイズ:

{
  "HardwareMonitor": {
    "EnableCpu": true,
    "EnableGpu": true,
    "EnableMemory": true,
    "EnableMotherboard": true,
    "EnableController": true,
    "EnableNetwork": true,
    "EnableStorage": true,
    "ScrapeIntervalSeconds": 15
  },
  "Urls": "http://0.0.0.0:9888"
}

設定オプション

オプションデフォルト説明
EnableCpubooltrueCPU メトリクスを監視
EnableGpubooltrueGPU メトリクスを監視
EnableMemorybooltrueメモリメトリクスを監視
EnableMotherboardbooltrueマザーボードメトリクスを監視
EnableControllerbooltrueコントローラーメトリクスを監視
EnableNetworkbooltrueネットワークメトリクスを監視
EnableStoragebooltrueストレージメトリクスを監視
ScrapeIntervalSecondsint15バックグラウンドループがハードウェアモニタの Update() を呼び出す頻度。/metrics は常にキャッシュされた最新スナップショットを返すため、これはハードウェアのポーリング頻度を制御するもので、Prometheus の scrape レイテンシではありません。低い値ほどデータが新鮮、高い値ほどアイドル中の AHCI HDD が実際にスピンダウンできます(Update() は対象ディスクに ATA SMART パススルーを発行するため)。

Prometheus 設定

prometheus.yml に以下を追加:

scrape_configs:
  - job_name: 'windows-hardware'
    static_configs:
      - targets:
          - '192.168.1.100:9888'  # Windows マシンの IP
          - '192.168.1.101:9888'

HardwareExporterWeb(オプションのサービスディスカバリー)

HardwareExporterWeb は、Prometheus の自動サービスディスカバリー機能を提供するオプションのサービスです。メトリクス収集とは無関係 で、Prometheus がネットワーク上の監視対象を自動的に発見するのを支援します。

📖 完全なドキュメント

機能

  • ローカルネットワークを自動スキャンし、HardwareExporter を実行している Windows マシンを発見
  • Prometheus HTTP サービスディスカバリーエンドポイントを提供
  • prometheus.yml で各ターゲットを手動設定する必要がなくなります

インストール

最新リリース から HardwareExporterWeb-win-x64.zip をダウンロードし、ネットワーク内の任意のマシンで実行します(監視対象の各マシンにインストールする必要はありません)。

設定

appsettings.json を編集:

{
  "NetworkScan": {
    "SubnetFilter": "",           // 空 = すべてのローカルサブネットをスキャン
    "SubnetMask": "255.255.255.0" // サブネットマスク
  }
}

サービスディスカバリーを使用した Prometheus 設定

静的ターゲットの代わりに HTTP サービスディスカバリーを使用:

scrape_configs:
  - job_name: 'windows-hardware-auto'
    http_sd_configs:
      - url: 'http://your-web-server/api/ServiceDiscovery/HardwareExporter'
        refresh_interval: 60s

API エンドポイント

  • /api/ServiceDiscovery/HardwareExporter - HardwareExporter インスタンスを発見
  • /api/ServiceDiscovery/WindowsExporter - windows_exporter インスタンスを発見

注意: これは完全にオプションです。静的設定を好む場合は、prometheus.yml で直接ターゲットを設定できます。

利用可能なメトリクス

エクスポーターは2種類のメトリクスを提供します:

  1. ハードウェアメトリクス - LibreHardwareMonitor から
  2. .NET ランタイムメトリクス - prometheus-net から(GC、スレッド、メモリなど)

すべてのメトリクスは /metrics エンドポイントで取得できます。

ハードウェアメトリクス形式

LHM 由来のメトリクスは LHM の SensorType をそのまま保ち、LHM ネイティブの単位を使用します(下の「メトリクスタイプ」表を参照):

hardware_{タイプ}_{センサータイプ}_{センサー名}{ラベル} 値

加えて、単位を持つセンサータイプ(ThroughputDataSmallData)については、Prometheus 規約に沿った別名を並行で出力し、値は SI 基本単位に正規化されます。新しいダッシュボードではこちらを優先してください——パネルごとの単位調整が不要で、rate(hardware_storage_data_*[5m]) を不安定にする GB 量子化問題も回避できます。

hardware_{タイプ}_{センサー名}_bytes_per_second{ラベル} 値   # Throughput
hardware_{タイプ}_{センサー名}_bytes{ラベル} 値              # Data, SmallData

メトリクス例

# CPU 温度
hardware_cpu_temperature_core{name="AMD Ryzen 9 5900X", core="0"} 45.0

# GPU 使用率
hardware_gpu_load_core{name="NVIDIA GeForce RTX 3080", vendor="nvidia"} 75.5

# メモリ使用量(レガシー、GB)
hardware_memory_data_memory_used{name="Generic Memory"} 18.655
# 同じ値、規約準拠の別名(bytes)
hardware_memory_used_bytes{name="Generic Memory"} 18655895233

# ファン速度
hardware_motherboard_fan_fan{name="ASUS ROG STRIX B550-F", fan="1"} 1200

# ディスクスループット(レガシー、B/s——注:MB/s ではない、過去のドキュメントに誤りあり)
hardware_storage_throughput_write_rate{name="KIOXIA-EXCERIA SSD"} 153991
# 同じ値、規約準拠の別名
hardware_storage_write_rate_bytes_per_second{name="KIOXIA-EXCERIA SSD"} 153991

# 累計書き込み(レガシー、GB 累計値——レートではない)
hardware_storage_data_written{name="SAMSUNG MZWLL3T2HAJQ"} 4608505
# 同じ値、規約準拠の別名(bytes 累計値;rate() を安全に使用可能)
hardware_storage_data_written_bytes{name="SAMSUNG MZWLL3T2HAJQ"} 4608505000000000

メトリクスタイプ

LHM SensorTypeレガシー単位(hardware_*_<sensor_type>_* 内)規約準拠の別名サフィックス別名の値
Temperature°C__
Loadpercent (0-100)__
ClockMHz__
PowerW__
FanRPM__
VoltageV__
ThroughputB/s(以前のドキュメントの MB/s は誤り)_bytes_per_second値はそのまま(既に B/s)
DataGB 累計値(GB/s ではない)`_bytes$レガシー値 \times 1\text{e9}
$SmallData`MB 累計値`_bytes$レガシー値 \times 1\text{e6}
$Energy`mWh__

トラブルシューティング

サービスが起動しない

  1. Windows イベントビューアでエラーを確認
  2. 管理者権限があることを確認
  3. .NET 10.0 ランタイムがインストールされていることを確認
  4. ポート 9888 が使用されていないか確認

メトリクスが表示されない

  1. サービスが実行中か確認:Get-Service HardwareExporter
  2. エンドポイントをテスト:curl http://localhost:9888/metrics
  3. イベントビューアの「アプリケーション」でログを確認

CPU 温度 / マザーボードセンサーが欠落している

/metrics に GPU・メモリ・ストレージ・ネットワークのデータはあるのに hardware_cpu_temperature_*hardware_cpu_voltage_*hardware_motherboard_* が無い場合、PawnIO カーネルドライバーがインストールされていません。昇格プロンプトでインストール処理を再実行し、サービスを再起動してください:

& "C:\Program Files\HardwareExporter\HardwareExporterWindows.exe" --install-pawnio
Restart-Service HardwareExporter
Get-Service PawnIO   # Running であること

ファイアウォールの問題

インストールスクリプトは自動的にファイアウォールルールを作成します。必要に応じて手動で作成:

New-NetFirewallRule -DisplayName "HardwareExporter" `
    -Direction Inbound `
    -Program "C:\Program Files\HardwareExporter\HardwareExporterWindows.exe" `
    -Action Allow

開発

ソースからビルド

git clone https://github.com/naughtyGitCat/HardwareExporterWindows.git
cd HardwareExporterWindows
dotnet build

開発モードで実行

cd src/HardwareExporterWindows
dotnet run

メトリクスにアクセス:http://localhost:9888/metrics

テストを実行

dotnet test

クレジット

ライセンス

MIT License - 詳細は LICENSE ファイルを参照してください。

このプロジェクトは以下のオープンソースライブラリを使用しています:

貢献

貢献を歓迎します!お気軽にプルリクエストを送信してください。