]> arthur.barton.de Git - netdata.git/blob - src/rrddimvar.c
Merge pull request #1998 from ktsaou/master
[netdata.git] / src / rrddimvar.c
1 #define NETDATA_HEALTH_INTERNALS
2 #include "common.h"
3
4 // ----------------------------------------------------------------------------
5 // RRDDIMVAR management
6 // DIMENSION VARIABLES
7
8 #define RRDDIMVAR_ID_MAX 1024
9
10 static inline void rrddimvar_free_variables(RRDDIMVAR *rs) {
11     RRDDIM *rd = rs->rrddim;
12     RRDSET *st = rd->rrdset;
13
14     // CHART VARIABLES FOR THIS DIMENSION
15
16     rrdvar_free(st->rrdhost, &st->variables_root_index, rs->var_local_id);
17     rs->var_local_id = NULL;
18
19     rrdvar_free(st->rrdhost, &st->variables_root_index, rs->var_local_name);
20     rs->var_local_name = NULL;
21
22     // FAMILY VARIABLES FOR THIS DIMENSION
23
24     rrdvar_free(st->rrdhost, &st->rrdfamily->variables_root_index, rs->var_family_id);
25     rs->var_family_id = NULL;
26
27     rrdvar_free(st->rrdhost, &st->rrdfamily->variables_root_index, rs->var_family_name);
28     rs->var_family_name = NULL;
29
30     rrdvar_free(st->rrdhost, &st->rrdfamily->variables_root_index, rs->var_family_contextid);
31     rs->var_family_contextid = NULL;
32
33     rrdvar_free(st->rrdhost, &st->rrdfamily->variables_root_index, rs->var_family_contextname);
34     rs->var_family_contextname = NULL;
35
36     // HOST VARIABLES FOR THIS DIMENSION
37
38     rrdvar_free(st->rrdhost, &st->rrdhost->variables_root_index, rs->var_host_chartidid);
39     rs->var_host_chartidid = NULL;
40
41     rrdvar_free(st->rrdhost, &st->rrdhost->variables_root_index, rs->var_host_chartidname);
42     rs->var_host_chartidname = NULL;
43
44     rrdvar_free(st->rrdhost, &st->rrdhost->variables_root_index, rs->var_host_chartnameid);
45     rs->var_host_chartnameid = NULL;
46
47     rrdvar_free(st->rrdhost, &st->rrdhost->variables_root_index, rs->var_host_chartnamename);
48     rs->var_host_chartnamename = NULL;
49
50     // KEYS
51
52     freez(rs->key_id);
53     rs->key_id = NULL;
54
55     freez(rs->key_name);
56     rs->key_name = NULL;
57
58     freez(rs->key_fullidid);
59     rs->key_fullidid = NULL;
60
61     freez(rs->key_fullidname);
62     rs->key_fullidname = NULL;
63
64     freez(rs->key_contextid);
65     rs->key_contextid = NULL;
66
67     freez(rs->key_contextname);
68     rs->key_contextname = NULL;
69
70     freez(rs->key_fullnameid);
71     rs->key_fullnameid = NULL;
72
73     freez(rs->key_fullnamename);
74     rs->key_fullnamename = NULL;
75 }
76
77 static inline void rrddimvar_create_variables(RRDDIMVAR *rs) {
78     rrddimvar_free_variables(rs);
79
80     RRDDIM *rd = rs->rrddim;
81     RRDSET *st = rd->rrdset;
82
83     char buffer[RRDDIMVAR_ID_MAX + 1];
84
85     // KEYS
86
87     snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s%s%s", rs->prefix, rd->id, rs->suffix);
88     rs->key_id = strdupz(buffer);
89
90     snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s%s%s", rs->prefix, rd->name, rs->suffix);
91     rs->key_name = strdupz(buffer);
92
93     snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s.%s", st->id, rs->key_id);
94     rs->key_fullidid = strdupz(buffer);
95
96     snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s.%s", st->id, rs->key_name);
97     rs->key_fullidname = strdupz(buffer);
98
99     snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s.%s", st->context, rs->key_id);
100     rs->key_contextid = strdupz(buffer);
101
102     snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s.%s", st->context, rs->key_name);
103     rs->key_contextname = strdupz(buffer);
104
105     snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s.%s", st->name, rs->key_id);
106     rs->key_fullnameid = strdupz(buffer);
107
108     snprintfz(buffer, RRDDIMVAR_ID_MAX, "%s.%s", st->name, rs->key_name);
109     rs->key_fullnamename = strdupz(buffer);
110
111     // CHART VARIABLES FOR THIS DIMENSION
112     // -----------------------------------
113     //
114     // dimensions are available as:
115     // - $id
116     // - $name
117
118     rs->var_local_id           = rrdvar_create_and_index("local", &st->variables_root_index, rs->key_id, rs->type, rs->value);
119     rs->var_local_name         = rrdvar_create_and_index("local", &st->variables_root_index, rs->key_name, rs->type, rs->value);
120
121     // FAMILY VARIABLES FOR THIS DIMENSION
122     // -----------------------------------
123     //
124     // dimensions are available as:
125     // - $id                 (only the first, when multiple overlap)
126     // - $name               (only the first, when multiple overlap)
127     // - $chart-context.id
128     // - $chart-context.name
129
130     rs->var_family_id          = rrdvar_create_and_index("family", &st->rrdfamily->variables_root_index, rs->key_id, rs->type, rs->value);
131     rs->var_family_name        = rrdvar_create_and_index("family", &st->rrdfamily->variables_root_index, rs->key_name, rs->type, rs->value);
132     rs->var_family_contextid   = rrdvar_create_and_index("family", &st->rrdfamily->variables_root_index, rs->key_contextid, rs->type, rs->value);
133     rs->var_family_contextname = rrdvar_create_and_index("family", &st->rrdfamily->variables_root_index, rs->key_contextname, rs->type, rs->value);
134
135     // HOST VARIABLES FOR THIS DIMENSION
136     // -----------------------------------
137     //
138     // dimensions are available as:
139     // - $chart-id.id
140     // - $chart-id.name
141     // - $chart-name.id
142     // - $chart-name.name
143
144     rs->var_host_chartidid      = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->key_fullidid, rs->type, rs->value);
145     rs->var_host_chartidname    = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->key_fullidname, rs->type, rs->value);
146     rs->var_host_chartnameid    = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->key_fullnameid, rs->type, rs->value);
147     rs->var_host_chartnamename  = rrdvar_create_and_index("host", &st->rrdhost->variables_root_index, rs->key_fullnamename, rs->type, rs->value);
148 }
149
150 RRDDIMVAR *rrddimvar_create(RRDDIM *rd, int type, const char *prefix, const char *suffix, void *value, uint32_t options) {
151     RRDSET *st = rd->rrdset;
152
153     debug(D_VARIABLES, "RRDDIMSET create for chart id '%s' name '%s', dimension id '%s', name '%s%s%s'", st->id, st->name, rd->id, (prefix)?prefix:"", rd->name, (suffix)?suffix:"");
154
155     if(!prefix) prefix = "";
156     if(!suffix) suffix = "";
157
158     RRDDIMVAR *rs = (RRDDIMVAR *)callocz(1, sizeof(RRDDIMVAR));
159
160     rs->prefix = strdupz(prefix);
161     rs->suffix = strdupz(suffix);
162
163     rs->type = type;
164     rs->value = value;
165     rs->options = options;
166     rs->rrddim = rd;
167
168     rs->next = rd->variables;
169     rd->variables = rs;
170
171     rrddimvar_create_variables(rs);
172
173     return rs;
174 }
175
176 void rrddimvar_rename_all(RRDDIM *rd) {
177     RRDSET *st = rd->rrdset;
178     debug(D_VARIABLES, "RRDDIMSET rename for chart id '%s' name '%s', dimension id '%s', name '%s'", st->id, st->name, rd->id, rd->name);
179
180     RRDDIMVAR *rs, *next = rd->variables;
181     while((rs = next)) {
182         next = rs->next;
183         rrddimvar_create_variables(rs);
184     }
185 }
186
187 void rrddimvar_free(RRDDIMVAR *rs) {
188     RRDDIM *rd = rs->rrddim;
189     RRDSET *st = rd->rrdset;
190     debug(D_VARIABLES, "RRDDIMSET free for chart id '%s' name '%s', dimension id '%s', name '%s', prefix='%s', suffix='%s'", st->id, st->name, rd->id, rd->name, rs->prefix, rs->suffix);
191
192     rrddimvar_free_variables(rs);
193
194     if(rd->variables == rs) {
195         debug(D_VARIABLES, "RRDDIMSET removing first entry for chart id '%s' name '%s', dimension id '%s', name '%s'", st->id, st->name, rd->id, rd->name);
196         rd->variables = rs->next;
197     }
198     else {
199         debug(D_VARIABLES, "RRDDIMSET removing non-first entry for chart id '%s' name '%s', dimension id '%s', name '%s'", st->id, st->name, rd->id, rd->name);
200         RRDDIMVAR *t;
201         for (t = rd->variables; t && t->next != rs; t = t->next) ;
202         if(!t) error("RRDDIMVAR '%s' not found in dimension '%s/%s' variables linked list", rs->key_name, st->id, rd->id);
203         else t->next = rs->next;
204     }
205
206     freez(rs->prefix);
207     freez(rs->suffix);
208     freez(rs);
209 }
210