ganglia (gmond) を拡張するモジュールをPythonで書いてみた

ganglia (http://ganglia.info/) 3.1以降では、データの収集を行うgmondを拡張したい場合、C言語のモジュールを書くほかに、modpython (libpython) をロードすることにより、pythonでも拡張モジュールを書けるようになっています。

なので書いてみました。


このモジュールは、ユーザが指定したネットワークインターフェースについてだけ、トラフィック(転送バイト数とパケット数)をモニタするものです。

トラフィックのモニタなら標準添付のmod_netがあります。Linuxの場合の実処理は libmetrics/linux/metrics.c でなされているのですが、こんな実装になっています:

  • /proc/net/dev を読んで転送バイト数などの値を得る
  • ネットワークでバイスが複数ある場合は、合算する
  • ただし、loとbond*なデバイスは除く

これだと、ルータ用途などで複数の物理NICがあり、それぞれのデバイスのモニタをしたいときに困ります。

自分の場合も、タグVLAN(bond0.2とか)で論理分割している上位回線のトラフィックだけをモニタしたかったのが、このpythonモジュールを書いた動機です。


pythonでgmondモジュールを角煮は、hookポイントが定められているのでそれに従って実装します。とてもシンプルなので、

を読めばすぐ書けるんじゃないかと思います。


ちなむと、ganglia 3.0の頃は、カスタムデータを追加するのに gmetric コマンドを使っていたのですが、モニタ項目が多くなると fork のコストもばかにならなくなるので、gangliaのCライブラリとリンクした拙作のPerlのXSモジュールを使っていました。

あわせて読みたい

みんなのPython 改訂版

みんなのPython 改訂版

Python!!

The Art of Capacity Planning: Scaling Web Resources

The Art of Capacity Planning: Scaling Web Resources

gangliaを使っているらしいFlickrの話。著者のスライドが

にあるのでこっちも必見。