@cryptotaxi247 / netdata-1 / commits / bcc3143e6

allow decimal precision in badges to be given at the url

Costa Tsaousis (ktsaou) committed Jun 5, 2016 at 23:26 UTC bcc3143e62d1351107e7ece8b101a0a8547f3c2f
3 files changed +18 -11
src/web_buffer_svg.c
+6 -2
@@ -503,7 +503,7 @@ static inline void calc_colorz(const char *color, char *final, size_t len, calcu
503 strncpyz(final, b, len);
504 }
505
506 -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) {
506 +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) {
507 char label_buffer[256 + 1], value_string[512 + 1], value_color_buffer[256 + 1];
508 char label_escaped[256 + 1], value_escaped[512 + 1], label_color_escaped[256 + 1], value_color_escaped[256 + 1];
509 int label_width, value_width, total_width;
@@ -519,7 +519,7 @@ void buffer_svg(BUFFER *wb, const char *label, calculated_number value, const ch
519
520 if(value_is_null)
521 strcpy(value_string, "-");
522 - else {
522 + else if(precision < 0) {
523 calculated_number abs = (value < (calculated_number)0)?-value:value;
524 if(abs > (calculated_number)1000.0) snprintfz(value_string, 512, "%0.0Lf%s%s", (long double)value, separator, units);
525 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
527 else if(abs > (calculated_number)0.1) snprintfz(value_string, 512, "%0.3Lf%s%s", (long double)value, separator, units);
528 else snprintfz(value_string, 512, "%0.4Lf%s%s", (long double)value, separator, units);
529 }
530 + else {
531 + if(precision > 50) precision = 50;
532 + snprintfz(value_string, 512, "%0.*Lf%s%s", precision, (long double)value, separator, units);
533 + }
534
535 // we need to copy the label, since verdana11_width may write to it
536 strncpyz(label_buffer, label, 256);
src/web_buffer_svg.h
+1 -1
@@ -4,6 +4,6 @@
4 #ifndef NETDATA_WEB_BUFFER_SVG_H
5 #define NETDATA_WEB_BUFFER_SVG_H 1
6
7 -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);
7 +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);
8
9 #endif /* NETDATA_WEB_BUFFER_SVG_H */
src/web_client.c
+11 -8
@@ -716,7 +716,8 @@ int web_client_api_v1_badge(struct web_client *w, char *url) {
716 , *units = NULL
717 , *label_color = NULL
718 , *value_color = NULL
719 - , *refresh_str = NULL;
719 + , *refresh_str = NULL
720 + , *precision_str = NULL;
721
722 int group = GROUP_AVERAGE;
723 uint32_t options = 0x00000000;
@@ -758,6 +759,7 @@ int web_client_api_v1_badge(struct web_client *w, char *url) {
759 else if(!strcmp(name, "multiply")) multiply_str = value;
760 else if(!strcmp(name, "divide")) divide_str = value;
761 else if(!strcmp(name, "refresh")) refresh_str = value;
762 + else if(!strcmp(name, "precision")) precision_str = value;
763 }
764
765 if(!chart || !*chart) {
@@ -768,16 +770,17 @@ int web_client_api_v1_badge(struct web_client *w, char *url) {
770 RRDSET *st = rrdset_find(chart);
771 if(!st) st = rrdset_find_byname(chart);
772 if(!st) {
771 - buffer_svg(w->response.data, "chart not found", 0, "", NULL, NULL, 1);
773 + buffer_svg(w->response.data, "chart not found", 0, "", NULL, NULL, 1, -1);
774 ret = 200;
775 goto cleanup;
776 }
777
776 - long long multiply = (multiply_str && *multiply_str)?atol(multiply_str):1;
777 - long long divide = (divide_str && *divide_str )?atol(divide_str):1;
778 - long long before = (before_str && *before_str )?atol(before_str):0;
779 - long long after = (after_str && *after_str )?atol(after_str):-st->update_every;
780 - int points = (points_str && *points_str )?atoi(points_str):1;
778 + long long multiply = (multiply_str && *multiply_str )?atol(multiply_str):1;
779 + long long divide = (divide_str && *divide_str )?atol(divide_str):1;
780 + long long before = (before_str && *before_str )?atol(before_str):0;
781 + long long after = (after_str && *after_str )?atol(after_str):-st->update_every;
782 + int points = (points_str && *points_str )?atoi(points_str):1;
783 + int precision = (precision_str && *precision_str)?atoi(precision_str):-1;
784
785 int refresh = 0;
786 if(refresh_str && *refresh_str) {
@@ -841,7 +844,7 @@ int web_client_api_v1_badge(struct web_client *w, char *url) {
844 buffer_sprintf(w->response.header, "Refresh: %d\r\n", refresh);
845
846 // render the badge
844 - buffer_svg(w->response.data, label, n * multiply / divide, units, label_color, value_color, value_is_null);
847 + buffer_svg(w->response.data, label, n * multiply / divide, units, label_color, value_color, value_is_null, precision);
848 return ret;
849
850 cleanup: