@cryptotaxi247 / netdata-1 / commits / 26ff6bab1

metrics cardinality improvements (#19366)

* metrics cardinality improvements * fix ephemerality of metrics calculation

Costa Tsaousis committed Jan 10, 2025 at 10:19 UTC 26ff6bab1423ddb865605bc1551aaa42c6f49ab3
1 file changed +134 -45
src/web/api/functions/function-metrics-cardinality.c
+134 -45
@@ -57,21 +57,26 @@ int function_metrics_cardinality(BUFFER *wb, const char *function __maybe_unused
57 dfe_start_read(rc->rrdinstances, ri) {
58 cnt->instances++;
59
60 - if(rrd_flag_check(ri, RRD_FLAG_COLLECTED))
60 + if(rrd_flag_check(ri, RRD_FLAG_COLLECTED)) {
61 cnt->online_instances++;
62 - else
63 - cnt->offline_instances++;
62
65 - RRDMETRIC *rm;
66 - dfe_start_read(ri->rrdmetrics, rm) {
67 - cnt->metrics++;
63 + RRDMETRIC *rm;
64 + dfe_start_read(ri->rrdmetrics, rm) {
65 + cnt->metrics++;
66
69 - if(rrd_flag_check(rm, RRD_FLAG_COLLECTED))
70 - cnt->online_metrics++;
71 - else
72 - cnt->offline_metrics++;
67 + if(rrd_flag_check(rm, RRD_FLAG_COLLECTED))
68 + cnt->online_metrics++;
69 + else
70 + cnt->offline_metrics++;
71 + }
72 + dfe_done(rm);
73 + }
74 + else {
75 + cnt->offline_instances++;
76 + size_t metrics = dictionary_entries(ri->rrdmetrics);
77 + cnt->metrics += metrics;
78 + cnt->offline_metrics += metrics;
79 }
74 - dfe_done(rm);
80 }
81 dfe_done(ri);
82 }
@@ -85,20 +90,27 @@ int function_metrics_cardinality(BUFFER *wb, const char *function __maybe_unused
90 struct context_counts *cnt;
91 dfe_start_read(contexts_dict, cnt) {
92 buffer_json_add_array_item_array(wb);
88 - buffer_json_add_array_item_string(wb, cnt_dfe.name);
89 - buffer_json_add_array_item_uint64(wb, cnt->nodes);
90 - buffer_json_add_array_item_uint64(wb, cnt->instances);
91 - buffer_json_add_array_item_uint64(wb, cnt->metrics);
92 - buffer_json_add_array_item_uint64(wb, cnt->online_nodes);
93 - buffer_json_add_array_item_uint64(wb, cnt->online_instances);
94 - buffer_json_add_array_item_uint64(wb, cnt->online_metrics);
95 - buffer_json_add_array_item_uint64(wb, cnt->offline_nodes);
96 - buffer_json_add_array_item_uint64(wb, cnt->offline_instances);
97 - buffer_json_add_array_item_uint64(wb, cnt->offline_metrics);
98 -
99 - double ephemerality = (cnt->metrics > 0) ? ((double)cnt->offline_metrics * 100.0) / (double)cnt->metrics : 0.0;
100 - buffer_json_add_array_item_double(wb, ephemerality);
93 + {
94 + buffer_json_add_array_item_string(wb, cnt_dfe.name);
95 +
96 + buffer_json_add_array_item_uint64(wb, cnt->nodes);
97 + buffer_json_add_array_item_uint64(wb, cnt->online_nodes);
98 + buffer_json_add_array_item_uint64(wb, cnt->offline_nodes);
99
100 + buffer_json_add_array_item_uint64(wb, cnt->instances);
101 + buffer_json_add_array_item_uint64(wb, cnt->online_instances);
102 + buffer_json_add_array_item_uint64(wb, cnt->offline_instances);
103 +
104 + buffer_json_add_array_item_uint64(wb, cnt->metrics);
105 + buffer_json_add_array_item_uint64(wb, cnt->online_metrics);
106 + buffer_json_add_array_item_uint64(wb, cnt->offline_metrics);
107 +
108 + double instances_ephemerality = (cnt->instances > 0) ? ((double)cnt->offline_instances * 100.0) / (double)cnt->instances : 0.0;
109 + buffer_json_add_array_item_double(wb, instances_ephemerality);
110 +
111 + double metrics_ephemerality = (cnt->metrics > 0) ? ((double)cnt->offline_metrics * 100.0) / (double)cnt->metrics : 0.0;
112 + buffer_json_add_array_item_double(wb, metrics_ephemerality);
113 + }
114 buffer_json_array_close(wb);
115
116 if(cnt->nodes > max.nodes)
@@ -142,72 +154,149 @@ int function_metrics_cardinality(BUFFER *wb, const char *function __maybe_unused
154 RRDF_FIELD_OPTS_NONE,
155 NULL);
156
145 - buffer_rrdf_table_add_field(wb, field_id++, "All Instances", "Total Number of Instances",
157 + buffer_rrdf_table_add_field(wb, field_id++, "Curr. Nodes", "Number of Online Nodes",
158 RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER,
147 - 0, "instances", (double)max.instances, RRDF_FIELD_SORT_DESCENDING, NULL,
159 + 0, "nodes", (double)max.online_nodes, RRDF_FIELD_SORT_DESCENDING, NULL,
160 RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
149 - RRDF_FIELD_OPTS_NONE,
161 + RRDF_FIELD_OPTS_VISIBLE,
162 NULL);
163
152 - buffer_rrdf_table_add_field(wb, field_id++, "All Metrics", "Total Number of Metrics",
164 + buffer_rrdf_table_add_field(wb, field_id++, "Old Nodes", "Number of Offline Nodes",
165 RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER,
154 - 0, "metrics", (double)max.metrics, RRDF_FIELD_SORT_DESCENDING, NULL,
166 + 0, "nodes", (double)max.offline_nodes, RRDF_FIELD_SORT_DESCENDING, NULL,
167 RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
156 - RRDF_FIELD_OPTS_NONE,
168 + RRDF_FIELD_OPTS_VISIBLE,
169 NULL);
170
159 - buffer_rrdf_table_add_field(wb, field_id++, "Curr. Nodes", "Number of Online Nodes",
171 + buffer_rrdf_table_add_field(wb, field_id++, "All Instances", "Total Number of Instances",
172 RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER,
161 - 0, "nodes", (double)max.online_nodes, RRDF_FIELD_SORT_DESCENDING, NULL,
173 + 0, "instances", (double)max.instances, RRDF_FIELD_SORT_DESCENDING, NULL,
174 RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
163 - RRDF_FIELD_OPTS_VISIBLE,
175 + RRDF_FIELD_OPTS_NONE,
176 NULL);
177
166 - buffer_rrdf_table_add_field(wb, field_id++, "Curr. Instances", "Total Number of Online Instances",
178 + buffer_rrdf_table_add_field(wb, field_id++, "Curr. Instances", "Total Number of Currently Collected Instances",
179 RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER,
180 0, "instances", (double)max.online_instances, RRDF_FIELD_SORT_DESCENDING, NULL,
181 RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
182 RRDF_FIELD_OPTS_VISIBLE,
183 NULL);
184
173 - buffer_rrdf_table_add_field(wb, field_id++, "Curr. Metrics", "Total Number of Online Metrics",
185 + buffer_rrdf_table_add_field(wb, field_id++, "Old Instances", "Total Number of Archived Instances",
186 RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER,
175 - 0, "metrics", (double)max.online_metrics, RRDF_FIELD_SORT_DESCENDING, NULL,
187 + 0, "instances", (double)max.offline_instances, RRDF_FIELD_SORT_DESCENDING, NULL,
188 RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
189 RRDF_FIELD_OPTS_VISIBLE,
190 NULL);
191
180 - buffer_rrdf_table_add_field(wb, field_id++, "Old Nodes", "Number of Offline Nodes",
192 + buffer_rrdf_table_add_field(wb, field_id++, "All Dimensions", "Total Number of Time-Series",
193 RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER,
182 - 0, "nodes", (double)max.offline_nodes, RRDF_FIELD_SORT_DESCENDING, NULL,
194 + 0, "metrics", (double)max.metrics, RRDF_FIELD_SORT_DESCENDING, NULL,
195 RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
196 RRDF_FIELD_OPTS_VISIBLE,
197 NULL);
198
187 - buffer_rrdf_table_add_field(wb, field_id++, "Old Instances", "Total Number of Offline Instances",
199 + buffer_rrdf_table_add_field(wb, field_id++, "Curr. Dimensions", "Total Number of Currently Collected Time-Series",
200 RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER,
189 - 0, "instances", (double)max.offline_instances, RRDF_FIELD_SORT_DESCENDING, NULL,
201 + 0, "metrics", (double)max.online_metrics, RRDF_FIELD_SORT_DESCENDING, NULL,
202 RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
191 - RRDF_FIELD_OPTS_VISIBLE,
203 + RRDF_FIELD_OPTS_NONE,
204 NULL);
205
194 - buffer_rrdf_table_add_field(wb, field_id++, "Old Metrics", "Total Number of Offline Metrics",
206 + buffer_rrdf_table_add_field(wb, field_id++, "Old Dimensions", "Total Number of Archived Time-Series",
207 RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_VALUE, RRDF_FIELD_TRANSFORM_NUMBER,
208 0, "metrics", (double)max.offline_metrics, RRDF_FIELD_SORT_DESCENDING, NULL,
209 RRDF_FIELD_SUMMARY_SUM, RRDF_FIELD_FILTER_RANGE,
198 - RRDF_FIELD_OPTS_VISIBLE,
210 + RRDF_FIELD_OPTS_NONE,
211 NULL);
212
201 - buffer_rrdf_table_add_field(wb, field_id++, "Ephemerality", "Percentage of Metrics that are Offline",
213 + buffer_rrdf_table_add_field(wb, field_id++, "Ephemeral Instances", "Percentage of Archived Instances",
214 RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER,
215 2, "%", 100.0, RRDF_FIELD_SORT_DESCENDING, NULL,
216 RRDF_FIELD_SUMMARY_MAX, RRDF_FIELD_FILTER_RANGE,
217 RRDF_FIELD_OPTS_VISIBLE,
218 NULL);
219 +
220 + buffer_rrdf_table_add_field(wb, field_id++, "Ephemeral Dimensions", "Percentage of Archived Time-Series",
221 + RRDF_FIELD_TYPE_INTEGER, RRDF_FIELD_VISUAL_BAR, RRDF_FIELD_TRANSFORM_NUMBER,
222 + 2, "%", 100.0, RRDF_FIELD_SORT_DESCENDING, NULL,
223 + RRDF_FIELD_SUMMARY_MAX, RRDF_FIELD_FILTER_RANGE,
224 + RRDF_FIELD_OPTS_NONE,
225 + NULL);
226 }
227 buffer_json_object_close(wb); // columns
228
210 - buffer_json_member_add_string(wb, "default_sort_column", "Old Metrics");
229 + buffer_json_member_add_string(wb, "default_sort_column", "Old Instances");
230 +
231 + buffer_json_member_add_object(wb, "charts");
232 + {
233 + buffer_json_member_add_object(wb, "Instances Ephemerality");
234 + {
235 + buffer_json_member_add_array(wb, "columns");
236 + buffer_json_add_array_item_string(wb, "Curr. Instances");
237 + buffer_json_add_array_item_string(wb, "Old Instances");
238 + buffer_json_array_close(wb);
239 +
240 + buffer_json_member_add_string(wb, "name", "Instances Ephemerality");
241 + buffer_json_member_add_string(wb, "type", "doughnut");
242 + buffer_json_member_add_string(wb, "groupBy", "all");
243 + buffer_json_member_add_string(wb, "aggregation", "sum");
244 + }
245 + buffer_json_object_close(wb);
246 +
247 + buffer_json_member_add_object(wb, "Dimensions Ephemerality");
248 + {
249 + buffer_json_member_add_array(wb, "columns");
250 + buffer_json_add_array_item_string(wb, "Curr. Dimensions");
251 + buffer_json_add_array_item_string(wb, "Old Dimensions");
252 + buffer_json_array_close(wb);
253 +
254 + buffer_json_member_add_string(wb, "name", "Dimensions Ephemerality");
255 + buffer_json_member_add_string(wb, "type", "doughnut");
256 + buffer_json_member_add_string(wb, "groupBy", "all");
257 + buffer_json_member_add_string(wb, "aggregation", "sum");
258 + }
259 + buffer_json_object_close(wb);
260 +
261 + buffer_json_member_add_object(wb, "Instances Total");
262 + {
263 + buffer_json_member_add_array(wb, "columns");
264 + buffer_json_add_array_item_string(wb, "All Instances");
265 + buffer_json_array_close(wb);
266 +
267 + buffer_json_member_add_string(wb, "name", "Instances Total");
268 + buffer_json_member_add_string(wb, "type", "value");
269 + buffer_json_member_add_string(wb, "groupBy", "all");
270 + buffer_json_member_add_string(wb, "aggregation", "sum");
271 + }
272 + buffer_json_object_close(wb);
273 +
274 + buffer_json_member_add_object(wb, "Dimensions Total");
275 + {
276 + buffer_json_member_add_array(wb, "columns");
277 + buffer_json_add_array_item_string(wb, "All Dimensions");
278 + buffer_json_array_close(wb);
279 +
280 + buffer_json_member_add_string(wb, "name", "Dimensions Total");
281 + buffer_json_member_add_string(wb, "type", "value");
282 + buffer_json_member_add_string(wb, "groupBy", "all");
283 + buffer_json_member_add_string(wb, "aggregation", "sum");
284 + }
285 + buffer_json_object_close(wb);
286 + }
287 + buffer_json_object_close(wb); // charts
288 +
289 + buffer_json_member_add_array(wb, "default_charts");
290 + {
291 + buffer_json_add_array_item_array(wb);
292 + buffer_json_add_array_item_string(wb, "Instances Ephemerality");
293 + buffer_json_array_close(wb);
294 +
295 + buffer_json_add_array_item_array(wb);
296 + buffer_json_add_array_item_string(wb, "Dimensions Ephemerality");
297 + buffer_json_array_close(wb);
298 + }
299 + buffer_json_array_close(wb); // default_charts
300
301 buffer_json_member_add_time_t(wb, "expires", now_realtime_sec() + 1);
302 buffer_json_finalize(wb);