summaryrefslogtreecommitdiffstats
path: root/src/health/health_prototypes.h
blob: cbb5dba066a9cffb32e0997dc5a78e315e31a506 (plain)
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
// SPDX-License-Identifier: GPL-3.0-or-later

#ifndef NETDATA_HEALTH_PROTOTYPES_H
#define NETDATA_HEALTH_PROTOTYPES_H

#include "../web/api/queries/rrdr.h"

typedef enum __attribute__((packed)) {
    ALERT_ACTION_OPTION_NONE = 0,
    ALERT_ACTION_OPTION_NO_CLEAR_NOTIFICATION = (1 << 0),
} ALERT_ACTION_OPTIONS;

typedef enum __attribute__((packed)) {
    ALERT_LOOKUP_DATA_SOURCE_SAMPLES = 0,
    ALERT_LOOKUP_DATA_SOURCE_PERCENTAGES,
    ALERT_LOOKUP_DATA_SOURCE_ANOMALIES,
} ALERT_LOOKUP_DATA_SOURCE;
ALERT_LOOKUP_DATA_SOURCE alerts_data_sources2id(const char *source);
const char *alerts_data_source_id2source(ALERT_LOOKUP_DATA_SOURCE source);

typedef enum __attribute__((packed)) {
    ALERT_LOOKUP_DIMS_SUM = 0,
    ALERT_LOOKUP_DIMS_MIN,
    ALERT_LOOKUP_DIMS_MAX,
    ALERT_LOOKUP_DIMS_AVERAGE,
    ALERT_LOOKUP_DIMS_MIN2MAX,
} ALERT_LOOKUP_DIMS_GROUPING;
ALERT_LOOKUP_DIMS_GROUPING alerts_dims_grouping2id(const char *group);
const char *alerts_dims_grouping_id2group(ALERT_LOOKUP_DIMS_GROUPING grouping);

typedef enum __attribute__((packed)) {
    ALERT_LOOKUP_TIME_GROUP_CONDITION_EQUAL,
    ALERT_LOOKUP_TIME_GROUP_CONDITION_NOT_EQUAL,
    ALERT_LOOKUP_TIME_GROUP_CONDITION_GREATER,
    ALERT_LOOKUP_TIME_GROUP_CONDITION_LESS,
    ALERT_LOOKUP_TIME_GROUP_CONDITION_GREATER_EQUAL,
    ALERT_LOOKUP_TIME_GROUP_CONDITION_LESS_EQUAL,
} ALERT_LOOKUP_TIME_GROUP_CONDITION;
ALERT_LOOKUP_TIME_GROUP_CONDITION alerts_group_condition2id(const char *source);
const char *alerts_group_conditions_id2txt(ALERT_LOOKUP_TIME_GROUP_CONDITION source);

struct rrd_alert_match {
    bool enabled;

    bool is_template;
    union {
        STRING *chart;
        STRING *context;
    } on;

    STRING *host_labels;                    // the label read from an alarm file
    STRING *chart_labels;                   // the chart label read from an alarm file

    struct pattern_array *host_labels_pattern;
    struct pattern_array *chart_labels_pattern;
};
void rrd_alert_match_cleanup(struct rrd_alert_match *am);

struct rrd_alert_config {
    uuid_t hash_id;

    STRING *name;                   // the name of this alarm

    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

    DYNCFG_SOURCE_TYPE source_type;
    STRING *source;                 // the source of this alarm
    STRING *units;                  // the units of the alarm
    STRING *summary;                // a short alert summary
    STRING *info;                   // a description of the alarm

    int update_every;               // update frequency for the alarm

    ALERT_ACTION_OPTIONS alert_action_options;

    // ------------------------------------------------------------------------
    // database lookup settings

    STRING *dimensions;             // the chart dimensions
    RRDR_TIME_GROUPING time_group;  // grouping method: average, max, etc.
    ALERT_LOOKUP_TIME_GROUP_CONDITION time_group_condition;
    NETDATA_DOUBLE time_group_value;
    ALERT_LOOKUP_DIMS_GROUPING dims_group; // grouping method for dimensions
    ALERT_LOOKUP_DATA_SOURCE data_source;
    int before;                     // ending point in time-series
    int after;                      // starting point in time-series
    RRDR_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

    bool has_custom_repeat_config;
    uint32_t warn_repeat_every;    // interval between repeating warning notifications
    uint32_t crit_repeat_every;    // interval between repeating critical notifications
};
void rrd_alert_config_cleanup(struct rrd_alert_config *ac);

#include "health.h"

void health_init_prototypes(void);

bool health_plugin_enabled(void);
void health_plugin_disable(void);

void health_reload_prototypes(void);
void health_apply_prototypes_to_host(RRDHOST *host);
void health_apply_prototypes_to_all_hosts(void);

void health_prototype_alerts_for_rrdset_incrementally(RRDSET *st);

struct rrd_alert_config;
struct rrd_alert_match;
void health_prototype_copy_config(struct rrd_alert_config *dst, struct rrd_alert_config *src);
void health_prototype_copy_match_without_patterns(struct rrd_alert_match *dst, struct rrd_alert_match *src);
void health_prototype_reset_alerts_for_rrdset(RRDSET *st);

#endif //NETDATA_HEALTH_PROTOTYPES_H