Version 1 (modified by 31 hours ago) ( diff ) | ,
---|
Мониторинг параметров SFP на примере температуры и уровня принимаемого сигнала
В данной статье рассматривается пример мониторинга параметров модуля SFP, установленного в плату SW-01 блока MC04-DSL-3U, с помощью системы мониторинга Zabbix и встроенного в плату SW-01 агента Zabbix. Предполагается, что у нас уже имеется настроенный и работающий сервер Zabbix, в котором настроен мониторинг блока MC04-DSL-3U, а в плате SW-01 блока настроена работа агента Zabbix с сервером Zabbix.
Настройка сервера Zabbix описана в руководстве Zabbix, настройка агента Zabbix в плате SW-01 описана в руководстве по эксплуатации MC04-DSL-3U.
Получение блока параметров SFP
Модули SFP содержат в себе идентификационную информацию, которая может быть прочитана из него устройством-хостом с адреса 0xA0 и отображена пользователю или использована каким-то иным образом. Некоторые модули SFP в дополнение к идентификационным данным имеют возможность предоставлять данные измерений и диагностики, содержащие различные параметры, измеряемые в процессе работы модуля, а также индикацию аварийных состояний, которая может быть прочитана из него устройством-хостом с адреса 0xA2.
Данные модуля SFP, установленного в плату SW-01, могут быть получены сервером Zabbix посредством функции readsfp
агента Zabbix (см. ZabbixAgent). Прочитанные из SFP данные возвращаются в форме массива Json. Каждый элемент массива содержит значение одного байта (0-255), прочитанного из SFP. В случае, если SFP поддерживает как идентификацию, так и измерение/диагностику, возвращаемый массив имеет размер 512. Первые 256 байт массива представляют собой идентификационную информацию, следующие 256 байт - данные измерений/диагностики. Если SFP не имеет функции измерения/диагностики, массив будет содержать только 256 байт данных идентификации. Формат данных описан в стандарте SFF-8472, его можно прочитать, например, здесь.
Для начала нам необходимо получать данные из SFP и сохранять их в базе данных сервера. Для этого создадим элемент данных SFP data (slot 9)
, указав ключ MC04.SW-01.readsfp[9]
:
Элемент данных SFP data (slot 10)
для SFP платы SW-01 в слоте 10 создается аналогично, только вместо слота 9 указывается слот 10 и ключ MC04.SW-01.readsfp[10]
.
Через 10-15 минут (необходимых для обновления списка параметров агентами плат SW-01) после создания элементов убедимся, что сервер получает данные, для чего найдем созданные нами параметры в разделе "Последние данные":
Если данных нет, убедитесь, что в плату SW-01 установлен SFP, и что SFP поддерживает диагностику (в веб-интерфейсе платы SW-01 при нажатии кнопки "SFP" должна отображаться информация, включающая температуру и мощность принимаемого сигнала).
Извлечение параметров из данных диагностики SFP
Для извлечения отдельных параметров из общего массива данных диагностики модуля SFP мы воспользуется элементами данных Zabbix типа "Зависимый элемент данных". Зависимые элементы перевычисляются каждый раз, когда сервер получает новое значение основного элемента данных.
Извлечение значения температуры из данных SFP
Для извлечения значения температуры создадим зависимый элемент данных:
Собственно извлечение значения температуры из массива данных будем производить скриптом javascript. Для этого на вкладке "Предобработка" добавим элемент типа JavaScript. В поле "Параметры" этого элемента запишем такой скрипт:
var v = eval(value); if(v.length < 512) throw 'No diagnostic data'; var x = v[352] * 256 + v[353]; if(x & 0x8000) x -= 65536; if(v[92] & 0x10) { var Ts = v[340] + v[341] / 256; var To = v[342] * 256 + v[343]; if(To & 0x8000) To -= 65536; x = x * Ts + To; } return x / 256;
Разберем этот скрипт подробнее.
var v = eval(value);
Первая строчка скрипта преобразует текстовую строку value
, которую мы получили от агента из платы SW-01, в массив v
.
if(v.length < 512) throw 'No diagnostic data';
Следующая строчка проверяет, содержатся ли в полученном массиве данные диагностики. Если данных диагностики нет (размер массива меньше 512), скрипт выбрасывает исключение. Значением исключения является сообщение об ошибке, которое можно бeдет увидеть в веб-интерфейсе сервера Zabbix.
var x = v[352] * 256 + v[353]; if(x & 0x8000) x -= 65536;
В первой строчке этого фрагмента из данных диагностики извлекается 16-битное "сырое" значение температуры. Это значение в данных диагностики занимает 2 байта начиная со смещения 96, что с учетом данных идентификации модуля дает нам смещение (256 + 96) = 352. Старший бит "сырого" значения является знаком, поэтому вторая строчка фрагмента преобразует значение в отрицательное если старший бит равен единице.
if(v[92] & 0x10) { var Ts = v[340] + v[341] / 256; var To = v[342] * 256 + v[343]; if(To & 0x8000) To -= 65536; x = x * Ts + To; }
Измеренные значения, выдаваемые модулем SFP, могут быть внутренне калибруемыми или внешне калибруемыми. Внутренне калибруемые значения уже откалиброваны самим модулем и представляют измеренную физическую величину (в данном случае температуру) в определенном масштабе (в случае температуры - в 1/256 градуса). Внешне калибруемые значения представляют собой данные АЦП, которые для получения значения физического параметра требуется дополнительно откалибровать по несложной формуле с использованием нескольких коэффициентов. О том, какая калибровка данных ипльзуется модулем, говорят флаги в байте 92 идентификационных данных SFP. Первая строчка данного фрагмента кода проверяет, требуется ли выполнять внешнюю калибровку. Если бит 4 в байте 92 установлен в значение 1, значит требуется выполнить внешнюю калибровку.
Калибровка температуры выполняется по формуле:
где TAD - "сырое" значение температуры, считанное с АЦП (оно у нас уже содержится в переменной x
), Ts и To - 16-битные коэффициенты, хранящиеся в данных диагностики по смещениям 84 и 86 соответственно, что дает нам смещения в массиве v
(256 + 84) = 340 и (256 + 86) = 342 соответственно. Коэффициент Ts - беззнаковый с фиксированной точкой, имеет масштаб 1/256. Коэффициент To имеет знаковый формат, поэтому дополнительным условием проверяется знак и выполняется преобразование к отрицательному значению.
return x / 256;
Последняя строчка скрипта возвращает результат вычислений в градусах Цельсия. Так как, как уже было сказано выше, значение температуры возвращается модулем в единицах 1/256 градуса, итоговое значение делится на 256.
В заключение отмечу, что стандарт SFF-8472 требует, чтобы при внутренней калибровке значений калибровочные коэффициенты Ts и To имели значения 1 и 0 соответственно и, таким образом, формула калибровки
превращается в формулу
Благодаря этому мы можем упростить скрипт, убрав из него проверку флага внешней калибровки в байте 92:
var v = eval(value); if(v.length < 512) throw 'No diagnostic data'; var x = v[352] * 256 + v[353]; if(x & 0x8000) x -= 65536; var Ts = v[340] + v[341] / 256; var To = v[342] * 256 + v[343]; if(To & 0x8000) To -= 65536; x = x * Ts + To; return x / 256;
Аналогично создается элемент данных для мониторинга температуры SFP платы SW-01 в слоте 10.
После создания элемента убедимся, что в разделе "последние данные" начало отображаться значение температуры модуля SFP:
Извлечение значения уровня принимаемого сигнала из данных SFP
Для извлечения значения уровня принимаемого сигнала создадим зависимый элемент данных:
Извлечение данных производится аналогично параметру температуры. Элемент предобратотки содержит такой скрипт:
var v = eval(value); if(v.length < 512) throw 'No diagnostic data'; var buffer = new ArrayBuffer(20); var view = new DataView(buffer); for(var i = 0, j = 312; i < 20; i++, j++) view.setUint8(i, v[j]); var rxpwr = v[360] * 256 + v[361]; rxpwr = Math.pow(rxpwr,4) * view.getFloat32(0, false) + Math.pow(rxpwr,3) * view.getFloat32(4, false) + Math.pow(rxpwr,2) * view.getFloat32(8, false) + rxpwr * view.getFloat32(12, false) + view.getFloat32(16, false); return rxpwr / 10000;
Давайте разберем некоторые фрагменты этого скрипта подробнее.
var buffer = new ArrayBuffer(20); var view = new DataView(buffer);
Согласно стандарту SFF-8472, внешняя калибровка значения принимаемой мощности выполняется по следующей формуле:
где PAD - "сырое" значение принимаемой мощности, K0 - K4 - коэффициенты калибровки. Коэффициенты K0 - K4 представляют собой 32-битные числа с плавающей точкой - таким образом, пять коэффициентов занимают (5 * 4) = 20 байт. Значения коэффициентов хранятся в данных диагностики начиная со смещения 56 или, с учетом данных идентификации, (256 + 56) = 312. Для преобразования байтовых значений в числа с плавающей точкой создается ArrayBuffer размером 20 байт и интерфейс DataView для записи в буфер и чтения из буфера значений.
for(var i = 0, j = 312; i < 20; i++, j++) view.setUint8(i, v[j]);
В этом фрагменте скрипта 20 байт, представляющих значения коэффициентов, загружаются в созданный нами буфер.
var rxpwr = v[360] * 256 + v[361];
16-битное значение принимаемой мощности читается из данных диагностики по смещению 104 (с учетом данных идентификации - 360).
rxpwr = Math.pow(rxpwr,4) * view.getFloat32(0, false) + Math.pow(rxpwr,3) * view.getFloat32(4, false) + Math.pow(rxpwr,2) * view.getFloat32(8, false) + rxpwr * view.getFloat32(12, false) + view.getFloat32(16, false);
В этом фрагменте выполняется внешняя калибровка по приведенной выше формуле. Как и в случае параметра температуры, стандарт требует, чтобы в случае внутренней калибровки коэффициент K1 был равен единице, а все остальные коэффициенты - нулю. Благодаря этому нет необходимости в проверке, какой тип калибровки применяется в конкретном SFP.
return rxpwr / 10000;
Значение принимаемой мощности, читаемое из SFP, выражено в единицах 0.1 мкВт. В приведенной строке скрипта значение делится на 10000 для получения значения в милливаттах.
Аналогично создается элемент данных для мониторинга принимаемой мощности SFP платы SW-01 в слоте 10.
После создания элементов убедимся, что в разделе "последние данные" начали отображаться значения принимаемой мощности.
Attachments (5)
- ss1.jpg (35.0 KB ) - added by 31 hours ago.
- ss2.jpg (57.5 KB ) - added by 31 hours ago.
- ss3.jpg (65.4 KB ) - added by 31 hours ago.
- ss4.jpg (42.7 KB ) - added by 31 hours ago.
- ss5.jpg (66.6 KB ) - added by 31 hours ago.
Download all attachments as: .zip