August 2012 posts

Aug 29, 2012

Ganglia で python module なんかで新たに監視項目を増やそうとしたときに、.pyconf のサンプルが不親切すぎ、.py にも説明ないとかで、設定すべき metric name がよくわからない場合にそれを探す方法のメモ。

まずは使うモジュールのソースを読んであたりを付ける、もしくは特定できるようならそれで。だいたい Init_Metric 関数、metric_init 関数あたりをみればわかる。以下は multidisk.py の例。

def Init_Metric (line, name, tmax, type, units, slope, fmt, desc, handler):
    '''Create a metric definition dictionary object for a device.'''
    metric_name = line[0] + '-' + name

    d = {'name': metric_name.replace('/', '-').lstrip('-'),
        'call_back': handler,
        'time_max': tmax,
        'value_type': type,
        'units': units,
        'slope': slope,
        'format': fmt,
        'description': desc,
        'groups': 'disk',
        'mount': line[1]}
    return d

def metric_init(params):
    '''Discover all of the local disk devices on the system and create
    a metric definition dictionary object for each.'''
    global descriptors
    f = open('/proc/mounts', 'r')

    for l in f:
        line = l.split()
        if line[3].startswith('ro'): continue
        elif Remote_Mount(line[0], line[2]): continue
        elif (not line[0].startswith('/dev/')) and (not line[0].startswith('/dev2/')): continue;

        if ganglia.get_debug_msg_level() > 1:
            print 'Discovered device %s' % line[1]

        descriptors.append(Init_Metric(line, 'disk_total', int(1200),
            'double', 'GB', 'both', '%.3f',
            'Available disk space', DiskTotal_Handler))
        descriptors.append(Init_Metric(line, 'disk_used', int(180),
            'float', '%', 'both', '%.1f',
            'Percent used disk space', DiskUsed_Handler))

    f.close()
    return descriptors

Init_Metric 関数への第2引数をサフィックスにして name パラメーターにいれてるので、呼び出し元から "disk_used", "disk_total" が metric name のサフィックスなってるであろうことを確認。python 読めないけど、前半部分は /proc/mounts からなんかもってきて / を - に変換して、一番最初の / 削る、とかやってるぽい。けど、とりあえず disk_used を含む metric name 一覧で確認してみたい。

ひとまず、モジュールを有効にして gmond で使えるようにする。/etc/ganglia/conf.d/diskusage.pyconf に以下を入れて gmond reload。

modules {
  module {
    name = "multidisk"
    language = "python"
  }
}

で、metric name 一覧を取る(これを今回知った)。

$ /usr/sbin/gmond -m

とすると、利用可能な metric name と、どのモジュールで定義されているかの一覧がどばーっとでる。残念なことに python でかかれた module はすべてが "pyhotn_module" として出てしまうけど、まぁどうでもいいところなので。

$ /usr/sbin/gmond -m | grep disk_used
dev-sda1-disk_used      Percent used disk space (module python_module)
dev-sdd1-disk_used      Percent used disk space (module python_module)
dev-sdb1-disk_used      Percent used disk space (module python_module)
dev-sda3-disk_used      Percent used disk space (module python_module)
dev-sdc1-disk_used      Percent used disk space (module python_module)

ということで、こいつらを metric name にそれぞれいれて gmond reload。まぁ、それ以外のこまい設定はソースよまないとわからないので最後は結局ソース読むのだけど。

徐々に脱 Ganglia 初心者。