Prometheus2とGrafana6によるシステム監視

Prometheus

この2年ほど、自分のシステムの監視にElastic Stackを使ってきた。Elastic Stackはおおよそやりたいことは好きに出来て本当に素晴らしいのだが、業務用のシステムで使うのならともかく個人レベルのシステムで使うにはあきらかにオーバースペックだし管理も大変。ElasticsearchやKibanaを動かすホストが貧弱だと表示が遅くて目も当てられない。そして環境依存的にソフトウエアのパッケージの更新が大変になる。なによりも、FreeBSDのports/pkgのサポートがバージョン6.5で停まっている。(更新が無い方が手間に苦しめられなくて済むのではあるが)

で、もっと簡単でシステムリソースの状態をササッと見れる程度のシステム監視ツールは無いかしらと思って探していたら、Prometheusというものが見つかった。試してみて良さそうだったら乗り換えようかしら?
ちなみに、この10年だとCacti, Observium, LibreNMSを導入しています。

インストール

PrometheusとGrafanaのどちらも他のソフトウエアへの依存が少ないので嬉しい。
2019年8月時点ではFreeBSD用にPrometheusには1系と2系のports/pkgがあるが、今回は新しい2系をインストールする。 また、Grafanaは無印(1系)から6系までのports/pkgがあるが、今回は新しい6系をインストールする。

# cd /usr/ports/net-mgmt/prometheus2
# make install

# cd /usr/ports/www/grafana6
# make install
/etc/rc.conf (2行追加)
1
2
prometheus_enable="YES"
grafana_enable="YES"

Prometheusの設定

/usr/local/etc/prometheus.yml (編集)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
global:
  # scrape_interval:     15s  #サンプルでは15秒になっているが、デフォルトの1分に変更にするためコメント化
  # evaluation_interval: 10s # サンプルでは10秒になっているが、デフォルトの1分に変更にするためコメント化

scrape_configs:
  - job_name: 'prometheus' #Prometheus用の名前を付ける(変更不要)
  static_configs:
    - targets: ['localhost:9090']   #IPアドレスまたはホスト名をPrometheusのサーバのものにする

  - job_name: 'node_exporter' #node_exporter用を追加する
    scrape_interval: 5s
    static_configs:
      - targets: ['localhost:9100']  #node_expoterのIPアドレスまたはホスト名 ポートは9100
基本的にはサンプル設定に10〜13行目を追加するだけ。
最後の1行のターゲットはnode_expoterをインストールしたホスト分だけ記述する。- targets: ['localhost:9100', '192.168.0.1:9100']のような感じ。
YMLファイルは行頭の字下げに意味があるので揃える位置に注意。

サービス起動

# service prometheus start
# service grafana start
サーバー側はこれだけ。

エージェント node_exporter

ここでは、Prometheusにシステム情報を送る側(Prometheusによってシステム情報を取られる側)要するに監視対象側に仕込むソフトウエアをエージェントとする。
まずは、Prometheusサーバが動いているホストにエージェントをインストールして動かす。他のホストはこれに倣う。
インストールするのは豊富なexporterの中でもよく使われるnode_exporter。依存関係は少ないがビルドするにはGo言語が必要。個人的にはGoはあまり好きじゃない。Goでビルドするのが嫌ならPrometheus公式で配布しているビルド済みバイナリを使う手もある。(後述)

FreeBSDの場合

 # cd  /usr/ports/sysutils/node_exporter
 # make install
または、pkgでインストールする
# pkg install node_exporter
 
/etc/rc.conf (1行追加)
node_exporter_enable="YES"

起動オプションは/usr/local/etc/rc.d/node_exporterを見て必要に応じて/etc/rc.confに追記する。出力項目を絞るのはnode_exporter_argsを/etc/rc.confに書く。例えば、ZFSを使っていないなら node_exporter_args="--no-collector.zfs" と書いてZFSコレクタを無効にする。

node_exporterの起動
# service node_exporter start

node_exporterの動作確認
node_exporterが出力するメトリクスを確認する場合はブラウザを起動し、http://[node_exporterのIPまたはホスト名]:9100 を開く。

