RRDTool を勉強しなおしてみる

やったこと

取得した CPU の温度データを RRDTool でグラフ化するところまで。
思ったより簡単に出来て良かった…。

日付を UNIX タイムに変換

データは YYYY/MM/DD hh/mm/ss な形式で記録していたため、RRDTool に投入する前に整形しないとイケなさげ
ぎゃふん。
どうやら、整形しなくても行けたみたい。
今回は直して進める。



が、こんなことは昔もあった。


出力した内容を Excel に貼り付けたら、日付部分がシリアル値に変換されていることを確認。
過去、備忘で書いた数式を一旦はそのままコピペして、日付部分はシリアル値を参照させるようにしてと。
UNIX タイムと温度データをタブ区切りしたテキストファイルを thermal.dat という名前で作成後、改行コード LF で保存しておく。

データを RRDTool に投入

まずは RRDTool のインストールから。

$ sudo apt-get install rrdtool


やっぱり Debian 系は、インストールが楽すぎる。


で、データの置場所を作って配置。

$ mkdir ~/rrddata
$ cd ~/rrddata


ここで SCP により、温度データを Raspberry Pi に投げつける。



それからグラフの描画に必要な情報を、簡単に取得

$ wc -l thermal.dat
3395 thermal.dat
$ head -1 thermal.dat
1427612783	46.54


ふむ。
4000ステップあれば足りるし、開始時刻は 1427612783 より前なら OK と。
ならばと参考サイト様を見て、コマンドを作ってみる。

$ rrdtool create thermaltest.rrd \
        --start 1427612782 \
        --step 60 \
        DS:thermal:GAUGE:600:0:U \
        RRA:AVERAGE:0.5:1:4000


Raspberry Pi で実行してみると、普通に通った。
やった。
次は、データ投入コマンドのテスト。

$ rrdtool update thermaltest.rrd \
    --template thermal \
    1427612783:46.54


うっし。
エラーなく格納されたようだ。
なら、4000行近いデータを、全部放り込んであげれば良い。
…とはいえ、1行目の重複データはエラーになるから、一度 rrd ファイルを削除して作り直した。


シェルスクリプトを作って、回してみる。

$ while read Line; do
	pTIME=$(echo ${Line} | awk '{print $1}')
	pDATA=$(echo ${Line} | awk '{print $2}')
	echo ${pTIME}:${pDATA}
done < thermal.dat
$ 


う…遅い…。
シェルスクリプトの宿命だよねぇ… perl で書けば、全然違うんだろうけど。
perl かぁ… perl かぁ… orz


せめて、進捗率だけは出そうか。

$ i=1
$ while read Line; do
	pTIME=$(echo ${Line} | awk '{print $1}')
	pDATA=$(echo ${Line} | awk '{print $2}')
	echo "(${i})rrdtool update thermaltest.rrd --template thermal ${pTIME}:${pDATA}"
	rrdtool update thermaltest.rrd --template thermal ${pTIME}:${pDATA}
	i=$(($i + 1))
$ done < thermal.dat


終わったら、中身を dump してみる。

$ rrdtool dump thermaltest.rrd | more


XML形式で、 部分に日付とデータと表示されるはず。

(以上略)
<database>
        <!-- 2015-03-29 06:07:00 JST / 1427576820 --> <row><v>NaN</v></row>
        <!-- 2015-03-29 06:08:00 JST / 1427576880 --> <row><v>NaN</v></row>
        <!-- 2015-03-29 06:09:00 JST / 1427576940 --> <row><v>NaN</v></row>
        <!-- 2015-03-29 06:10:00 JST / 1427577000 --> <row><v>NaN</v></row>
        <!-- 2015-03-29 06:11:00 JST / 1427577060 --> <row><v>NaN</v></row>
        <!-- 2015-03-29 06:12:00 JST / 1427577120 --> <row><v>NaN</v></row>
        <!-- 2015-03-29 06:13:00 JST / 1427577180 --> <row><v>NaN</v></row>
        <!-- 2015-03-29 06:14:00 JST / 1427577240 --> <row><v>NaN</v></row>
        <!-- 2015-03-29 06:15:00 JST / 1427577300 --> <row><v>NaN</v></row>
(以下略)

うん、最初こんなんなってて、ビビった。
NaN って何で〜?


入力したデータは 2015/3/29 16:06 からのもの。
つまり 2015-03-29 06:07:00 なんて時間のデータなんざ入れてないわけで、無くて当たり前だった。
心臓に悪いわぁ…


もう少し、読み進めてみる。

