В статье расскажу как одним запросом в базу, реализовать и автоматическое создание метрик и обеспечить наполнения найденных метрик данными. Пришли коллеги, говорят есть список SERVICE_TYPE с двумя столбцами отражающие статистику работы сервиса, скорость отработки запросов с количество запросов, которые меняются в онлайне, просим добавить в мониторинг.
[root@zabbix admin]# su zabbix bash-4.2$ bash-4.2$ isql -v oracle_host SQL> select service_name, service_type, avg_time, r_count from main.timing_mon; +--------------+--------------+----------+---------+ | SERVICE_NAME | SERVICE_TYPE | AVG_TIME | R_COUNT | +--------------+--------------+----------+---------+ | CR | EQ: | 1.25 | 8 | | CR | FPS:0 | 1 | 10 | | CR | MTV1:1 | .5 | 10 | | CR | NBI: | .33 | 6 | | ID | PETAPFR | 5.38 | 8 | | PY | PY_UNI | .63 | 8 | | RB | Card | .43 | 7 | | RB | DepLq | 0 | 7 | | RB | Loaq | .29 | 7 | +--------------+--------------+----------+---------+ SQL>
Информации как такие вещи реализуются мало
Делюсь опытом, если есть более элегантные способы реализации, делитесь в комментариях, буду рад почитать.
Первым делом создаем простую метрику, в текстовом формате, с временем хранения данных 3600 секунд, хотя после отработки всех моментов можно убрать вообще хранения данных.

Имя будущих метрик будет содержать имя из столбца SERVICE_TYPE вместо символов : (двоеточие) будет находится символ _ что допускается. Соответственно пришлось в пред-обработке убирать символ : (двоеточие) на _ весьма не тривиальным способом:

После создания метрики, проверяем собираемость данных, содержание метрики json:
[{"SERVICE_NAME":"CR","SERVICE_TYPE":"EQ_","AVG_TIME":".84","R_COUNT":"31"}, {"SERVICE_NAME":"CR","SERVICE_TYPE":"FPS_0","AVG_TIME":"2.22","R_COUNT":"90"}, {"SERVICE_NAME":"CR","SERVICE_TYPE":"MTV1_1","AVG_TIME":".49","R_COUNT":"94"}, {"SERVICE_NAME":"CR","SERVICE_TYPE":"NBI_","AVG_TIME":".65","R_COUNT":"57"}, {"SERVICE_NAME":"ID","SERVICE_TYPE":"PETAPFR","AVG_TIME":"1.11","R_COUNT":"62"}, {"SERVICE_NAME":"PY","SERVICE_TYPE":"PY_UNI","AVG_TIME":".39","R_COUNT":"36"}, {"SERVICE_NAME":"RB","SERVICE_TYPE":"Card","AVG_TIME":".3","R_COUNT":"44"}, {"SERVICE_NAME":"RB","SERVICE_TYPE":"DepLq","AVG_TIME":".4","R_COUNT":"45"}, {"SERVICE_NAME":"RB","SERVICE_TYPE":"Loaq","AVG_TIME":".33","R_COUNT":"48"}]
Что есть что:
SERVICE_NAME - преобразуется как группа элементов данных
SERVICE_TYPE - преобразуется в два элемента данных по каждому из сервисов, например: FPS_0 AVG_TIME и FPS_0 COUNT
Создаем правило обнаружения:



Создаем два прототипа элементов данных:

Первый прототип данных


Регулярное выражение
("SERVICE_TYPE":"{#SERVICE_TYPE}".*?})Регулярное выражение
"AVG_TIME":("[0-9|.]{1,}?")
Второй прототип данных


Регулярное выражение
("SERVICE_TYPE":"{#SERVICE_TYPE}".*?})Регулярное выражение
"R_COUNT":("[0-9|.]{1,}?")
Первое регулярное выражение: ("SERVICE_TYPE":"{#SERVICE_TYPE}".*?}) в прототипах оно одинаковое, в момент разведки метрик, LLD макрос {#SERVICE_TYPE} будет заменен именем будущей метрики, например:
Метрика FPS_0 AVG_TIME а regex будет ("SERVICE_TYPE":"FPS_0".*?})
Можно обратится к ресурсу regex101.com для тестирования, я для наглядности приведу скрин который показывает что делает первый regex:

Результат отработки первого выражения, поиск по всему json и получение в первую группу нужного нам параметра с его столбцами: "SERVICE_TYPE":"FPS_0","AVG_TIME":"2.22","R_COUNT":"90"}
Второе регулярное выражение получает из строки значение конкретного параметра:


Далее может быть так что, значение параметра будет без начального нуля:
"AVG_TIME":".33"
"AVG_TIME":".4"
"AVG_TIME":"2.22"
В этом случае применяется две замены
Замена
".меняет на0.Замена удаляет символы
"
В общем все
Если есть другие способы реализовать разведку метрик и наполнения данными одним или двумя запросами в базу, пишите в комментариях, будут рад почитать
