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);