CPU温度を取得してTelegrafで記録するC#コンソールアプリケーションを作ってみた

はじめに

先日は、北海道で気温が39度を超えるなど、記録的な暑さになりましたね…
私は北国出身なので、豊橋の夏を乗り切れるのか、今から不安でいっぱいです。
気温が高いといえば、気になるのはサーバーのCPU温度。特に自宅サーバーは燃えないか不安になりますよね。
というわけで、サーバーのCPU温度を取得して、Telegrafで記録するC#のコンソールアプリケーションを作ってみました。

作ったもの

ソースはこちら。
github.com
プログラムを実行すると、標準出力に以下のようなフォーマットでデータが出力されます。

cpu_temperature,core=0,cpu=0,host=itokawa max=57,min=57,value=57
cpu_temperature,core=1,cpu=0,host=itokawa max=55,min=55,value=55
cpu_temperature,core=2,cpu=0,host=itokawa max=52,min=52,value=52
cpu_temperature,core=3,cpu=0,host=itokawa max=58,min=58,value=58
cpu_temperature,core=4,cpu=0,host=itokawa max=56,min=56,value=56
cpu_temperature,core=5,cpu=0,host=itokawa max=57,min=57,value=57
cpu_temperature,core=0,cpu=1,host=itokawa max=56,min=56,value=56
cpu_temperature,core=1,cpu=1,host=itokawa max=62,min=62,value=62
cpu_temperature,core=2,cpu=1,host=itokawa max=52,min=52,value=52
cpu_temperature,core=3,cpu=1,host=itokawa max=55,min=55,value=55
cpu_temperature,core=4,cpu=1,host=itokawa max=57,min=57,value=57
cpu_temperature,core=5,cpu=1,host=itokawa max=54,min=54,value=54

タイムスタンプはTelegraf側で付けてくれます。
あとはTelegrafの設定ファイルに、以下のように追記してサービスを再起動するとデータの記録が始まります。

[[inputs.exec]]
  commands = [
    "C:/path/to/exe/CPUTemperature.exe"
  ]
  timeout = "5s"
  data_format = "influx"

パスはスラッシュで記述してください。
少しだけはまったのが、実行ファイルのパスにスペースが入るとうまく動かないという点です。
例えば、実行ファイルがC:\Program Files\以下などにあるとうまく動きません。

使ったもの

Linuxの場合はファイルを読み込むだけでCPU温度が取得できるのですが、Windowsの場合はちょっと手間がかかります。
一般的な方法はパフォーマンスモニターやWMICコマンドで取得する方法ですが、私の環境ではエラーとなり取得できませんでした。
というわけでほかの方法を探すことにしました。
Nugetパッケージを物色していると、HardwareProvidersというライブラリを見つけました。
github.com
このライブラリを導入し、サンプルコードの通りにプログラムを書いたところ、無事にCPU温度が取得できました。
HardwareProvidersでは、その名の通りCPU温度以外の情報も取得できるようです。

終わりに

想像以上に簡単にCPU温度の取得ができました。
HardwareProvidersは日本語の情報は皆無ですが、とても良いライブラリだと感じました。
とりあえず、学校に行っている間にサーバーが燃えていないか不安になることはなさそうです。
何とか夏を乗り切りたいですね!