Ведение журнала медленных запросов на экземплярах Google Cloud SQL PostgreSQL - PullRequest
0 голосов
/ 02 мая 2018

Компания, в которой я работаю, использует Google Cloud SQL для управления своими базами данных SQL на производстве.

У нас проблемы с производительностью, и я подумал, что было бы неплохо (среди прочего) увидеть / отслеживать все запросы выше определенного порога (например, 250 мс).

Глядя на документацию PostgreSQL Я думаю, log_min_duration_statement выглядит как нужный мне флаг.

log_min_duration_statement (целое число)

Заставляет регистрировать продолжительность каждого выполненного оператора, если оператор выполнялся по крайней мере указанное количество миллисекунд. Установка этого значения в ноль печатает все длительности операторов.

Но, судя по документации Cloud SQL, я вижу, что можно установить только узкий набор флагов базы данных (как для каждого экземпляра БД), но, как вы можете видеть из здесь log_min_duration_statement не среди поддерживаемых флагов.

Итак, возникает вопрос. Как мне регистрировать / отслеживать мои медленные запросы PostgreSQL с помощью Google Cloud SQL? Если это невозможно, то какие инструменты / методологии вы предлагаете использовать для достижения аналогичного результата?

Ответы [ 4 ]

0 голосов
/ 08 апреля 2019

3 апреля 2019 г. ОБНОВЛЕНИЕ

Теперь можно регистрировать медленные запросы на экземплярах Google Cloud SQL PostgreSQL, см. https://cloud.google.com/sql/docs/release-notes#april_3_2019:

database_flags = [
  {
    name = "log_min_duration_statement"
    value = "1000"
  },
]

Ссылки:

0 голосов
/ 05 августа 2018

Не идеален ни в каком измерении, но мы запускаем что-то подобное на cron раз в минуту и ​​выводим результат:

SELECT EXTRACT(EPOCH FROM now() - query_start) AS seconds, query
 FROM  pg_stat_activity 
 WHERE state = 'active' AND now() - query_start > interval '1 seconds' AND query NOT LIKE '%pg_stat_activity%'
 ORDER BY seconds DESC LIMIT 20

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

0 голосов
/ 21 марта 2019

Существует способ регистрировать медленные запросы через расширение pg_stat_statements, которое поддерживается Cloud SQL.

Поскольку Cloud SQL не предоставляет права суперпользователя ни одному из пользователей, вам необходимо использовать обходной путь. Во-первых, вам нужно включить расширение с помощью

CREATE EXTENSION IF NOT EXISTS pg_stat_statements;

тогда вы можете проверять медленные запросы с помощью запроса типа

SELECT pd.datname,
       us.usename,
       pss.userid,
       pss.query                         AS SQLQuery,
       pss.rows                          AS TotalRowCount,
       (pss.total_time / 1000)           AS TotalSecond,
       ((pss.total_time / 1000) / calls) as TotalAverageSecond
FROM pg_stat_statements AS pss
       INNER JOIN pg_database AS pd
                  ON pss.dbid = pd.oid
       INNER JOIN pg_user AS us
                  ON pss.userid = us.usesysid
ORDER BY TotalAverageSecond DESC
LIMIT 10;

Как пользователь postgres вы можете просматривать все медленные запросы, но, поскольку пользователь не является суперпользователем, вы увидите <insufficient privilege> по всем запросам других пользователей. Чтобы обойти это ограничение, вы можете установить расширение и в других базах данных (обычно только postgres пользователь имеет право устанавливать расширения), и вы можете проверить текст запроса у владельца базы данных.

0 голосов
/ 03 мая 2018

Возможность мониторинга медленных запросов PostgreSQL для экземпляров Cloud SQL в настоящее время недоступна. Как вы прокомментируете, флаг log_min_duration_statement в настоящее время не поддерживается Cloud SQL.

В настоящее время ведется работа по добавлению этой функции в Cloud SQL, и вы можете отслеживать прогресс, достигнутый с помощью по этой ссылке . Вы можете щелкнуть значок звездочки в верхнем левом углу, чтобы получать уведомления по электронной почте о любом существенном прогрессе.

...