ラベル Visualization の投稿を表示しています。 すべての投稿を表示
ラベル Visualization の投稿を表示しています。 すべての投稿を表示

2012年10月19日

Ubuntu に munin 2 をインストールする手順メモ

概要

Munin」はサーバリソースグラフツール。
最新版は2.0.7だが、Ubuntu だと munin 1.x 系しかインストールできない模様なので、インストール手順をメモする。

muninの概要

munin は サーバのリソースをグラフ化するツール。似たようなツールは cacti 等が存在する。

muninの利点は以下

  • MySQL 等のデータベース不要
  • データ記録に RRDtool を利用
  • RRDtool で生成したデータファイルは、容量が初期生成時から増えることはないので、サーバの容量管理が容易
  • Perl で記述されているので、多くの環境で動作する
  • plugin の作成のためのプログラム言語はなんでも良く、書き方も比較的容易

munin は「master」と「node」が存在する。ここでは一つのサーバに「master」と「node」をインストールしているが、通常は「node」しかインストールしないサーバ等も存在することになる。

インストール

インストール手順を書いた fabfile は以下。「fab install」でインストールできる。
この記事を書いた時点では、deb ファイルがまだ 2.0.6 しかなかったので、2.0.6 をインストールしている。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from fabric.decorators import task
from fabric.api import (
    sudo,
    run,
    cd,
    env,
)


@task
def install():
    """
    munin 2.0 インストール
    """
    # 依存ファイルのインストール
    sudo('apt-get update')
    sudo('apt-get -y install librrds-perl '
         'rrdtool '
         'liblog-log4perl-perl '
         'ttf-dejavu '
         'libdate-manip-perl '
         'libcgi-fast-perl '
         'libfile-copy-recursive-perl '
         'libio-socket-inet6-perl '
         'librrd4 '
         'libfcgi-perl '
         'libyaml-syck-perl '
         'libsocket6-perl '
         'liblist-moreutils-perl '
         'libnet-server-perl '
         'libio-multiplex-perl '
         'libnet-cidr-perl '
         'libnet-snmp-perl '
         'libhtml-template-perl '
         'liburi-perl '
         'gawk ')

    etc_dict = {
        'urlpath': 'http://ftp.jp.debian.org/debian/pool/main/m/munin/',
        'ver': '2.0.6-1',
    }
    with cd(env.path):
        deb_tpl = (
            'munin-common_{ver}_all.deb'.format(**etc_dict),
            'munin_{ver}_all.deb'.format(**etc_dict),
            'munin-plugins-core_{ver}_all.deb'.format(**etc_dict),
            'munin-node_{ver}_all.deb'.format(**etc_dict),
        )
        # ダウンロード
        for deb in deb_tpl:
            run('wget {urlpath}/{deb}'.format(deb=deb, **etc_dict))

        # インストール
        for deb in deb_tpl:
            sudo('dpkg -i {deb}'.format(deb=deb))

起動

基本的には自動起動するはず。

「/etc/init.d/munin-node」および、「/etc/cron.d/munin」、「/etc/cron.d/munin-node」を確認する。

ディレクトリ

ディレクトリを確認しておく必要がある。

  • 設定ファイル:/etc/munin
  • 記録ファイル:/var/lib/munin
  • HTMLファイル:/var/cache/munin/www
  • ログ:/var/log/munin
  • pid:/var/run/munin

細かい設定は、設定ファイルで実施するが、とりあえずこの記事ではインストールまでとする。

nginxの設定

http 経由でグラフを見えるように設定する。
以下のような設定を nginx の設定に追加すれば、「http://ip/munin/」でグラフを見ることが可能になる。

# munin
location ^~ /munin/ {
    alias   /var/cache/munin/www/;
}

以上

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 で書くよりはいろいろと応用が効くので楽。

2012年10月11日

RRDtool の使い方

概要

RRDtool」は時系列データを高速にロギングしたり、グラフ化するためのオープンソースのツール。
Munin」等のツール経由で利用する機会が多い。
ほとんどコマンドラインから利用しないので使い方をちゃんと調べた事がなかったのだけど、Munin で高度なグラフが必要になる機会が増えてきたので、ちゃんと調査してみることにした。

インストール

Mac であれば MacPorts なり homebrew なりでインストールするのが楽。この記事を書いている時点では「1.4.7」がインストールされる。

# MacPorts
port install rrdtool
# homebrew
brew install rrdtool

記録用ファイル作成

最初に記録用のファイルであるRRD(Round Robin Database)を作成する。
「rrdtool」コマンドを利用する。ファイルの作成は「rrdcreate」を参照すると詳細が記述されている。

rrdtool create filename \
        [--start|-b start time] \
        [--step|-s step] \
        [--no-overwrite] \
        [DS:ds-name:DST:dst arguments] \
        [RRA:CF:cf arguments]

