Re: New GUC to sample log queries

Adrien NAYRAT <adrien.nayrat@anayrat.info>

From: Adrien Nayrat <adrien.nayrat@anayrat.info>
To: Vik Fearing <vik.fearing@2ndquadrant.com>, Michael Paquier <michael@paquier.xyz>
Cc: David Rowley <david.rowley@2ndquadrant.com>, PostgreSQL mailing lists <pgsql-hackers@postgresql.org>
Date: 2018-06-27T21:13:34Z
Lists: pgsql-hackers
On 06/24/2018 08:41 PM, Vik Fearing wrote:
> On 24/06/18 13:22, Adrien Nayrat wrote:
>> Attached third version of the patch with documentation.
> 
> Hi.  I'm reviewing this.

Hi, thanks for your review.

> 
>>  		exceeded = (log_min_duration_statement == 0 ||
>>  					(log_min_duration_statement > 0 &&
>>  					 (secs > log_min_duration_statement / 1000 ||
>> -					  secs * 1000 + msecs >= log_min_duration_statement)));
>> +					  secs * 1000 + msecs >= log_min_duration_statement))) &&
>> +				   log_sample_rate != 0 && (log_sample_rate == 1 ||
>> +				   random() <= log_sample_rate * MAX_RANDOM_VALUE);
> 
> A few notes on this part, which is the crux of the patch.
> 
> 1) Is there an off-by-one error here?  drandom() has the formula
> 
>     (double) random() / ((double) MAX_RANDOM_VALUE + 1)
> 
> but yours doesn't look like that.

I don't think there is an error. random() function return a long int between 0
and MAX_RANDOM_VALUE.

> 
> 2) I think the whole thing should be separated into its own expression
> instead of tagging along on an already hard to read expression.

+1

> 
> 3) Is it intentional to only sample with log_min_duration_statement and
> not also with log_duration?  It seems like it should affect both.  In
> both cases, the name is too generic.  Something called "log_sample_rate"
> should sample **everything**.

I do not think it could be useful to sample other case such as log_duration.

But yes, the GUC is confusing and I am not comfortable to introduce a new GUC in
my initial patch.

Maybe we should adapt current GUC with something like :

log_min_duration_statement = <time>,<sample rate>

This give :

log_min_duration_statement = 0,0.1

Equivalent to :
log_min_duration_statement = 0
log_sample_rate = 0.1

Thought?

> 
> Otherwise I think it's good.  Attached is a revised patch that fixes 2)
> as well as some wordsmithing throughout.  It does not deal with the
> other issues I raised.

Thanks for your corrections.

--
Adrien

Commits

  1. Use pg_strong_random() to select each server process's random seed.

  2. Use a separate random seed for SQL random()/setseed() functions.

  3. Marginal performance hacking in erand48.c.

  4. Fix latent problem with pg_jrand48().

  5. Silence compiler warning

  6. Add log_statement_sample_rate parameter