1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
|
// SPDX-License-Identifier: GPL-3.0-or-later
#include "rrd.h"
#ifndef NETDATA_RRDCALC_H
#define NETDATA_RRDCALC_H 1
// calculated variables (defined in health configuration)
// These aggregate time-series data at fixed intervals
// (defined in their update_every member below)
// They increase the overhead of netdata.
//
// These calculations are stored under RRDHOST.
// Then are also linked to RRDSET (of course only when a
// matching chart is found).
typedef enum {
RRDCALC_FLAG_DB_ERROR = (1 << 0),
RRDCALC_FLAG_DB_NAN = (1 << 1),
// RRDCALC_FLAG_DB_STALE = (1 << 2),
RRDCALC_FLAG_CALC_ERROR = (1 << 3),
RRDCALC_FLAG_WARN_ERROR = (1 << 4),
RRDCALC_FLAG_CRIT_ERROR = (1 << 5),
RRDCALC_FLAG_RUNNABLE = (1 << 6),
RRDCALC_FLAG_DISABLED = (1 << 7),
RRDCALC_FLAG_SILENCED = (1 << 8),
RRDCALC_FLAG_RUN_ONCE = (1 << 9),
RRDCALC_FLAG_FROM_TEMPLATE = (1 << 10), // the rrdcalc has been created from a template
} RRDCALC_FLAGS;
typedef enum {
// This list uses several other options from RRDR_OPTIONS for db lookups.
// To add an item here, you need to reserve a bit in RRDR_OPTIONS.
RRDCALC_OPTION_NO_CLEAR_NOTIFICATION = 0x80000000,
} RRDCALC_OPTIONS;
#define RRDCALC_ALL_OPTIONS_EXCLUDING_THE_RRDR_ONES (RRDCALC_OPTION_NO_CLEAR_NOTIFICATION)
struct rrdcalc {
STRING *key; // the unique key in the host's rrdcalc_root_index
uint32_t id; // the unique id of this alarm
uint32_t next_event_id; // the next event id that will be used for this alarm
uuid_t config_hash_id; // a predictable hash_id based on specific alert configuration
STRING *name; // the name of this alarm
STRING *chart; // the chart id this should be linked to
STRING *exec; // the command to execute when this alarm switches state
STRING *recipient; // the recipient of the alarm (the first parameter to exec)
STRING *classification; // the class that this alarm belongs
STRING *component; // the component that this alarm refers to
STRING *type; // type of the alarm
STRING *plugin_match; // the plugin name that should be linked to
SIMPLE_PATTERN *plugin_pattern;
STRING *module_match; // the module name that should be linked to
SIMPLE_PATTERN *module_pattern;
STRING *source; // the source of this alarm
STRING *units; // the units of the alarm
STRING *original_info; // the original info field before any variable replacement
STRING *info; // a short description of the alarm
int update_every; // update frequency for the alarm
// the red and green threshold of this alarm (to be set to the chart)
NETDATA_DOUBLE green;
NETDATA_DOUBLE red;
// ------------------------------------------------------------------------
// database lookup settings
STRING *dimensions; // the chart dimensions
STRING *foreach_dimension; // the group of dimensions that the `foreach` will be applied.
SIMPLE_PATTERN *foreach_dimension_pattern; // used if and only if there is a simple pattern for the chart.
RRDR_GROUPING group; // grouping method: average, max, etc.
int before; // ending point in time-series
int after; // starting point in time-series
RRDCALC_OPTIONS options; // configuration options
// ------------------------------------------------------------------------
// expressions related to the alarm
EVAL_EXPRESSION *calculation; // expression to calculate the value of the alarm
EVAL_EXPRESSION *warning; // expression to check the warning condition
EVAL_EXPRESSION *critical; // expression to check the critical condition
// ------------------------------------------------------------------------
// notification delay settings
int delay_up_duration; // duration to delay notifications when alarm raises
int delay_down_duration; // duration to delay notifications when alarm lowers
int delay_max_duration; // the absolute max delay to apply to this alarm
float delay_multiplier; // multiplier for all delays when alarms switch status
// while now < delay_up_to
// ------------------------------------------------------------------------
// notification repeat settings
uint32_t warn_repeat_every; // interval between repeating warning notifications
uint32_t crit_repeat_every; // interval between repeating critical notifications
// ------------------------------------------------------------------------
// Labels settings
STRING *host_labels; // the label read from an alarm file
SIMPLE_PATTERN *host_labels_pattern; // the simple pattern of labels
// ------------------------------------------------------------------------
// runtime information
RRDCALC_STATUS old_status; // the old status of the alarm
RRDCALC_STATUS status; // the current status of the alarm
NETDATA_DOUBLE value; // the current value of the alarm
NETDATA_DOUBLE old_value; // the previous value of the alarm
RRDCALC_FLAGS run_flags; // check RRDCALC_FLAG_*
time_t last_updated; // the last update timestamp of the alarm
time_t next_update; // the next update timestamp of the alarm
time_t last_status_change; // the timestamp of the last time this alarm changed status
time_t last_repeat; // the last time the alarm got repeated
uint32_t times_repeat; // number of times the alarm got repeated
time_t db_after; // the first timestamp evaluated by the db lookup
time_t db_before; // the last timestamp evaluated by the db lookup
time_t delay_up_to_timestamp; // the timestamp up to which we should delay notifications
int delay_up_current; // the current up notification delay duration
int delay_down_current; // the current down notification delay duration
int delay_last; // the last delay we used
// ------------------------------------------------------------------------
// variables this alarm exposes to the rest of the alarms
const RRDVAR_ACQUIRED *rrdvar_local;
const RRDVAR_ACQUIRED *rrdvar_family;
const RRDVAR_ACQUIRED *rrdvar_host_chart_id;
const RRDVAR_ACQUIRED *rrdvar_host_chart_name;
// ------------------------------------------------------------------------
// the chart this alarm it is linked to
size_t labels_version;
struct rrdset *rrdset;
struct rrdcalc *next;
struct rrdcalc *prev;
};
#define rrdcalc_name(rc) string2str((rc)->name)
#define rrdcalc_chart_name(rc) string2str((rc)->chart)
#define rrdcalc_exec(rc) string2str((rc)->exec)
#define rrdcalc_recipient(rc) string2str((rc)->recipient)
#define rrdcalc_classification(rc) string2str((rc)->classification)
#define rrdcalc_component(rc) string2str((rc)->component)
#define rrdcalc_type(rc) string2str((rc)->type)
#define rrdcalc_plugin_match(rc) string2str((rc)->plugin_match)
#define rrdcalc_module_match(rc) string2str((rc)->module_match)
#define rrdcalc_source(rc) string2str((rc)->source)
#define rrdcalc_units(rc) string2str((rc)->units)
#define rrdcalc_original_info(rc) string2str((rc)->original_info)
#define rrdcalc_info(rc) string2str((rc)->info)
#define rrdcalc_dimensions(rc) string2str((rc)->dimensions)
#define rrdcalc_foreachdim(rc) string2str((rc)->foreach_dimension)
#define rrdcalc_host_labels(rc) string2str((rc)->host_labels)
#define foreach_rrdcalc_in_rrdhost_read(host, rc) \
dfe_start_read((host)->rrdcalc_root_index, rc) \
#define foreach_rrdcalc_in_rrdhost_reentrant(host, rc) \
dfe_start_reentrant((host)->rrdcalc_root_index, rc)
#define foreach_rrdcalc_in_rrdhost_done(rc) \
dfe_done(rc)
struct alert_config {
STRING *alarm;
STRING *template_key;
STRING *os;
STRING *host;
STRING *on;
STRING *families;
STRING *plugin;
STRING *module;
STRING *charts;
STRING *lookup;
STRING *calc;
STRING *warn;
STRING *crit;
STRING *every;
STRING *green;
STRING *red;
STRING *exec;
STRING *to;
STRING *units;
STRING *info;
STRING *classification;
STRING *component;
STRING *type;
STRING *delay;
STRING *options;
STRING *repeat;
STRING *host_labels;
STRING *p_db_lookup_dimensions;
STRING *p_db_lookup_method;
uint32_t p_db_lookup_options;
int32_t p_db_lookup_after;
int32_t p_db_lookup_before;
int32_t p_update_every;
};
#define RRDCALC_HAS_DB_LOOKUP(rc) ((rc)->after)
void rrdcalc_update_info_using_rrdset_labels(RRDCALC *rc);
void rrdcalc_link_matching_alerts_to_rrdset(RRDSET *st);
const RRDCALC_ACQUIRED *rrdcalc_from_rrdset_get(RRDSET *st, const char *alert_name);
void rrdcalc_from_rrdset_release(RRDSET *st, const RRDCALC_ACQUIRED *rca);
RRDCALC *rrdcalc_acquired_to_rrdcalc(const RRDCALC_ACQUIRED *rca);
const char *rrdcalc_status2string(RRDCALC_STATUS status);
void rrdcalc_free_unused_rrdcalc_loaded_from_config(RRDCALC *rc);
uint32_t rrdcalc_get_unique_id(RRDHOST *host, STRING *chart, STRING *name, uint32_t *next_event_id);
void rrdcalc_add_from_rrdcalctemplate(RRDHOST *host, RRDCALCTEMPLATE *rt, RRDSET *st, const char *overwrite_alert_name, const char *overwrite_dimensions);
int rrdcalc_add_from_config(RRDHOST *host, RRDCALC *rc);
void rrdcalc_delete_alerts_not_matching_host_labels_from_all_hosts();
void rrdcalc_delete_alerts_not_matching_host_labels_from_this_host(RRDHOST *host);
static inline int rrdcalc_isrepeating(RRDCALC *rc) {
if (unlikely(rc->warn_repeat_every > 0 || rc->crit_repeat_every > 0)) {
return 1;
}
return 0;
}
void rrdcalc_unlink_all_rrdset_alerts(RRDSET *st);
void rrdcalc_delete_all(RRDHOST *host);
void rrdcalc_rrdhost_index_init(RRDHOST *host);
void rrdcalc_rrdhost_index_destroy(RRDHOST *host);
#define RRDCALC_VAR_MAX 100
#define RRDCALC_VAR_FAMILY "$family"
#define RRDCALC_VAR_LABEL "$label:"
#define RRDCALC_VAR_LABEL_LEN (sizeof(RRDCALC_VAR_LABEL)-1)
#endif //NETDATA_RRDCALC_H
|