@cryptotaxi247 / netdata-1 / commits / 9cd6a2459

Add alert meta info (#17730)

Stelios Fragkakis committed May 22, 2024 at 22:00 UTC 9cd6a2459a84e79869d3f9b6fd3f0b1fd0085af9
3 files changed +71
src/database/contexts/api_v2.c
+58
@@ -195,6 +195,11 @@ struct alert_v2_entry {
195
196 STRING *name;
197 STRING *summary;
198 + RRDLABELS *recipient;
199 + RRDLABELS *classification;
200 + RRDLABELS *context;
201 + RRDLABELS *component;
202 + RRDLABELS *type;
203
204 size_t ati;
205
@@ -371,6 +376,21 @@ static void alerts_v2_insert_callback(const DICTIONARY_ITEM *item __maybe_unused
376 RRDCALC *rc = t->tmp;
377 t->name = rc->config.name;
378 t->summary = rc->config.summary; // the original summary
379 + t->context = rrdlabels_create();
380 + t->recipient = rrdlabels_create();
381 + t->classification = rrdlabels_create();
382 + t->component = rrdlabels_create();
383 + t->type = rrdlabels_create();
384 + if (string_strlen(rc->rrdset->context))
385 + rrdlabels_add(t->context, string2str(rc->rrdset->context), "yes", RRDLABEL_SRC_AUTO);
386 + if (string_strlen(rc->config.recipient))
387 + rrdlabels_add(t->recipient, string2str(rc->config.recipient), "yes", RRDLABEL_SRC_AUTO);
388 + if (string_strlen(rc->config.classification))
389 + rrdlabels_add(t->classification, string2str(rc->config.classification), "yes", RRDLABEL_SRC_AUTO);
390 + if (string_strlen(rc->config.component))
391 + rrdlabels_add(t->component, string2str(rc->config.component), "yes", RRDLABEL_SRC_AUTO);
392 + if (string_strlen(rc->config.type))
393 + rrdlabels_add(t->type, string2str(rc->config.type), "yes", RRDLABEL_SRC_AUTO);
394 t->ati = ctl->alerts.ati++;
395
396 t->nodes = dictionary_create(DICT_OPTION_SINGLE_THREADED|DICT_OPTION_VALUE_LINK_DONT_CLONE|DICT_OPTION_NAME_LINK_DONT_CLONE);
@@ -382,12 +402,29 @@ static void alerts_v2_insert_callback(const DICTIONARY_ITEM *item __maybe_unused
402 static bool alerts_v2_conflict_callback(const DICTIONARY_ITEM *item __maybe_unused, void *old_value, void *new_value, void *data __maybe_unused) {
403 struct alert_v2_entry *t = old_value, *n = new_value;
404 RRDCALC *rc = n->tmp;
405 + if (string_strlen(rc->rrdset->context))
406 + rrdlabels_add(t->context, string2str(rc->rrdset->context), "yes", RRDLABEL_SRC_AUTO);
407 + if (string_strlen(rc->config.recipient))
408 + rrdlabels_add(t->recipient, string2str(rc->config.recipient), "yes", RRDLABEL_SRC_AUTO);
409 + if (string_strlen(rc->config.classification))
410 + rrdlabels_add(t->classification, string2str(rc->config.classification), "yes", RRDLABEL_SRC_AUTO);
411 + if (string_strlen(rc->config.component))
412 + rrdlabels_add(t->component, string2str(rc->config.component), "yes", RRDLABEL_SRC_AUTO);
413 + if (string_strlen(rc->config.type))
414 + rrdlabels_add(t->type, string2str(rc->config.type), "yes", RRDLABEL_SRC_AUTO);
415 alerts_v2_add(t, rc);
416 return true;
417 }
418
419 static void alerts_v2_delete_callback(const DICTIONARY_ITEM *item __maybe_unused, void *value, void *data __maybe_unused) {
420 struct alert_v2_entry *t = value;
421 +
422 + rrdlabels_destroy(t->context);
423 + rrdlabels_destroy(t->recipient);
424 + rrdlabels_destroy(t->classification);
425 + rrdlabels_destroy(t->component);
426 + rrdlabels_destroy(t->type);
427 +
428 dictionary_destroy(t->nodes);
429 dictionary_destroy(t->configs);
430 }
@@ -1554,6 +1591,27 @@ static void contexts_v2_alerts_to_json(BUFFER *wb, struct rrdcontext_to_json_v2_
1591 buffer_json_member_add_uint64(wb, "in", t->instances);
1592 buffer_json_member_add_uint64(wb, "nd", dictionary_entries(t->nodes));
1593 buffer_json_member_add_uint64(wb, "cfg", dictionary_entries(t->configs));
1594 +
1595 + buffer_json_member_add_array(wb, "ctx");
1596 + rrdlabels_key_to_buffer_array_item(t->context, wb);
1597 + buffer_json_array_close(wb); // ctx
1598 +
1599 + buffer_json_member_add_array(wb, "cl");
1600 + rrdlabels_key_to_buffer_array_item(t->classification, wb);
1601 + buffer_json_array_close(wb); // ctx
1602 +
1603 +
1604 + buffer_json_member_add_array(wb, "cp");
1605 + rrdlabels_key_to_buffer_array_item(t->component, wb);
1606 + buffer_json_array_close(wb); // component
1607 +
1608 + buffer_json_member_add_array(wb, "ty");
1609 + rrdlabels_key_to_buffer_array_item(t->type, wb);
1610 + buffer_json_array_close(wb); // type
1611 +
1612 + buffer_json_member_add_array(wb, "to");
1613 + rrdlabels_key_to_buffer_array_item(t->recipient, wb);
1614 + buffer_json_array_close(wb); // recipient
1615 }
1616 buffer_json_object_close(wb); // alert name
1617 }
src/database/rrdlabels.c
+12
@@ -849,6 +849,18 @@ void rrdlabels_value_to_buffer_array_item_or_null(RRDLABELS *labels, BUFFER *wb,
849 string_freez(this_key);
850 }
851
852 +void rrdlabels_key_to_buffer_array_item(RRDLABELS *labels, BUFFER *wb)
853 +{
854 + if(!labels) return;
855 +
856 + RRDLABEL *lb;
857 + RRDLABEL_SRC ls;
858 + lfe_start_read(labels, lb, ls) {
859 + buffer_json_add_array_item_string(wb, string2str(lb->index.key));
860 + }
861 + lfe_done(labels);
862 +}
863 +
864 // ----------------------------------------------------------------------------
865
866 void rrdlabels_get_value_strcpyz(RRDLABELS *labels, char *dst, size_t dst_len, const char *key) {
src/database/rrdlabels.h
+1
@@ -37,6 +37,7 @@ void rrdlabels_destroy(RRDLABELS *labels_dict);
37 void rrdlabels_add(RRDLABELS *labels, const char *name, const char *value, RRDLABEL_SRC ls);
38 void rrdlabels_add_pair(RRDLABELS *labels, const char *string, RRDLABEL_SRC ls);
39 void rrdlabels_value_to_buffer_array_item_or_null(RRDLABELS *labels, BUFFER *wb, const char *key);
40 +void rrdlabels_key_to_buffer_array_item(RRDLABELS *labels, BUFFER *wb);
41 void rrdlabels_get_value_strdup_or_null(RRDLABELS *labels, char **value, const char *key);
42 void rrdlabels_get_value_to_buffer_or_unset(RRDLABELS *labels, BUFFER *wb, const char *key, const char *unset);
43 bool rrdlabels_exist(RRDLABELS *labels, const char *key);