如何在 collectd 中运行 python 插件的多个实例?
How to run multiple instances of python plugin in collectd?
我为 collectd
编写了一个简单的 python 插件,我想为 db1
和 db2
运行两个实例:
文件:/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>
我为 collectd
编写了一个简单的 python 插件,我想为 db1
和 db2
运行两个实例:
文件:/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>