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