Посмотрел ещё раз - как минимум, в версии Zabbix 5.0 всё необходимое для данной задачи уже есть - и предобработка правила LLD с помощью JavaScript, и замещения (overrides). И ещё подумал, что проще может оказаться другой подход: в качестве параметров в ключах элементов данных использовать не SNMP-индекс, и имя интерфейса (которое будет одинаково для сенсоров на приём и на передачу). Только его ещё надо извлечь; но это совсем несложно: обрезаем из {#SNMPVALUE} незначащую часть в конце строки.
То есть, при таком подходе:
1) добавляем для правила LLD шаг предобработки с типом JavaScript и примерно таким кодом:
В результате в наш исходный JSON должен добавиться третий LLD-макрос {#INT_NAME}, содержащий имя интерфейса (например, "subslot 0/1 transceiver 3").
2) корректируем прототипы элементов данных, создавая сами элементы данных с разными ключами, но одинаковыми параметрами ключа для одного интерфейса, например: sensor.sfp.power.rx["{#INT_NAME}"] - для приёмника, sensor.sfp.power.tx["{#INT_NAME}"] - для передатчика.
При помощи правил замещения настраиваем таким образом, чтобы rx либо tx-айтемы создавались только при наличии соответствующей подстроки в имени элемента данных (а там используем макрос {#SNMPNAME}).
3) для триггера тоже создаём правило замещения, чтобы создавать его для tx- или rx-айтемов. А уж в формуле восстановления для триггера при таком подходе пишется просто:
То есть, при таком подходе:
1) добавляем для правила LLD шаг предобработки с типом JavaScript и примерно таким кодом:
Code:
//transform source string into JSON object
val_json=JSON.parse(value);
//Regular expression: search needed substring
re=/\s+(Tx|Rx) Power Sensor/;
//transform needed part of array (replace substring by an empty string)
for (i in val_json) {
val_json[i]["{#INT_NAME}"] = val_json[i]["{#SNMPVALUE}"].trim().replace(re,"");
}
//return result converted back to String
return JSON.stringify(val_json);
2) корректируем прототипы элементов данных, создавая сами элементы данных с разными ключами, но одинаковыми параметрами ключа для одного интерфейса, например: sensor.sfp.power.rx["{#INT_NAME}"] - для приёмника, sensor.sfp.power.tx["{#INT_NAME}"] - для передатчика.
При помощи правил замещения настраиваем таким образом, чтобы rx либо tx-айтемы создавались только при наличии соответствующей подстроки в имени элемента данных (а там используем макрос {#SNMPNAME}).
3) для триггера тоже создаём правило замещения, чтобы создавать его для tx- или rx-айтемов. А уж в формуле восстановления для триггера при таком подходе пишется просто:
Code:
({Host:sensor.sfp.power.rx["{#INT_NAME}"].last()} = -40 and {Host:sensor.sfp.power.tx["{#INT_NAME}"].last()} = -40)
or
(предыдущее выражение восстановления)

) или прописывать макрос. В предположении, что основная часть интерфейсов работает, а отключать мониторинг надо только на некоторых - это может оказаться рабочим вариантом.
Comment