Всем привет!
Вопрос больше к разработчикам, т.к. сама суть проблемы ясна.
Собственно по теме:
Стоит Centos-8 и Zabbix-5.2.6.
Имеется парк приборов ЭльметроВиЭР-104К (более 400 шт) с MODBUS/TCP на борту, к приборам подключены датчики,
при обрыве или неисправности датчика в регистр данных записывается float значение NaN.
Приборы нежненькие, очень не любят когда их часто спрашивают по TCP, ну раз в пару-тройку минут один запрос терпят,
т.е. надо выдернуть диапазон из примерно 30 регистров типа float за один запрос и потом его разобрать по переменным с одного прибора,
так вот создаем Data Item -> Type - Zabbix, Key -> modbus.get[tcp://IP_HERE,1,4,0,16,float,mbe] , и создаем подчиненные Data Items с предобработкой JSONPath -> $.[номер регистра],
если в регистрах нет NaN, то всё прекрасно работает, а вот если появляется NaN, тогда вся схема ломается,
т.е. требуется чтобы родительский Data Item возвращал JSON что-то типа [12.11,11.234,NaN,123,456], а он просто возвращает ошибку: Unable to create json: json: unsupported value: NaN.
Прикрепляю картинки, на которых видно такое поведение.
Еще глянул исходники модуля MODBUS и по ним видно, что это проблема находится в функции pack2Json (файл .../zabbix-5.2.6/src/go/plugins/modbus/endianness.go), там используется так называемый сериализатор jd, jerr := json.Marshal(arr)
и как пишут в ИНЕТ вот он-то и неправильно понимает NaN, к сожалению на этом моя программистская компетенция заканчивается и я не знаю как это поправить.
Кто, что подскажет?
Заранее благодарен.
Вопрос больше к разработчикам, т.к. сама суть проблемы ясна.
Собственно по теме:
Стоит Centos-8 и Zabbix-5.2.6.
Имеется парк приборов ЭльметроВиЭР-104К (более 400 шт) с MODBUS/TCP на борту, к приборам подключены датчики,
при обрыве или неисправности датчика в регистр данных записывается float значение NaN.
Приборы нежненькие, очень не любят когда их часто спрашивают по TCP, ну раз в пару-тройку минут один запрос терпят,
т.е. надо выдернуть диапазон из примерно 30 регистров типа float за один запрос и потом его разобрать по переменным с одного прибора,
так вот создаем Data Item -> Type - Zabbix, Key -> modbus.get[tcp://IP_HERE,1,4,0,16,float,mbe] , и создаем подчиненные Data Items с предобработкой JSONPath -> $.[номер регистра],
если в регистрах нет NaN, то всё прекрасно работает, а вот если появляется NaN, тогда вся схема ломается,
т.е. требуется чтобы родительский Data Item возвращал JSON что-то типа [12.11,11.234,NaN,123,456], а он просто возвращает ошибку: Unable to create json: json: unsupported value: NaN.
Прикрепляю картинки, на которых видно такое поведение.
Еще глянул исходники модуля MODBUS и по ним видно, что это проблема находится в функции pack2Json (файл .../zabbix-5.2.6/src/go/plugins/modbus/endianness.go), там используется так называемый сериализатор jd, jerr := json.Marshal(arr)
и как пишут в ИНЕТ вот он-то и неправильно понимает NaN, к сожалению на этом моя программистская компетенция заканчивается и я не знаю как это поправить.
Кто, что подскажет?
Заранее благодарен.
Здесь читаем 6 float регистров |
Здесь читаем регистр с NaN (седьмой) |
Здесь читаем 7 float регистров седьмой с NaN |
Comment