Одним db.odbc.get запросом в базу реализовывается discovery метрик и разнесение данных по метрикам

—

от автора

В статье расскажу как одним запросом в базу, реализовать и автоматическое создание метрик и обеспечить наполнения найденных метрик данными. Пришли коллеги, говорят есть список 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

Создаем правило обнаружения:

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

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

  1. Регулярное выражение ("SERVICE_TYPE":"{#SERVICE_TYPE}".*?})

  2. Регулярное выражение "AVG_TIME":("[0-9|.]{1,}?")

Второй прототип данных

  1. Регулярное выражение ("SERVICE_TYPE":"{#SERVICE_TYPE}".*?})

  2. Регулярное выражение "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″

В этом случае применяется две замены

  1. Замена ". меняет на 0.

  2. Замена удаляет символы "

В общем все

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


ссылка на оригинал статьи https://habr.com/ru/articles/574548/