Prometheus2によるシステム監視 FreeBSD標準のエクスポーター prometheus_sysctl_exporterを使う

FreeBSD 12からはprometheus_sysctl_exporterというPrometheus用のExporterが何故かOS標準で入っている。
Linuxではprocで取れるような値でsysctlで取得できる値は、難しいことをしなくてもprometheus_sysctl_exporterで取れてしまう。
前々回あたりにやったFreeBSDのCPU温度取得はsysctlで取っていたので、当然それもprometheus_sysctl_exporterで取れる。
FreeBSDだとNode Exporterでは取れない値が多いのだが、prometheus_sysctl_exporterが一部その代替となるかも。

問題は「がとらぼ」の中の人が管理するホストにはFreeBSD 11がまだ半分ほど残っているので、全てでprometheus_sysctl_exporterが使えないこと。
また、FreeBSDだけではなくてLinuxもあるので全てのホストでprometheus_sysctl_exporterに統一するというのも無理。
できたらNode Exporterとprometheus_sysctl_exporterを併用は避けたいかなと思う心がある。
FreeBSDではNode Exporterで取れない値があるといってもそれが重要な値でもないというのが正直な感想。
さらに、Node Exporterの標準状態で取れない値で必要なのがあればCPU温度みたいにsysctlで取ってNode Exporterに渡せば良いじゃん?
prometheus_sysctl_exporterの出力データが多すぎるんだけど、これを全てPrometheusで受けさせるの?
prometheus_sysctl_exporter側で出力項目を制御できないのかしら?

どうしようかな?
是非使ってみたいという気持ちではないけど、今後に備えて一応触ってみた。ネットに情報が全然無いので手探りだけど。

prometheus_sysctl_exporter はターミナルで /usr/sbin/prometheus_sysctl_exporter を実行すれば、「sysctl_hoge_hoge 値」というのを大量に返してくる。
これをPrometheusが取りに来た時に渡すようにすれば良い。
FreeBSDではこれはinetdで動かすことを想定しているみたい。

/etc/inetd.conf (最終行)
#prom-sysctl stream tcp nowait nobody /usr/sbin/prometheus_sysctl_exporter prometheus_sysctl_exporter -dgh

行頭の#を削ってinetdを起動すれば使えるみたい。
ただ、inetdは昔から嫌いなのよね。最近は改善されているのかも知らないけど。

そこで20年前と変わらずinetdの代替としてtcpserverを使うことにする。(頭が化石でスミマセン)

tcpserverのインストール

# cd /usr/ports/sysutils/ucspi-tcp
# make install

configオプションは初期値で特に問題ない。
tcpserverはサービス起動周りが何か用意されているわけでもないのでこれだけ。

prometheus_sysctl_exporterをネットで使う

prometheus_sysctl_exporterは標準でTCPポート9124を使うみたい。

$ tcpserver -H -R  0 9124 /usr/sbin/prometheus_sysctl_exporter & 

今回はtcpserverのアクセス制御は入れていない。

では、ネット経由でprometheus_sysctl_exporterのメトリクスを表示してみます。

$ curl http://ホストアドレス:9124
curl: (1) Received HTTP/0.9 when not allowed

あれっ?HTTP/0.9だって言ってる?HTTP応答ヘッダが無いの?

$ curl --http0.9 http://ホストアドレス:9124
または
$ echo -e "GET /\r\n" | nc ホストアドレス 9124
sysctl_kern_osrevision 199506
sysctl_kern_maxvnodes 3350688
sysctl_kern_maxproc 13444
sysctl_kern_maxfiles 4030976
sysctl_kern_argmax 262144
sysctl_kern_securelevel -1
sysctl_kern_hostid 1764859756
sysctl_kern_posix1version 200112
sysctl_kern_ngroups 1023
sysctl_kern_job_control 1
sysctl_kern_saved_ids 0
sysctl_kern_boottime_seconds 1568628839.445746
sysctl_kern_osreldate 1200086
sysctl_kern_maxfilesperproc 3627792
sysctl_kern_maxprocperuid 12099
大量に後略

おおっ、表示できた。でも、Exporterのデータで見るHELP hogeっていう説明が一切付いてない。
prometheus_sysctl_exporterのヘルプによるとオプションが3つだけあるのね。

  • -d メトリクスの説明を付けて表示
  • -g HTTP応答ボディのGzip 圧縮あり
  • -h HTTP応答ヘッダーを付ける
なるほど、-hオプション無しだとHTTP応答ヘッダ無しなのね。っていうか、これオプション全指定が標準で良くない?

自動起動スクリプト

直前で見たオプション3つを指定して自動起動させる。
FreeBSDの自動起動は起動スクリプトを書いて/usr/local/etc/rc.dの下に置くだけ。
ただし、起動しっぱなしは行儀が悪いと思ったら同ディレクトリの他のスクリプトと同様にstart, stopで制御できるものにした方が良いかも。(下)

