MySQLの中身を時系列プロットするワンライナー

MySQLに入ってるデータの傾向をグラフで見たい、しかしgrafanaとかkibanaとかは導入したくないし、グラフを描画するプログラムを書くなんて論外という事があると思います。

そういうときにおすすめなのがこのワンライナー!必要なのはmysqlクライアントとgnuplotだけ!

はい。

$ mysql dbname -u root --password=passwd -e "SELECT timestamp, value FROM tbl WHERE some=condition" | gnuplot -e 'set terminal dumb 150 30; set xdata time; set timefmt "%s"; plot "<cat" using 1:2 with line;'

gist5e6cb1eb0b6d56bf5642471d18e0ad2f

f:id:threetea0407:20180907215322p:plain

解説

まず、

gnuplot -e 'set terminal dumb 150 30; set xdata time; set timefmt "%s"; plot "<cat" using 1:2 with line;'

について解説します。

set terminal dump

gnuplotset terminal dumb とすると、プロットの結果をターミナルにアスキーアートで出力することができます。

また、set terminal dump width height のようにwidthとheightを指定すると、プロットの大きさを指定することができます。

set xdata time

gnuplotset xdata time とすると、X軸を時系列データとして解釈してくれるようになります。

set timefmt "%s";

set timefmt "%s" は、時系列データのフォーマットを規定しています。%sUNIX時間に対応しています。

もし時系列データが他のフォーマットで渡ってくる場合は、 %Y-%m-%dT%H:%M:%S のように適当に変えてやる必要があります。

plot "<cat" using 1:2 with line

通常gnuplotplot コマンドの第一引数には、プロットするデータが入ったファイルの名前を指定します。ここに "<cat" を指定することで、標準入力の内容をプロットするデータとして解釈するようになります。

MySQLからデータを渡してやる

あとはMySQLからデータを取ってきてTSVにして、これをgnuplotの標準入力に食わせてやればグラフが描けます。

MySQLからデータを取ってきてTSVにして標準出力に出すワンライナーです:

mysql dbname -u root --password=passwd -e "SELECT timestamp, value FROM tbl WHERE condition=hoge "

1列目に時系列データ、2列目にプロットする値を持ってくるのが重要です。

制約

このワンライナーは2つ以上の列を1つのグラフにプロットできません。例えば、CPU使用率とメモリ使用率を1つのグラフにプロットするというようなことができません。

そういう複雑なグラフが見たくなったらgrafanaなどを使うべきということですね。導入がちょっと面倒ですが...