@cryptotaxi247 / netdata-1 / commits / 96cac58ec

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 */