QNAPの共有フォルダの各サイズをPrometheusで収集できるようにする

Node exporterTextfile Collector機能を使用することで、任意の値をPrometheusで収集できます。そこで、QNAPでNode exporterが稼働するようになったのでQNAPの各ディレクトリサイズを計測して、それをPrometheusで収集できるようにします

前提

  • サイズ計測対象のフォルダは/share/homes以下(ユーザーのホームディレクトリ)

構成

パス 内容
/share/homes/admin/bin/node_exporter.sh Node exporter起動スクリプト。前回作成済み
/share/homes/admin/bin/directory_size.sh ディレクトリサイズ計測スクリプト
/share/homes/admin/opt/node_exporter/textfile_collector 計測結果置き場
/etc/config/crontab QNAPのcrontab

データ取得設定(Textfile Collector)

ディレクトリサイズ計測スクリプトが出力し、Node expoterが読み取る場所を作成する

mkdir /share/homes/admin/opt/node_exporter/textfile_collector

起動スクリプトのNode exporter起動時に--collector.textfile.directoryオプションを追加する

#!/bin/bash

DAEMON_MGR="/sbin/daemon_mgr"
NAME=node_exporter
PROG=/share/homes/admin/opt/node_exporter/node_exporter

# OPTにcollector.textfile.directoryオプションを追加
OPT="--collector.textfile.directory=/share/homes/admin/opt/node_exporter/textfile_collector"

case "$1" in
    start)
        mypid=`/bin/pidof $NAME`
        if [ ! -z $mypid ]; then
                exit 1
        else
            echo -n "Starting $NAME: "
            $DAEMON_MGR $NAME start "$PROG $OPT &"
            exit 0
        fi
        ;;
    stop)
        echo -n "Stopping $NAME: "
        $DAEMON_MGR $NAME stop "$PROG"
        echo
        ;;
    *)
        echo "Usage: $1 start|stop"
        exit 1
        ;;
esac

exit 0

ディレクトリサイズ計測スクリプト

prometheus-community/node-exporter-textfile-collector-scripts: Scripts for node-exporter’s textfile collectordirectory_size.shを参考に/share/homes/admin/bindirectory_size.shを作成する

#!/bin/bash

echo "# HELP node_directory_size_bytes Disk space used by some directories" > /share/homes/admin/opt/node_exporter/textfile_collector/directory_size.prom.$$
echo "# TYPE node_directory_size_bytes gauge" >> /share/homes/admin/opt/node_exporter/textfile_collector/directory_size.prom.$$

du -sb /share/homes/* | /opt/bin/sed -ne 's/^\([0-9]\+\)\t\(.*\)$/node_directory_size_bytes{directory="\2"} \1/p' >> /share/homes/admin/opt/node_exporter/textfile_collector/directory_size.prom.$$

mv /share/homes/admin/opt/node_exporter/textfile_collector/directory_size.prom.$$ /share/homes/admin/opt/node_exporter/textfile_collector/directory_size.prom

HELPとTYPEは、Exposition formats | Prometheusを参考に出力値に合ったものを設定

実行権限付与

chmod +x /share/homes/admin/bin/directory_size.sh

実行確認

/share/homes/admin/bin/directory_size.sh

成功していれば、/share/homes/admin/opt/node_exporter/textfile_collectordirectory_size.promが生成され、各ディレクトリのサイズが出力されています

cat /share/homes/admin/opt/node_exporter/textfile_collector/directory_size.prom
# HELP node_directory_size_bytes Disk space used by some directories
# TYPE node_directory_size_bytes gauge
node_directory_size_bytes{directory="/share/homes/@Recycle"} 15107
node_directory_size_bytes{directory="/share/homes/admin"} 62545445
node_directory_size_bytes{directory="/share/homes/ftptest"} 26675

※古いQNAPだとsedのバージョンが古いため1行目のコマンドの出力が得られないことがありました(TS-120)その場合、Entwareインストールして

/opt/bin/opkg update
/opt/bin/opkg install sed

とすることで、/opt/bin/sedが利用できるので、そちらで代用できます

確認

http://QNAPのIP:9100 にアクセスして、node_directory_size_bytesの項目が出力されているか確認

出力確認

cron設定

directory_size.shを定期実行するためCronに登録

QNAPのcrontab/etc/config/crontabにあるので、それに追記

# この例では毎時0分実行
0 * * * * /share/homes/admin/bin/directory_size.sh

あとは、Prometheus経由で、Grafanaでグラフ化する

Grafanaでのグラフ例

参考