我正在尝试实现一个collectd-plugin,它应该报告同一台机器上多个服务器进程实例的数据。
我的 TYPE_CONFIG 函数很好——它获取每个配置项并解析它。
我正在努力解决的是 TYPE_READ 函数——我希望读者的每次调用只报告一个服务器实例,这样,如果一个实例的调用失败,collectd 调用的速率其他实例的方法,不受影响。
所以我尝试从 TYPE_CONFIG 方法中注册多个 TYPE_READ 方法。
不幸的是,collectd 没有将任何参数传递给 read-method... 一种替代方法是在 config 中构建实例列表,仅注册一个读取器,然后循环遍历其中的列表——这可行,但有提到的缺点上图:如果一个实例未能报告其统计信息,守护程序将降低所有实例的查询率。
另一种选择可能是使用 Perl 的匿名函数——但我不确定如何使用。以下不起作用:
my @data = [$m_instance, $connection];
plugin_register(TYPE_READ, "foo", sub { return mongo_read(@data); });
Collectd 拒绝这样的调用:Collectd::plugin_register: Invalid data
。
是否有一些简单的方法可以以 plugin_register 可接受的方式创建这样的函数?