#define RRDCALC_FLAG_CRIT_ERROR 0x00000020
typedef struct rrdcalc {
- uint32_t id;
- uint32_t next_event_id;
+ 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
- char *name;
- uint32_t hash;
+ char *name; // the name of this alarm
+ uint32_t hash;
- char *exec;
- char *recipient;
+ char *exec; // the command to execute when this alarm switches state
+ char *recipient; // the recipient of the alarm (the first parameter to exec)
- char *chart; // the chart id this should be linked to
+ char *chart; // the chart id this should be linked to
uint32_t hash_chart;
- char *source; // the source of this calculation
- char *units;
- char *info;
+ char *source; // the source of this alarm
+ char *units; // the units of the alarm
+ char *info; // a short description of the alarm
- char *dimensions; // the chart dimensions
+ int update_every; // update frequency for the alarm
- int group; // grouping method: average, max, etc.
- int before; // ending point in time-series
- int after; // starting point in time-series
- uint32_t options; // calculation options
- int update_every; // update frequency for the calculation
+ // the red and green threshold of this alarm (to be set to the chart)
+ calculated_number green;
+ calculated_number red;
- time_t last_updated;
- time_t next_update;
+ // ------------------------------------------------------------------------
+ // database lookup settings
- EVAL_EXPRESSION *calculation;
- EVAL_EXPRESSION *warning;
- EVAL_EXPRESSION *critical;
+ char *dimensions; // the chart dimensions
+ int group; // grouping method: average, max, etc.
+ int before; // ending point in time-series
+ int after; // starting point in time-series
+ uint32_t options; // calculation options
- uint32_t rrdcalc_flags;
- int status;
+ // ------------------------------------------------------------------------
+ // expressions related to the alarm
- time_t db_after;
- time_t db_before;
- time_t last_status_change;
+ 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
- calculated_number value;
- calculated_number old_value;
+ // ------------------------------------------------------------------------
+ // notification delay settings
- calculated_number green;
- calculated_number red;
+ 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
+
+ // ------------------------------------------------------------------------
+ // runtime information
+
+ int status; // the current status of the alarm
+
+ calculated_number value; // the current value of the alarm
+ calculated_number old_value; // the previous value of the alarm
+
+ uint32_t rrdcalc_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 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
RRDVAR *local;
RRDVAR *family;
RRDVAR *hostid;
RRDVAR *hostname;
+ // ------------------------------------------------------------------------
+ // the chart this alarm it is linked to
+
struct rrdset *rrdset;
+
+ // linking of this alarm on its chart
struct rrdcalc *rrdset_next;
struct rrdcalc *rrdset_prev;
char *context;
uint32_t hash_context;
- char *source; // the source of this template
- char *units;
- char *info;
+ char *source; // the source of this alarm
+ char *units; // the units of the alarm
+ char *info; // a short description of the alarm
- char *dimensions;
+ int update_every; // update frequency for the alarm
- int group; // grouping method: average, max, etc.
- int before; // ending point in time-series
- int after; // starting point in time-series
- uint32_t options; // calculation options
- int update_every; // update frequency for the calculation
+ // the red and green threshold of this alarm (to be set to the chart)
+ calculated_number green;
+ calculated_number red;
+
+ // ------------------------------------------------------------------------
+ // database lookup settings
+
+ char *dimensions; // the chart dimensions
+ int group; // grouping method: average, max, etc.
+ int before; // ending point in time-series
+ int after; // starting point in time-series
+ uint32_t options; // calculation options
+
+ // ------------------------------------------------------------------------
+ // 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
+
+ // ------------------------------------------------------------------------
+ // expressions related to the alarm
EVAL_EXPRESSION *calculation;
EVAL_EXPRESSION *warning;
EVAL_EXPRESSION *critical;
- calculated_number green;
- calculated_number red;
-
struct rrdcalctemplate *next;
} RRDCALCTEMPLATE;
char *exec;
char *recipient;
+ time_t exec_run_timestamp;
int exec_code;
char *source;
uint32_t notifications;
+ int delay;
+ time_t delay_up_to_timestamp;
+
struct alarm_entry *updated_by;
struct alarm_entry *next;
} ALARM_ENTRY;