Adds Alert Related API for new protocol (#11424)
* adds alarm related message generators, parsers and API for the new protocol
Timotej S committed
Aug 27, 2021 at 08:26 UTC
96cac58ec8307a7088a4abc90e3ba6c1553745a1
16 files changed
+638
-32
Makefile.am
+18
@@ -578,6 +578,8 @@ ACLK_NG_FILES = \
578
aclk/https_client.h \
579
aclk/aclk_charts_api.c \
580
aclk/aclk_charts_api.h \
581
+ aclk/aclk_alarm_api.c \
582
+ aclk/aclk_alarm_api.h \
583
mqtt_websockets/src/mqtt_wss_client.c \
584
mqtt_websockets/src/include/mqtt_wss_client.h \
585
mqtt_websockets/src/mqtt_wss_log.c \
@@ -599,6 +601,10 @@ ACLK_NG_FILES = \
601
aclk/schema-wrappers/chart_stream.h \
602
aclk/schema-wrappers/chart_config.cc \
603
aclk/schema-wrappers/chart_config.h \
604
+ aclk/schema-wrappers/alarm_stream.cc \
605
+ aclk/schema-wrappers/alarm_stream.h \
606
+ aclk/schema-wrappers/alarm_config.cc \
607
+ aclk/schema-wrappers/alarm_config.h \
608
aclk/schema-wrappers/node_info.cc \
609
aclk/schema-wrappers/node_info.h \
610
aclk/schema-wrappers/schema_wrappers.h \
@@ -638,6 +644,10 @@ ACLK_NG_PROTO_BUILT_FILES = aclk/aclk-schemas/proto/agent/v1/connection.pb.cc \
644
aclk/aclk-schemas/proto/chart/v1/config.pb.h \
645
aclk/aclk-schemas/proto/aclk/v1/lib.pb.cc \
646
aclk/aclk-schemas/proto/aclk/v1/lib.pb.h \
647
+ aclk/aclk-schemas/proto/alarm/v1/config.pb.cc \
648
+ aclk/aclk-schemas/proto/alarm/v1/config.pb.h \
649
+ aclk/aclk-schemas/proto/alarm/v1/stream.pb.cc \
650
+ aclk/aclk-schemas/proto/alarm/v1/stream.pb.h \
651
aclk/aclk-schemas/proto/nodeinstance/info/v1/info.pb.cc \
652
aclk/aclk-schemas/proto/nodeinstance/info/v1/info.pb.h \
653
$(NULL)
@@ -678,6 +688,14 @@ aclk/aclk-schemas/proto/aclk/v1/lib.pb.cc \
688
aclk/aclk-schemas/proto/aclk/v1/lib.pb.h: aclk/aclk-schemas/proto/aclk/v1/lib.proto
689
$(PROTOC) -I=aclk/aclk-schemas --cpp_out=$(builddir)/aclk/aclk-schemas $^
690
691
+aclk/aclk-schemas/proto/alarm/v1/config.pb.cc \
692
+aclk/aclk-schemas/proto/alarm/v1/config.pb.h: aclk/aclk-schemas/proto/alarm/v1/config.proto
693
+ $(PROTOC) -I=aclk/aclk-schemas --cpp_out=$(builddir)/aclk/aclk-schemas $^
694
+
695
+aclk/aclk-schemas/proto/alarm/v1/stream.pb.cc \
696
+aclk/aclk-schemas/proto/alarm/v1/stream.pb.h: aclk/aclk-schemas/proto/alarm/v1/stream.proto
697
+ $(PROTOC) -I=aclk/aclk-schemas --cpp_out=$(builddir)/aclk/aclk-schemas $^
698
+
699
aclk/aclk-schemas/proto/nodeinstance/info/v1/info.pb.cc \
700
aclk/aclk-schemas/proto/nodeinstance/info/v1/info.pb.h: aclk/aclk-schemas/proto/nodeinstance/info/v1/info.proto
701
$(PROTOC) -I=aclk/aclk-schemas --cpp_out=$(builddir)/aclk/aclk-schemas $^
aclk/aclk.c
+5
@@ -1014,3 +1014,8 @@ void aclk_send_node_instances()
1014
}
1015
freez(list_head);
1016
}
1017
+
1018
+void aclk_send_bin_msg(char *msg, size_t msg_len, enum aclk_topics subtopic, const char *msgname)
1019
+{
1020
+ aclk_send_bin_message_subtopic_pid(mqttwss_client, msg, msg_len, subtopic, msgname);
1021
+}
aclk/aclk.h
+2
@@ -47,4 +47,6 @@ void ng_aclk_host_state_update(RRDHOST *host, int cmd);
47
48
void aclk_send_node_instances(void);
49
50
+void aclk_send_bin_msg(char *msg, size_t msg_len, enum aclk_topics subtopic, const char *msgname);
51
+
52
#endif /* ACLK_H */
aclk/aclk_alarm_api.c
new
+37
@@ -0,0 +1,37 @@
1
+// SPDX-License-Identifier: GPL-3.0-or-later
2
+
3
+#include "aclk_alarm_api.h"
4
+
5
+#include "aclk_query_queue.h"
6
+
7
+#include "aclk_util.h"
8
+
9
+#include "aclk.h"
10
+
11
+void aclk_send_alarm_log_health(struct alarm_log_health *log_health)
12
+{
13
+ aclk_query_t query = aclk_query_new(ALARM_LOG_HEALTH);
14
+ query->data.bin_payload.payload = generate_alarm_log_health(&query->data.bin_payload.size, log_health);
15
+ query->data.bin_payload.topic = ACLK_TOPICID_ALARM_HEALTH;
16
+ query->data.bin_payload.msg_name = "AlarmLogHealth";
17
+ if (query->data.bin_payload.payload)
18
+ aclk_queue_query(query);
19
+}
20
+
21
+void aclk_send_alarm_log_entry(struct alarm_log_entry *log_entry)
22
+{
23
+ size_t payload_size;
24
+ char *payload = generate_alarm_log_entry(&payload_size, log_entry);
25
+
26
+ aclk_send_bin_msg(payload, payload_size, ACLK_TOPICID_ALARM_LOG, "AlarmLogEntry");
27
+}
28
+
29
+void aclk_send_provide_alarm_cfg(struct provide_alarm_configuration *cfg)
30
+{
31
+ aclk_query_t query = aclk_query_new(ALARM_PROVIDE_CFG);
32
+ query->data.bin_payload.payload = generate_provide_alarm_configuration(&query->data.bin_payload.size, cfg);
33
+ query->data.bin_payload.topic = ACLK_TOPICID_ALARM_CONFIG;
34
+ query->data.bin_payload.msg_name = "ProvideAlarmConfiguration";
35
+ if (query->data.bin_payload.payload)
36
+ aclk_queue_query(query);
37
+}
aclk/aclk_alarm_api.h
new
+13
@@ -0,0 +1,13 @@
1
+// SPDX-License-Identifier: GPL-3.0-or-later
2
+
3
+#ifndef ACLK_ALARM_API_H
4
+#define ACLK_ALARM_API_H
5
+
6
+#include "../daemon/common.h"
7
+#include "schema-wrappers/schema_wrappers.h"
8
+
9
+void aclk_send_alarm_log_health(struct alarm_log_health *log_health);
10
+void aclk_send_alarm_log_entry(struct alarm_log_entry *log_entry);
11
+void aclk_send_provide_alarm_cfg(struct provide_alarm_configuration *cfg);
12
+
13
+#endif /* ACLK_ALARM_API_H */
aclk/aclk_query.c
+2
@@ -294,6 +294,8 @@ aclk_query_handler aclk_query_handlers[] = {
294
{ .type = CHART_RESET, .name = "reset chart messages", .fnc = send_bin_msg },
295
{ .type = RETENTION_UPDATED, .name = "update retention info", .fnc = send_bin_msg },
296
{ .type = UPDATE_NODE_INFO, .name = "update node info", .fnc = send_bin_msg },
297
+ { .type = ALARM_LOG_HEALTH, .name = "alarm log health", .fnc = send_bin_msg },
298
+ { .type = ALARM_PROVIDE_CFG, .name = "provide alarm config", .fnc = send_bin_msg },
299
{ .type = UNKNOWN, .name = NULL, .fnc = NULL }
300
};
301
aclk/aclk_query_queue.c
+2
@@ -171,6 +171,8 @@ void aclk_query_free(aclk_query_t query)
171
case CHART_RESET:
172
case RETENTION_UPDATED:
173
case UPDATE_NODE_INFO:
174
+ case ALARM_LOG_HEALTH:
175
+ case ALARM_PROVIDE_CFG:
176
freez(query->data.bin_payload.payload);
177
break;
178
aclk/aclk_query_queue.h
+3
-1
@@ -23,7 +23,9 @@ typedef enum {
23
CHART_CONFIG_UPDATED,
24
CHART_RESET,
25
RETENTION_UPDATED,
26
- UPDATE_NODE_INFO
26
+ UPDATE_NODE_INFO,
27
+ ALARM_LOG_HEALTH,
28
+ ALARM_PROVIDE_CFG
29
} aclk_query_type_t;
30
31
struct aclk_query_metadata {
aclk/aclk_util.c
+6
@@ -125,6 +125,9 @@ struct topic_name {
125
{ .id = ACLK_TOPICID_CHART_RESET, .name = "reset-charts" },
126
{ .id = ACLK_TOPICID_RETENTION_UPDATED, .name = "chart-retention-updated" },
127
{ .id = ACLK_TOPICID_NODE_INFO, .name = "node-instance-info" },
128
+ { .id = ACLK_TOPICID_ALARM_LOG, .name = "alarm-log" },
129
+ { .id = ACLK_TOPICID_ALARM_HEALTH, .name = "alarm-health" },
130
+ { .id = ACLK_TOPICID_ALARM_CONFIG, .name = "alarm-config" },
131
{ .id = ACLK_TOPICID_UNKNOWN, .name = NULL }
132
};
133
@@ -151,6 +154,9 @@ enum aclk_topics compulsory_topics_new_cloud_arch[] = {
154
ACLK_TOPICID_CHART_RESET,
155
ACLK_TOPICID_RETENTION_UPDATED,
156
ACLK_TOPICID_NODE_INFO,
157
+ ACLK_TOPICID_ALARM_LOG,
158
+ ACLK_TOPICID_ALARM_HEALTH,
159
+ ACLK_TOPICID_ALARM_CONFIG,
160
ACLK_TOPICID_UNKNOWN
161
};
162
aclk/aclk_util.h
+4
-1
@@ -69,7 +69,10 @@ enum aclk_topics {
69
ACLK_TOPICID_CHART_CONFIGS_UPDATED = 10,
70
ACLK_TOPICID_CHART_RESET = 11,
71
ACLK_TOPICID_RETENTION_UPDATED = 12,
72
- ACLK_TOPICID_NODE_INFO = 13
72
+ ACLK_TOPICID_NODE_INFO = 13,
73
+ ACLK_TOPICID_ALARM_LOG = 14,
74
+ ACLK_TOPICID_ALARM_HEALTH = 15,
75
+ ACLK_TOPICID_ALARM_CONFIG = 16
76
};
77
78
const char *aclk_get_topic(enum aclk_topics topic);
aclk/schema-wrappers/alarm_config.cc
new
+147
@@ -0,0 +1,147 @@
1
+// SPDX-License-Identifier: GPL-3.0-or-later
2
+
3
+#include "alarm_config.h"
4
+
5
+#include "proto/alarm/v1/config.pb.h"
6
+
7
+#include "libnetdata/libnetdata.h"
8
+
9
+#include "schema_wrapper_utils.h"
10
+
11
+using namespace alarmconfig::v1;
12
+
13
+void destroy_aclk_alarm_configuration(struct aclk_alarm_configuration *cfg)
14
+{
15
+ freez(cfg->alarm);
16
+ freez(cfg->tmpl);
17
+ freez(cfg->on_chart);
18
+
19
+ freez(cfg->classification);
20
+ freez(cfg->type);
21
+ freez(cfg->component);
22
+
23
+ freez(cfg->os);
24
+ freez(cfg->hosts);
25
+ freez(cfg->plugin);
26
+ freez(cfg->module);
27
+ freez(cfg->charts);
28
+ freez(cfg->families);
29
+ freez(cfg->lookup);
30
+ freez(cfg->every);
31
+ freez(cfg->units);
32
+
33
+ freez(cfg->green);
34
+ freez(cfg->red);
35
+
36
+ freez(cfg->calculation_expr);
37
+ freez(cfg->warning_expr);
38
+ freez(cfg->critical_expr);
39
+
40
+ freez(cfg->recipient);
41
+ freez(cfg->exec);
42
+ freez(cfg->delay);
43
+ freez(cfg->repeat);
44
+ freez(cfg->info);
45
+ freez(cfg->options);
46
+ freez(cfg->host_labels);
47
+
48
+ freez(cfg->p_db_lookup_dimensions);
49
+ freez(cfg->p_db_lookup_method);
50
+ freez(cfg->p_db_lookup_options);
51
+}
52
+
53
+char *generate_provide_alarm_configuration(size_t *len, struct provide_alarm_configuration *data)
54
+{
55
+ ProvideAlarmConfiguration msg;
56
+ AlarmConfiguration *cfg = msg.mutable_config();
57
+
58
+ msg.set_config_hash(data->cfg_hash);
59
+
60
+ if (data->cfg.alarm)
61
+ cfg->set_alarm(data->cfg.alarm);
62
+ if (data->cfg.tmpl)
63
+ cfg->set_template_(data->cfg.tmpl);
64
+ if(data->cfg.on_chart)
65
+ cfg->set_on_chart(data->cfg.on_chart);
66
+
67
+ if (data->cfg.classification)
68
+ cfg->set_classification(data->cfg.classification);
69
+ if (data->cfg.type)
70
+ cfg->set_type(data->cfg.type);
71
+ if (data->cfg.component)
72
+ cfg->set_component(data->cfg.component);
73
+
74
+ if (data->cfg.os)
75
+ cfg->set_os(data->cfg.os);
76
+ if (data->cfg.hosts)
77
+ cfg->set_hosts(data->cfg.hosts);
78
+ if (data->cfg.plugin)
79
+ cfg->set_plugin(data->cfg.plugin);
80
+ if(data->cfg.module)
81
+ cfg->set_module(data->cfg.module);
82
+ if(data->cfg.charts)
83
+ cfg->set_charts(data->cfg.charts);
84
+ if(data->cfg.families)
85
+ cfg->set_families(data->cfg.families);
86
+ if(data->cfg.lookup)
87
+ cfg->set_lookup(data->cfg.lookup);
88
+ if(data->cfg.every)
89
+ cfg->set_every(data->cfg.every);
90
+ if(data->cfg.units)
91
+ cfg->set_units(data->cfg.units);
92
+
93
+ if (data->cfg.green)
94
+ cfg->set_green(data->cfg.green);
95
+ if (data->cfg.red)
96
+ cfg->set_red(data->cfg.red);
97
+
98
+ if (data->cfg.calculation_expr)
99
+ cfg->set_calculation_expr(data->cfg.calculation_expr);
100
+ if (data->cfg.warning_expr)
101
+ cfg->set_warning_expr(data->cfg.warning_expr);
102
+ if (data->cfg.critical_expr)
103
+ cfg->set_critical_expr(data->cfg.critical_expr);
104
+
105
+ if (data->cfg.recipient)
106
+ cfg->set_recipient(data->cfg.recipient);
107
+ if (data->cfg.exec)
108
+ cfg->set_exec(data->cfg.exec);
109
+ if (data->cfg.delay)
110
+ cfg->set_delay(data->cfg.delay);
111
+ if (data->cfg.repeat)
112
+ cfg->set_repeat(data->cfg.repeat);
113
+ if (data->cfg.info)
114
+ cfg->set_info(data->cfg.info);
115
+ if (data->cfg.options)
116
+ cfg->set_options(data->cfg.options);
117
+ if (data->cfg.host_labels)
118
+ cfg->set_host_labels(data->cfg.host_labels);
119
+
120
+ cfg->set_p_db_lookup_after(data->cfg.p_db_lookup_after);
121
+ cfg->set_p_db_lookup_before(data->cfg.p_db_lookup_before);
122
+ if (data->cfg.p_db_lookup_dimensions)
123
+ cfg->set_p_db_lookup_dimensions(data->cfg.p_db_lookup_dimensions);
124
+ if (data->cfg.p_db_lookup_method)
125
+ cfg->set_p_db_lookup_method(data->cfg.p_db_lookup_method);
126
+ if (data->cfg.p_db_lookup_options)
127
+ cfg->set_p_db_lookup_options(data->cfg.p_db_lookup_options);
128
+ cfg->set_p_update_every(data->cfg.p_update_every);
129
+
130
+ *len = PROTO_COMPAT_MSG_SIZE(msg);
131
+ char *bin = (char*)mallocz(*len);
132
+ if (!msg.SerializeToArray(bin, *len))
133
+ return NULL;
134
+
135
+ return bin;
136
+}
137
+
138
+char *parse_send_alarm_configuration(const char *data, size_t len)
139
+{
140
+ SendAlarmConfiguration msg;
141
+ if (!msg.ParseFromArray(data, len))
142
+ return NULL;
143
+ if (!msg.config_hash().c_str())
144
+ return NULL;
145
+ return strdupz(msg.config_hash().c_str());
146
+}
147
+
aclk/schema-wrappers/alarm_config.h
new
+69
@@ -0,0 +1,69 @@
1
+// SPDX-License-Identifier: GPL-3.0-or-later
2
+
3
+#ifndef ACLK_SCHEMA_WRAPPER_ALARM_CONFIG_H
4
+#define ACLK_SCHEMA_WRAPPER_ALARM_CONFIG_H
5
+
6
+#include <stdlib.h>
7
+#include <stdint.h>
8
+
9
+#ifdef __cplusplus
10
+extern "C" {
11
+#endif
12
+
13
+struct aclk_alarm_configuration {
14
+ char *alarm;
15
+ char *tmpl;
16
+ char *on_chart;
17
+
18
+ char *classification;
19
+ char *type;
20
+ char *component;
21
+
22
+ char *os;
23
+ char *hosts;
24
+ char *plugin;
25
+ char *module;
26
+ char *charts;
27
+ char *families;
28
+ char *lookup;
29
+ char *every;
30
+ char *units;
31
+
32
+ char *green;
33
+ char *red;
34
+
35
+ char *calculation_expr;
36
+ char *warning_expr;
37
+ char *critical_expr;
38
+
39
+ char *recipient;
40
+ char *exec;
41
+ char *delay;
42
+ char *repeat;
43
+ char *info;
44
+ char *options;
45
+ char *host_labels;
46
+
47
+ int32_t p_db_lookup_after;
48
+ int32_t p_db_lookup_before;
49
+ char *p_db_lookup_dimensions;
50
+ char *p_db_lookup_method;
51
+ char *p_db_lookup_options;
52
+ int32_t p_update_every;
53
+};
54
+
55
+void destroy_aclk_alarm_configuration(struct aclk_alarm_configuration *cfg);
56
+
57
+struct provide_alarm_configuration {
58
+ char *cfg_hash;
59
+ struct aclk_alarm_configuration cfg;
60
+};
61
+
62
+char *generate_provide_alarm_configuration(size_t *len, struct provide_alarm_configuration *data);
63
+char *parse_send_alarm_configuration(const char *data, size_t len);
64
+
65
+#ifdef __cplusplus
66
+}
67
+#endif
68
+
69
+#endif /* ACLK_SCHEMA_WRAPPER_ALARM_CONFIG_H */
aclk/schema-wrappers/alarm_stream.cc
new
+176
@@ -0,0 +1,176 @@
1
+// SPDX-License-Identifier: GPL-3.0-or-later
2
+
3
+#include "alarm_stream.h"
4
+
5
+#include "proto/alarm/v1/stream.pb.h"
6
+
7
+#include "libnetdata/libnetdata.h"
8
+
9
+#include "schema_wrapper_utils.h"
10
+
11
+struct start_alarm_streaming parse_start_alarm_streaming(const char *data, size_t len)
12
+{
13
+ struct start_alarm_streaming ret;
14
+ memset(&ret, 0, sizeof(ret));
15
+
16
+ alarmstream::v1::StartAlarmStreaming msg;
17
+
18
+ if (!msg.ParseFromArray(data, len))
19
+ return ret;
20
+
21
+ ret.node_id = strdupz(msg.node_id().c_str());
22
+ ret.batch_id = msg.batch_id();
23
+ ret.start_seq_id = msg.start_sequnce_id();
24
+
25
+ return ret;
26
+}
27
+
28
+char *parse_send_alarm_log_health(const char *data, size_t len)
29
+{
30
+ alarmstream::v1::SendAlarmLogHealth msg;
31
+ if (!msg.ParseFromArray(data, len))
32
+ return NULL;
33
+ return strdupz(msg.node_id().c_str());
34
+}
35
+
36
+char *generate_alarm_log_health(size_t *len, struct alarm_log_health *data)
37
+{
38
+ alarmstream::v1::AlarmLogHealth msg;
39
+ alarmstream::v1::LogEntries *entries;
40
+
41
+ msg.set_claim_id(data->claim_id);
42
+ msg.set_node_id(data->node_id);
43
+ msg.set_enabled(data->enabled);
44
+
45
+ switch (data->status) {
46
+ case ALARM_LOG_STATUS_IDLE:
47
+ msg.set_status(alarmstream::v1::ALARM_LOG_STATUS_IDLE);
48
+ break;
49
+ case ALARM_LOG_STATUS_RUNNING:
50
+ msg.set_status(alarmstream::v1::ALARM_LOG_STATUS_RUNNING);
51
+ break;
52
+ case ALARM_LOG_STATUS_UNSPECIFIED:
53
+ msg.set_status(alarmstream::v1::ALARM_LOG_STATUS_UNSPECIFIED);
54
+ break;
55
+ default:
56
+ error("Unknown status of AlarmLogHealth LogEntry");
57
+ return NULL;
58
+ }
59
+
60
+ entries = msg.mutable_log_entries();
61
+ entries->set_first_sequence_id(data->log_entries.first_seq_id);
62
+ entries->set_last_sequence_id(data->log_entries.last_seq_id);
63
+
64
+ set_google_timestamp_from_timeval(data->log_entries.first_when, entries->mutable_first_when());
65
+ set_google_timestamp_from_timeval(data->log_entries.last_when, entries->mutable_last_when());
66
+
67
+ *len = PROTO_COMPAT_MSG_SIZE(msg);
68
+ char *bin = (char*)mallocz(*len);
69
+ if (!msg.SerializeToArray(bin, *len))
70
+ return NULL;
71
+
72
+ return bin;
73
+}
74
+
75
+static alarmstream::v1::AlarmStatus aclk_alarm_status_to_proto(enum aclk_alarm_status status)
76
+{
77
+ switch (status) {
78
+ case ALARM_STATUS_NULL:
79
+ return alarmstream::v1::ALARM_STATUS_NULL;
80
+ case ALARM_STATUS_UNKNOWN:
81
+ return alarmstream::v1::ALARM_STATUS_UNKNOWN;
82
+ case ALARM_STATUS_REMOVED:
83
+ return alarmstream::v1::ALARM_STATUS_REMOVED;
84
+ case ALARM_STATUS_NOT_A_NUMBER:
85
+ return alarmstream::v1::ALARM_STATUS_NOT_A_NUMBER;
86
+ case ALARM_STATUS_CLEAR:
87
+ return alarmstream::v1::ALARM_STATUS_CLEAR;
88
+ case ALARM_STATUS_WARNING:
89
+ return alarmstream::v1::ALARM_STATUS_WARNING;
90
+ case ALARM_STATUS_CRITICAL:
91
+ return alarmstream::v1::ALARM_STATUS_CRITICAL;
92
+ default:
93
+ error("Unknown alarm status");
94
+ return alarmstream::v1::ALARM_STATUS_UNKNOWN;
95
+ }
96
+}
97
+
98
+void destroy_alarm_log_entry(struct alarm_log_entry *entry)
99
+{
100
+ freez(entry->node_id);
101
+ freez(entry->claim_id);
102
+
103
+ freez(entry->chart);
104
+ freez(entry->name);
105
+ freez(entry->family);
106
+
107
+ freez(entry->config_hash);
108
+
109
+ freez(entry->timezone);
110
+
111
+ freez(entry->exec_path);
112
+ freez(entry->conf_source);
113
+ freez(entry->command);
114
+
115
+ freez(entry->value_string);
116
+ freez(entry->old_value_string);
117
+
118
+ freez(entry->rendered_info);
119
+}
120
+
121
+char *generate_alarm_log_entry(size_t *len, struct alarm_log_entry *data)
122
+{
123
+ alarmstream::v1::AlarmLogEntry le;
124
+
125
+ le.set_node_id(data->node_id);
126
+ le.set_claim_id(data->claim_id);
127
+
128
+ le.set_chart(data->chart);
129
+ le.set_name(data->name);
130
+ if (data->family)
131
+ le.set_family(data->family);
132
+
133
+ le.set_batch_id(data->batch_id);
134
+ le.set_sequence_id(data->sequence_id);
135
+ le.set_when(data->when);
136
+
137
+ le.set_config_hash(data->config_hash);
138
+
139
+ le.set_utc_offset(data->utc_offset);
140
+ le.set_timezone(data->timezone);
141
+
142
+ le.set_exec_path(data->exec_path);
143
+ le.set_conf_source(data->conf_source);
144
+ le.set_command(data->command);
145
+
146
+ le.set_duration(data->duration);
147
+ le.set_non_clear_duration(data->non_clear_duration);
148
+
149
+
150
+ le.set_status(aclk_alarm_status_to_proto(data->status));
151
+ le.set_old_status(aclk_alarm_status_to_proto(data->old_status));
152
+ le.set_delay(data->delay);
153
+ le.set_delay_up_to_timestamp(data->delay_up_to_timestamp);
154
+
155
+ le.set_last_repeat(data->last_repeat);
156
+ le.set_silenced(data->silenced);
157
+
158
+ if (data->value_string)
159
+ le.set_value_string(data->value_string);
160
+ if (data->old_value_string)
161
+ le.set_old_value_string(data->old_value_string);
162
+
163
+ le.set_value(data->value);
164
+ le.set_old_value(data->old_value);
165
+
166
+ le.set_updated(data->updated);
167
+
168
+ le.set_rendered_info(data->rendered_info);
169
+
170
+ *len = PROTO_COMPAT_MSG_SIZE(le);
171
+ char *bin = (char*)mallocz(*len);
172
+ if (!le.SerializeToArray(bin, *len))
173
+ return NULL;
174
+
175
+ return bin;
176
+}
aclk/schema-wrappers/alarm_stream.h
new
+110
@@ -0,0 +1,110 @@
1
+// SPDX-License-Identifier: GPL-3.0-or-later
2
+
3
+#ifndef ACLK_SCHEMA_WRAPPER_ALARM_STREAM_H
4
+#define ACLK_SCHEMA_WRAPPER_ALARM_STREAM_H
5
+
6
+#include <stdlib.h>
7
+
8
+#include "database/rrd.h"
9
+
10
+#ifdef __cplusplus
11
+extern "C" {
12
+#endif
13
+
14
+enum alarm_log_status_aclk {
15
+ ALARM_LOG_STATUS_UNSPECIFIED = 0,
16
+ ALARM_LOG_STATUS_RUNNING = 1,
17
+ ALARM_LOG_STATUS_IDLE = 2
18
+};
19
+
20
+struct alarm_log_entries {
21
+ int64_t first_seq_id;
22
+ struct timeval first_when;
23
+
24
+ int64_t last_seq_id;
25
+ struct timeval last_when;
26
+};
27
+
28
+struct alarm_log_health {
29
+ char *claim_id;
30
+ char *node_id;
31
+ int enabled;
32
+ enum alarm_log_status_aclk status;
33
+ struct alarm_log_entries log_entries;
34
+};
35
+
36
+struct start_alarm_streaming {
37
+ char *node_id;
38
+ uint64_t batch_id;
39
+ uint64_t start_seq_id;
40
+};
41
+
42
+struct start_alarm_streaming parse_start_alarm_streaming(const char *data, size_t len);
43
+char *parse_send_alarm_log_health(const char *data, size_t len);
44
+
45
+char *generate_alarm_log_health(size_t *len, struct alarm_log_health *data);
46
+
47
+enum aclk_alarm_status {
48
+ ALARM_STATUS_NULL = 0,
49
+ ALARM_STATUS_UNKNOWN = 1,
50
+ ALARM_STATUS_REMOVED = 2,
51
+ ALARM_STATUS_NOT_A_NUMBER = 3,
52
+ ALARM_STATUS_CLEAR = 4,
53
+ ALARM_STATUS_WARNING = 5,
54
+ ALARM_STATUS_CRITICAL = 6
55
+};
56
+
57
+struct alarm_log_entry {
58
+ char *node_id;
59
+ char *claim_id;
60
+
61
+ char *chart;
62
+ char *name;
63
+ char *family;
64
+
65
+ uint64_t batch_id;
66
+ uint64_t sequence_id;
67
+ uint64_t when;
68
+
69
+ char *config_hash;
70
+
71
+ int32_t utc_offset;
72
+ char *timezone;
73
+
74
+ char *exec_path;
75
+ char *conf_source;
76
+ char *command;
77
+
78
+ uint32_t duration;
79
+ uint32_t non_clear_duration;
80
+
81
+ enum aclk_alarm_status status;
82
+ enum aclk_alarm_status old_status;
83
+ uint64_t delay;
84
+ uint64_t delay_up_to_timestamp;
85
+
86
+ uint64_t last_repeat;
87
+ int silenced;
88
+
89
+ char *value_string;
90
+ char *old_value_string;
91
+
92
+ double value;
93
+ double old_value;
94
+
95
+ // updated alarm entry, when the status of the alarm has been updated by a later entry
96
+ int updated;
97
+
98
+ // rendered_info
99
+ char *rendered_info;
100
+};
101
+
102
+void destroy_alarm_log_entry(struct alarm_log_entry *entry);
103
+
104
+char *generate_alarm_log_entry(size_t *len, struct alarm_log_entry *data);
105
+
106
+#ifdef __cplusplus
107
+}
108
+#endif
109
+
110
+#endif /* ACLK_SCHEMA_WRAPPER_ALARM_STREAM_H */
aclk/schema-wrappers/node_info.cc
+42
-30
@@ -9,54 +9,66 @@ static int generate_node_info(nodeinstance::info::v1::NodeInfo *info, struct acl
9
struct label *label;
10
google::protobuf::Map<std::string, std::string> *map;
11
12
- try
13
- {
12
+ if (data->name)
13
info->set_name(data->name);
15
-
14
+
15
+ if (data->os)
16
info->set_os(data->os);
17
+ if (data->os_name)
18
info->set_os_name(data->os_name);
19
+ if (data->os_version)
20
info->set_os_version(data->os_version);
19
-
21
+
22
+ if (data->kernel_name)
23
info->set_kernel_name(data->kernel_name);
24
+ if (data->kernel_version)
25
info->set_kernel_version(data->kernel_version);
22
-
26
+
27
+ if (data->architecture)
28
info->set_architecture(data->architecture);
24
-
25
- info->set_cpus(data->cpus);
26
-
29
+
30
+ info->set_cpus(data->cpus);
31
+
32
+ if (data->cpu_frequency)
33
info->set_cpu_frequency(data->cpu_frequency);
28
-
34
+
35
+ if (data->memory)
36
info->set_memory(data->memory);
30
-
37
+
38
+ if (data->disk_space)
39
info->set_disk_space(data->disk_space);
32
-
40
+
41
+ if (data->version)
42
info->set_version(data->version);
34
-
43
+
44
+ if (data->release_channel)
45
info->set_release_channel(data->release_channel);
36
-
46
+
47
+ if (data->timezone)
48
info->set_timezone(data->timezone);
38
-
49
+
50
+ if (data->virtualization_type)
51
info->set_virtualization_type(data->virtualization_type);
40
-
52
+
53
+ if (data->container_type)
54
info->set_container_type(data->container_type);
42
-
55
+
56
+ if (data->custom_info)
57
info->set_custom_info(data->custom_info);
44
-
45
- for (size_t i = 0; i < data->service_count; i++)
46
- info->add_services(data->services[i]);
47
-
58
+
59
+ for (size_t i = 0; i < data->service_count; i++)
60
+ info->add_services(data->services[i]);
61
+
62
+ if (data->machine_guid)
63
info->set_machine_guid(data->machine_guid);
49
-
50
- map = info->mutable_host_labels();
51
- label = data->host_labels_head;
52
- while (label) {
53
- map->insert({label->key, label->value});
54
- label = label->next;
55
- }
56
- }
57
- catch(...) {
58
- return 1;
64
+
65
+ map = info->mutable_host_labels();
66
+ label = data->host_labels_head;
67
+ while (label) {
68
+ map->insert({label->key, label->value});
69
+ label = label->next;
70
}
71
+
72
return 0;
73
}
74
aclk/schema-wrappers/schema_wrappers.h
+2
@@ -10,6 +10,8 @@
10
#include "node_creation.h"
11
#include "chart_config.h"
12
#include "chart_stream.h"
13
+#include "alarm_config.h"
14
+#include "alarm_stream.h"
15
#include "node_info.h"
16
17
#endif /* SCHEMA_WRAPPERS_H */