如何在 collectd 中运行 python 插件的多个实例?

How to run multiple instances of python plugin in collectd?

我为 collectd 编写了一个简单的 python 插件,我想为 db1db2 运行两个实例:

文件:/etc/collectd/plugins/redis_info.py

#!/usr/bin/env python

import collectd
import redis

REDIS = None
HOST = 'localhost'
PORT = 6379
DB = 0
KEY = None


def config(conf):
    global REDIS, HOST, PORT, DB, KEY
    for node in conf.children:
        key = node.key.lower()
        val = node.values[0]
        if key == 'host':
            HOST = val
        elif key == 'port':
            PORT = int(val)
        elif key == 'db':
            DB = int(val)
        elif key == 'key':
            KEY = val
        else:
            collectd.warning('redis_info plugin: Unknown config key: %s' % key)

def init():
    global REDIS, HOST, PORT, DB, KEY
    REDIS = redis.StrictRedis(host=HOST, port=PORT, db=DB)


def read():
    global REDIS, HOST, PORT, DB, KEY
    value = REDIS.llen(KEY)
    val = collectd.Values(plugin='redis_info')
    val.type = 'gauge'
    val.type_instance = KEY
    val.values = [value]
    val.dispatch()


collectd.register_config(config)
collectd.register_init(init)
collectd.register_read(read)

文件:/etc/collectd/collectd.conf.d/redis_info.conf

<Plugin python>
        ModulePath "/etc/collectd/plugins/"
        Import "redis_info"

        <Module redis_info>
                host localhost
                port 6379
                db 1
                key "queue1"
        </Module>
</Plugin>

<Plugin python>
        ModulePath "/etc/collectd/plugins/"
        Import "redis_info"

        <Module redis_info>
                host localhost
                port 6379
                db 2
                key "queue2"
        </Module>
</Plugin>

但是,只有一个实例 (db2) 工作,前一个 (db1) 被禁用。
如何运行两个实例?谢谢!

所有配置文件中应该只有一个 <Plugin python>...</Plugin> 标签。
我重写了 redis_info 插件以接受多个 Module 配置。


文件:/etc/collectd/plugins/redis_info.py

#!/usr/bin/env python

import collectd
import redis


CONFIGS = []


def config(conf):

    collectd.info('------ config ------')

    for node in conf.children:
        key = node.key.lower()
        val = node.values[0]
        if key == 'host':
            host = val
        elif key == 'port':
            port = int(val)
        elif key == 'db':
            db = int(val)
        elif key == 'key':
            key = val
        else:
            collectd.warning('redis_info plugin: Unknown config key: %s' % key)
            continue

    CONFIGS.append({
        'host': host,
        'port': port,
        'db': db,
        'key': key,
    })


def read():

    collectd.info('------ read ------')

    for conf in CONFIGS:

        rdb = redis.StrictRedis(host=conf['host'], port=conf['port'], db=conf['db'])
        value = rdb.llen(conf['key'])
        val = collectd.Values(plugin='redis_info')
        val.type = 'gauge'
        val.type_instance = conf['key']
        val.values = [value]
        val.dispatch()


collectd.register_config(config)
collectd.register_read(read)

文件:/etc/collectd/collectd.conf.d/redis_info.conf

<Plugin python>
        ModulePath "/etc/collectd/plugins/"
        Import "redis_info"

        <Module redis_info>
                host localhost
                port 6379
                db 1
                key "queue1"
        </Module>

        <Module redis_info>
                host localhost
                port 6379
                db 2
                key "queue2"
        </Module>
</Plugin>