Re: [PATCH] Add log_transaction setting - Mailing list pgsql-hackers

From Kirill Reshke
Subject Re: [PATCH] Add log_transaction setting
Date
Msg-id CALdSSPg-uOK9NsaSJHJzBc6TbMNqaCj5q8TB0fzLsEZ=45LbVA@mail.gmail.com
Whole thread Raw
In response to [PATCH] Add log_transaction setting  (Sergey Solovev <sergey.soloviev@tantorlabs.ru>)
List pgsql-hackers
On Wed, 14 Aug 2024 at 23:08, Сергей Соловьев
<sergey.soloviev@tantorlabs.ru> wrote:
>
>
>
> 10.08.2024, 16:40, "Kirill Reshke" <reshkekirill@gmail.com>:
>
> On Thu, 4 Jul 2024 at 21:46, Sergey Solovev
> <sergey.soloviev@tantorlabs.ru> wrote:
>
>
>  Hi.
>
>  We encountered a problem with excessive logging when transaction is
>  sampled.
>  When it is getting sampled every statement is logged, event SELECT. This
>  can
>  lead to performance degradation and log polluting.
>  I have added new setting to filter statements when transaction is
>  sampled - log_transaction.
>
>  Overview
>  ===================
>  This parameter works very similar to log_statement, but it filters out
>  statements only
>  in sampled transaction. It has same values as log_statement, access
>  rights (only superuser),
>  setup in postgresql.conf or by superuser with SET.
>  But by default it has value "all" in compliance with existing behaviour
>  (to log every statement).
>
>  Example usage
>  ==================
>  Log every DDL, but only subset of other statements.
>
>  postgresql.conf
>   > log_transaction = ddl
>   > log_statement = all
>   > log_transaction_sample_rate = 1
>   > log_statement_sample_rate = 0.3
>
>  backend:
>   > BEGIN;
>   > CREATE TABLE t1(value text);
>   > INSERT INTO t1(value) VALUES ('hello'), ('world');
>   > SELECT * FROM t1;
>   > DROP TABLE t1;
>   > COMMIT;
>
>  logfile:
>   > LOG: duration: 6.465 ms statement: create table t1(value text);
>   > LOG: statement: insert into t1(value) values ('hello'), ('world');
>   > LOG: duration: 6.457 ms statement: drop table t1;
>
>  As you can see CREATE and DROP were logged with duration (because it is
>  DDL), but
>  only INSERT was logged (without duration) - not SELECT.
>
>  Testing
>  ===================
>  All tests are passed - default configuration is compatible with existing
>  behaviour.
>  Honestly, I could not find any TAP/regress tests that would test logging
>  - some
>  tests only use logs to ensure test results.
>  I did not find suitable place for such tests, so no tests provided
>
>  Implementation details
>  ===================
>  I have modified signature of check_log_duration function - this accepts
>  List of
>  statements that were executed. This is to decide whether we should log
>  current statement if transaction is sampled.
>  But this list can be empty, in that case we decide to log. NIL is passed
>  only
>  in fast path, PARSE and BIND functions - by default these are logged
>  if transaction is sampled, so we are compliant with existing behaviour
>  again.
>  In first implementation version, there was boolean flag (instead of
>  List), but
>  it was replaced by List to defer determining (function call) whether it
>  is worth logging.
>
>  -------------
>  Best regards, Sergey Solovev
>
>
> Hi!
>
> As I understand, the need of this GUC variable comes from fact, that
> is the transaction is sampled for logging, all statements within this
> tx are logged and this is not configurable now, correct?
> Well, if this is the case, why should we add a new GUC? Maybe we
> should use `log_statement` in this case too, so there is a bug, that
> log_statement is honored not during tx sampling?
>
>
> Also, tests are failing[1]
>
>
> [1] https://cirrus-ci.com/task/5645711230894080
>
>
> --
> Best regards,
> Kirill Reshke
>
> Hi, Kirill!
>
> Thanks for review.
>
> Also, tests are failing[1]
>
> That is my mistake: I have tested patch on REL_17BETA2, but set 18 version, and
> it seems that I run tests without proper ./configure flags. I reproduced error and fixed
> it in new patch.
>
> As I understand, the need of this GUC variable comes from fact, that
> is the transaction is sampled for logging, all statements within this
> tx are logged and this is not configurable now, correct?
>
> Yes. That's the point - all or nothing.
>
> Well, if this is the case, why should we add a new GUC? Maybe we
> should use `log_statement` in this case too, so there is a bug, that
> log_statement is honored not during tx sampling?
>
> That can be good solution, but I proceed from possibility of flexible logging setup.
> Shown example (when all DDL statements were logged) is just one of such use cases.
> Another example is security policy: when we must log every data modification -
> set `log_transaction = mod`.

Hi Sergey!
We are still awaiting a rebase.
I moved this to the next CF, as there is little chance of being
finished within this CF.

--
Best regards,
Kirill Reshke



pgsql-hackers by date:

Previous
From: postgresql_contributors
Date:
Subject: Guidance Needed for Testing PostgreSQL Patch (CF-5044)
Next
From: Pavel Stehule
Date:
Subject: Re: how to get MAJORVERSION in meson