最近いろいろと監視周りでmuninを使っているので、自分でもmuninのプラグインを作ってみたくなった。

muninはシェル上から実行可能な形であれば、プラグインをどんな言語で開発してもいいらしいので、基本的な使い方が分かればかなりいろいろと可能性があると思っている。

でも、いまいち監視する値がおもいつかなかったので、ショップの成長状況をグラフ化するイメージで、EC-CUBEの状態をグラフ化するプラグインを作ってみることにした。

要件:

  1. EC-CUBEの性能に影響のある商品数と受注件数、会員数を取得する
  2. 商品数と会員数は現在の値、受注件数は監視周期の間での受注件数
  3. 一番てっとり早いのでシェルスクリプトで作る
  4. MYSQLとPostgreSQLに対応できるようにしておく

で以下のコードを作成した。

#!/bin/sh
DBTYPE=`basename $0 | sed 's/^eccube_//g'`

case $DBTYPE in
    mysql)
        MYSQL=/usr/bin/mysql
        MYSQLOPTS="${dbopts}"
        COMMAND="${MYSQL} ${MYSQLOPTS} -s -N -e"
        ;;
    pgsql)
        PSQL=/usr/bin/psql
        PSQLOPTS="$dbopts"
        COMMAND="${PSQL} ${OPTS} -c"
        ;;
esac

if [ "$1" = "config" ]; then
        echo 'graph_title EC-CUBE Status'
        echo 'graph_args --base 1000'
        echo 'graph_order product order customer'
        echo 'graph_vlabel EC-CUBE Customers, Products, Orders'
        echo 'graph_category ec-cube'

        echo 'product.label Product'
        echo 'product.type GAUGE'
        echo 'product.min 0'
        echo 'product.draw LINE2'
        echo 'product.info Shop Products Count(product_class)'

        echo 'order.label Order'
        echo 'order.type COUNTER'
        echo 'order.min 0'
        echo 'order.draw LINE2'
        echo 'order.info Order Count By Term'

        echo 'customer.label Customer'
        echo 'customer.type GAUGE'
        echo 'customer.min 0'
        echo 'customer.draw LINE2'
        echo 'customer.info Customer Count Total'

    exit 0
fi

echo "product.value `${COMMAND} 'select count(product_class_id) FROM dtb_products_class'`"
echo "order.value `${COMMAND} 'select count(order_id) FROM dtb_order'`"
echo "customer.value `${COMMAND} 'select count(customer_id) FROM dtb_customer'`"

実際に実行してみる。

これを「eccube_」って名前で作成して、実行権限を与えておく。

ec-cubeがmysqlでインスールされているか、postgresでインストールされているかによって設定は変わるのだが、まずはmysqlだけで対応する。postgresの場合は省略するが、postgresはシェルからコマンドを実行するにも毎度パスワードが聞かれる仕様なので、.pgpassを作って対応しないといけないとだけメモって置く。

プラグインフォルダに作成したプラグインのシンボリックリンクをつくる
ln -s eccube_ /etc/munin/plugins/eccube_mysql

さらに、/etc/munin/plugin-conf.d/munin-node に

[eccube*]
env.dbopts -u DBユーザー名 -h DBサーバーIP -pDBパスワード DB名

としてDBへの接続オプションを記載しておく。

この後munin-nodeを再起動。 /etc/init.d/munin-node restart

テストように作ったサイトなので、動きはないが、とりあえず以下のようなグラフがとれているので動いてはいるようです。
muninの監視画面

今回わかったこと。

デフォルトのmuninの周期が5分なのでec-cubeのショップデータのような日ごとであればまずいいデータをリソース監視のプラグインで見る必要はないな。
用は文字列としてmunin用の設定や値を出力してやればいいので、ちょっとしたプラグインは簡単に自作できそう。

課題

muninの[フィールド名].typeのCOUNTERは前回からの差分を取得するという説明をみたのだが、どうも差分でなく差分の平均のような値が出ているような・・・
せっかくだから、備忘録かねてまたmuninのプラグイン作成時の属性の整理を書こう。