Удалить параметры из SQL-запроса с помощью Regex / LogStash - PullRequest
0 голосов
/ 05 июня 2019

Сторонняя система, которую я использую, регистрирует все запросы SQL вместе с количеством строк и временем отклика, которые я затем отправляю в Logstash / Elastic для вычисления метрик.Поскольку в этой системе не используются переменные связывания, и ежедневно выполняется 10 миллионов запросов, мне нужно иметь возможность объединять данные, чего я не могу сделать, если большинство запросов уникальны.Мне нужен способ заменить параметры SQL-запроса на '?'как Oracle будет делать с помощью Cursor Sharing.

т.е.

заменить

'SELECT * FROM table_name WHERE id = 123'

на

'SELECT * FROM table_name WHERE id = ?'

У меня есть доступ к магии сценариев Ruby в Logstash, но, к сожалению, все результаты google для 'sql regex' или аналогичные результаты возвращают то, как использовать регулярные выражения в SQL, а не наоборот.Прежде чем приступить к созданию синтаксического анализатора регулярных выражений, я решил проверить здесь, пытались ли другие решить подобную проблему.

К вашему сведению, рассматривали реализацию решения с использованием библиотеки Ruby SQL AST, такой какhttps://github.com/lfittl/pg_query но подключение библиотек Ruby к Logstash становится большей проблемой при написании специального плагина Filter для выполнения работы, что может быть ответом, но я надеюсь, что упускаю что-то очевидное.

1 Ответ

0 голосов
/ 06 июня 2019

Я не разработчик / пользователь logstash / ruby, но с точки зрения регулярного выражения вы можете попробовать это:

(= \ s \ W \ w + \ W | = \ s \d +)

Вы можете проверить это здесь

SELECT * FROM Table1 WHERE Column1 = 1
SELECT * FROM Table1 WHERE Column1 = 'abc'
SELECT * FROM Table1 WHERE (Column1 = 'abc' OR Column2 = 1)
SELECT * FROM Table1 WHERE (Column1 = 'abc' AND Column2 = 1) OR Column2 = 'zxy'
SELECT * FROM Table1 WHERE (Column1 = 'abc' AND Column2 = 1) OR Column2 = 'zxy' AND 
Column3 = 2
SELECT * FROM Table1 WHERE Column1 = 1 AND Column2 = 2

Ожидаемые результаты:

Match 1
Full match  = 1
Group 1.    = 1

Match 2
Full match  = 'abc'
Group 1.    = 'abc'

Match 3
Full match  = 'abc'
Group 1.    = 'abc'

Match 4
Full match  = 1
Group 1.    = 1

Match 5
Full match  = 'abc'
Group 1.    = 'abc'

Match 6
Full match  = 1
Group 1.    = 1

Match 7
Full match  = 'zxy'
Group 1.    = 'zxy'

Match 8
Full match  = 'abc'
Group 1.    = 'abc'

Match 9
Full match  = 1
Group 1.    = 1

Match 10
Full match  = 'zxy'
Group 1.    = 'zxy'

Match 11
Full match  = 2
Group 1.    = 2

Match 12
Full match  = 1
Group 1.    = 1

Match 13
Full match  = 2
Group 1.    = 2

На основепо этим результатам вы можете создать функцию, которая заменит значение '= 2' на '=?'.

Надеюсь, что оно хотя бы даст вам отправную точку.

...