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