diff --git a/include/proto/stats.h b/include/proto/stats.h index 01c96cb23..6144d2f00 100644 --- a/include/proto/stats.h +++ b/include/proto/stats.h @@ -84,6 +84,12 @@ static inline struct field mkf_str(uint32_t type, const char *value) return f; } +static inline struct field mkf_flt(uint32_t type, double value) +{ + struct field f = { .type = FF_FLT | type, .u.flt = value }; + return f; +} + extern const char *stat_status_codes[]; /* These two structs contains all field names according with diff --git a/include/types/stats.h b/include/types/stats.h index d99d51911..b3a69c61d 100644 --- a/include/types/stats.h +++ b/include/types/stats.h @@ -198,6 +198,7 @@ enum field_format { FF_S64 = 0x00000003, FF_U64 = 0x00000004, FF_STR = 0x00000005, + FF_FLT = 0x00000006, FF_MASK = 0x000000FF, }; @@ -245,6 +246,7 @@ struct field { uint32_t u32; /* FF_U32 */ int64_t s64; /* FF_S64 */ uint64_t u64; /* FF_U64 */ + double flt; /* FF_FLT */ const char *str; /* FF_STR */ } u; }; diff --git a/src/stats.c b/src/stats.c index f44f5eef7..f280e5a71 100644 --- a/src/stats.c +++ b/src/stats.c @@ -333,6 +333,7 @@ int stats_emit_raw_data_field(struct buffer *out, const struct field *f) case FF_U32: return chunk_appendf(out, "%u", f->u.u32); case FF_S64: return chunk_appendf(out, "%lld", (long long)f->u.s64); case FF_U64: return chunk_appendf(out, "%llu", (unsigned long long)f->u.u64); + case FF_FLT: return chunk_appendf(out, "%f", f->u.flt); case FF_STR: return csv_enc_append(field_str(f, 0), 1, out) != NULL; default: return chunk_appendf(out, "[INCORRECT_FIELD_TYPE_%08x]", f->type); } @@ -350,6 +351,7 @@ int stats_emit_typed_data_field(struct buffer *out, const struct field *f) case FF_U32: return chunk_appendf(out, "u32:%u", f->u.u32); case FF_S64: return chunk_appendf(out, "s64:%lld", (long long)f->u.s64); case FF_U64: return chunk_appendf(out, "u64:%llu", (unsigned long long)f->u.u64); + case FF_FLT: return chunk_appendf(out, "flt:%f", f->u.flt); case FF_STR: return chunk_appendf(out, "str:%s", field_str(f, 0)); default: return chunk_appendf(out, "%08x:?", f->type); } @@ -389,6 +391,8 @@ int stats_emit_json_data_field(struct buffer *out, const struct field *f) type = "\"u64\""; snprintf(buf, sizeof(buf), "%llu", (unsigned long long) f->u.u64); + case FF_FLT: type = "\"flt\""; + snprintf(buf, sizeof(buf), "%f", f->u.flt); break; case FF_STR: type = "\"str\""; value = field_str(f, 0);