Revert "Add log_statement_sample_rate parameter"

This reverts commit 88bdbd3f74.

As committed, statement sampling used the existing duration threshold
(log_min_duration_statement) when decide which statements to sample.
The issue is that even the longest statements are subject to sampling,
and so may not end up logged. An improvement was proposed, introducing
a second duration threshold, but it would not be backwards compatible.
So we've decided to revert this feature - the separate threshold should
be part of the feature itself.

Discussion: https://postgr.es/m/CAFj8pRDS8tQ3Wviw9%3DAvODyUciPSrGeMhJi_WPE%2BEB8%2B4gLL-Q%40mail.gmail.com
This commit is contained in:
Tomas Vondra 2019-08-04 20:29:00 +02:00
parent 4f9ed8f3c5
commit 75506195da
5 changed files with 13 additions and 65 deletions

View File

@ -5850,13 +5850,12 @@ local0.* /var/log/postgresql
<para> <para>
Causes the duration of each completed statement to be logged Causes the duration of each completed statement to be logged
if the statement ran for at least the specified number of if the statement ran for at least the specified number of
milliseconds, modulated by <varname>log_statement_sample_rate</varname>. milliseconds. Setting this to zero prints all statement durations.
Setting this to zero prints all statement durations. Minus-one (the default) disables logging statement durations.
<literal>-1</literal> (the default) disables logging statements due to For example, if you set it to <literal>250ms</literal>
exceeding duration threshold; for example, if you set it to then all SQL statements that run 250ms or longer will be
<literal>250ms</literal>, then all SQL statements that run 250ms or logged. Enabling this parameter can be helpful in tracking down
longer will be logged. Enabling this parameter can be helpful in unoptimized queries in your applications.
tracking down unoptimized queries in your applications.
Only superusers can change this setting. Only superusers can change this setting.
</para> </para>
@ -5882,27 +5881,6 @@ local0.* /var/log/postgresql
</listitem> </listitem>
</varlistentry> </varlistentry>
<varlistentry id="guc-log-statement-sample-rate" xreflabel="log_statement_sample_rate">
<term><varname>log_statement_sample_rate</varname> (<type>real</type>)
<indexterm>
<primary><varname>log_statement_sample_rate</varname> configuration parameter</primary>
</indexterm>
</term>
<listitem>
<para>
Determines the fraction of statements that exceed
<xref linkend="guc-log-min-duration-statement"/> to be logged.
The default is <literal>1.0</literal>, meaning log all such
statements.
Setting this to zero disables logging by duration, same as setting
<varname>log_min_duration_statement</varname> to
<literal>-1</literal>.
<varname>log_statement_sample_rate</varname> is helpful when the
traffic is too high to log all queries.
</para>
</listitem>
</varlistentry>
<varlistentry id="guc-log-transaction-sample-rate" xreflabel="log_transaction_sample_rate"> <varlistentry id="guc-log-transaction-sample-rate" xreflabel="log_transaction_sample_rate">
<term><varname>log_transaction_sample_rate</varname> (<type>real</type>) <term><varname>log_transaction_sample_rate</varname> (<type>real</type>)
<indexterm> <indexterm>

View File

