zbx-sadman / unifi_proxy

Fast client-server version of UniFi Miner
45 stars 21 forks source link

Zabbix 3.4 on Debian, Proxy/Agent/netcat setup #15

Closed diffway closed 6 years ago

diffway commented 6 years ago

Followed Proxy Guide to configure UniFi proxy v1.3.5 with controller v5.5.20

UniFi Controller has ~50 sites with 1-3 APs each, and about 100 users at per site at peak

$ tune unifi_proxy.conf user/password/location
$ mv unifi_proxy.conf /etc/zabbix
$ mv unifi_proxy.pl /usr/local/sbin
$ mv unifi_proxy /etc/init.d/
$ update-rc.d unifi_proxy defaults
$ invoke-rc.d unifi_proxy start

After a while, after items started to get values, I noticed that sertain items eventually become unsupported. The message in Info column displays: Value "" of type "string" is not suitable for value type "Numeric (unsigned)" or Value "" of type "string" is not suitable for value type "Float .." On next one or two iterations "last check" and value columns updated, then item "recovers".

This effect drifts over items randomly.

In zabbix agent UserParameter conf is

UserParameter=unifi.proxy[*],echo "$1,$2,$3,$4,$5,$6,$7" |nc 127.0.0.1 8448 -q 1

Testing from shell: zabbix_get -s unifi -k unifi.proxy[get,sysinfo,default,version] Gives emty string, and after a while it can yeld valid result.

So far no time dependency between queries, apperently cache issue, but can't figure out where. Please Help.

zbx-sadman commented 6 years ago

Надеюсь, что по-русски будет понятно, и ответ гонять через гугл-транслятор нет смысла.

Ранее с подобной проблемой ко мне не обращались, поэтому я не совсем понимаю, с какого места начинать анализ. Нельзя сказать, что нагрузка очень велика - даже в моей маленькой сети бывало и свыше двухсот одновременно подключенных. Впрочем, кол-во пользователей не должно оказывать большого влияния на производительность, если не производятся в жутких количествах действия, требующие анализа состояния текущих сессий (вычисления RSSI и CCQ и пр.) или данных по всем пользователям, требующим загрузки JSON со "http://unifi/api/...stat/alluser".

В то же время - я совершенно не знаю, как в реальности ведет себя система в конфигурации с десятками сайтов. Возможно, что есть какая-то проблема с количеством единовременных сеансов, если так можно выразиться, между UniFi Proxy и UniFi Controller (так как Proxy не закрывает сессию специально для того, чтобы не проходить вновь процесс авторизации при последующих запросах). Либо не хватает ресурсов для открытия TCP сеанса. Так же есть вероятность того, что в каталоге кэша не хватает места и запрошенный JSON не может быть записан. Хотя, полагаю, что в таком случае метрики бы вылетали в ошибочное состояние пачками. Вместе с тем - к UniFi Proxy мой Zabbix agent обращается через loadable module, поэтому в ситуации с nc в качестве посредника у меня банально нет никакой статистики..

И, в конце концов, звёзды сошлись так, что: 1) В Zabbix v3.4 были введены изменения, которые не очень совместимы со скриптами, которые были написаны для ранних версий. У многих пользователей возникли с этим проблемы (не при использовании моего ПО, а вообще); 2) Где-то в v5.5.18 контроллера UniFi в API начали вноситься изменения, метрики стали переименовываться. Возможно, что произошли еще какие-то неафишируемые правки в его (API) работе. 3) В v.1.3.5 UniFi Proxy/UniFi Miner была введена возможность выбирать JSON-backend (или предоставлять выбор автоматическому алгоритму), а он является практически ключевым механизмом скрипта.

Пустая же строка будет выдаваться как при обнаружении в JSON-ключе значения null или "", так и при какой-либо ошибке обработки данных, так любое другое значение может быть ошибочно принято за величину метрики и сбой в работе будет замаскирован.

Поэтому я вынужден констатировать, что хоть какую-то ясность могут внести только отладочные логи или какие-либо приметы, описывающие системность возникающей ошибки. Без этого все мои предположения будут носить точно такой же случайный характер, как и возникающие проблемы.

diffway commented 6 years ago

Кхм. Хотелось соблюсти этикет общения в сети - в трансляторе нет необходимости. Спасибо за быстрый ответ.

zbx-sadman commented 6 years ago

Ничего страшного, если будет найдено решение - можно будет оформить его на английском языке. А пока его нет - мне так проще, а вам - понятней.

zbx-sadman commented 6 years ago

У меня есть соображение по локализации места возникновения ошибки. Оно, конечно, не очень изящное... Можно сделать некий .sh, в котором будет вызываться в цикле запрос той метрики, которая несет "" в элемент данных. Как только этот запрос вернет пустое значение, сделать мгновенную копию кэша (и лога, если он ведется). Затем уже можно спокойно анализировать файлы кэша на предмет того, что реально получает Proxy на вход и делать какие-либо выводы.

diffway commented 6 years ago

По ссылке есть немного пищи для размышлений..

