repmgr: add --csv output to "cluster event"

Implements GitHub #471.
This commit is contained in:
Ian Barwick
2018-07-13 11:19:12 +09:00
parent 388ac2f392
commit b3f64987cb
4 changed files with 101 additions and 53 deletions

33
HISTORY
View File

@@ -1,34 +1,35 @@
4.1.0 2018-??-?? 4.1.0 2018-??-??
repmgr: change default log_level to INFO, add documentation; GitHub #470 (Ian) repmgr: change default log_level to INFO, add documentation; GitHub #470 (Ian)
repmgr: add "--missing-slots" check to "repmgr node check" (Ian) repmgr: add "--missing-slots" check to "repmgr node check" (Ian)
repmgr: improve command line error handling; GitHub #464 (Ian) repmgr: improve command line error handling; GitHub #464 (Ian)
repmgr: fix "standby register --wait-sync" when no timeout provided (Ian) repmgr: fix "standby register --wait-sync" when no timeout provided (Ian)
repmgr: "cluster show" returns non-zero value if an issue encountered; repmgr: "cluster show" returns non-zero value if an issue encountered;
GitHub #456 (Ian) GitHub #456 (Ian)
repmgr: "node check" and "node status" returns non-zero value if an issue repmgr: "node check" and "node status" returns non-zero value if an issue
encountered (Ian) encountered (Ian)
repmgr: add CSV output mode to "cluster event"; GitHub #471 (Ian)
repmgr: "node status" returns non-zero value if an issue encountered (Ian) repmgr: "node status" returns non-zero value if an issue encountered (Ian)
repmgrd: create a PID file by default; GitHub #457 (Ian) repmgrd: create a PID file by default; GitHub #457 (Ian)
repmgrd: daemonize process by default; GitHub #458 (Ian) repmgrd: daemonize process by default; GitHub #458 (Ian)
4.0.6 2018-06-14 4.0.6 2018-06-14
repmgr: (witness register) prevent registration of a witness server with the repmgr: (witness register) prevent registration of a witness server with the
same name as an existing node (Ian) same name as an existing node (Ian)
repmgr: (standby follow) check node has actually connected to new primary repmgr: (standby follow) check node has actually connected to new primary
before reporting success; GitHub #444 (Ian) before reporting success; GitHub #444 (Ian)
repmgr: (standby clone) improve handling of external configuration file copying, repmgr: (standby clone) improve handling of external configuration file copying,
including consideration in --dry-run check; GitHub #443 (Ian) including consideration in --dry-run check; GitHub #443 (Ian)
repmgr: (standby clone) don't require presence of "user" parameter in repmgr: (standby clone) don't require presence of "user" parameter in
conninfo string; GitHub #437 (Ian) conninfo string; GitHub #437 (Ian)
repmgr: (standby clone) improve documentation of --recovery-conf-only repmgr: (standby clone) improve documentation of --recovery-conf-only
mode; GitHub #438 (Ian) mode; GitHub #438 (Ian)
repmgr: (node rejoin) fix bug when parsing --config-files parameter; repmgr: (node rejoin) fix bug when parsing --config-files parameter;
GitHub #442 (Ian) GitHub #442 (Ian)
repmgr: when using --dry-run, force log level to INFO to ensure output repmgr: when using --dry-run, force log level to INFO to ensure output
will always be displayed; GitHub #441 (Ian) will always be displayed; GitHub #441 (Ian)
repmgr: (cluster matrix/crosscheck) return non-zero exit code if node repmgr: (cluster matrix/crosscheck) return non-zero exit code if node
connection issues detected; GitHub #447 (Ian) connection issues detected; GitHub #447 (Ian)
repmgrd: ensure local node is counted as quorum member; GitHub #439 (Ian) repmgrd: ensure local node is counted as quorum member; GitHub #439 (Ian)
4.0.5 2018-05-02 4.0.5 2018-05-02
repmgr: poll demoted primary after restart as a standby during a repmgr: poll demoted primary after restart as a standby during a

View File

