Я пытаюсь реализовать плагин 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?