1

我正在尝试实现一个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 可接受的方式创建这样的函数?

4

1 回答 1

0

Square backets [ ] 创建一个数组 ref,而不是数组。

my @data = ($m_instance, $connection);

或者

my $data = [$m_instance, $connection];
plugin_register(TYPE_READ, "foo", sub { return mongo_read($data); });

然后处理对 mongo_read() 子中的数组的引用。

于 2015-01-21T00:24:14.610 回答