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

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!

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


Интересные статьи

Интересные статьи

Позвольте мне рассказать техническую историю. Много лет назад я разрабатывал приложение со встроенными в него функциями совместной работы. Это был удобный экспериментальный сте...
Прим. перев.: хотя этот обзор не претендует на статус тщательно проработанного технического сравнения существующих решений для постоянного хранения данных в Kubernetes, он может стать...
Анамнез, так сказать: Сервер Fujitsu rx300 s6, RAID6 из 6 1Тб дисков, поднят XenServer 6.2, крутятся несколько серверов, среди них Убунта с несколькими шарами, 3,5 миллиона файлов, 1,5 Тб данн...
Предыстория Так произошло, что сервере был атакован вирусом шифровальщиком, который по "счастливой случайности", частично отставил не тронутыми файлы .ibd (файлы сырых данных innodb ...
Если вы когда-нибудь сравнивали данные двух аналитических инструментов на одном и том же сайте или сравнивали аналитику с отчётами и продажах, то, вероятно, замечали, что они не всегда совпад...