diff --git a/include/proto/dumpstats.h b/include/proto/dumpstats.h index 04f9e7e54..a162e69f6 100644 --- a/include/proto/dumpstats.h +++ b/include/proto/dumpstats.h @@ -395,6 +395,8 @@ int stats_fill_info(struct field *info, int len); int stats_fill_fe_stats(struct proxy *px, struct field *stats, int len); int stats_fill_li_stats(struct proxy *px, struct listener *l, int flags, struct field *stats, int len); +int stats_fill_sv_stats(struct proxy *px, struct server *sv, int flags, + struct field *stats, int len); extern struct applet http_stats_applet; diff --git a/src/dumpstats.c b/src/dumpstats.c index e978607bb..10b9cd31d 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -4088,19 +4088,26 @@ static const char *srv_hlt_st[SRV_STATS_STATE_COUNT] = { [SRV_STATS_STATE_NO_CHECK] = "no check" }; -/* Dumps a line for server and proxy to the trash and uses the state - * from stream interface , stats flags , and server state . - * The caller is responsible for clearing the trash if needed. Returns non-zero - * if it emits anything, zero otherwise. +/* Fill with the server statistics. is + * preallocated array of length . The length of the array + * must be at least ST_F_TOTAL_FIELDS. If this length is less + * then this value, the function returns 0, otherwise, it + * returns 1. can take the value ST_SHLGNDS. */ -static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, int flags, struct server *sv) +int stats_fill_sv_stats(struct proxy *px, struct server *sv, int flags, + struct field *stats, int len) { - struct appctx *appctx = __objt_appctx(si->end); struct server *via, *ref; char str[INET6_ADDRSTRLEN]; struct chunk *out = get_trash_chunk(); enum srv_stats_state state; char *fld_status; + + if (len < ST_F_TOTAL_FIELDS) + return 0; + + memset(stats, 0, sizeof(*stats) * len); + /* we have "via" which is the tracked server as described in the configuration, * and "ref" which is the checked server and the end of the chain. */ @@ -4151,7 +4158,6 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in } chunk_reset(out); - memset(&stats, 0, sizeof(stats)); stats[ST_F_PXNAME] = mkf_str(FO_KEY|FN_NAME|FS_SERVICE, px->id); stats[ST_F_SVNAME] = mkf_str(FO_KEY|FN_NAME|FS_SERVICE, sv->id); @@ -4314,6 +4320,21 @@ static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, in stats[ST_F_COOKIE] = mkf_str(FO_CONFIG|FN_NAME|FS_SERVICE, sv->cookie); } + return 1; +} + +/* Dumps a line for server and proxy to the trash and uses the state + * from stream interface , stats flags , and server state . + * The caller is responsible for clearing the trash if needed. Returns non-zero + * if it emits anything, zero otherwise. + */ +static int stats_dump_sv_stats(struct stream_interface *si, struct proxy *px, int flags, struct server *sv) +{ + struct appctx *appctx = __objt_appctx(si->end); + + if (!stats_fill_sv_stats(px, sv, flags, stats, ST_F_TOTAL_FIELDS)) + return 0; + return stats_dump_one_line(stats, flags, px, appctx); }