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

В общем все

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

Комментарии (0)