Ad Widget

Collapse

Препроцессинг заббикс через регулярное выражение

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • fractal90
    Senior Member
    • Jun 2019
    • 177

    #1

    Препроцессинг заббикс через регулярное выражение

    Zabbix 7.0.0
    Хочу преобразовать текстовые значения
    0 - Fully non-compliance with SLA
    0,1 - VDI-Data
    0,1,2 - VDI-Data, VDI-Voip

    пробовал через препроцессинг и регулярное выражение, но выдет ошибку

    Code:
    Preprocessing failed for: {"mean-jitter":0,"lastupdated":1749821354045,"proto":"ips ec","dst-port":"12346","vdevice-name":"1...
    1. Result: 0
    2. Result: Fully non-compliance with SLA
    3. Failed: cannot perform regular expression "^0,1$" match for value of type "none": pattern does not match
    Click image for larger version

Name:	image.png
Views:	115
Size:	103.8 KB
ID:	504035
  • Kos
    Senior Member
    Zabbix Certified SpecialistZabbix Certified Professional
    • Aug 2015
    • 3404

    #2
    Ваша реплика, по сути, подразумевает два вопроса:
    • почему не работает так, как настроено сейчас?
    • как сделать так, чтобы заработало?
    На первый вопрос ответ простой: препроцессинг через регулярное выражение сделан в Zabbix'е таким образом, что требуется обязательное совпадение с указанным регулярным выражением. Если совпадения нет - возникает ошибка. В вашем случае заданы три шага препроцессинга с тремя разными регулярными выражениями, и первое из них отрабатывает успешно, но после него со вторым регулярным выражением совпадения уже нет (и вообще, какие бы данные ни были на входе, с каждым из этих трёх регулярных выражений совпадений не будет).

    Второй вопрос сложнее.
    Один из вариантов - это использовать не шаг препроцессинга "Регулярное выражение", а какой-то другой - например, "JavaScript" (и там уже средствами JavaScript делать что угодно).
    Но в случае, если во входных данных мы ожидаем строго ограниченный набор значений (например, перечисленные вами три строки, которые надо заменить другими), то можно извратиться и через регулярные выражения тоже, но в два шага. Использую тот же приём, который был подсмотрен ранее (уже не помню где) для преобразования дат из формата "Jan/Feb/.../Dec" в числовое представление ("01/02/.../12").
    • Первый шаг: добавляем к полученному значению словарь. Для этого используем шаг препроцессинга "Регулярное выражение" и указываем такие параметры:
    Регулярное выражение Замена
    (.*) \1:0=Fully non-compliance with SLA:0,1=VDI-Data:0,1,2=VDI-Data, VDI-Voip
    Результат: исходная строка удлиняется, к ней дописывается словарь, в котором элементы словаря разделяются двоеточем, а каждый элемент состоит из ключа и значения через знак равенства.
    • Второй шаг: извлекаем нужное значение из словаря по ключу, расположенному в начале строки (т.е. исходному значению). Для этого снова используем шаг препроцессинга "Регулярное выражение" и указываем такие параметры:
    Регулярное выражение Замена
    ^([0-2,]+)(?=.*:\1=([^:]+)) \2
    Результат: в зависимости от того, с какой строки начиналось значение (набор символов из нуля, единицы, двойки и запятой), выбирается та или иная подстрока из словаря (в соответствии с вашей табличкой преобразований).


    Но, наверное, реализовать это через JavaScript было бы понятнее
    Last edited by Kos; 13-06-2025, 18:18.

    Comment

    • fractal90
      Senior Member
      • Jun 2019
      • 177

      #3
      Originally posted by Kos
      Ваша реплика, по сути, подразумевает два вопроса:
      • почему не работает так, как настроено сейчас?
      • как сделать так, чтобы заработало?
      На первый вопрос ответ простой: препроцессинг через регулярное выражение сделан в Zabbix'е таким образом, что требуется обязательное совпадение с указанным регулярным выражением. Если совпадения нет - возникает ошибка. В вашем случае заданы три шага препроцессинга с тремя разными регулярными выражениями, и первое из них отрабатывает успешно, но после него со вторым регулярным выражением совпадения уже нет (и вообще, какие бы данные ни были на входе, с каждым из этих трёх регулярных выражений совпадений не будет).

      Второй вопрос сложнее.
      Один из вариантов - это использовать не шаг препроцессинга "Регулярное выражение", а какой-то другой - например, "JavaScript" (и там уже средствами JavaScript делать что угодно).
      Но в случае, если во входных данных мы ожидаем строго ограниченный набор значений (например, перечисленные вами три строки, которые надо заменить другими), то можно извратиться и через регулярные выражения тоже, но в два шага. Использую тот же приём, который был подсмотрен ранее (уже не помню где) для преобразования дат из формата "Jan/Feb/.../Dec" в числовое представление ("01/02/.../12").
      • Первый шаг: добавляем к полученному значению словарь. Для этого используем шаг препроцессинга "Регулярное выражение" и указываем такие параметры:
      Регулярное выражение Замена
      (.*) \1:0=Fully non-compliance with SLA:0,1=VDI-Data:0,1,2=VDI-Data, VDI-Voip
      Результат: исходная строка удлиняется, к ней дописывается словарь, в котором элементы словаря разделяются двоеточем, а каждый элемент состоит из ключа и значения через знак равенства.
      • Второй шаг: извлекаем нужное значение из словаря по ключу, расположенному в начале строки (т.е. исходному значению). Для этого снова используем шаг препроцессинга "Регулярное выражение" и указываем такие параметры:
      Регулярное выражение Замена
      ^([0-2,]+)(?=.*:\1=([^:]+)) \2
      Результат: в зависимости от того, с какой строки начиналось значение (набор символов из нуля, единицы, двойки и запятой), выбирается та или иная подстрока из словаря (в соответствии с вашей табличкой преобразований).





      Но, наверное, реализовать это через JavaScript было бы понятнее
      Я пробовал JS, но в прототипе элемента данных у меня не вышло) в отличие от предобработки в самом LLD правиле

      Code:
      var sla_class_index = {
          '0,1,2' : 'VDI-Data,VDI-Voip'
      };
      
      var value = JSON.parse(value);
      
      for (var i in value) {
          value[i]['{#SLA_CLASS_INDEX_NEW}'] = sla_class_index[value[i]['sla-class-index']] || value[i]['sla-class-index'];
      }
      
      return JSON.stringify(value);​
      у меня прототип зависимый от другого прототипа

      основной прототип (в шаге предобработки - Json path $.data[?(@.['local-color'] == "{#LOCAL}" && @.['remote-color'] == "{#REMOTE}" && @.['dst-ip'] == "{#DST_IP}")].first())
      Click image for larger version

Name:	image.png
Views:	70
Size:	38.9 KB
ID:	504696
      зависимый прототип (в шаге предобработки Json Path $.['sla-class-index'])
      Click image for larger version

Name:	image.png
Views:	38
Size:	37.0 KB
ID:	504697​​

      Comment

      Working...