/* A global buffer used to store all startup alerts/warnings. It will then be
* retrieve on the CLI. */
struct ring *startup_logs = NULL;
+uint tot_warnings = 0;
#ifdef USE_SHM_OPEN
static struct ring *shm_startup_logs = NULL;
#endif
va_list argp;
warned |= WARN_ANY;
+ HA_ATOMIC_INC(&tot_warnings);
if (!(global.mode & MODE_QUIET) || (global.mode & MODE_VERBOSE) ||
!(global.mode & MODE_STARTING)) {
[INF_CUM_LOG_MSGS] = { .name = "CumRecvLogs", .desc = "Total number of log messages received by log-forwarding listeners on this worker process since started" },
[INF_BUILD_INFO] = { .name = "Build info", .desc = "Build info" },
[INF_TAINTED] = { .name = "Tainted", .desc = "Experimental features used" },
+ [INF_WARNINGS] = { .name = "TotalWarnings", .desc = "Total warnings issued" },
};
const struct name_desc stat_fields[ST_F_TOTAL_FIELDS] = {
"<h3>> General process information</h3>\n"
"<table border=0><tr><td align=\"left\" nowrap width=\"1%%\">\n"
"<p><b>pid = </b> %d (process #%d, nbproc = %d, nbthread = %d)<br>\n"
- "<b>uptime = </b> %dd %dh%02dm%02ds<br>\n"
+ "<b>uptime = </b> %dd %dh%02dm%02ds; warnings = %u<br>\n"
"<b>system limits:</b> memmax = %s%s; ulimit-n = %d<br>\n"
"<b>maxsock = </b> %d; <b>maxconn = </b> %d; <b>maxpipes = </b> %d<br>\n"
"current conns = %d; current pipes = %d/%d; conn rate = %d/sec; bit rate = %.3f %cbps<br>\n"
pid, 1, 1, global.nbthread,
up / 86400, (up % 86400) / 3600,
(up % 3600) / 60, (up % 60),
+ HA_ATOMIC_LOAD(&tot_warnings),
global.rlimit_memmax ? ultoa(global.rlimit_memmax) : "unlimited",
global.rlimit_memmax ? " MB" : "",
global.rlimit_nofile,
info[INF_CUM_LOG_MSGS] = mkf_u32(FN_COUNTER, cum_log_messages);
info[INF_TAINTED] = mkf_str(FO_STATUS, chunk_newstr(out));
+ info[INF_WARNINGS] = mkf_u32(FN_COUNTER, HA_ATOMIC_LOAD(&tot_warnings));
chunk_appendf(out, "%#x", get_tainted());
return 1;