MINOR: mworker/cli: add 'debug' to 'show proc'

This patch adds a 'debug' parameter to the 'show proc' command of the
master CLI. It allows to show debug details about the processes.

Example:

echo 'show proc debug' | socat /tmp/master.sock -
\#<PID>          <type>          <reloads>       <uptime>        <version>      		<ipc_fd[0]>     <ipc_fd[1]>
391999          master          0 [failed: 0]   0d00h00m02s     3.1-dev10-b9095a-63		5               6
\# workers
392001          worker          0               0d00h00m02s     3.1-dev10-b9095a-63		3               -1
\# programs
This commit is contained in:
William Lallemand 2024-10-24 14:18:30 +02:00
parent 362de90f3e
commit 84640aaa2a
2 changed files with 42 additions and 5 deletions

View File

@ -4314,7 +4314,7 @@ reload
Note that a reload will close all connections to the master CLI. Note that a reload will close all connections to the master CLI.
See also the "hard-reload" command. See also the "hard-reload" command.
show proc show proc [debug]
The master CLI introduces a 'show proc' command to surpervise the The master CLI introduces a 'show proc' command to surpervise the
processe. processe.
@ -4335,6 +4335,10 @@ show proc
worker is still running and survived 3 reloads. You could access the CLI of worker is still running and survived 3 reloads. You could access the CLI of
this worker to understand what's going on. this worker to understand what's going on.
The 'debug' parameter is useful to show debug details, it currently shows the
FDs for IPC communication. Note that the debug output is not guaranteed to be
stable between haproxy versions.
show startup-logs show startup-logs
HAProxy needs to be compiled with USE_SHM_OPEN=1 to be used correctly on the HAProxy needs to be compiled with USE_SHM_OPEN=1 to be used correctly on the
master CLI or all messages won't be visible. master CLI or all messages won't be visible.

View File

