Как передать аргументы в функцию чтения perl-плагина collectd?

Я пытаюсь реализовать плагин collectd, который должен сообщать данные для нескольких экземпляров серверного процесса на одном компьютере.

Моя функция TYPE_CONFIG в порядке - она ​​получает каждый элемент конфигурации и анализирует его.

С чем я борюсь, так это с функцией TYPE_READ. Я бы хотел, чтобы каждый вызов средства чтения сообщал только об одном экземпляре сервера, чтобы в случае сбоя вызова для одного экземпляра скорость, с которой collectd вызывает метод для других экземпляров, не изменяется.

Поэтому я попытался зарегистрировать несколько методов TYPE_READ внутри метода TYPE_CONFIG.

К сожалению, collectd не передает какие-либо аргументы методу чтения... Один из вариантов — создать список экземпляров в конфигурации, зарегистрировать только один считыватель, а затем пройтись по списку внутри него — это работает, но имеет упомянутый недостаток. выше: если один экземпляр не сможет сообщить свою статистику, демон снизит частоту запросов для всех экземпляров.

Другая альтернатива может заключаться в использовании анонимных функций Perl, но я не знаю, как это сделать. Ниже не работает:

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

Collectd отклоняет такой вызов с помощью: Collectd::plugin_register: Invalid data.

Возможно, есть какой-то простой способ создать такую ​​функцию, приемлемую для plugin_register?


person Mikhail T.    schedule 14.01.2015    source источник


Ответы (1)


Square backets [ ] создают ссылку на массив, а не массив.

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

or

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

А затем обработайте ссылку на массив в вашем подразделе mongo_read().

person Justin C    schedule 21.01.2015