コマンドの引数は以下。

  • filename:ファイルの名前。通常拡張子を「rrd」にするが、特に拡張子は関係ない。
  • --start:記録開始とする時刻。指定しないと、RRDファイル作成時間の10秒前に設定される。
  • --step:RRDファイルへの記録間隔。指定しないと300秒(5分)に設定される。
  • --no-overwrite:同じファイル名があったら上書きしない。
  • DS:データソース(data sources)の定義。複数定義でき、一定義がグラフ画像を生成する時の一つの線になる。
    • ds-name:参照用のデータソース名。1文字以上19文字以下で、[a-zA-Z0-9_]で定義する
    • DST:データソースのタイプ(Data Source Type)定義。(DS:ds-name:GAUGE | COUNTER | DERIVE | ABSOLUTE:heartbeat:min:max もしくは DS:ds-name:COMPUTE:rpn-expression)
      • GAUGE:取得した値をそのまま記録
      • COUNTER:前回の記録に加算していく。減算は考慮されていない。そのため、いつかオーバーフローするが、適切に処理される。
      • DERIVE:前回との差を記録。オーバフローは考慮されない。マイナス値もありえる。
      • ABSOLUTE:読み取るごとに0になる、もしくは0にしたい場合で、マイナスにならない物を記録。
      • COMPUTE:計算式を記述して、その結果を記録
    • arguments(heartbeat:min:max もしくは rpn-expression)
      • heartbeat:指定秒数を越えてデータが取得できない場合、UNKNOWNと記録する
      • min or max:必須ではない。最大値、最小値を定義。不明な場合は「U」を記述。最大最小が判明している時は明記すること。
      • rpn-expression:逆ポーランド記法の数式。COMPUTEの時のみ利用可能。
  • RRA:RRDへのRRA(round robin archives)の保存定義。(RRA:AVERAGE | MIN | MAX | LAST:xff:steps:rows)
    • CF:統合関数(consolidation function)
      • AVERAGE:平均
      • MIN:最小
      • MAX:最大
      • LAST:最後
    • xff:統合関数の結果、UNKNOWNがどの程度だったら、UNKNOWNにするかを定義。0から1の間の数を指定。0.5だと半分以上がUNKNOWNだと結果をUNKNOWNにする。
    • steps:統合関数にて統合するステップ数
    • rows:記録するレコード数

コマンドの引数は、実際の例を見た方が速いかもしれない。サンプルとして「load average」を取得してみる。

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

この例だと以下のようになる。

  • 「load.rrd」というファイル名
  • 1ステップ5分
  • 「load average」は1分、5分、15分の3つの値があるので、DSをその数定義。
  • Daily用に、1ステップを600個、つまり5分×600個なので、50時間(2日2時間)の平均、最小、最大を保存
  • Weekly用に、6ステップを700個、つまり5分×6×700個なので、350時間(2日2時間×7)の平均、最小、最大を保存
  • Monthly用に、24ステップを775個、つまり5分×24×775個なので、1550時間(2日2時間×31)の平均、最小、最大を保存
  • Yearly用に、288ステップを797個、つまり5分×288×797個なので、18600時間(2日2時間×372=31×12)の平均、最小、最大を保存

Dailyは前々日ぐらいまでと比較したいので、50時間にしてある。48時間ぴったりだと同時刻が上手く比較できないため2時間を加算。
この50時間を単位として、週、月、年を定義してある。
週は7倍、月は31倍、年は31×12倍になるように定義。この定義で2年間はデータが記録可能ということになる。

データの記録

実際にデータを記録する。データ記録は「rrdupdate」を参照すると詳細が記述されている。

今回は「load average」を取得してみる。Mac で load average を取得する場合は以下のコマンドで可能。

uptime | awk -F\  '{print $(NF - 2)":"$(NF - 1)":"$NF}'

rrdtoolで記録する場合は時刻と同時に記録するように作成。

rrdtool update load.rrd \
    --template load1:load5:load15 \
    `date +%s`:`uptime | awk -F\  '{print $(NF - 2)":"$(NF - 1)":"$NF}'`

cron 等でしばらく動作させておく。step が 300 に指定してあるが、それより短い時間で記録してもそれなりに処理する。

記録内容の確認

内容確認は「fetch」を利用する。「rrdfetch」を参照すると詳細が記述されている。

rrdtool fetch load.rrd AVERAGE

グラフ画像の生成

グラフ生成は「graph」を利用する。「rrdgraph」を参照すると詳細が記述されている。
グラフの色は自動ではないので、自分で考える必要がある。

rrdtool graph load.png \
    --title "Load Average" \
    --vertical-label "Load Average" \
    --width 500 \
    --upper-limit 10.0 \
    --lower-limit 0 \
    --rigid \
    --imgformat PNG \
    DEF:load1=load.rrd:load1:AVERAGE \
    DEF:load5=load.rrd:load5:AVERAGE \
    DEF:load15=load.rrd:load15:AVERAGE \
    LINE1:load1#00FF00:"CPU Usage 1" \
    GPRINT:load1:LAST:"cur\: %2.2lf /" \
    GPRINT:load1:AVERAGE:"ave\: %2.2lf /" \
    GPRINT:load1:MAX:"max\: %2.2lf /" \
    GPRINT:load1:MIN:"min\: %2.2lf\n" \
    LINE2:load5#0000FF:"CPU Usage 5" \
    GPRINT:load5:LAST:"cur\: %2.2lf /" \
    GPRINT:load5:AVERAGE:"ave\: %2.2lf /" \
    GPRINT:load5:MAX:"max\: %2.2lf /" \
    GPRINT:load5:MIN:"min\: %2.2lf\n" \
    LINE3:load15#FF0000:"CPU Usage 15" \
    GPRINT:load15:LAST:"cur\: %2.2lf /" \
    GPRINT:load15:AVERAGE:"ave\: %2.2lf /" \
    GPRINT:load15:MAX:"max\: %2.2lf /" \
    GPRINT:load15:MIN:"min\: %2.2lf\n"

まとめ

とりあえず、グラフまで生成できるようになったが、オプションが一部の動作が良くわかっていないので、さらに細かい事項は使いながら調べることにする。

参考資料

いくつかの資料を参照した。本家のチュートリアルはそれなりに説明されているが、わかりずらい気がする。