zubkov-andrei / pg_profile

Postgres historic workload reports
Other
236 stars 33 forks source link

Не снимаются семплы после обновления на версию 4.6 #92

Closed xinferum closed 2 weeks ago

xinferum commented 6 months ago

Добрый день.

У нас был установлен pg_profile версии 4.5 на централизованном сервере сбора семплов (собираем данные раз в час с примерно 50-ти серверов PostgreSQL), сегодня выполнил обновление версии на 4.6 как описано в документации. После обновления, уже на версии 4.6 пытаюсь снять семпл и получаю следующую ошибку:

=# SELECT profile.take_sample('server-name.domain');
                             take_sample                              
──────────────────────────────────────────────────────────────────────
("query returned no rows                                            ↵
PL/pgSQL function init_sample(integer) line 160 at SQL statement    ↵
PL/pgSQL function take_sample(integer,boolean) line 32 at assignment↵
PL/pgSQL function take_sample(name,boolean) line 16 at assignment   ↵
",00:00:00.02)
(1 строка)

Время: 21,065 мс

Так же не работает снятие сабсемплов:

=# SELECT profile.take_subsample('server-name.domain);
ERROR:  P0002: query returned no rows
КОНТЕКСТ:  PL/pgSQL function init_sample(integer) line 160 at SQL statement
PL/pgSQL function take_subsample(integer,jsonb) line 29 at assignment
SQL statement "SELECT take_subsample(sserver_id)"
PL/pgSQL function take_subsample(name) line 9 at PERFORM
ПОЛОЖЕНИЕ:  exec_stmt_execsql, pl_exec.c:4385
Время: 25,145 мс

От сервера с которого пытаюсь снять семплы ничего не зависит - ошибки те же. Централизованный сервер pg_profile у нас на ванильной версии PostgreSQL 15.6.

Похоже что вот этот запрос ничего не возвращает:

    -- Subsample settings collection
    -- Get last base sample identifier of a server
    SELECT
      last_sample_id,
      subsample_enabled,
      min_query_dur,
      min_xact_dur,
      min_xact_age,
      min_idle_xact_dur
      INTO STRICT qres_subsample
    FROM servers JOIN server_subsample USING (server_id)
    WHERE server_id = sserver_id;

Так как у нас еще не настроены для всех серверов subsample.

xinferum commented 6 months ago

Изменение параметра pg_profile.subsample_enabled в конфигурационном файле postgresql.conf никак не влияет, те же ошибки при обоих значениях true и false.

xinferum commented 6 months ago

Еще в документации указано:

pg_profile.min_idle_xact_duration (integer) - idle transaction threshold Any setting of the above can be defined on a server level using the set_server_subsampling() function.

То есть тип параметра integer, но в функции:

set_server_subsampling(server name, subsample_enabled boolean, min_query_duration interval, min_xact_duration interval, min_xact_age integer, min_idle_xact_dur interval hour to second) Set subsample settings for a server.

subsample_enabled - should the take_subsample() function perform a subsample actually.
min_query_duration - query duration threshold
min_xact_duration - transaction duration threshold
min_xact_age - transaction age threshold
min_idle_xact_dur - idle transaction threshold

Параметр min_idle_xact_dur уже имеет тип interval hour to second и тип interval указан в функции в базе. Так же сама таблица в которую прописываются параметры:

CREATE TABLE profile.server_subsample (
    server_id int4 NOT NULL,
    subsample_enabled bool DEFAULT true NOT NULL,
    min_query_dur interval hour to second NULL,
    min_xact_dur interval hour to second NULL,
    min_xact_age int8 NULL,
    min_idle_xact_dur interval hour to second NULL,
    CONSTRAINT pk_server_subsample PRIMARY KEY (server_id),
    CONSTRAINT fk_server_subsample_server FOREIGN KEY (server_id) REFERENCES profile.servers(server_id) ON DELETE CASCADE
);

Тоже тип interval.

Делаю попытку прописать серверу настройки для subsample:

=# select profile.set_server_subsampling('server-name.domain', true, '120s', '120s', 1000000, '3600s');
ERROR:  42703: column "min_wait_dur" of relation "server_subsample" does not exist
СТРОКА 8:       min_wait_dur
                ^
ЗАПРОС:  INSERT INTO server_subsample(
      server_id,
      subsample_enabled,
      min_query_dur,
      min_xact_dur,
      min_xact_age,
      min_idle_xact_dur,
      min_wait_dur
    )
    SELECT
      s.server_id,
      set_server_subsampling.subsample_enabled,
      set_server_subsampling.min_query_duration,
      set_server_subsampling.min_xact_duration,
      set_server_subsampling.min_xact_age,
      set_server_subsampling.min_idle_xact_dur,
      NULL
    FROM servers s
    WHERE server_name = set_server_subsampling.server
    ON CONFLICT (server_id) DO
    UPDATE SET
      (subsample_enabled, min_query_dur, min_xact_dur, min_xact_age,
       min_idle_xact_dur, min_wait_dur) =
      (
        COALESCE(EXCLUDED.subsample_enabled,server_subsample.subsample_enabled),
        COALESCE(EXCLUDED.min_query_dur,server_subsample.min_query_dur),
        COALESCE(EXCLUDED.min_xact_dur,server_subsample.min_xact_dur),
        COALESCE(EXCLUDED.min_xact_age,server_subsample.min_xact_age),
        COALESCE(EXCLUDED.min_idle_xact_dur,server_subsample.min_idle_xact_dur),
        COALESCE(EXCLUDED.min_lock_dur,server_subsample.min_wait_dur)
      )
КОНТЕКСТ:  PL/pgSQL function set_server_subsampling(name,boolean,interval,interval,integer,interval) line 5 at SQL statement
ПОЛОЖЕНИЕ:  checkInsertTargets, parse_target.c:1066
Время: 1,988 мс
zubkov-andrei commented 5 months ago

Прошу прощения за долгий ответ. Причиной проблемы является ошибка в скрипте обновления. Сегодня я заменю пакет в релизе. Для восстановления работоспособнеости существующие сервера должны быть упомянуты в server_subsample, починиться должно запросом:

INSERT INTO server_subsample(server_id) SELECT server_id FROM servers;
xinferum commented 5 months ago

Спасибо! Будем ждать. Мы когда проблему обнаружили, на бекап откатились, пока 4.5 версию используем.

zubkov-andrei commented 5 months ago

@xinferum, большое спасибо за обнаруженную ошибку. Я перевыпустил релиз, прошу вас проверить работоспособность после обновления еще раз. На этот раз должно работать. В документацию тоже внёс исправления, там, конечно, должен быть интервал - речь идёт о продолжительности во времени.

xinferum commented 2 weeks ago

Добрый день.

Извиняюсь за долгое отсутствие ответа - откатили обновление и на время отложили этот вопрос. Сегодня обновил заново - на версии 4.6 все заработало, семплы снимаются, спасибо! Так же в прошлый раз у нас вся pg_profile лопатилась несколько часов, а в этот раз менее секунды ушло на обновления расширения.

Так же обновил следом версию на 4.7, на ней тоже все работает, семплы и отчеты снимаются, будем наблюдать.

Закрываю issue.