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で動かすことを想定しているみたい。
#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応答ヘッダーを付ける
自動起動スクリプト
直前で見たオプション3つを指定して自動起動させる。
FreeBSDの自動起動は起動スクリプトを書いて/usr/local/etc/rc.dの下に置くだけ。
ただし、起動しっぱなしは行儀が悪いと思ったら同ディレクトリの他のスクリプトと同様にstart, stopで制御できるものにした方が良いかも。(下)
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で表示しようとするなど矛盾した指定を行うと何も出力されなくなるよう。
- dump1090 Prometheus ExporterでADS-B受信状況を監視する
- Grafana AlertingやAlert Managerと連携して警告灯を点灯
- Prometheus2とGrafana6によるシステム監視 GrafanaのAlertを使う
- Prometheus2によるシステム監視 FreeBSD標準のエクスポーター prometheus_sysctl_exporterを使う
- Prometheus2とGrafana6によるシステム監視 NTP統計情報の表示
- Prometheus2とGrafana6によるシステム監視 シングルボードコンピュータの温度表示
- Prometheus2とGrafana6によるシステム監視 FreeBSDのメモリとCPU温度
- Prometheus2とGrafana6によるシステム監視 Node Exporterの情報を表示
- Prometheus2とGrafana6によるシステム監視