]> arthur.barton.de Git - netdata.git/commitdiff
allow decimal precision in badges to be given at the url
authorCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Sun, 5 Jun 2016 20:26:27 +0000 (23:26 +0300)
committerCosta Tsaousis (ktsaou) <costa@tsaousis.gr>
Sun, 5 Jun 2016 20:26:27 +0000 (23:26 +0300)
src/web_buffer_svg.c
src/web_buffer_svg.h
src/web_client.c

index 27416b440f2add28b2d90a8bfb364e15af2b1c97..910646fc24f1fa255012519ccab5ad4f1af6fb91 100644 (file)
@@ -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);
index ff3922ee7d39c5f64e1e75ea8ba91c21bbf4ac86..b853e97dde49d1c3c75ec5f3f7a4c558225bc7ba 100644 (file)
@@ -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 */
index 64f66641fef657f34b81fd998da46ea48f9e35c2..a4b460dd8651ff162c5a88a5ef23bdb4bf33838d 100644 (file)
@@ -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: