我正试图写一个基于Python的CollectD插件,根据他们在https://collectd.org/documentation/manpages/collectd-python.5.shtml#writing_your_own_plugins上的文档
我pip在本地安装了collectd,并尝试按照文档页面运行hello world插件:
import collectd
import random
def read(data=None):
vl = collectd.Values(type='gauge')
vl.plugin='python.spam'
vl.dispatch(values=[random.random() * 100])
collectd.register_read(read)
字符串
然而,我在运行这段代码时遇到了通用的python错误:
回溯(最近的呼叫最后一次):
文件“CollectdTest1.py“,第9行,在collectd中。register_read(read)AttributeError:'module'对象没有属性'register_read'
有人可以帮助解释我错过了什么在这里能够运行插件?
这个错误似乎与CollectD是否实际在本地运行无关-只是尝试创建'collectd.Values'对象也会给出类似的错误。
import collectd
collectd.Values(type='gauge')
型
文件“CollectdTest3.py“,第3行,collectd.Values(type ='gauge')AttributeError:'module'对象没有属性'Values'
顺便说一下,我浏览了collectd模块的源代码(文件://Library/Python/2.7/site-packages/collectd.py),看起来“register_read”函数实际上并不在模块中。
我试着在Google和StackOverflow上搜索遇到类似问题的人,但无济于事:(。
FYI,我在MacOS Sierra上运行Python版本2.7.10。
请注意,我对Python和CollectD都是新手,所以这可能是一个新手问题。
1条答案
按热度按时间wlsrxk511#
我认为问题是你安装了
collectd
module from pypi,这是一个第三方模块,它被编写为通过网络与collectd接口。这个模块恰好与collectd本身暴露给它的模块的collectd
模块命名相同。Collectd通过在collectd进程中定义一种“虚拟”
collectd
python模块并在该模块中注册一些类型和方法来实现这一点,这些类型和方法可以被collectd进程中的python解释器内的python代码使用。换句话说,collectd
模块并不以.py文件的形式存在。这意味着你不能在一个独立的进程中实际使用
collectd
模块(至少是你需要的那个)。要测试你的模块,你必须把它作为collectd的一部分运行。为此,我定义了一个最小的collectd配置文件,它只配置Python插件,然后运行
collectd -f -C my_plugin_debug.conf
在前台运行它,或者运行collectd -T -C my_plugin_debug.conf
运行一次read函数,然后退出。作为参考,这里是我用来从当前目录加载
my_plugin.py
的my_plugin_debug.conf
文件,以及我使用的虚拟环境中的模块,但您的可能会有所不同:字符串