Как передать аргументы в функцию чтения 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().

Другие вопросы по тегам