/usr/local/etc/rc.d/prometheus_sysctl_exporter (新規作成)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/sh
# Add the following line to /etc/rc.conf to enable prometheus_sysctl_exporter:
# prometheus_sysctl_exporter="YES"

PATH=/usr/local/bin:/bin:/usr/bin:/usr/sbin

. /etc/rc.subr

name="prometheus_sysctl_exporter"
rcvar="${name}_enable"
start_cmd="${name}_start"
stop_cmd="${name}_stop"

prometheus_sysctl_exporter_start() {
        tcpserver -H -R 0 9124 prometheus_sysctl_exporter -dgh & 
}

prometheus_sysctl_exporter_stop() {
        killall tcpserver
}

run_rc_command "$1"

なお、上のスクリプトではサービス停止がkillallによる全tcpserver停止という手抜きなので他にtcpserverを使っていたら注意。

実行属性を付ける
# chmod +x /usr/local/etc/rc.d/prometheus_sysctl_exporter
自動実行フラグの設定
/etc/rc.conf (1行追加)
prometheus_sysctl_exporter_start="YES"
または(コマンド)
# sysrc prometheus_sysctl_exporter="YES"
サービスの開始・停止
# service prometheus_sysctl_exporter start      システム再起動後のサービス手動スタート
# service prometheus_sysctl_exporter onestart   システム再起動前のサービス臨時スタート
# service prometheus_sysctl_exporter stop      システム再起動後のサービス手動停止
# service prometheus_sysctl_exporter onestop   システム再起動前のサービス臨時停止

出力確認

GZIP圧縮を有効にしたので確認にはブラウザを使う。http://ホストアドレス:9124を開く。

# HELP sysctl_kern_osrevision Operating system revision
sysctl_kern_osrevision 199506
# HELP sysctl_kern_maxvnodes Target for maximum number of vnodes
sysctl_kern_maxvnodes 3350688
# HELP sysctl_kern_maxproc Maximum number of processes
sysctl_kern_maxproc 13444
# HELP sysctl_kern_maxfiles Maximum number of files
sysctl_kern_maxfiles 4030976
# HELP sysctl_kern_argmax Maximum bytes of argument to execve(2)
sysctl_kern_argmax 262144
# HELP sysctl_kern_securelevel Current secure level
sysctl_kern_securelevel -1
# HELP sysctl_kern_hostid Host ID
sysctl_kern_hostid 1764859756
# HELP sysctl_kern_posix1version Version of POSIX attempting to comply to
sysctl_kern_posix1version 200112
# HELP sysctl_kern_ngroups Maximum number of supplemental groups a user can belong to
sysctl_kern_ngroups 1023
# HELP sysctl_kern_job_control Whether job control is available
sysctl_kern_job_control 1
# HELP sysctl_kern_saved_ids Whether saved set-group/user ID is available
sysctl_kern_saved_ids 0
大量に後略

希望通りの出力になった。
この後は、Prometheusに読み込ませて、Grafanaのダッシュボードを作成するところだけど、今回はここで気力が尽きたのでおしまい。

以下、2023年1月23日追記

出力項目のフィルタ

FreeBSD 13.1からは-iオプションと-eオプションが追加されて出力する項目を調整できるようになった。

  • -i オプションは出力する項目の指定
  • -e オプションは除外する項目の指定

たとえば prometheus_sysctl_exporter でフィルタ無しで出力した中に以下のような項目があって、それが不要だとする。

sysctl_compat_linux_setid_allowed 1
sysctl_compat_linux_use_emul_path 1
sysctl_compat_linux_map_sched_prio 1
続く

sysctl_compat_linuxから始まることが共通しているので

# prometheus_sysctl_exporter -e sysctl_compat_linux

このように-eオプションを付けて実行すると sysctl_compat_linux〜 が抜けた状態で出力される。

反対に、CPUの温度だけが欲しいというとき、sysctl_dev_cpu_coretemp〜だけ出力したいなら-iオプションでその項目を指定する。

# prometheus_sysctl_exporter -i sysctl_dev_cpu_coretemp

指定した項目以外は表示されない。

複数項目を指定したいなら「\|」で区切ることが可能。

# prometheus_sysctl_exporter -e sysctl_kern_features\|sysctl_vm\|sysctl_vfs_nfs\|sysctl_vfs_nfsd\|sysctl_debug\|sysctl_hw\|sysctl_machdep\|sysctl_user\|sysctl_p1003\|sysctl_dev\|sysctl_security\|sysctl_compat

こんな感じ。上の礼は-eオプションだが、-iオプションでも指定の仕方は同じ。
なお、-eオプションと-iオプションの併用は注意が必要っぽい。-eで除外した項目を-iで表示しようとするなど矛盾した指定を行うと何も出力されなくなるよう。

関連記事: