В статье расскажу как одним запросом в базу, реализовать и автоматическое создание метрик и обеспечить наполнения найденных метрик данными. Пришли коллеги, говорят есть список 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 секунд, хотя после отработки всех моментов можно убрать вообще хранения данных.
![](https://habrastorage.org/getpro/habr/upload_files/294/a54/280/294a542808c3bdad6216906100e45456.png)
Имя будущих метрик будет содержать имя из столбца SERVICE_TYPE вместо символов : (двоеточие) будет находится символ _ что допускается. Соответственно пришлось в пред-обработке убирать символ : (двоеточие) на _ весьма не тривиальным способом:
![](https://habrastorage.org/getpro/habr/upload_files/047/7bd/406/0477bd406eb70cfc6c3c3b5ba485ce11.png)
После создания метрики, проверяем собираемость данных, содержание метрики 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
Создаем правило обнаружения:
![](https://habrastorage.org/getpro/habr/upload_files/eab/01d/d9a/eab01dd9a3967bb7b7122d8b3d00e7c5.png)
![](https://habrastorage.org/getpro/habr/upload_files/2b7/566/47a/2b756647ac2c03bd74e3ad8a3c9761bd.png)
![](https://habrastorage.org/getpro/habr/upload_files/5b3/b13/017/5b3b130170a4db5f4b6d4a6f9382e794.png)
Создаем два прототипа элементов данных:
![](https://habrastorage.org/getpro/habr/upload_files/245/063/e2f/245063e2f655814e240e5daba982f303.png)
Первый прототип данных
![](https://habrastorage.org/getpro/habr/upload_files/d64/f65/7e0/d64f657e0ef15f170af9054f32dc319b.png)
![](https://habrastorage.org/getpro/habr/upload_files/ed8/ee4/d55/ed8ee4d558cd28a44bc6e2cc7d040846.png)
Регулярное выражение
("SERVICE_TYPE":"{#SERVICE_TYPE}".*?})
Регулярное выражение
"AVG_TIME":("[0-9|.]{1,}?")
Второй прототип данных
![](https://habrastorage.org/getpro/habr/upload_files/aad/224/610/aad2246101f6ffbbaa1f7dc9c6269aea.png)
![](https://habrastorage.org/getpro/habr/upload_files/47b/0e0/3e0/47b0e03e08e73b449de44826fbae6504.png)
Регулярное выражение
("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:
![](https://habrastorage.org/getpro/habr/upload_files/590/702/c21/590702c21b810a7ab3aa9603b8545953.png)
Результат отработки первого выражения, поиск по всему json и получение в первую группу нужного нам параметра с его столбцами: "SERVICE_TYPE":"FPS_0","AVG_TIME":"2.22","R_COUNT":"90"}
Второе регулярное выражение получает из строки значение конкретного параметра:
![](https://habrastorage.org/getpro/habr/upload_files/e96/a59/e87/e96a59e8709e5c06584450676f9a108f.png)
![](https://habrastorage.org/getpro/habr/upload_files/9f9/7d3/2f9/9f97d32f9bf3e6c895eb0c37067004c4.png)
Далее может быть так что, значение параметра будет без начального нуля:
"AVG_TIME":".33"
"AVG_TIME":".4"
"AVG_TIME":"2.22"
В этом случае применяется две замены
Замена
".
меняет на0.
Замена удаляет символы
"
В общем все
Если есть другие способы реализовать разведку метрик и наполнения данными одним или двумя запросами в базу, пишите в комментариях, будут рад почитать