Проверьте, равны ли значения двух элементов строкового типа в триггере Zabbix - PullRequest
2 голосов
/ 13 марта 2012

Я наблюдаю за приложением, используя Zabbix, и определил пользовательский элемент, который возвращает строковое значение.Поскольку значения моего элемента на самом деле являются контрольными суммами, они будут содержать только символы [0-9a-f].Две зеркальные копии моего приложения работают на двух серверах ради избыточности.Я хотел бы создать триггер, который будет принимать значения элементов с обеих машин и запускать их, если они не совпадают.

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

Суть: как написатьтриггерное выражение Zabbix, которое может сравнивать на равенство строковые значения двух элементов (фактически, одного и того же элемента на двух зеркальных хостах)?

Оба согласно прекрасному руководству и какЯ подтвердил в практике, что стандартные операторы = и # работают только с числовыми значениями, поэтому я не могу просто написать натуральное {host1:myitem[param].last(0)} # {host2:myitem[param].last(0)}.Такие функции, как change() или diff(), могут сравнивать значения одного и того же элемента в разные моменты времени.Такие функции, как regexp(), могут сравнивать только значение элемента с постоянной строкой / регулярным выражением, но не со значением другого элемента.Это очень ограничивает.

Я мог бы переместить логику сравнения в скрипт, который выполняет мой пользовательский элемент, но он немного запутанный и не элегантный, поэтому, если это вообще возможно, я бы предпочел, чтобы эта логика была внутри моегоТриггер Zabbix.

Возможно, несмотря на перечисленные выше ограничения, кто-то может найти обходной путь?

Ответы [ 3 ]

2 голосов
/ 14 марта 2012

Обходной путь:

{host1:myitem[param].change(0)} # {host2:myitem[param].change(0)}

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

change (float,int, str, text, log)
Возвращает разницу между последним и предыдущим значениями.Для строк:
0 - значения равны
1 - значения отличаются

0 голосов
/ 20 февраля 2017

Вы можете изменить свои элементы, чтобы они возвращали числа вместо строк.Поскольку ваши элементы являются контрольными суммами, которые используют только [0-9a-f] символов, они представляют собой числа, записанные в шестнадцатеричном формате.Поэтому вам необходимо преобразовать контрольную сумму в десятичное число.

Поскольку контрольная сумма является большим числом, вам нужно ограничить шестнадцатеричное число до 8 символов для числового (без знака) типа перед преобразованием.Или, если вам нужна более высокая точность, вы можете использовать float (но это будет больше работы):

Числовое (без знака) - 64-разрядное целое число без знака
Числовое (с плавающей точкой) - число с плавающей запятой
Могут быть сохранены отрицательные значения.
Допустимый диапазон (для MySQL): от -999999999999,9999 до 999999999999,9999 (двойной (16,4)).

Я бы хотел, чтобы в Zabbix была функция .hashedUnsigned(), которая выполняла бывычислил бы хеш строки и возвратил бы это как число.Такая функция должна быть легко написана.

0 голосов
/ 23 октября 2014

Я верю, и я сам борюсь с этой ТОЧНОЙ ситуацией, что правильный способ сделать это - через вычисляемые предметы.

Вы хотите создать новый ПУНКТ, а не триггер (пока!),который выполняет расчетное сравнение для нескольких значений элемента (разность строк, числа в пределах диапазона и т. д.).

После того, как у вас есть этот элемент, сделайте расчет, чтобы получить значение, из которого вы можете вызвать.Вы можете использовать ЛЮБЫЕ триггерные функции в своих вычислениях наряду с аритмическими операциями.

Теперь к вопросу (для которого я отправил запрос функции, потому что это чрезвычайно ограничивает), большинство выражений триггера оцениваются как число или0/1 bool.

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

Но, опять же, это запутанно и больно.

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

Я пытаюсь работать над патчем самостоятельно, но у меня нет времени, поскольку у меня такмного мониторинга для реализации, и хотя zabbix является мощным, у него есть несколько огромных недостатков.Я до сих пор считаю, что это лучшая система мониторинга.

Простой ответ: создавайте параметр UserParameter, пока кто-нибудь не напишет патч.

...