From: Willy Tarreau Date: Mon, 12 Nov 2018 06:25:28 +0000 (+0100) Subject: MINOR: log: report the number of dropped logs in the stats X-Git-Tag: v1.9-dev7~139 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=13ef7737227a07efa0d604d0e11a33cd08e926d2;p=thirdparty%2Fhaproxy.git MINOR: log: report the number of dropped logs in the stats It's easy to detect when logs on some paths are lost as sendmsg() will return EAGAIN. This is particularly true when sending to /dev/log, which often doesn't support a big logging capacity. Let's keep track of these and report the total number of dropped messages in "show info". --- diff --git a/include/proto/log.h b/include/proto/log.h index b994470dd2..30d4dce7fb 100644 --- a/include/proto/log.h +++ b/include/proto/log.h @@ -46,6 +46,8 @@ extern char clf_http_log_format[]; extern char default_rfc5424_sd_log_format[]; +extern unsigned int dropped_logs; + extern THREAD_LOCAL char *logheader; extern THREAD_LOCAL char *logheader_rfc5424; extern THREAD_LOCAL char *logline; diff --git a/include/types/stats.h b/include/types/stats.h index 2cb23bfdc5..75250447ec 100644 --- a/include/types/stats.h +++ b/include/types/stats.h @@ -293,6 +293,7 @@ enum info_field { INF_LISTENERS, INF_ACTIVE_PEERS, INF_CONNECTED_PEERS, + INF_DROPPED_LOGS, /* must always be the last one */ INF_TOTAL_FIELDS diff --git a/src/log.c b/src/log.c index 24e4c3ff02..3434550a38 100644 --- a/src/log.c +++ b/src/log.c @@ -210,6 +210,9 @@ char *log_format = NULL; */ char default_rfc5424_sd_log_format[] = "- "; +/* total number of dropped logs */ +unsigned int dropped_logs = 0; + /* This is a global syslog header, common to all outgoing messages in * RFC3164 format. It begins with time-based part and is updated by * update_log_hdr(). @@ -1478,7 +1481,9 @@ send: if (sent < 0) { static char once; - if (!once) { + if (errno == EAGAIN) + HA_ATOMIC_ADD(&dropped_logs, 1); + else if (!once) { once = 1; /* note: no need for atomic ops here */ ha_alert("sendmsg() failed in logger #%d: %s (errno=%d)\n", nblogger, strerror(errno), errno); diff --git a/src/stats.c b/src/stats.c index 78342cde7f..07a5ef74ea 100644 --- a/src/stats.c +++ b/src/stats.c @@ -135,6 +135,7 @@ const char *info_field_names[INF_TOTAL_FIELDS] = { [INF_LISTENERS] = "Listeners", [INF_ACTIVE_PEERS] = "ActivePeers", [INF_CONNECTED_PEERS] = "ConnectedPeers", + [INF_DROPPED_LOGS] = "DroppedLogs", }; const char *stat_field_names[ST_F_TOTAL_FIELDS] = { @@ -3302,6 +3303,7 @@ int stats_fill_info(struct field *info, int len) info[INF_LISTENERS] = mkf_u32(0, listeners); info[INF_ACTIVE_PEERS] = mkf_u32(0, active_peers); info[INF_CONNECTED_PEERS] = mkf_u32(0, connected_peers); + info[INF_DROPPED_LOGS] = mkf_u32(0, dropped_logs); return 1; }