@@ -68,14 +68,21 @@
<listitem> <listitem>
<para> <para>
<command><link linkend="repmgr-cluster-show">repmgr cluster-show</link></command>, <command><link linkend="repmgr-cluster-show">repmgr cluster show</link></command>,
<command><link linkend="repmgr-node-check">repmgr node check</link></command> and <command><link linkend="repmgr-node-check">repmgr node check</link></command> and
<command><link linkend="repmgr-node-status">repmgr node status</link></command> <command><link linkend="repmgr-node-status">repmgr node status</link></command>
return non-zero exit code if node status issues detected. (GitHub #456). return non-zero exit code if node status issues detected. (GitHub #456).
</para> </para>
</listitem> </listitem>
<listitem>
<para>
Add <option>--csv</option> output option for
<command><link linkend="repmgr-cluster-event">repmgr cluster event</link></command>.
(GitHub #471).
</para>
</listitem>
</itemizedlist> </itemizedlist>
</para> </para>
</sect2> </sect2>

View File

@@ -49,6 +49,22 @@
</para> </para>
</refsect1> </refsect1>
<refsect1>
<title>Output format</title>
<para>
<itemizedlist spacing="compact" mark="bullet">
<listitem>
<simpara>
<literal>--csv</literal>: generate output in CSV format. Note that the <literal>Details</literal>
column will currently not be emitted in CSV format.
</simpara>
</listitem>
</itemizedlist>
</para>
</refsect1>
<refsect1> <refsect1>
<title>Example</title> <title>Example</title>
<para> <para>

View File

@@ -463,6 +463,7 @@ do_cluster_show(void)
* --all * --all
* --node-[id|name] * --node-[id|name]
* --event * --event
* --csv
*/ */
void void
@@ -507,8 +508,12 @@ do_cluster_event(void)
strncpy(headers_event[EV_TIMESTAMP].title, _("Timestamp"), MAXLEN); strncpy(headers_event[EV_TIMESTAMP].title, _("Timestamp"), MAXLEN);
strncpy(headers_event[EV_DETAILS].title, _("Details"), MAXLEN); strncpy(headers_event[EV_DETAILS].title, _("Details"), MAXLEN);
/* if --terse provided, simply omit the "Details" column */ /*
if (runtime_options.terse == true) * If --terse or --csv provided, simply omit the "Details" column.
* In --csv mode we'd need to quote/escape the contents "Details" column,
* which is doable but which will remain a TODO for now.
*/
if (runtime_options.terse == true || runtime_options.output_mode == OM_CSV)
column_count --; column_count --;
for (i = 0; i < column_count; i++) for (i = 0; i < column_count; i++)
@@ -531,47 +536,64 @@ do_cluster_event(void)
} }
for (i = 0; i < column_count; i++) if (runtime_options.output_mode == OM_TEXT)
{ {
if (i == 0) for (i = 0; i < column_count; i++)
printf(" "); {
else if (i == 0)
printf(" | "); printf(" ");
else
printf(" | ");
printf("%-*s", printf("%-*s",
headers_event[i].max_length, headers_event[i].max_length,
headers_event[i].title); headers_event[i].title);
}
printf("\n");
printf("-");
for (i = 0; i < column_count; i++)
{
int j;
for (j = 0; j < headers_event[i].max_length; j++)
printf("-");
if (i < (column_count - 1))
printf("-+-");
else
printf("-");
}
printf("\n");
} }
printf("\n");
printf("-");
for (i = 0; i < column_count; i++)
{
int j;
for (j = 0; j < headers_event[i].max_length; j++)
printf("-");
if (i < (column_count - 1))
printf("-+-");
else
printf("-");
}
printf("\n");
for (i = 0; i < PQntuples(res); i++) for (i = 0; i < PQntuples(res); i++)
{ {
int j; int j;
printf(" "); if (runtime_options.output_mode == OM_CSV)
for (j = 0; j < column_count; j++)
{ {
printf("%-*s", for (j = 0; j < column_count; j++)
headers_event[j].max_length, {
PQgetvalue(res, i, j)); printf("%s", PQgetvalue(res, i, j));
if ((j + 1) < column_count)
{
printf(",");
}
}
}
else
{
printf(" ");
for (j = 0; j < column_count; j++)
{
printf("%-*s",
headers_event[j].max_length,
PQgetvalue(res, i, j));
if (j < (column_count - 1)) if (j < (column_count - 1))
printf(" | "); printf(" | ");
}
} }
printf("\n"); printf("\n");
@@ -581,7 +603,8 @@ do_cluster_event(void)
PQfinish(conn); PQfinish(conn);
puts(""); if (runtime_options.output_mode == OM_TEXT)
puts("");
} }
@@ -1414,6 +1437,7 @@ do_cluster_help(void)
printf(_(" --event filter specific event\n")); printf(_(" --event filter specific event\n"));
printf(_(" --node-id restrict entries to node with this ID\n")); printf(_(" --node-id restrict entries to node with this ID\n"));
printf(_(" --node-name restrict entries to node with this name\n")); printf(_(" --node-name restrict entries to node with this name\n"));
printf(_(" --csv emit output as CSV\n"));
puts(""); puts("");
printf(_("CLUSTER CLEANUP\n")); printf(_("CLUSTER CLEANUP\n"));