@cryptotaxi247 / netdata-1 / commits / 81e23e71c

Adds new alarm status protocol messages (#11612)

Adds new message parsers and generators for the Alarm Snapshot messages

Timotej S committed Oct 15, 2021 at 12:48 UTC 81e23e71ceeca221342f382576f58a8d45163474
11 files changed +173 -61
aclk/aclk-schemas
+1 -1
@@ -1 +1 @@
1 -Subproject commit a0adf5b1e026ee8339d56cfa27af95bb26b53177
1 +Subproject commit ff110970c006170b01b51a15bf6cdc219ce1dcf5
aclk/aclk_alarm_api.c
+9
@@ -33,3 +33,12 @@ void aclk_send_provide_alarm_cfg(struct provide_alarm_configuration *cfg)
33 query->data.bin_payload.msg_name = "ProvideAlarmConfiguration";
34 QUEUE_IF_PAYLOAD_PRESENT(query);
35 }
36 +
37 +void aclk_send_alarm_snapshot(alarm_snapshot_proto_ptr_t snapshot)
38 +{
39 + aclk_query_t query = aclk_query_new(ALARM_SNAPSHOT);
40 + query->data.bin_payload.payload = generate_alarm_snapshot_bin(&query->data.bin_payload.size, snapshot);
41 + query->data.bin_payload.topic = ACLK_TOPICID_ALARM_SNAPSHOT;
42 + query->data.bin_payload.msg_name = "AlarmSnapshot";
43 + QUEUE_IF_PAYLOAD_PRESENT(query);
44 +}
aclk/aclk_alarm_api.h
+1
@@ -9,5 +9,6 @@
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 +void aclk_send_alarm_snapshot(alarm_snapshot_proto_ptr_t snapshot);
13
14 #endif /* ACLK_ALARM_API_H */
aclk/aclk_query.c
+1
@@ -299,6 +299,7 @@ aclk_query_handler aclk_query_handlers[] = {
299 { .type = UPDATE_NODE_INFO, .name = "update node info", .fnc = send_bin_msg },
300 { .type = ALARM_LOG_HEALTH, .name = "alarm log health", .fnc = send_bin_msg },
301 { .type = ALARM_PROVIDE_CFG, .name = "provide alarm config", .fnc = send_bin_msg },
302 + { .type = ALARM_SNAPSHOT, .name = "alarm snapshot", .fnc = send_bin_msg },
303 #endif
304 { .type = UNKNOWN, .name = NULL, .fnc = NULL }
305 };
aclk/aclk_query_queue.c
+1
@@ -173,6 +173,7 @@ void aclk_query_free(aclk_query_t query)
173 case UPDATE_NODE_INFO:
174 case ALARM_LOG_HEALTH:
175 case ALARM_PROVIDE_CFG:
176 + case ALARM_SNAPSHOT:
177 freez(query->data.bin_payload.payload);
178 break;
179
aclk/aclk_query_queue.h
+2 -1
@@ -25,7 +25,8 @@ typedef enum {
25 RETENTION_UPDATED,
26 UPDATE_NODE_INFO,
27 ALARM_LOG_HEALTH,
28 - ALARM_PROVIDE_CFG
28 + ALARM_PROVIDE_CFG,
29 + ALARM_SNAPSHOT
30 } aclk_query_type_t;
31
32 struct aclk_query_metadata {
aclk/aclk_util.c
+2
@@ -122,6 +122,7 @@ struct topic_name {
122 { .id = ACLK_TOPICID_ALARM_LOG, .name = "alarm-log" },
123 { .id = ACLK_TOPICID_ALARM_HEALTH, .name = "alarm-health" },
124 { .id = ACLK_TOPICID_ALARM_CONFIG, .name = "alarm-config" },
125 + { .id = ACLK_TOPICID_ALARM_SNAPSHOT, .name = "alarm-snapshot" },
126 { .id = ACLK_TOPICID_UNKNOWN, .name = NULL }
127 };
128
@@ -151,6 +152,7 @@ enum aclk_topics compulsory_topics_new_cloud_arch[] = {
152 ACLK_TOPICID_ALARM_LOG,
153 ACLK_TOPICID_ALARM_HEALTH,
154 ACLK_TOPICID_ALARM_CONFIG,
155 + ACLK_TOPICID_ALARM_SNAPSHOT,
156 ACLK_TOPICID_UNKNOWN
157 };
158
aclk/aclk_util.h
+2 -1
@@ -78,7 +78,8 @@ enum aclk_topics {
78 ACLK_TOPICID_NODE_INFO = 13,
79 ACLK_TOPICID_ALARM_LOG = 14,
80 ACLK_TOPICID_ALARM_HEALTH = 15,
81 - ACLK_TOPICID_ALARM_CONFIG = 16
81 + ACLK_TOPICID_ALARM_CONFIG = 16,
82 + ACLK_TOPICID_ALARM_SNAPSHOT = 17
83 };
84
85 const char *aclk_get_topic(enum aclk_topics topic);
aclk/schema-wrappers/alarm_config.cc
+1 -1
@@ -8,7 +8,7 @@
8
9 #include "schema_wrapper_utils.h"
10
11 -using namespace alarmconfig::v1;
11 +using namespace alarms::v1;
12
13 void destroy_aclk_alarm_configuration(struct aclk_alarm_configuration *cfg)
14 {
aclk/schema-wrappers/alarm_stream.cc
+129 -57
@@ -8,12 +8,14 @@
8
9 #include "schema_wrapper_utils.h"
10
11 +using namespace alarms::v1;
12 +
13 struct start_alarm_streaming parse_start_alarm_streaming(const char *data, size_t len)
14 {
15 struct start_alarm_streaming ret;
16 memset(&ret, 0, sizeof(ret));
17
16 - alarmstream::v1::StartAlarmStreaming msg;
18 + StartAlarmStreaming msg;
19
20 if (!msg.ParseFromArray(data, len))
21 return ret;
@@ -27,7 +29,7 @@ struct start_alarm_streaming parse_start_alarm_streaming(const char *data, size_
29
30 char *parse_send_alarm_log_health(const char *data, size_t len)
31 {
30 - alarmstream::v1::SendAlarmLogHealth msg;
32 + SendAlarmLogHealth msg;
33 if (!msg.ParseFromArray(data, len))
34 return NULL;
35 return strdupz(msg.node_id().c_str());
@@ -35,22 +37,22 @@ char *parse_send_alarm_log_health(const char *data, size_t len)
37
38 char *generate_alarm_log_health(size_t *len, struct alarm_log_health *data)
39 {
38 - alarmstream::v1::AlarmLogHealth msg;
39 - alarmstream::v1::LogEntries *entries;
40 + AlarmLogHealth msg;
41 + LogEntries *entries;
42
43 msg.set_claim_id(data->claim_id);
44 msg.set_node_id(data->node_id);
45 msg.set_enabled(data->enabled);
46
47 switch (data->status) {
46 - case ALARM_LOG_STATUS_IDLE:
47 - msg.set_status(alarmstream::v1::ALARM_LOG_STATUS_IDLE);
48 + case alarm_log_status_aclk::ALARM_LOG_STATUS_IDLE:
49 + msg.set_status(alarms::v1::ALARM_LOG_STATUS_IDLE);
50 break;
49 - case ALARM_LOG_STATUS_RUNNING:
50 - msg.set_status(alarmstream::v1::ALARM_LOG_STATUS_RUNNING);
51 + case alarm_log_status_aclk::ALARM_LOG_STATUS_RUNNING:
52 + msg.set_status(alarms::v1::ALARM_LOG_STATUS_RUNNING);
53 break;
52 - case ALARM_LOG_STATUS_UNSPECIFIED:
53 - msg.set_status(alarmstream::v1::ALARM_LOG_STATUS_UNSPECIFIED);
54 + case alarm_log_status_aclk::ALARM_LOG_STATUS_UNSPECIFIED:
55 + msg.set_status(alarms::v1::ALARM_LOG_STATUS_UNSPECIFIED);
56 break;
57 default:
58 error("Unknown status of AlarmLogHealth LogEntry");
@@ -72,26 +74,26 @@ char *generate_alarm_log_health(size_t *len, struct alarm_log_health *data)
74 return bin;
75 }
76
75 -static alarmstream::v1::AlarmStatus aclk_alarm_status_to_proto(enum aclk_alarm_status status)
77 +static alarms::v1::AlarmStatus aclk_alarm_status_to_proto(enum aclk_alarm_status status)
78 {
79 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;
80 + case aclk_alarm_status::ALARM_STATUS_NULL:
81 + return alarms::v1::ALARM_STATUS_NULL;
82 + case aclk_alarm_status::ALARM_STATUS_UNKNOWN:
83 + return alarms::v1::ALARM_STATUS_UNKNOWN;
84 + case aclk_alarm_status::ALARM_STATUS_REMOVED:
85 + return alarms::v1::ALARM_STATUS_REMOVED;
86 + case aclk_alarm_status::ALARM_STATUS_NOT_A_NUMBER:
87 + return alarms::v1::ALARM_STATUS_NOT_A_NUMBER;
88 + case aclk_alarm_status::ALARM_STATUS_CLEAR:
89 + return alarms::v1::ALARM_STATUS_CLEAR;
90 + case aclk_alarm_status::ALARM_STATUS_WARNING:
91 + return alarms::v1::ALARM_STATUS_WARNING;
92 + case aclk_alarm_status::ALARM_STATUS_CRITICAL:
93 + return alarms::v1::ALARM_STATUS_CRITICAL;
94 default:
95 error("Unknown alarm status");
94 - return alarmstream::v1::ALARM_STATUS_UNKNOWN;
96 + return alarms::v1::ALARM_STATUS_UNKNOWN;
97 }
98 }
99
@@ -118,54 +120,59 @@ void destroy_alarm_log_entry(struct alarm_log_entry *entry)
120 freez(entry->rendered_info);
121 }
122
121 -char *generate_alarm_log_entry(size_t *len, struct alarm_log_entry *data)
123 +static void fill_alarm_log_entry(struct alarm_log_entry *data, AlarmLogEntry *proto)
124 {
123 - alarmstream::v1::AlarmLogEntry le;
124 -
125 - le.set_node_id(data->node_id);
126 - le.set_claim_id(data->claim_id);
125 + proto->set_node_id(data->node_id);
126 + proto->set_claim_id(data->claim_id);
127
128 - le.set_chart(data->chart);
129 - le.set_name(data->name);
128 + proto->set_chart(data->chart);
129 + proto->set_name(data->name);
130 if (data->family)
131 - le.set_family(data->family);
131 + proto->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);
133 + proto->set_batch_id(data->batch_id);
134 + proto->set_sequence_id(data->sequence_id);
135 + proto->set_when(data->when);
136
137 - le.set_config_hash(data->config_hash);
137 + proto->set_config_hash(data->config_hash);
138
139 - le.set_utc_offset(data->utc_offset);
140 - le.set_timezone(data->timezone);
139 + proto->set_utc_offset(data->utc_offset);
140 + proto->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);
142 + proto->set_exec_path(data->exec_path);
143 + proto->set_conf_source(data->conf_source);
144 + proto->set_command(data->command);
145
146 - le.set_duration(data->duration);
147 - le.set_non_clear_duration(data->non_clear_duration);
146 + proto->set_duration(data->duration);
147 + proto->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);
150 + proto->set_status(aclk_alarm_status_to_proto(data->status));
151 + proto->set_old_status(aclk_alarm_status_to_proto(data->old_status));
152 + proto->set_delay(data->delay);
153 + proto->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);
155 + proto->set_last_repeat(data->last_repeat);
156 + proto->set_silenced(data->silenced);
157
158 if (data->value_string)
159 - le.set_value_string(data->value_string);
159 + proto->set_value_string(data->value_string);
160 if (data->old_value_string)
161 - le.set_old_value_string(data->old_value_string);
161 + proto->set_old_value_string(data->old_value_string);
162 +
163 + proto->set_value(data->value);
164 + proto->set_old_value(data->old_value);
165 +
166 + proto->set_updated(data->updated);
167
163 - le.set_value(data->value);
164 - le.set_old_value(data->old_value);
168 + proto->set_rendered_info(data->rendered_info);
169 +}
170
166 - le.set_updated(data->updated);
171 +char *generate_alarm_log_entry(size_t *len, struct alarm_log_entry *data)
172 +{
173 + AlarmLogEntry le;
174
168 - le.set_rendered_info(data->rendered_info);
175 + fill_alarm_log_entry(data, &le);
176
177 *len = PROTO_COMPAT_MSG_SIZE(le);
178 char *bin = (char*)mallocz(*len);
@@ -174,3 +181,68 @@ char *generate_alarm_log_entry(size_t *len, struct alarm_log_entry *data)
181
182 return bin;
183 }
184 +
185 +struct send_alarm_snapshot *parse_send_alarm_snapshot(const char *data, size_t len)
186 +{
187 + SendAlarmSnapshot msg;
188 + if (!msg.ParseFromArray(data, len))
189 + return NULL;
190 +
191 + struct send_alarm_snapshot *ret = (struct send_alarm_snapshot*)callocz(1, sizeof(struct send_alarm_snapshot));
192 + if (msg.claim_id().c_str())
193 + ret->claim_id = strdupz(msg.claim_id().c_str());
194 + if (msg.node_id().c_str())
195 + ret->node_id = strdupz(msg.node_id().c_str());
196 + ret->snapshot_id = msg.snapshot_id();
197 + ret->sequence_id = msg.sequence_id();
198 +
199 + return ret;
200 +}
201 +
202 +void destroy_send_alarm_snapshot(struct send_alarm_snapshot *ptr)
203 +{
204 + freez(ptr->claim_id);
205 + freez(ptr->node_id);
206 + freez(ptr);
207 +}
208 +
209 +alarm_snapshot_proto_ptr_t generate_alarm_snapshot_proto(struct alarm_snapshot *data)
210 +{
211 + AlarmSnapshot *msg = new AlarmSnapshot;
212 + if (unlikely(!msg)) fatal("Cannot allocate memory for AlarmSnapshot");
213 +
214 + msg->set_node_id(data->node_id);
215 + msg->set_claim_id(data->claim_id);
216 + msg->set_snapshot_id(data->snapshot_id);
217 + msg->set_chunks(data->chunks);
218 + msg->set_chunk(data->chunk);
219 +
220 + // this is handled automatically by add_alarm_log_entry2snapshot function
221 + msg->set_chunk_size(0);
222 +
223 + return msg;
224 +}
225 +
226 +void add_alarm_log_entry2snapshot(alarm_snapshot_proto_ptr_t snapshot, struct alarm_log_entry *data)
227 +{
228 + AlarmSnapshot *alarm_snapshot = (AlarmSnapshot *)snapshot;
229 + AlarmLogEntry *alarm_log_entry = alarm_snapshot->add_alarms();
230 +
231 + fill_alarm_log_entry(data, alarm_log_entry);
232 +
233 + alarm_snapshot->set_chunk_size(alarm_snapshot->chunk_size() + 1);
234 +}
235 +
236 +char *generate_alarm_snapshot_bin(size_t *len, alarm_snapshot_proto_ptr_t snapshot)
237 +{
238 + AlarmSnapshot *alarm_snapshot = (AlarmSnapshot *)snapshot;
239 + *len = PROTO_COMPAT_MSG_SIZE_PTR(alarm_snapshot);
240 + char *bin = (char*)mallocz(*len);
241 + if (!alarm_snapshot->SerializeToArray(bin, *len)) {
242 + delete alarm_snapshot;
243 + return NULL;
244 + }
245 +
246 + delete alarm_snapshot;
247 + return bin;
248 +}
aclk/schema-wrappers/alarm_stream.h
+24
@@ -99,10 +99,34 @@ struct alarm_log_entry {
99 char *rendered_info;
100 };
101
102 +struct send_alarm_snapshot {
103 + char *node_id;
104 + char *claim_id;
105 + uint64_t snapshot_id;
106 + uint64_t sequence_id;
107 +};
108 +
109 +struct alarm_snapshot {
110 + char *node_id;
111 + char *claim_id;
112 + uint64_t snapshot_id;
113 + uint32_t chunks;
114 + uint32_t chunk;
115 +};
116 +
117 +typedef void* alarm_snapshot_proto_ptr_t;
118 +
119 void destroy_alarm_log_entry(struct alarm_log_entry *entry);
120
121 char *generate_alarm_log_entry(size_t *len, struct alarm_log_entry *data);
122
123 +struct send_alarm_snapshot *parse_send_alarm_snapshot(const char *data, size_t len);
124 +void destroy_send_alarm_snapshot(struct send_alarm_snapshot *ptr);
125 +
126 +alarm_snapshot_proto_ptr_t generate_alarm_snapshot_proto(struct alarm_snapshot *data);
127 +void add_alarm_log_entry2snapshot(alarm_snapshot_proto_ptr_t snapshot, struct alarm_log_entry *data);
128 +char *generate_alarm_snapshot_bin(size_t *len, alarm_snapshot_proto_ptr_t snapshot);
129 +
130 #ifdef __cplusplus
131 }
132 #endif