2012年10月12日

RRDtool を Python から使う

概要

RRDtool」に関して調査しているが、Shell スクリプトだと個人的には面倒なので、Python から利用する方法を調査してみる。

モジュール

ちゃんとメンテナンスされているのは「python-rrdtool」と「PyRRD」がある。
python-rrdtool」は本家で解説(rrdpython)されているモジュールで、Cモジュールから RRDtool を利用する。ほとんど RRDtool そのまま利用するモジュール。
PyRRD」は、RRDtoolを結構ちゃんとラップしようとしている。Python 的に利用しようとすると便利だが、RRDtoolの一部機能が上手く使えない模様。

どちらを利用するか悩んだが、PyRRD の方が書き易そうだが、結局 RRDtool のマニュアル読むことになって、どのオブジェクト使うか調べるのが面倒。
素直に書ける方がRRDtoolのマニュアルとの対応が取りやすいので、「python-rrdtool」の方を使うことにした。

インストール

pip でインストールする。

pip install python-rrdtool

ただし、Macでインストールすると、Mac の ls が GNU ls でないため「error: ls -t appears to fail. Make sure there is not a broken」のエラーが出るかもしれない。
エラーになる場合は、GNU ls(coreutils)を別途インストールするなりして対処するか、「python-rrdtool」をダウンロードしてきて、「configure」ファイルで「ls」の出力チェックをしている場所をコメントアウトするとコンパイルが通る。

RRDtool を MacPorts でインストールしている場合はソースをダウンロードしてきて、以下でインストールする。

env CPPFLAGS=-I/opt/local/include LDFLAGS=-L/opt/local/lib python setup.py install

使い方

rrdtoolコマンドがわかっていれば、それほど難しくはない。
例えば Shell で以下のように書く場合。

rrdtool create load.rrd \
    --step 300 \
    DS:load1:GAUGE:600:0:U \
    DS:load5:GAUGE:600:0:U \
    DS:load15:GAUGE:600:0:U \
    RRA:AVERAGE:0.5:1:600 \
    RRA:AVERAGE:0.5:6:700 \
    RRA:AVERAGE:0.5:24:775 \
    RRA:AVERAGE:0.5:288:797 \
    RRA:MAX:0.5:1:600 \
    RRA:MAX:0.5:6:700 \
    RRA:MAX:0.5:24:775 \
    RRA:MAX:0.5:288:797 \
    RRA:MIN:0.5:1:600 \
    RRA:MIN:0.5:6:700 \
    RRA:MIN:0.5:24:775 \
    RRA:MIN:0.5:288:797

python-rrdtoolでは以下のように書ける。このサンプルはほとんど変数とか利用してないが、もうすこし Python らしく書くことも可能。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rrdtool


def create():
    data_sources = [
        'DS:load1:GAUGE:600:0:U',
        'DS:load5:GAUGE:600:0:U',
        'DS:load15:GAUGE:600:0:U',
    ]
    rras = [
        'RRA:AVERAGE:0.5:1:600',
        'RRA:AVERAGE:0.5:6:700',
        'RRA:AVERAGE:0.5:24:775',
        'RRA:AVERAGE:0.5:288:797',
        'RRA:MAX:0.5:1:600',
        'RRA:MAX:0.5:6:700',
        'RRA:MAX:0.5:24:775',
        'RRA:MAX:0.5:288:797',
        'RRA:MIN:0.5:1:600',
        'RRA:MIN:0.5:6:700',
        'RRA:MIN:0.5:24:775',
        'RRA:MIN:0.5:288:797',
    ]

    rrdtool.create('pyload.rrd',
                   '--step', '300',
                   data_sources,
                   rras)


def main():
    create()

if __name__ == '__main__':
    main()

まとめ

個人的には Shell で書くよりはいろいろと応用が効くので楽。

blog comments powered by Disqus