From bcc3143e62d1351107e7ece8b101a0a8547f3c2f Mon Sep 17 00:00:00 2001 From: "Costa Tsaousis (ktsaou)" Date: Sun, 5 Jun 2016 23:26:27 +0300 Subject: [PATCH] allow decimal precision in badges to be given at the url --- src/web_buffer_svg.c | 8 ++++++-- src/web_buffer_svg.h | 2 +- src/web_client.c | 19 +++++++++++-------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/web_buffer_svg.c b/src/web_buffer_svg.c index 27416b44..910646fc 100644 --- a/src/web_buffer_svg.c +++ b/src/web_buffer_svg.c @@ -503,7 +503,7 @@ static inline void calc_colorz(const char *color, char *final, size_t len, calcu strncpyz(final, b, len); } -void buffer_svg(BUFFER *wb, const char *label, calculated_number value, const char *units, const char *label_color, const char *value_color, int value_is_null) { +void buffer_svg(BUFFER *wb, const char *label, calculated_number value, const char *units, const char *label_color, const char *value_color, int value_is_null, int precision) { char label_buffer[256 + 1], value_string[512 + 1], value_color_buffer[256 + 1]; char label_escaped[256 + 1], value_escaped[512 + 1], label_color_escaped[256 + 1], value_color_escaped[256 + 1]; int label_width, value_width, total_width; @@ -519,7 +519,7 @@ void buffer_svg(BUFFER *wb, const char *label, calculated_number value, const ch if(value_is_null) strcpy(value_string, "-"); - else { + else if(precision < 0) { calculated_number abs = (value < (calculated_number)0)?-value:value; if(abs > (calculated_number)1000.0) snprintfz(value_string, 512, "%0.0Lf%s%s", (long double)value, separator, units); else if(abs > (calculated_number)100.0) snprintfz(value_string, 512, "%0.1Lf%s%s", (long double)value, separator, units); @@ -527,6 +527,10 @@ void buffer_svg(BUFFER *wb, const char *label, calculated_number value, const ch else if(abs > (calculated_number)0.1) snprintfz(value_string, 512, "%0.3Lf%s%s", (long double)value, separator, units); else snprintfz(value_string, 512, "%0.4Lf%s%s", (long double)value, separator, units); } + else { + if(precision > 50) precision = 50; + snprintfz(value_string, 512, "%0.*Lf%s%s", precision, (long double)value, separator, units); + } // we need to copy the label, since verdana11_width may write to it strncpyz(label_buffer, label, 256); diff --git a/src/web_buffer_svg.h b/src/web_buffer_svg.h index ff3922ee..b853e97d 100644 --- a/src/web_buffer_svg.h +++ b/src/web_buffer_svg.h @@ -4,6 +4,6 @@ #ifndef NETDATA_WEB_BUFFER_SVG_H #define NETDATA_WEB_BUFFER_SVG_H 1 -extern void buffer_svg(BUFFER *wb, const char *label, calculated_number value, const char *units, const char *label_color, const char *value_color, int value_is_null); +extern void buffer_svg(BUFFER *wb, const char *label, calculated_number value, const char *units, const char *label_color, const char *value_color, int value_is_null, int precision); #endif /* NETDATA_WEB_BUFFER_SVG_H */ diff --git a/src/web_client.c b/src/web_client.c index 64f66641..a4b460dd 100644 --- a/src/web_client.c +++ b/src/web_client.c @@ -716,7 +716,8 @@ int web_client_api_v1_badge(struct web_client *w, char *url) { , *units = NULL , *label_color = NULL , *value_color = NULL - , *refresh_str = NULL; + , *refresh_str = NULL + , *precision_str = NULL; int group = GROUP_AVERAGE; uint32_t options = 0x00000000; @@ -758,6 +759,7 @@ int web_client_api_v1_badge(struct web_client *w, char *url) { else if(!strcmp(name, "multiply")) multiply_str = value; else if(!strcmp(name, "divide")) divide_str = value; else if(!strcmp(name, "refresh")) refresh_str = value; + else if(!strcmp(name, "precision")) precision_str = value; } if(!chart || !*chart) { @@ -768,16 +770,17 @@ int web_client_api_v1_badge(struct web_client *w, char *url) { RRDSET *st = rrdset_find(chart); if(!st) st = rrdset_find_byname(chart); if(!st) { - buffer_svg(w->response.data, "chart not found", 0, "", NULL, NULL, 1); + buffer_svg(w->response.data, "chart not found", 0, "", NULL, NULL, 1, -1); ret = 200; goto cleanup; } - long long multiply = (multiply_str && *multiply_str)?atol(multiply_str):1; - long long divide = (divide_str && *divide_str )?atol(divide_str):1; - long long before = (before_str && *before_str )?atol(before_str):0; - long long after = (after_str && *after_str )?atol(after_str):-st->update_every; - int points = (points_str && *points_str )?atoi(points_str):1; + long long multiply = (multiply_str && *multiply_str )?atol(multiply_str):1; + long long divide = (divide_str && *divide_str )?atol(divide_str):1; + long long before = (before_str && *before_str )?atol(before_str):0; + long long after = (after_str && *after_str )?atol(after_str):-st->update_every; + int points = (points_str && *points_str )?atoi(points_str):1; + int precision = (precision_str && *precision_str)?atoi(precision_str):-1; int refresh = 0; if(refresh_str && *refresh_str) { @@ -841,7 +844,7 @@ int web_client_api_v1_badge(struct web_client *w, char *url) { buffer_sprintf(w->response.header, "Refresh: %d\r\n", refresh); // render the badge - buffer_svg(w->response.data, label, n * multiply / divide, units, label_color, value_color, value_is_null); + buffer_svg(w->response.data, label, n * multiply / divide, units, label_color, value_color, value_is_null, precision); return ret; cleanup: -- 2.39.2