Конфига агента принципиально не изменилась:

UserParameter=unifi.proxy[*],echo "$1,$2,$3,$4,$5,$6,$7" |nc 127.0.0.1 8443 -q 1

Чтобы избежать буферизации запускал демона командой script

Лог получен командой: $ script -q /var/log/unifi-proxy.debug.timer -c '/usr/local/sbin/unifi_proxy.pl -C /etc/zabbix/unifi_proxy.conf' 2>&1 > /var/log/unifi-proxy.debug.log

Между командами в терминале пауза 5-10 сек.

Комит: a2b7f76

В скрипте unifi_proxy.pl менял:

MAX_BUFFER_LEN => 131072

В конфиге менял:

CacheMaxAge = 30 UniFiVersion = v5 DebugLevel = 3 StartServers = 8 MaxClients = 60 ListenPort = 8443

Что-то нужно повторить/изменить/любые вопросы - спрашивайте.

UPD:

zbx-sadman commented 6 years ago

Логи я ваши скачал, но вам их лучше удалить - там присутствует излишняя информация. Однако я там ничего не обнаружил криминального... "sysinfo,default,version" присутствует в JSON, из метрики значение возвращается. Пустого значения в логах нет. Или я чего-то не увидел?

diffway commented 6 years ago

Факт 1: Через дробное количество периодов опроса скрипт возвращает пустую строку, что вынуждает zabbix поставить флаг _NOTSUPPORTED на соответствующий элемент данных Уменьшение периода refresh unsupported items этой проблемы не решает, а лишь увеличивает нагрузку на контроллер и на сам zabbix. Факт 2: То что в логах действительно нет ничего "криминального" сбивает с толку. Возможно потеря данных происходит где-то ещё в цепочке.

Нужно отметить что _unif_miner_ отдаёт данные стабильно.

PS: В фичу третьего zabbix, preprocessing, была добавлена возможность парсить json, что существено разгружает zabbix, плюс за счёт _зависимых элементов данных_ даёт необходимую для формирования вычисляемых метрик "консистентность" данных.

zbx-sadman commented 6 years ago

Могу наугад тыкнуть в параметр MaxRequestsPerChild конфига Proxy. Через это количество запросов форк пересоздается, хотя, конечно, при этом всё должно корректно закрываться, иначе бы у меня тоже всё вылетало в NOT_SUPPORTED. Увеличьте его радикально... Код Proxy идентичен коду Miner, различие только в том, что Proxy принимает команды через TCP-соединение несколькими форками.

Если не поможет, то нужно смотреть на живой системе, заочно у меня диагноз ставить не выходит.

Про препроцессинг я знаю. Вещь интересная, но, насколько я понял, выборки с ее помощью на данный момент делать нельзя. Т.е. вы не сможете отобрать значение метрики с ключом type, которая относится к объекту JSON с заданным значением ключа id. А уж сложить _usersnum со всех объектов с type="UAP" и подавно.

P.S. Закрыл issue случайно.

diffway commented 6 years ago

Насколько я могу судить увеличение MaxRequestsPerChild не решит проблемы, а лишь отсрочит её проявление.

Поясню про препроцессинг..

Для zabbix 3.4

Cоздаём item с _valuetype "текст"

Любым доступным способом доставляем json содержащий нужные метрики объекта (прописывается соответствующий нашему способу item type)

Далее создаём новый item, задаём ему тип dependent, а в его препроцессинг JsonPath вписываем например "_$.stat.rxbytes".

Т.к значения зависимых метрик заполняются сразу после обновления своего мастера, по крайней мере, для соответствующего id, _rxbytes будет соответствовать _txbytes.

Вычисления различных сумм можно делать из файла кеша.

zbx-sadman commented 6 years ago

Увеличение не решит, но, возможно, своей отсрочкой укажет, где начать искать ошибку.

За разъяснения спасибо, но у меня нет ресурсов сопровождать все доступные для всех выпусков Zabbix способы доставки значений. К тому же выигрыш в производительности для Proxy будет мизерным - основная работа алгоритма состоит в том, чтобы найти этот самый кусок JSON, содержащий нужную метрику. А отправить ее в TCP-сессию - дело пары операторов. Если же пользоваться loadable module, то выигрыш будет стремиться к нулю при увеличении сложности поддержки всего этого добра.

Если вам нужно персональное решение - можем это обсудить.

zbx-sadman commented 6 years ago

Накидал на коленке отдачу куска JSON в 1.3.6. Пока только в Miner. С Zabbix не тестировал (нет инсталляции 3.4), но вроде как JSON отдает правильный: https://github.com/zbx-sadman/unifi_miner/tree/master/experimental

Отдельные девайсы/вложенные объекты JSON отбираются с помощью фильтра, берется только первый подходящий под условие объект, например:
./unifi_miner.pl -a raw -o uap -s default -k "[mac=00:27:22:0a:16:a7].*"

Подключ '*' в действии raw завершает анализ дерева, в других - игнорируется.

Если погоняете и все будет работать, то внесу тот же код в Proxy.