diff --git a/include/haproxy/global-t.h b/include/haproxy/global-t.h index 677d98f51..8acba890b 100644 --- a/include/haproxy/global-t.h +++ b/include/haproxy/global-t.h @@ -109,6 +109,7 @@ struct global { struct freq_ctr comp_bps_out; /* bytes per second, after http compression */ struct freq_ctr out_32bps; /* #of 32-byte blocks emitted per second */ unsigned long long out_bytes; /* total #of bytes emitted */ + unsigned long long spliced_out_bytes; /* total #of bytes emitted though a kernel pipe */ int cps_lim, cps_max; int sps_lim, sps_max; int ssl_lim, ssl_max; diff --git a/include/haproxy/stats-t.h b/include/haproxy/stats-t.h index 01c399d88..baf2fac5d 100644 --- a/include/haproxy/stats-t.h +++ b/include/haproxy/stats-t.h @@ -314,6 +314,7 @@ enum info_field { INF_BUSY_POLLING, INF_FAILED_RESOLUTIONS, INF_TOTAL_BYTES_OUT, + INF_TOTAL_SPLICED_BYTES_OUT, INF_BYTES_OUT_RATE, INF_DEBUG_COMMANDS_ISSUED, diff --git a/src/raw_sock.c b/src/raw_sock.c index 2d31b1851..1900a5c4a 100644 --- a/src/raw_sock.c +++ b/src/raw_sock.c @@ -154,6 +154,7 @@ int raw_sock_to_pipe(struct connection *conn, void *xprt_ctx, struct pipe *pipe, * limited to 4GB and that it's not enough per second. */ _HA_ATOMIC_ADD(&global.out_bytes, retval); + _HA_ATOMIC_ADD(&global.spliced_out_bytes, retval); update_freq_ctr(&global.out_32bps, (retval + 16) / 32); } return retval; diff --git a/src/stats.c b/src/stats.c index 1a453c398..e8ea831a7 100644 --- a/src/stats.c +++ b/src/stats.c @@ -144,6 +144,7 @@ const struct name_desc info_fields[INF_TOTAL_FIELDS] = { [INF_BUSY_POLLING] = { .name = "BusyPolling", .desc = "1 if busy-polling is currently in use on the worker process, otherwise zero (config.busy-polling)" }, [INF_FAILED_RESOLUTIONS] = { .name = "FailedResolutions", .desc = "Total number of failed DNS resolutions in current worker process since started" }, [INF_TOTAL_BYTES_OUT] = { .name = "TotalBytesOut", .desc = "Total number of bytes emitted by current worker process since started" }, + [INF_TOTAL_SPLICED_BYTES_OUT] = { .name = "TotalSplicdedBytesOut", .desc = "Total number of bytes emitted by current worker process through a kernel pipe since started" }, [INF_BYTES_OUT_RATE] = { .name = "BytesOutRate", .desc = "Number of bytes emitted by current worker process over the last second" }, [INF_DEBUG_COMMANDS_ISSUED] = { .name = "DebugCommandsIssued", .desc = "Number of debug commands issued on this process (anything > 0 is unsafe)" }, }; @@ -3519,6 +3520,7 @@ int stats_fill_info(struct field *info, int len) info[INF_BUSY_POLLING] = mkf_u32(0, !!(global.tune.options & GTUNE_BUSY_POLLING)); info[INF_FAILED_RESOLUTIONS] = mkf_u32(0, dns_failed_resolutions); info[INF_TOTAL_BYTES_OUT] = mkf_u64(0, global.out_bytes); + info[INF_TOTAL_SPLICED_BYTES_OUT] = mkf_u64(0, global.spliced_out_bytes); info[INF_BYTES_OUT_RATE] = mkf_u64(FN_RATE, (unsigned long long)read_freq_ctr(&global.out_32bps) * 32); info[INF_DEBUG_COMMANDS_ISSUED] = mkf_u32(0, debug_commands_issued);