Add %P to log_line_prefix for parallel group leader

This is useful for monitoring purposes with log parsing.  Similarly to
pg_stat_activity, the leader's PID is shown only for active parallel
workers, minimizing the log footprint for the leaders as the equivalent
shared memory field is set as long as a backend is alive.

Author: Justin Pryzby
Reviewed-by: Álvaro Herrera, Michael Paquier, Julien Rouhaud, Tom Lane
Discussion: https://postgr.es/m/20200315111831.GA21492@telsasoft.com
This commit is contained in:
Michael Paquier 2020-08-03 13:38:48 +09:00
parent f44b9b625b
commit b8fdee7d0c
3 changed files with 47 additions and 1 deletions

View File

@ -6694,6 +6694,12 @@ local0.* /var/log/postgresql
<entry>Process ID</entry> <entry>Process ID</entry>
<entry>no</entry> <entry>no</entry>
</row> </row>
<row>
<entry><literal>%P</literal></entry>
<entry>Process ID of the parallel group leader, if this process
is a parallel query worker</entry>
<entry>no</entry>
</row>
<row> <row>
<entry><literal>%t</literal></entry> <entry><literal>%t</literal></entry>
<entry>Time stamp without milliseconds</entry> <entry>Time stamp without milliseconds</entry>
@ -7026,7 +7032,7 @@ log_line_prefix = '%m [%p] %q%u@%d/%a '
character count of the error position therein, character count of the error position therein,
location of the error in the PostgreSQL source code location of the error in the PostgreSQL source code
(if <varname>log_error_verbosity</varname> is set to <literal>verbose</literal>), (if <varname>log_error_verbosity</varname> is set to <literal>verbose</literal>),
application name, and backend type. application name, backend type, and process ID of parallel group leader.
Here is a sample table definition for storing CSV-format log output: Here is a sample table definition for storing CSV-format log output:
<programlisting> <programlisting>
@ -7056,6 +7062,7 @@ CREATE TABLE postgres_log
location text, location text,
application_name text, application_name text,
backend_type text, backend_type text,
leader_pid integer,
PRIMARY KEY (session_id, session_line_num) PRIMARY KEY (session_id, session_line_num)
); );
</programlisting> </programlisting>

View File

@ -2448,6 +2448,29 @@ log_line_prefix(StringInfo buf, ErrorData *edata)
else else
appendStringInfo(buf, "%d", MyProcPid); appendStringInfo(buf, "%d", MyProcPid);
break; break;
case 'P':
if (MyProc)
{
PGPROC *leader = MyProc->lockGroupLeader;
/*
* Show the leader only for active parallel workers. This
* leaves out the leader of a parallel group.
*/
if (leader == NULL || leader->pid == MyProcPid)
appendStringInfoSpaces(buf,
padding > 0 ? padding : -padding);
else if (padding != 0)
appendStringInfo(buf, "%*d", padding, leader->pid);
else
appendStringInfo(buf, "%d", leader->pid);
}
else if (padding != 0)
appendStringInfoSpaces(buf,
padding > 0 ? padding : -padding);
break;
case 'l': case 'l':
if (padding != 0) if (padding != 0)
appendStringInfo(buf, "%*ld", padding, log_line_number); appendStringInfo(buf, "%*ld", padding, log_line_number);
@ -2836,6 +2859,21 @@ write_csvlog(ErrorData *edata)
else else
appendCSVLiteral(&buf, GetBackendTypeDesc(MyBackendType)); appendCSVLiteral(&buf, GetBackendTypeDesc(MyBackendType));
appendStringInfoChar(&buf, ',');
/* leader PID */
if (MyProc)
{
PGPROC *leader = MyProc->lockGroupLeader;
/*
* Show the leader only for active parallel workers. This leaves out
* the leader of a parallel group.
*/
if (leader && leader->pid != MyProcPid)
appendStringInfo(&buf, "%d", leader->pid);
}
appendStringInfoChar(&buf, '\n'); appendStringInfoChar(&buf, '\n');
/* If in the syslogger process, try to write messages direct to file */ /* If in the syslogger process, try to write messages direct to file */

View File

@ -537,6 +537,7 @@
# %h = remote host # %h = remote host
# %b = backend type # %b = backend type
# %p = process ID # %p = process ID
# %P = process ID of parallel group leader
# %t = timestamp without milliseconds # %t = timestamp without milliseconds
# %m = timestamp with milliseconds # %m = timestamp with milliseconds
# %n = timestamp with milliseconds (as a Unix epoch) # %n = timestamp with milliseconds (as a Unix epoch)