mirror of
https://github.com/netdata/netdata.git
synced 2025-04-08 07:10:12 +00:00

* remove loading and storing families from alert configs * remove families from silencers * remove from alarm log * start remove from alarm-notify.sh.in * fix test alarm * rebase * remove from api/v1/alarm_log * remove from alert stream * remove from config stream * remove from more * remove from swagger for health api * revert md changes * remove from health cmd api test
169 lines
5.4 KiB
C
169 lines
5.4 KiB
C
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
#include "health.h"
|
|
|
|
SILENCERS *silencers;
|
|
|
|
/**
|
|
* Create Silencer
|
|
*
|
|
* Allocate a new silencer to Netdata.
|
|
*
|
|
* @return It returns the address off the silencer on success and NULL otherwise
|
|
*/
|
|
SILENCER *create_silencer(void) {
|
|
SILENCER *t = callocz(1, sizeof(SILENCER));
|
|
netdata_log_debug(D_HEALTH, "HEALTH command API: Created empty silencer");
|
|
|
|
return t;
|
|
}
|
|
|
|
/**
|
|
* Health Silencers add
|
|
*
|
|
* Add more one silencer to the list of silencers.
|
|
*
|
|
* @param silencer
|
|
*/
|
|
void health_silencers_add(SILENCER *silencer) {
|
|
// Add the created instance to the linked list in silencers
|
|
silencer->next = silencers->silencers;
|
|
silencers->silencers = silencer;
|
|
netdata_log_debug(D_HEALTH, "HEALTH command API: Added silencer %s:%s:%s:%s", silencer->alarms,
|
|
silencer->charts, silencer->contexts, silencer->hosts
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Silencers Add Parameter
|
|
*
|
|
* Create a new silencer and adjust the variables
|
|
*
|
|
* @param silencer a pointer to the silencer that will be adjusted
|
|
* @param key the key value sent by client
|
|
* @param value the value sent to the key
|
|
*
|
|
* @return It returns the silencer configured on success and NULL otherwise
|
|
*/
|
|
SILENCER *health_silencers_addparam(SILENCER *silencer, char *key, char *value) {
|
|
static uint32_t
|
|
hash_alarm = 0,
|
|
hash_template = 0,
|
|
hash_chart = 0,
|
|
hash_context = 0,
|
|
hash_host = 0;
|
|
|
|
if (unlikely(!hash_alarm)) {
|
|
hash_alarm = simple_uhash(HEALTH_ALARM_KEY);
|
|
hash_template = simple_uhash(HEALTH_TEMPLATE_KEY);
|
|
hash_chart = simple_uhash(HEALTH_CHART_KEY);
|
|
hash_context = simple_uhash(HEALTH_CONTEXT_KEY);
|
|
hash_host = simple_uhash(HEALTH_HOST_KEY);
|
|
}
|
|
|
|
uint32_t hash = simple_uhash(key);
|
|
if (unlikely(silencer == NULL)) {
|
|
if (
|
|
(hash == hash_alarm && !strcasecmp(key, HEALTH_ALARM_KEY)) ||
|
|
(hash == hash_template && !strcasecmp(key, HEALTH_TEMPLATE_KEY)) ||
|
|
(hash == hash_chart && !strcasecmp(key, HEALTH_CHART_KEY)) ||
|
|
(hash == hash_context && !strcasecmp(key, HEALTH_CONTEXT_KEY)) ||
|
|
(hash == hash_host && !strcasecmp(key, HEALTH_HOST_KEY))
|
|
) {
|
|
silencer = create_silencer();
|
|
if(!silencer) {
|
|
netdata_log_error("Cannot add a new silencer to Netdata");
|
|
return NULL;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (hash == hash_alarm && !strcasecmp(key, HEALTH_ALARM_KEY)) {
|
|
silencer->alarms = strdupz(value);
|
|
silencer->alarms_pattern = simple_pattern_create(silencer->alarms, NULL, SIMPLE_PATTERN_EXACT, true);
|
|
} else if (hash == hash_chart && !strcasecmp(key, HEALTH_CHART_KEY)) {
|
|
silencer->charts = strdupz(value);
|
|
silencer->charts_pattern = simple_pattern_create(silencer->charts, NULL, SIMPLE_PATTERN_EXACT, true);
|
|
} else if (hash == hash_context && !strcasecmp(key, HEALTH_CONTEXT_KEY)) {
|
|
silencer->contexts = strdupz(value);
|
|
silencer->contexts_pattern = simple_pattern_create(silencer->contexts, NULL, SIMPLE_PATTERN_EXACT, true);
|
|
} else if (hash == hash_host && !strcasecmp(key, HEALTH_HOST_KEY)) {
|
|
silencer->hosts = strdupz(value);
|
|
silencer->hosts_pattern = simple_pattern_create(silencer->hosts, NULL, SIMPLE_PATTERN_EXACT, true);
|
|
}
|
|
|
|
return silencer;
|
|
}
|
|
|
|
/**
|
|
* JSON Read Callback
|
|
*
|
|
* Callback called by netdata to create the silencer.
|
|
*
|
|
* @param e the main json structure
|
|
*
|
|
* @return It always return 0.
|
|
*/
|
|
int health_silencers_json_read_callback(JSON_ENTRY *e)
|
|
{
|
|
switch(e->type) {
|
|
case JSON_OBJECT:
|
|
#ifndef ENABLE_JSONC
|
|
e->callback_function = health_silencers_json_read_callback;
|
|
if(strcmp(e->name,"")) {
|
|
// init silencer
|
|
netdata_log_debug(D_HEALTH, "JSON: Got object with a name, initializing new silencer for %s",e->name);
|
|
#endif
|
|
e->callback_data = create_silencer();
|
|
if(e->callback_data) {
|
|
health_silencers_add(e->callback_data);
|
|
}
|
|
#ifndef ENABLE_JSONC
|
|
}
|
|
#endif
|
|
break;
|
|
|
|
case JSON_ARRAY:
|
|
e->callback_function = health_silencers_json_read_callback;
|
|
break;
|
|
|
|
case JSON_STRING:
|
|
if(!strcmp(e->name,"type")) {
|
|
netdata_log_debug(D_HEALTH, "JSON: Processing type=%s",e->data.string);
|
|
if (!strcmp(e->data.string,"SILENCE")) silencers->stype = STYPE_SILENCE_NOTIFICATIONS;
|
|
else if (!strcmp(e->data.string,"DISABLE")) silencers->stype = STYPE_DISABLE_ALARMS;
|
|
} else {
|
|
netdata_log_debug(D_HEALTH, "JSON: Adding %s=%s", e->name, e->data.string);
|
|
if (e->callback_data)
|
|
(void)health_silencers_addparam(e->callback_data, e->name, e->data.string);
|
|
}
|
|
break;
|
|
|
|
case JSON_BOOLEAN:
|
|
netdata_log_debug(D_HEALTH, "JSON: Processing all_alarms");
|
|
silencers->all_alarms=e->data.boolean?1:0;
|
|
break;
|
|
|
|
case JSON_NUMBER:
|
|
case JSON_NULL:
|
|
break;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* Initialize Global Silencers
|
|
*
|
|
* Initialize the silencer for the whole netdata system.
|
|
*
|
|
* @return It returns 0 on success and -1 otherwise
|
|
*/
|
|
int health_initialize_global_silencers() {
|
|
silencers = mallocz(sizeof(SILENCERS));
|
|
silencers->all_alarms=0;
|
|
silencers->stype=STYPE_NONE;
|
|
silencers->silencers=NULL;
|
|
|
|
return 0;
|
|
}
|