propagate name, algorithm, multiplier and divider changes to netdata masters; fixes #2253
Costa Tsaousis (ktsaou) committed
Jun 7, 2017 at 21:02 UTC
5c36a42f9284388d37ad2555e3decb8e57e1ef94
3 files changed
+50
-9
src/rrd.h
+5
-1
@@ -617,7 +617,11 @@ extern void rrdset_done(RRDSET *st);
617
extern RRDDIM *rrddim_add_custom(RRDSET *st, const char *id, const char *name, collected_number multiplier, collected_number divisor, RRD_ALGORITHM algorithm, RRD_MEMORY_MODE memory_mode);
618
#define rrddim_add(st, id, name, multiplier, divisor, algorithm) rrddim_add_custom(st, id, name, multiplier, divisor, algorithm, (st)->rrd_memory_mode)
619
620
-extern void rrddim_set_name(RRDSET *st, RRDDIM *rd, const char *name);
620
+extern int rrddim_set_name(RRDSET *st, RRDDIM *rd, const char *name);
621
+extern int rrddim_set_algorithm(RRDSET *st, RRDDIM *rd, RRD_ALGORITHM algorithm);
622
+extern int rrddim_set_multiplier(RRDSET *st, RRDDIM *rd, collected_number multiplier);
623
+extern int rrddim_set_divisor(RRDSET *st, RRDDIM *rd, collected_number divisor);
624
+
625
extern RRDDIM *rrddim_find(RRDSET *st, const char *id);
626
627
extern int rrddim_hide(RRDSET *st, const char *id);
src/rrddim.c
+39
-3
@@ -35,9 +35,9 @@ inline RRDDIM *rrddim_find(RRDSET *st, const char *id) {
35
// ----------------------------------------------------------------------------
36
// RRDDIM rename a dimension
37
38
-inline void rrddim_set_name(RRDSET *st, RRDDIM *rd, const char *name) {
38
+inline int rrddim_set_name(RRDSET *st, RRDDIM *rd, const char *name) {
39
if(unlikely(!strcmp(rd->name, name)))
40
- return;
40
+ return 0;
41
42
debug(D_RRD_CALLS, "rrddim_set_name() from %s.%s to %s.%s", st->name, rd->name, st->name, name);
43
@@ -45,10 +45,40 @@ inline void rrddim_set_name(RRDSET *st, RRDDIM *rd, const char *name) {
45
snprintfz(varname, CONFIG_MAX_NAME, "dim %s name", rd->id);
46
rd->name = config_set_default(st->config_section, varname, name);
47
rd->hash_name = simple_hash(rd->name);
48
-
48
rrddimvar_rename_all(rd);
49
+ rd->exposed = 0;
50
+ return 1;
51
+}
52
+
53
+inline int rrddim_set_algorithm(RRDSET *st, RRDDIM *rd, RRD_ALGORITHM algorithm) {
54
+ if(unlikely(rd->algorithm != algorithm))
55
+ return 0;
56
+
57
+ debug(D_RRD_CALLS, "Updating algorithm of dimension '%s/%s' from %s to %s", st->id, rd->name, rrd_algorithm_name(rd->algorithm), rrd_algorithm_name(algorithm));
58
+ rd->algorithm = algorithm;
59
+ rd->exposed = 0;
60
+ return 1;
61
}
62
63
+inline int rrddim_set_multiplier(RRDSET *st, RRDDIM *rd, collected_number multiplier) {
64
+ if(unlikely(rd->multiplier != multiplier))
65
+ return 0;
66
+
67
+ debug(D_RRD_CALLS, "Updating multiplier of dimension '%s/%s' from " COLLECTED_NUMBER_FORMAT " to " COLLECTED_NUMBER_FORMAT, st->id, rd->name, rd->multiplier, multiplier);
68
+ rd->multiplier = multiplier;
69
+ rd->exposed = 0;
70
+ return 1;
71
+}
72
+
73
+inline int rrddim_set_divisor(RRDSET *st, RRDDIM *rd, collected_number divisor) {
74
+ if(unlikely(rd->divisor != divisor))
75
+ return 0;
76
+
77
+ debug(D_RRD_CALLS, "Updating divisor of dimension '%s/%s' from " COLLECTED_NUMBER_FORMAT " to " COLLECTED_NUMBER_FORMAT, st->id, rd->name, rd->divisor, divisor);
78
+ rd->multiplier = divisor;
79
+ rd->exposed = 0;
80
+ return 1;
81
+}
82
83
// ----------------------------------------------------------------------------
84
// RRDDIM create a dimension
@@ -57,6 +87,12 @@ RRDDIM *rrddim_add_custom(RRDSET *st, const char *id, const char *name, collecte
87
RRDDIM *rd = rrddim_find(st, id);
88
if(unlikely(rd)) {
89
debug(D_RRD_CALLS, "Cannot create rrd dimension '%s/%s', it already exists.", st->id, name?name:"<NONAME>");
90
+
91
+ rrddim_set_name(st, rd, name);
92
+ rrddim_set_algorithm(st, rd, algorithm);
93
+ rrddim_set_multiplier(st, rd, multiplier);
94
+ rrddim_set_divisor(st, rd, divisor);
95
+
96
return rd;
97
}
98
src/statsd.c
+6
-5
@@ -1608,6 +1608,12 @@ static inline void check_if_metric_is_for_app(STATSD_INDEX *index, STATSD_METRIC
1608
dim->divisor *= STATSD_DECIMAL_DETAIL;
1609
}
1610
1611
+ if(unlikely(chart->st && dim->rd)) {
1612
+ rrddim_set_algorithm(chart->st, dim->rd, dim->algorithm);
1613
+ rrddim_set_multiplier(chart->st, dim->rd, dim->multiplier);
1614
+ rrddim_set_divisor(chart->st, dim->rd, dim->divisor);
1615
+ }
1616
+
1617
chart->dimensions_linked_count++;
1618
debug(D_STATSD, "metric '%s' of type %u linked with app '%s', chart '%s', dimension '%s', algorithm '%s'", m->name, m->type, app->name, chart->id, dim->name, rrd_algorithm_name(dim->algorithm));
1619
}
@@ -1645,11 +1651,6 @@ static inline void statsd_update_app_chart(STATSD_APP *app, STATSD_APP_CHART *ch
1651
dim->rd = rrddim_add(chart->st, dim->name, NULL, dim->multiplier, dim->divisor, dim->algorithm);
1652
1653
if(unlikely(dim->value_ptr)) {
1648
- // FIXME: this is anorthodox, we should an API call at RRDDIM to overwrite these settings
1649
- dim->rd->algorithm = dim->algorithm;
1650
- dim->rd->multiplier = dim->multiplier;
1651
- dim->rd->divisor = dim->divisor;
1652
-
1654
debug(D_STATSD, "updating dimension '%s' (%s) of chart '%s' (%s) for app '%s' with value " COLLECTED_NUMBER_FORMAT, dim->name, dim->rd->id, chart->id, chart->st->id, app->name, *dim->value_ptr);
1655
rrddim_set_by_pointer(chart->st, dim->rd, *dim->value_ptr);
1656
}