Сбор данных MQTT в Zabbix. cannot subscribe topic timed out while subscribing

День добрый!

Контроллеры

Участвуют 3 контроллера 7.3.3E/3 с прошивкой wb-2407

На каждом контроллере подключено несколько устройств, которые необходимо отслеживать. На всех примерно одинаковое количество устройств.
Например:
4 MAP,
5 MAI,
4 DI-WD-14,
1 M1W2.

Сценарий 1
На контроллерах установлен zabbix-agent2. Включены активные проверки. Включена подписка на mqtt по tcp://127.0.0.1:1883 без авторизации.
На сервере Zabbix mqtt.get принимает мастер-данные.
Сценарий 2
На контроллерах удален zabbix-agent2.
На сервере Zabbix установлен zabbix-agent2, включены активные проверки. Включена подписка на mqtt по tcp://{IP контроллера}:1883 без авторизации.
На сервере Zabbix mqtt.get принимает мастер-данные.
Сценарий 3
ПО MQTT Explorer запущен и читает данные.


При любом сценарии если выполнять 1 запрос (1 хост в Zabbix), то все ок. данные идут ежесекундно, если изменяются.
Как только я включу 2 запроса и более, то все сразу умирает.
Лог Zabbix-agent2 пишет что
[MQTT] cannot subscribe topic ‘/devices/GC_TP1_IN2/controls/#’ to [tcp://192.168.2.131:1883]: timed out while subscribing
[MQTT] connection lost to [tcp://192.168.2.131:1883]: pingresp not received, disconnecting
Сценарий 1
Проработав в таком режиме некоторое время контроллер зависает намертво. Может отвалиться web, может работать, но никакие данные не отображаются. Невозможно собрать диагностические данные. Помогает только перезапуск контроллера.
Сценарий 2
Контроллеры работают сами по себе, у них все хорошо. Но данные Zabbix-agent2 на сервере Zabbix не собираются. В логах агента аналогично.
Сценарий 3
MQTT Explorer аналогично - 1 окно работает нормально, запускаешь 2 окна - появляется табличка Disconnected from server.

Т.е. я делаю вывод что нельзя подключиться несколько раз к 1 контроллеру для получения данных?

Спойлер



Добрый день,
Похоже, что у вас возникает проблема с многократными подключениями к MQTT-брокеру на контроллерах Wiren Board, что приводит к перегрузке ресурса или блокировке соединений. MQTT-брокер по умолчанию поддерживает одновременные подключения, но его настройки и нагрузка могут сильно влиять на стабильность.

При вашем сценарии я бы рекомендовал реализовать внешний общий MQTT брокер, который собирает все метрики от N контроллеров и направляет их в zabbix.

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

Сам себе и отвечу.
Множественные подключения одного клиента к одному серверу невозможны из-за спецификации MQTT.

https://docs.solace.com/API/MQTT-311-Prtl-Conformance-Spec/MQTT%20Control%20Packets.htm

В общем что делать?

Подключение Zabbix Agent 2 к MQTT-брокеру Wiren Board — Wiren Board

Эта инструкция - mqtt.get работает если хост один.
В zabbix нельзя получить Зависимый элемент данных из другого узла, например Одним узлом (одним запросом) получаем данные по всему контроллеру, а другим узлом(-ами) получаем данные через JSON через зависимый элемент.

GitHub - wirenboard/wb-mqtt-zabbix: WB MQTT <--> Zabbix bridge

Эта тема работает?

Добрый день, прошу прощения за долгий ответ.
На данный момент нашел, наверное, самое короткое решение по настройке мониторинга в Zabbix нескольких контроллеров. Потребуется настроить агента и следовать следующим шагам:

1. Установка Zabbix Agent 2 на каждом контроллере

Выполните установку агента:

apt update
apt install zabbix-agent2

2. Настройка файла конфигурации

Отредактируйте файл конфигурации /etc/zabbix/zabbix_agent2.conf на каждом контроллере. Укажите параметры:

LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=0
DebugLevel=3
Server= # IP вашего Zabbix Server
ServerActive= # IP вашего Zabbix Server
Hostname=WirenBoard-Controller-1  # Уникальное имя для вашего контроллера

3. Перезапуск агента

Перезапустите агент, чтобы применить изменения:

sudo systemctl restart zabbix-agent2
sudo systemctl enable zabbix-agent2

4. Настройка шаблона для мониторинга в Zabbix

В Конфигурация → Шаблоны создайте шаблон (например, Template WirenBoard MQTT All Topics).

В шаблоне на вкладке Элементы данных добавьте элемент для отслеживания. Например, с подпиской на все топики, используя JSON-формат:

  • Имя: MQTT All Topics
  • Тип: Zabbix агент (активный)
  • Ключ: mqtt.get["tcp://127.0.0.1:1883","/devices/#"]
  • Тип информации: Текст

5. Применение шаблона к узлам сети

В разделе Конфигурация → Узлы сети выберите нужные контроллеры и добавьте им созданный шаблон Template WirenBoard MQTT All Topics.

6. Проверка данных

Перейдите в Мониторинг → Последние данные и найдите данные по элементу MQTT All Topics. Вы должны увидеть все сообщения, которые публикуются на MQTT-брокере контроллера.

День добрый!
Это все понятно. Оно так и работает.
Проблема как раз в 5 пункте.
Когда 1 узел сети - все работает отлично.
Когда 2+ начинаются проблемы как в топик старте.
Т.е. проблема заключается в том что ZA2 первый раз подключаясь к брокеру инициирует одно соединение (при одном узле).
При 2+ узлах он инициирует 2+ подключения к брокеру. При этом первое соединение должно быть сброшено.
3й узел подключается - второе соединение сбрасывается и так по кругу.

Т.е. как я и писал ранее Брокер поддерживает 1 соединение от одного клиента.

Я правильно понимаю, что у вас данные с одного контроллера не идут? То есть только один топик у вас публикуется?

Контроллер 1.
Топики
/devices/ГЦ ХОЛОД 1/controls/#
/devices/ГЦ Чиллер 1/controls/#
/devices/ГЦ ШОК 1/controls/#
/devices/Котельная 1/controls/#
/devices/Котельная 2/controls/#
Каждый топик это отдельный узел в Zabbix.

Довольно интересно. Пожалуй - надо воспроизвести.
Попробую, пожалуй, “Сценарий 1”.

Итак, сделал стенд из двух контроллеров:

PLAY [Apply common configuration] ********************************************************************************************************************************************************************************************************************************************************************************************************************

TASK [Gathering Facts] *******************************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [10.0.0.77]
ok: [10.0.0.78]

TASK [zabbix-agent2 : Install zabbix-agent2] *********************************************************************************************************************************************************************************************************************************************************************************************************
ok: [10.0.0.77]
[WARNING]: Updating cache and auto-installing missing dependency: python3-apt
changed: [10.0.0.78]

TASK [zabbix-agent2 : Set server address] ************************************************************************************************************************************************************************************************************************************************************************************************************
changed: [10.0.0.78]
ok: [10.0.0.77]

TASK [zabbix-agent2 : Set Server Active address] *****************************************************************************************************************************************************************************************************************************************************************************************************
ok: [10.0.0.77]
changed: [10.0.0.78]

TASK [zabbix-agent2 : Set Remote command enable] *****************************************************************************************************************************************************************************************************************************************************************************************************
ok: [10.0.0.77]
changed: [10.0.0.78]

TASK [zabbix-agent2 : Set Hostname from system] ******************************************************************************************************************************************************************************************************************************************************************************************************
ok: [10.0.0.77]
changed: [10.0.0.78]

TASK [zabbix-agent2 : Set Log to syslog] *************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [10.0.0.77]
changed: [10.0.0.78]

TASK [zabbix-agent2 : Enable service zabbix-agent2] **************************************************************************************************************************************************************************************************************************************************************************************************
ok: [10.0.0.77]
ok: [10.0.0.78]

TASK [zabbix-agent2 : Restart service zabbix-agent2] *************************************************************************************************************************************************************************************************************************************************************************************************
changed: [10.0.0.77]
changed: [10.0.0.78]

PLAY RECAP *******************************************************************************************************************************************************************************************************************************************************************************************************************************************
10.0.0.77                  : ok=9    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
10.0.0.78                  : ok=9    changed=7    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

Завтра опишу несколько топиков в активные проверки - и посмотрим.

День добрый!
Жду с нетерпением.

Добрый день.
Пока - работает, сбоев не наблюдается.

Давайте уточним, как воспроизвести поведение которое наблюдается у вас.
У меня есть объект, описанный в узлах сети. К нему применены несколько шаблонов, в каждом из которых несколько топиков.
Все верно?

День добрый!

А можете мне скинуть шаблон с которым вы подключаетесь к узлу?
Ко всему прочему у меня добавилась проблема с

Спойлер
  1. Failed: cannot extract value from json by path “$[‘/devices/GC_TP1_IN1/controls/Irms L1’]”: no data matches the specified path
    1134194:20241119:153737.147 error reason for “GC TP1-1:Irms.L2” changed: Preprocessing failed for: {“/devices/GC_TP1_IN1/controls/Температура трансформатора 10Кв”:“28”}
  2. Failed: cannot extract value from json by path “$[‘/devices/GC_TP1_IN1/controls/Irms L2’]”: no data matches the specified path
    1134194:20241119:153737.147 error reason for “GC TP1-1:Irms.L3” changed: Preprocessing failed for: {“/devices/GC_TP1_IN1/controls/Серийный номер”:“3403015”}
  3. Failed: cannot extract value from json by path “$[‘/devices/GC_TP1_IN1/controls/Irms L3’]”: no data matches the specified path
    1134194:20241119:153737.147 [Z3008] query failed due to primary key constraint: [1062] Duplicate entry ‘103495-1732019854-435303983’ for key ‘PRIMARY’
    1134194:20241119:153737.147 skipped 1 duplicates

Он берет каждое полученное значение, сравнивает его с json path и, если оно не совпадает, выдает ошибку.
И так каждый раз по каждому item.
Приложил свой шаблон, часть для примера.
Wirenboard TP new mqtt.yaml (2,0 КБ)
Лог сервера
zabbix_server.log (6,4 МБ)

У меня крайне простой тестовый:
zbx_export_templates.yaml (2,6 КБ)
агент 6.0.14, штатный из дистрибутива

И, что интересно я столкнулся с подобным. После нескольких перезапусков c добавлением топиков вижу в логах:

ov 21 14:23:56 wirenboard-AQASN7R6 mosquitto[20238]: 1732199036: New connection from ::1:55684 on port 1883.
Nov 21 14:23:56 wirenboard-AQASN7R6 mosquitto[20238]: 1732199036: New client connected from ::1:55684 as Zabbix agent 2 6.0.14 d9c18619-118d-6f7b-c96f-85ea21e90af4 (p2, c1, k30).
Nov 21 14:23:56 wirenboard-AQASN7R6 mosquitto[20238]: 1732199036: Client Zabbix agent 2 6.0.14 d9c18619-118d-6f7b-c96f-85ea21e90af4 disconnected due to malformed packet.
Nov 21 14:23:56 wirenboard-AQASN7R6 zabbix_agent2[12287]: [MQTT] connection lost to [tcp://localhost:1883]: EOF
Nov 21 14:23:56 wirenboard-AQASN7R6 zabbix_agent2[12287]: [MQTT] cannot subscribe topic '/devices/SocketRelay_2floor/controls/P L1        ' to [tcp://localhost:1883]: Connection lost before Subscribe completed

Я предполагаю что эта проблема описана тут: https://www.zabbix.com/forum/zabbix-help/456267-mqtt-plugin-in-zabbix-agent-2-subscribe-was-broken-by-timeout/page2
Возможно, если у меня получится - соберу арента из 7(7.2) версии и проверб с ним.

Интересная тема. Не натыкался на нее.
НО там пишут что на 7 версии проблема остается.
Если с 7,2 не получится надо на 6.2.9 откатываться.
Жду тестов)
Наконец-то просвет в задаче.

6.2.9 тоже не помогает.
Сейчас тоже пытаюсь бороться с этой проблемой, и пока только сильно костыльные решения есть.

С проблемой “cannot subscribe …” борюсь уже очень давно.
(даже подписан на ряд топиков с форума zabbix с этой траблой но там решения не нашли, как и в поддержке zabbix).
Сразу говорю: никакие откаты на старые версии не помогут - проверено.
Увеличение таймаутов тоже.
Корневая проблема - в библиотеках клиента paho, которые использует плагин агента2.
По моим наблюдениям ошибка возникает когда агента2 пытается подписаться на большое количество топиков.

Вот да. Я пару дней поэспериментировал и получил что если топиков больше 3-4 то вероятность ошибок подписки увеличивается. На 1-2 топика работает стабильно.
Тут моих компетенций довольно мало для подробной диагностики.

Я сейчас копаю в сторону экспорта telegaraf-ом данных MQTT в Prometheus и забор заббиксом их уже оттуда.

1 лайк