@ -2212,8 +2212,7 @@ check_log_statement(List *stmt_list)
/* /*
* check_log_duration * check_log_duration
* Determine whether current command's duration should be logged. * Determine whether current command's duration should be logged
* If log_statement_sample_rate < 1.0, log only a sample.
* We also check if this statement in this transaction must be logged * We also check if this statement in this transaction must be logged
* (regardless of its duration). * (regardless of its duration).
* *
@ -2237,7 +2236,6 @@ check_log_duration(char *msec_str, bool was_logged)
int usecs; int usecs;
int msecs; int msecs;
bool exceeded; bool exceeded;
bool in_sample;
TimestampDifference(GetCurrentStatementStartTimestamp(), TimestampDifference(GetCurrentStatementStartTimestamp(),
GetCurrentTimestamp(), GetCurrentTimestamp(),
@ -2254,17 +2252,7 @@ check_log_duration(char *msec_str, bool was_logged)
(secs > log_min_duration_statement / 1000 || (secs > log_min_duration_statement / 1000 ||
secs * 1000 + msecs >= log_min_duration_statement))); secs * 1000 + msecs >= log_min_duration_statement)));
/* if (exceeded || log_duration || xact_is_sampled)
* Do not log if log_statement_sample_rate = 0. Log a sample if
* log_statement_sample_rate <= 1 and avoid unecessary random() call
* if log_statement_sample_rate = 1.
*/
if (exceeded)
in_sample = log_statement_sample_rate != 0 &&
(log_statement_sample_rate == 1 ||
random() <= log_statement_sample_rate * MAX_RANDOM_VALUE);
if ((exceeded && in_sample) || log_duration || xact_is_sampled)
{ {
snprintf(msec_str, 32, "%ld.%03d", snprintf(msec_str, 32, "%ld.%03d",
secs * 1000 + msecs, usecs % 1000); secs * 1000 + msecs, usecs % 1000);

View File

@ -511,7 +511,6 @@ int log_min_messages = WARNING;
int client_min_messages = NOTICE; int client_min_messages = NOTICE;
int log_min_duration_statement = -1; int log_min_duration_statement = -1;
int log_temp_files = -1; int log_temp_files = -1;
double log_statement_sample_rate = 1.0;
double log_xact_sample_rate = 0; double log_xact_sample_rate = 0;
int trace_recovery_messages = LOG; int trace_recovery_messages = LOG;
@ -2705,8 +2704,7 @@ static struct config_int ConfigureNamesInt[] =
{"log_min_duration_statement", PGC_SUSET, LOGGING_WHEN, {"log_min_duration_statement", PGC_SUSET, LOGGING_WHEN,
gettext_noop("Sets the minimum execution time above which " gettext_noop("Sets the minimum execution time above which "
"statements will be logged."), "statements will be logged."),
gettext_noop("Zero prints all queries, subject to log_statement_sample_rate. " gettext_noop("Zero prints all queries. -1 turns this feature off."),
"-1 turns this feature off."),
GUC_UNIT_MS GUC_UNIT_MS
}, },
&log_min_duration_statement, &log_min_duration_statement,
@ -3432,17 +3430,6 @@ static struct config_real ConfigureNamesReal[] =
NULL, NULL, NULL NULL, NULL, NULL
}, },
{
{"log_statement_sample_rate", PGC_SUSET, LOGGING_WHEN,
gettext_noop("Fraction of statements exceeding log_min_duration_statement to be logged."),
gettext_noop("If you only want a sample, use a value between 0.0 (never "
"log) and 1.0 (always log).")
},
&log_statement_sample_rate,
1.0, 0.0, 1.0,
NULL, NULL, NULL
},
{ {
{"log_transaction_sample_rate", PGC_SUSET, LOGGING_WHEN, {"log_transaction_sample_rate", PGC_SUSET, LOGGING_WHEN,
gettext_noop("Set the fraction of transactions to log for new transactions."), gettext_noop("Set the fraction of transactions to log for new transactions."),

View File

@ -488,14 +488,10 @@
# fatal # fatal
# panic (effectively off) # panic (effectively off)
#log_min_duration_statement = -1 # logs statements and their durations #log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements
# according to log_statement_sample_rate. -1 is disabled, # and their durations, > 0 logs only
# 0 logs all statements, > 0 logs only statements running # statements running at least this number
# at least this number of milliseconds. # of milliseconds
#log_statement_sample_rate = 1.0 # Fraction of logged statements exceeding
# log_min_duration_statement to be logged.
# 1.0 logs all such statements, 0.0 never logs.
#log_transaction_sample_rate = 0.0 # Fraction of transactions whose statements #log_transaction_sample_rate = 0.0 # Fraction of transactions whose statements
# are logged regardless of their duration. 1.0 logs all # are logged regardless of their duration. 1.0 logs all

View File

@ -253,7 +253,6 @@ extern PGDLLIMPORT int log_min_messages;
extern PGDLLIMPORT int client_min_messages; extern PGDLLIMPORT int client_min_messages;
extern int log_min_duration_statement; extern int log_min_duration_statement;
extern int log_temp_files; extern int log_temp_files;
extern double log_statement_sample_rate;
extern double log_xact_sample_rate; extern double log_xact_sample_rate;
extern int temp_file_limit; extern int temp_file_limit;