无法在本地运行CollectD Python插件代码示例

fjaof16o  于 12个月前  发布在  Python
关注(0)|答案(1)|浏览(114)

我正试图写一个基于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都是新手,所以这可能是一个新手问题。

wlsrxk51

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.pymy_plugin_debug.conf文件,以及我使用的虚拟环境中的模块,但您的可能会有所不同:

LoadPlugin python

<Plugin python>
  ModulePath "./venv/lib/python3.9/site-packages/"
  ModulePath "."
  LogTraces true
  Import "my_plugin"
</Plugin>

字符串

相关问题