From 13ef7737227a07efa0d604d0e11a33cd08e926d2 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Mon, 12 Nov 2018 07:25:28 +0100 Subject: [PATCH] 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". --- include/proto/log.h | 2 ++ include/types/stats.h | 1 + src/log.c | 7 ++++++- src/stats.c | 2 ++ 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/include/proto/log.h b/include/proto/log.h index b994470dd..30d4dce7f 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 2cb23bfdc..75250447e 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 24e4c3ff0..3434550a3 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 @@ void __send_log(struct proxy *p, int level, char *message, size_t size, char *sd 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 78342cde7..07a5ef74e 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; }