@ -586,6 +586,9 @@ void mworker_cleanup_proc()
} }
} }
struct cli_showproc_ctx {
int debug;
};
/* Displays workers and processes */ /* Displays workers and processes */
static int cli_io_handler_show_proc(struct appctx *appctx) static int cli_io_handler_show_proc(struct appctx *appctx)
@ -593,6 +596,7 @@ static int cli_io_handler_show_proc(struct appctx *appctx)
struct mworker_proc *child; struct mworker_proc *child;
int old = 0; int old = 0;
int up = date.tv_sec - proc_self->timestamp; int up = date.tv_sec - proc_self->timestamp;
struct cli_showproc_ctx *ctx = appctx->svcctx;
char *uptime = NULL; char *uptime = NULL;
char *reloadtxt = NULL; char *reloadtxt = NULL;
@ -602,9 +606,15 @@ static int cli_io_handler_show_proc(struct appctx *appctx)
chunk_reset(&trash); chunk_reset(&trash);
memprintf(&reloadtxt, "%d [failed: %d]", proc_self->reloads, proc_self->failedreloads); memprintf(&reloadtxt, "%d [failed: %d]", proc_self->reloads, proc_self->failedreloads);
chunk_printf(&trash, "#%-14s %-15s %-15s %-15s %-15s\n", "<PID>", "<type>", "<reloads>", "<uptime>", "<version>"); chunk_printf(&trash, "#%-14s %-15s %-15s %-15s %-15s", "<PID>", "<type>", "<reloads>", "<uptime>", "<version>");
if (ctx->debug)
chunk_appendf(&trash, "\t\t %-15s %-15s", "<ipc_fd[0]>", "<ipc_fd[1]>");
chunk_appendf(&trash, "\n");
memprintf(&uptime, "%dd%02dh%02dm%02ds", up / 86400, (up % 86400) / 3600, (up % 3600) / 60, (up % 60)); memprintf(&uptime, "%dd%02dh%02dm%02ds", up / 86400, (up % 86400) / 3600, (up % 3600) / 60, (up % 60));
chunk_appendf(&trash, "%-15u %-15s %-15s %-15s %-15s\n", (unsigned int)getpid(), "master", reloadtxt, uptime, haproxy_version); chunk_appendf(&trash, "%-15u %-15s %-15s %-15s %-15s", (unsigned int)getpid(), "master", reloadtxt, uptime, haproxy_version);
if (ctx->debug)
chunk_appendf(&trash, "\t\t %-15d %-15d", proc_self->ipc_fd[0], proc_self->ipc_fd[1]);
chunk_appendf(&trash, "\n");
ha_free(&reloadtxt); ha_free(&reloadtxt);
ha_free(&uptime); ha_free(&uptime);
@ -624,7 +634,10 @@ static int cli_io_handler_show_proc(struct appctx *appctx)
continue; continue;
} }
memprintf(&uptime, "%dd%02dh%02dm%02ds", up / 86400, (up % 86400) / 3600, (up % 3600) / 60, (up % 60)); memprintf(&uptime, "%dd%02dh%02dm%02ds", up / 86400, (up % 86400) / 3600, (up % 3600) / 60, (up % 60));
chunk_appendf(&trash, "%-15u %-15s %-15d %-15s %-15s\n", child->pid, "worker", child->reloads, uptime, child->version); chunk_appendf(&trash, "%-15u %-15s %-15d %-15s %-15s", child->pid, "worker", child->reloads, uptime, child->version);
if (ctx->debug)
chunk_appendf(&trash, "\t\t %-15d %-15d", child->ipc_fd[0], child->ipc_fd[1]);
chunk_appendf(&trash, "\n");
ha_free(&uptime); ha_free(&uptime);
} }
@ -697,6 +710,26 @@ static int cli_io_handler_show_proc(struct appctx *appctx)
/* dump complete */ /* dump complete */
return 1; return 1;
} }
/* reload the master process */
static int cli_parse_show_proc(char **args, char *payload, struct appctx *appctx, void *private)
{
struct cli_showproc_ctx *ctx;
ctx = applet_reserve_svcctx(appctx, sizeof(*ctx));
if (!cli_has_level(appctx, ACCESS_LVL_OPER))
return 1;
if (*args[2]) {
if (strcmp(args[2], "debug") == 0)
ctx->debug = 1;
else
return cli_err(appctx, "'show proc' only supports 'debug' as argument\n");
}
return 0;
}
/* reload the master process */ /* reload the master process */
static int cli_parse_reload(char **args, char *payload, struct appctx *appctx, void *private) static int cli_parse_reload(char **args, char *payload, struct appctx *appctx, void *private)
@ -900,7 +933,7 @@ static struct cli_kw_list cli_kws = {{ },{
{ { "@<relative pid>", NULL }, "@<relative pid> : send a command to the <relative pid> process", NULL, cli_io_handler_show_proc, NULL, NULL, ACCESS_MASTER_ONLY}, { { "@<relative pid>", NULL }, "@<relative pid> : send a command to the <relative pid> process", NULL, cli_io_handler_show_proc, NULL, NULL, ACCESS_MASTER_ONLY},
{ { "@!<pid>", NULL }, "@!<pid> : send a command to the <pid> process", cli_parse_default, NULL, NULL, NULL, ACCESS_MASTER_ONLY}, { { "@!<pid>", NULL }, "@!<pid> : send a command to the <pid> process", cli_parse_default, NULL, NULL, NULL, ACCESS_MASTER_ONLY},
{ { "@master", NULL }, "@master : send a command to the master process", cli_parse_default, NULL, NULL, NULL, ACCESS_MASTER_ONLY}, { { "@master", NULL }, "@master : send a command to the master process", cli_parse_default, NULL, NULL, NULL, ACCESS_MASTER_ONLY},
{ { "show", "proc", NULL }, "show proc : show processes status", cli_parse_default, cli_io_handler_show_proc, NULL, NULL, ACCESS_MASTER_ONLY}, { { "show", "proc", NULL }, "show proc : show processes status", cli_parse_show_proc, cli_io_handler_show_proc, NULL, NULL, ACCESS_MASTER_ONLY},
{ { "reload", NULL }, "reload : achieve a soft-reload (-sf) of haproxy", cli_parse_reload, NULL, NULL, NULL, ACCESS_MASTER_ONLY}, { { "reload", NULL }, "reload : achieve a soft-reload (-sf) of haproxy", cli_parse_reload, NULL, NULL, NULL, ACCESS_MASTER_ONLY},
{ { "hard-reload", NULL }, "hard-reload : achieve a hard-reload (-st) of haproxy", cli_parse_reload, NULL, NULL, NULL, ACCESS_MASTER_ONLY}, { { "hard-reload", NULL }, "hard-reload : achieve a hard-reload (-st) of haproxy", cli_parse_reload, NULL, NULL, NULL, ACCESS_MASTER_ONLY},
{ { "_loadstatus", NULL }, NULL, cli_parse_default, cli_io_handler_show_loadstatus, NULL, NULL, ACCESS_MASTER_ONLY}, { { "_loadstatus", NULL }, NULL, cli_parse_default, cli_io_handler_show_loadstatus, NULL, NULL, ACCESS_MASTER_ONLY},