なお、node_expoterは基本的にLinuxの情報を取るために作られたようで仕組み的に(標準では存在し無い)/procなどが無いFreeBSDでは取れる情報が限られる。boottime, cpu, exec, filesystem, loadave, meminfo, netdev, unameの8項目が基本? そのままではメモリの使用情報が取れないのがちょっと残念。

Linuxでパッケージありの場合

例えばパッケージの管理システムがaptなら以下。

$ apt-cache search prometheus     #「prometheus」という名前でパッケージを探す
中略
prometheus-node-exporter - Prometheus exporter for machine metrics       ←リストの中から見つける
中略
$ sudo apt install prometheus-node-exporter   #インストール
$ sudo  systemctl enable prometheus-node-exporter  #サービス有効化
Synchronizing state of prometheus-node-exporter.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable prometheus-node-exporter
$ sudo service prometheus-node-exporter start  #起動

Linuxでパッケージ無しの場合

Raspberry Pi Zeroで動くVolumioにもnode_exporterを入れてみた。

Twitterなどを見るとVolumioというOSだと思っている人がいるみたいだけど実体はDebian Linux。なので全然特別なものじゃない。で、パッケージ管理システムはaptが使えるが、標準リポジトリにはPrometheus関係は無さげ?
さらに、Volumioを汚染されたたり壊されたりしたくないので様々なパッケージを突っ込んでビルドするのも避けたい。
なのでPrometheusのウェブサイトからビルド済みのバイナリファイルを貰ってくる。

ブラウザでhttps://prometheus.io/download/を開き、ページ上部近くにある「Architecture」プルダウンメニューからarmv6を選んでからスクロールしてnode_exporterのファイルリンクをクリックする、またはリンクURLをコピーしてwget等で取得する。
(Raspberry Pi Zero WはARMv6用のバイナリの方が良いみたい。一応ARMv7用も試してみたがRaspberry Pi Zeroでは動かなかった。Raspberry Pi 2あたりだとARMv7用の方が良い?)

$ wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-armv6.tar.gz
$ tar zxvf node_exporter-0.18.1.linux-armv6.tar.gz
$ cd node_exporter-0.18.1.linux-armv6
$ sudo chown root:root node_exporter
$ sudo mv node_exporter /usr/bin/
v0.18.1は2019年8月現在にPrometeus公式でリンクされているバージョン。
/lib/systemd/system/node-exporter.service (新規作成)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[Unit]
Description=Prometheus exporter for machine metrics
Documentation=https://github.com/prometheus/node_exporter

[Service]
Restart=always
User=prometheus
EnvironmentFile=/etc/node-exporter
ExecStart=/usr/bin/node_exporter $ARGS
ExecReload=/bin/kill -HUP $MAINPID
TimeoutStopSec=20s
SendSIGKILL=no

[Install]
WantedBy=multi-user.target
/etc/node-exporter (新規作成 手動インストールで上のEnvironmentFileで指定したファイル)
または
/etc/default/prometheus-node-exporter (編集 パッケージの場合はこちらが多いかしら?)
1
2
3
ARGS="--collector.diskstats.ignored-devices=^(ram|loop|fd)\d+$ \
      --collector.filesystem.ignored-mount-points=^/(sys|proc|dev|run)($|/) \
      --collector.textfile.directory=/tmp"

または、最初はARGS=""だけでも良い。
逆に要らない情報は出力したくないなら上の例のようなのや、一部のコレクタを停止させるために--no-collector.nfsd --no-collector.nfs のようなの(これはNFS|NFSdコレクタを停止)を追加する。

ユーザー追加
$ sudo useradd prometheus
有効化
$ sudo systemctl enable node-exporter.service
$ sudo service node-exporter start

これでシステム情報を収集(node_exporter)し、情報を蓄積(Prometheus)し、表示(Grafana)するという3つの役割が揃った。
次回はGrafanaを操作して監視情報を表示する。

「やはり裏切ったのかメーテル、この母を。
   お前に全てを与えて、安らかに眠りにつこうとしている、この母を。」

それはプロメシューム・・・

関連記事: