Prometheus2とGrafana6によるシステム監視 FreeBSDのメモリとCPU温度

前々回、PrometheusとGrafanaとNode Exporterのインストールを行った。前回は、既存のGrafanaのNode Exporter用テンプレートを貰ってきて使ったが、Linuxホストの監視用特化なのでFreeBSDのホストではメモリや温度の情報が表示されなかった。
そこで、今回はテンプレートはそのままで、Prometheus側の設定でFreeBSDの情報をLinuxの情報互換にして表示する。
初歩の初歩なので、すでにPrometheus, Grafanaを使いこなしている人にとっては見るところが無いかも。

CPU温度を取れるようにする

FreeBSDではCPUの温度はカーネルの温度関係のモジュールを使えるようにしていないと機能しないかもしれない。まぁ、システム監視をするなら間違いなく有効にしているだろうけど。

手動でカーネルモジュールを読み込んで温度を確認する方法

# kldload coretemp    #←カーネルモジュール読み込み CPUがAMD系ならkldload amdtemp
# sysctl dev.cpu | grep temperature  #←CPU温度表示
dev.cpu.3.temperature: 42.0C    #以下、CPUのコア(仮想含む)の数だけ温度が表示される。
dev.cpu.2.temperature: 42.0C
dev.cpu.1.temperature: 41.0C
dev.cpu.0.temperature: 41.0C
/boot/loader.conf (システム起動時に自動的に読み込む設定を追加)
1
2
coretemp_load="YES"  #Intel系CPU用
amdtemp_load="YES"  #AMD系CPU用

Node Exporterの情報確認

Node Exporterの情報はプル(Pull)なので、送られてくるのではなく取りに行く。つまり「http://Node Exporterホスト:9100/metrics」にアクセスしたらそのホストのNode Exporterの情報を取ることができる。
FreeBSDのホストのNode Exporterの情報を見るとメモリと温度は以下のようなの。つまり、Grafanaで見ると表示はされていないが、それらしいものは出力はされている。ただし、Linuxと比べると取得できる項目はだいぶ少ないっぽい。

メモリ
# HELP node_memory_active_bytes Recently used by userland
# TYPE node_memory_active_bytes gauge
node_memory_active_bytes 1.083392e+07
# HELP node_memory_buffer_bytes Disk IO Cache entries for non ZFS filesystems, only usable by kernel
# TYPE node_memory_buffer_bytes gauge
node_memory_buffer_bytes 1.16641792e+08
# HELP node_memory_cache_bytes Almost free, backed by swap or files, available for re-allocation
# TYPE node_memory_cache_bytes gauge
node_memory_cache_bytes 0
# HELP node_memory_free_bytes Unallocated, available for allocation
# TYPE node_memory_free_bytes gauge
node_memory_free_bytes 1.2384256e+08
# HELP node_memory_inactive_bytes Not recently used by userland
# TYPE node_memory_inactive_bytes gauge
node_memory_inactive_bytes 7.29227264e+08
# HELP node_memory_size_bytes Total physical memory size
# TYPE node_memory_size_bytes gauge
node_memory_size_bytes 1.949618176e+09
# HELP node_memory_swap_in_bytes_total Bytes paged in from swap devices
# TYPE node_memory_swap_in_bytes_total counter
node_memory_swap_in_bytes_total 0
# HELP node_memory_swap_out_bytes_total Bytes paged out to swap devices
# TYPE node_memory_swap_out_bytes_total counter
node_memory_swap_out_bytes_total 0
# HELP node_memory_swap_size_bytes Total swap memory size
# TYPE node_memory_swap_size_bytes gauge
node_memory_swap_size_bytes 0
# HELP node_memory_swap_used_bytes Currently allocated swap
# TYPE node_memory_swap_used_bytes gauge
node_memory_swap_used_bytes 0
# HELP node_memory_wired_bytes Locked in memory by kernel, mlock, etc
# TYPE node_memory_wired_bytes gauge
node_memory_wired_bytes 1.085915136e+09

CPU温度
# HELP node_cpu_temperature_celsius CPU temperature
# TYPE node_cpu_temperature_celsius gauge
node_cpu_temperature_celsius{cpu="0"} 40.9
node_cpu_temperature_celsius{cpu="1"} 40.9
node_cpu_temperature_celsius{cpu="2"} 41.9
node_cpu_temperature_celsius{cpu="3"} 41.9