(以上略)
        <!-- 2015-03-29 16:01:00 JST / 1427612460 --> <row><v>NaN</v></row>
        <!-- 2015-03-29 16:02:00 JST / 1427612520 --> <row><v>NaN</v></row>
        <!-- 2015-03-29 16:03:00 JST / 1427612580 --> <row><v>NaN</v></row>
        <!-- 2015-03-29 16:04:00 JST / 1427612640 --> <row><v>NaN</v></row>
        <!-- 2015-03-29 16:05:00 JST / 1427612700 --> <row><v>NaN</v></row>
        <!-- 2015-03-29 16:06:00 JST / 1427612760 --> <row><v>NaN</v></row>
        <!-- 2015-03-29 16:07:00 JST / 1427612820 --> <row><v>4.6540000000e+01</v></row>
        <!-- 2015-03-29 16:08:00 JST / 1427612880 --> <row><v>4.6540000000e+01</v></row>
        <!-- 2015-03-29 16:09:00 JST / 1427612940 --> <row><v>4.6540000000e+01</v></row>
        <!-- 2015-03-29 16:10:00 JST / 1427613000 --> <row><v>4.6540000000e+01</v></row>
        <!-- 2015-03-29 16:11:00 JST / 1427613060 --> <row><v>4.6540000000e+01</v></row>
        <!-- 2015-03-29 16:12:00 JST / 1427613120 --> <row><v>4.6010966667e+01</v></row>
        <!-- 2015-03-29 16:13:00 JST / 1427613180 --> <row><v>4.6531033333e+01</v></row>
        <!-- 2015-03-29 16:14:00 JST / 1427613240 --> <row><v>4.6540000000e+01</v></row>
        <!-- 2015-03-29 16:15:00 JST / 1427613300 --> <row><v>4.6540000000e+01</v></row>
        <!-- 2015-03-29 16:16:00 JST / 1427613360 --> <row><v>4.6540000000e+01</v></row>
(以下略)


該当部分は、きちんとデータが入ってて一安心。
…まぁ、平均値を出す設定だし、多少の時間のズレはあるだろう。

グラフの生成

データを入れたんだから、次はグラフの生成。
これも、読み替えで対応。
(勉強になってるか疑問…)


とりあえず、気を付ける場所はグラフの上限かな。
上限は、100℃。
下限は、0℃
それを意識して、コマンドを作る。

$ rrdtool graph thermal.png \
	--title "CPU Thermal Average" \
	--vertical-label "Thermal Average" \
	--width 500 \
	--upper-limit 100.0 \
	--lower-limit 0 \
	--rigid \
	--imgformat PNG \
	DEF:thermal=thermaltest.rrd:thermal:AVERAGE \
	LINE1:thermal#00FF00:"CPU thermal" \
	GPRINT:thermal:LAST:"cur\: %2.2lf /" \
	GPRINT:thermal:AVERAGE:"ave\: %2.2lf /" \
	GPRINT:thermal:MAX:"max\: %2.2lf /" \
	GPRINT:thermal:MIN:"min\: %2.2lf\n"
$ ll
total 108
-rw-r--r-- 1 pi pi 60313 Apr  1 02:01 thermal.dat
-rw-r--r-- 1 pi pi 12482 Apr  1 02:30 thermal.png
-rw-r--r-- 1 pi pi 32556 Apr  1 02:13 thermaltest.rrd
$ 


やったぜ。
画像ファイルが出来たっぽいぞ。






…………げ。
どうやって表示しよう。
どうやって PC に持ってこよう(^^;
PC を買ったときにオマケで貰った 8GB USBメモリがあった。
あっぶな。
これの為だけにファイルサーバを立てるところだった。
(立ててもいいんだけど…)


もしくは、Webサーバを仕立てて、ブラウザで確認?
$(sudo apt-get install apache2) だけで公開まで設定は済んじゃうハズ…。
それでもよかったかなと思う自分がいるけれども。


閑話休題
一応、USB メモリの存在を思い出したし、データを吸い出して PC で確認。

$ sudo mount /dev/sda1 /mnt
$ sudo cp thermal.png /mnt
$ sudo umount /mnt


持ってきたグラフデータは、こんな感じ。



ふ〜ん…。
生データを見ると、たまーに 49℃ まで上がってるんだけど、やっぱり平均に丸めちゃうと大した起伏でもないね〜。


いろいろ突っ込みどころのあるグラフだけど、初回にしてはよくできた。
うん。


次やるとしたら、cron で取得するデータを直接グラフにぶっこむところかな。
グラフの幅とか、いろいろ考えなきゃだけど。