Как передать аргументы в функцию чтения perl-плагина collectd?
Я пытаюсь реализовать сборщик-плагин, который должен сообщать данные для нескольких экземпляров серверного процесса на одном компьютере.
Моя TYPE_CONFIG-функция в порядке - она получает каждый элемент конфигурации и анализирует его.
С чем я борюсь, так это с функцией TYPE_READ- я бы хотел, чтобы каждый вызов считывателя сообщал только об одном из экземпляров сервера, чтобы в случае сбоя вызова для одного экземпляра использовалась скорость, с которой вызывается метод collectd. метод для других случаев не затрагивается.
Поэтому я попытался зарегистрировать несколько методов TYPE_READ изнутри метода TYPE_CONFIG.
К сожалению, 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 ответ
Квадратные задники [ ] создают массив ref, а не массив.
my @data = ($m_instance, $connection);
или же
my $data = [$m_instance, $connection];
plugin_register(TYPE_READ, "foo", sub { return mongo_read($data); });
А затем обработайте ссылку на массив в вашей подпрограмме mongo_read().