Linuxと比べるとFreeBSDではメトリクス名が違うのが判るはず。LinuxとFreeBSDで明らかに対応しそうな似たメトリクス名があってもそれに値が入っていない場合は別のメトリクスから探さなければならなかったり、複数のメトリクス値から計算する必要があったり。

node exporter 1
Grafanaで使用しているテンプレートから、メモリのグラフ表示のためにの何のメトリクスを使っているかを編集モードで確認する。クエリーの全文を確認する。1つのメトリクスしか使われていないとは限らない。

FreeBSD           ⇔    Linux
メモリ
node_memory_free_bytes   ⇔ node_memory_MemAvailable_bytes
node_memory_inactive_bytes ⇔ node_memory_MemFree_bytes
node_memory_size_bytes   ⇔ node_memory_MemTotal_bytes
スワップ
node_memory_swap_size_bytes ⇔ node_memory_SwapTotal_bytes
node_memory_swap_used_bytes ⇔ node_memory_SwapCached_bytes
node_memory_swap_size_bytes - node_memory_swap_used_bytes(差分) ⇔ node_memory_SwapFree_bytes
CPU温度
node_cpu_temperature_celsius ⇔ node_hwmon_temp_celsius

「がとらぼ」の中の人はFreeBSDではスワップを使わない方針のため、ちょこっと試しただけでテキトーに書いてます。間違っていたらスミマセン。

Prometheusの設定変更

対応を調べたら、メトリクス名の書き換えをPrometheusに設定する。
このときに、ルールを書く設定ファイルを分ける。

メインのPrometheusの設定ファイル
/usr/local/etc/prometheus.yml (追記)
1
2
rule_files:
   - "prometheus_node_exporter.yml"

2行を追加する。すでに別のルールファイルを指定して使っているなら既存のルールファイルの指定行の次の行に上の2行目を指定する。
YAMLファイルは行頭の字下げに意味があるのでむやみに字下げしたり、逆に行頭のスペースを取らないこと。
ファイル名だけを指定したら設定ファイルと同じディレクトリという意味なので/usr/local/etc/prometheus_node_exporter.ymlになる。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
groups:
- name: node_exporter-FreeBSD-metrics  #何か名前をつける
  rules:
  - expr: node_memory_free_bytes                #書き換え元のメトリクス名
    record: node_memory_MemAvailable_bytes    #書き換え後のメトリクス名
  - expr: node_memory_inactive_bytes
    record: node_memory_MemFree_bytes
  - expr: node_memory_size_bytes
    record: node_memory_MemTotal_bytes
  - expr: node_memory_swap_size_bytes
    record: node_memory_SwapTotal_bytes
  - expr: node_memory_swap_used_bytes
    record: node_memory_SwapCached_bytes
  - expr: (node_memory_swap_size_bytes{job="node_exporter"} - node_memory_swap_used_bytes{job="node_exporter"})
    record: node_memory_SwapFree_bytes
  - expr: node_cpu_temperature_celsius
    record: node_hwmon_temp_celsiu

Linuxのnode_memory_SwapFree_bytes (スワップの空き容量)に相当する値はFreeBSDでは取得できないようなので、node_memory_swap_size_bytes (スワップの全容量)とnode_memory_swap_used_bytes (スワップ使用量)の差分を求めて、その値がスワップの空き容量だろうとした。何台かのFreeBSDホストでスワップを使っていたらこのメトリクス名と計算が正しいのか確認できたんだろうけど、空いてた1台に急遽スワップを作って、スワップがほぼほぼ使われない中で「これかな?」で出したので正しいかは判らない。

Grafanaでグラフ表示を確認する

Prometheusを再起動またはリロードする。

# service prometheus restart
または
# service prometheus reload

暫く待ってGrafanaにメモリ、スワップ、CPU温度が表示されればOK.

node exporter 2
前回のテンプレートではCPU温度は 下部で折りたたまれたSystem Detailを展開した最後のグラフ。

このようにメトリクス名を変換、或いは、複数のメトリクスから計算した値を渡すようにすることで、Linuxとは違う名前のメトリクスで出力されるシステムでも簡単に表示できるようになる。今回の場合はテンプレートを弄っていないので当然Linuxホストはそのまま正常に表示できる。

関連記事: