如何将参数传递给collectd perl-plugin的read-function?

时间:2015-01-14 03:10:52

标签: perl perl-data-structures collectd

我正在尝试实现一个collectd-plugin,它应该在同一台机器上报告服务器进程的多个实例的数据。

我的TYPE_CONFIG函数很好 - 它获取每个配置项并解析它。

我正在努力的是TYPE_READ功能 - 我希望每次调用阅读器只报告服务器实例的一个,这样就应该对于一个实例,调用失败,collectd调用其他实例的方法的速率不受影响。

所以我尝试在TYPE_CONFIG方法中注册多个TYPE_READ方法。

不幸的是,collectd没有向read方法传递任何参数......另一种方法是在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可接受的方式创建这样的函数?

1 个答案:

答案 0 :(得分:0)

Square backets []创建数组引用,而不是数组。

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

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

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