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: