master
cc 222 lines 6.63 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #include "alarm_stream.h"
4
5 #include "alarm/v1/stream.pb.h"
6
7 #include "libnetdata/libnetdata.h"
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
18 StartAlarmStreaming msg;
19
20 if (!msg.ParseFromArray(data, len))
21 return ret;
22
23 ret.node_id = strdupz(msg.node_id().c_str());
24 ret.resets = msg.resets();
25 ret.version = msg.version();
26
27 return ret;
28 }
29
30 struct send_alarm_checkpoint parse_send_alarm_checkpoint(const char *data, size_t len)
31 {
32 struct send_alarm_checkpoint ret;
33 memset(&ret, 0, sizeof(ret));
34
35 SendAlarmCheckpoint msg;
36 if (!msg.ParseFromArray(data, len))
37 return ret;
38
39 ret.node_id = strdupz(msg.node_id().c_str());
40 ret.claim_id = strdupz(msg.claim_id().c_str());
41 ret.version = msg.version();
42
43 return ret;
44 }
45
46 static alarms::v1::AlarmStatus aclk_alarm_status_to_proto(enum aclk_alarm_status status)
47 {
48 switch (status) {
49 case aclk_alarm_status::ALARM_STATUS_NULL:
50 return alarms::v1::ALARM_STATUS_NULL;
51 case aclk_alarm_status::ALARM_STATUS_UNKNOWN:
52 return alarms::v1::ALARM_STATUS_UNKNOWN;
53 case aclk_alarm_status::ALARM_STATUS_REMOVED:
54 return alarms::v1::ALARM_STATUS_REMOVED;
55 case aclk_alarm_status::ALARM_STATUS_NOT_A_NUMBER:
56 return alarms::v1::ALARM_STATUS_NOT_A_NUMBER;
57 case aclk_alarm_status::ALARM_STATUS_CLEAR:
58 return alarms::v1::ALARM_STATUS_CLEAR;
59 case aclk_alarm_status::ALARM_STATUS_WARNING:
60 return alarms::v1::ALARM_STATUS_WARNING;
61 case aclk_alarm_status::ALARM_STATUS_CRITICAL:
62 return alarms::v1::ALARM_STATUS_CRITICAL;
63 default:
64 netdata_log_error("Unknown alarm status");
65 return alarms::v1::ALARM_STATUS_UNKNOWN;
66 }
67 }
68
69 void destroy_alarm_log_entry(struct alarm_log_entry *entry)
70 {
71 freez(entry->chart);
72 freez(entry->name);
73 freez(entry->config_hash);
74 freez(entry->timezone);
75 freez(entry->exec_path);
76 freez(entry->conf_source);
77 freez(entry->command);
78 freez(entry->value_string);
79 freez(entry->old_value_string);
80 freez(entry->rendered_info);
81 freez(entry->chart_context);
82 freez(entry->transition_id);
83 freez(entry->chart_name);
84 freez(entry->summary);
85 }
86
87 static void fill_alarm_log_entry(struct alarm_log_entry *data, AlarmLogEntry *proto)
88 {
89 proto->set_node_id(data->node_id);
90 proto->set_claim_id(data->claim_id);
91 proto->set_chart(data->chart);
92 proto->set_name(data->name);
93 proto->set_when(data->when);
94 proto->set_config_hash(data->config_hash);
95 proto->set_utc_offset(data->utc_offset);
96 proto->set_timezone(data->timezone);
97 proto->set_exec_path(data->exec_path);
98 proto->set_conf_source(data->conf_source);
99 proto->set_command(data->command);
100 proto->set_duration(data->duration);
101 proto->set_non_clear_duration(data->non_clear_duration);
102 proto->set_status(aclk_alarm_status_to_proto(data->status));
103 proto->set_old_status(aclk_alarm_status_to_proto(data->old_status));
104 proto->set_delay(data->delay);
105 proto->set_delay_up_to_timestamp(data->delay_up_to_timestamp);
106 proto->set_last_repeat(data->last_repeat);
107 proto->set_silenced(data->silenced);
108
109 if (data->value_string)
110 proto->set_value_string(data->value_string);
111 if (data->old_value_string)
112 proto->set_old_value_string(data->old_value_string);
113
114 proto->set_value(data->value);
115 proto->set_old_value(data->old_value);
116 proto->set_updated(data->updated);
117 proto->set_rendered_info(data->rendered_info);
118 proto->set_chart_context(data->chart_context);
119 proto->set_event_id(data->event_id);
120 proto->set_transition_id(data->transition_id);
121 proto->set_chart_name(data->chart_name);
122 proto->set_summary(data->summary);
123 proto->set_alert_version(data->version);
124 }
125
126 char *generate_alarm_log_entry(size_t *len, struct alarm_log_entry *data)
127 {
128 AlarmLogEntry le;
129
130 fill_alarm_log_entry(data, &le);
131
132 *len = PROTO_COMPAT_MSG_SIZE(le);
133 char *bin = (char*)mallocz(*len);
134 if (!le.SerializeToArray(bin, *len)) {
135 freez(bin);
136 return NULL;
137 }
138
139 return bin;
140 }
141
142 char *generate_alarm_checkpoint(size_t *len, struct alarm_checkpoint *data)
143 {
144 AlarmCheckpoint msg;
145
146 msg.set_claim_id(data->claim_id);
147 msg.set_node_id(data->node_id);
148 msg.set_checksum(data->checksum);
149
150 *len = PROTO_COMPAT_MSG_SIZE(msg);
151 char *bin = (char*)mallocz(*len);
152 if (!msg.SerializeToArray(bin, *len)) {
153 freez(bin);
154 return NULL;
155 }
156
157 return bin;
158 }
159
160 struct send_alarm_snapshot *parse_send_alarm_snapshot(const char *data, size_t len)
161 {
162 SendAlarmSnapshot msg;
163 if (!msg.ParseFromArray(data, len))
164 return NULL;
165
166 struct send_alarm_snapshot *ret = (struct send_alarm_snapshot*)callocz(1, sizeof(struct send_alarm_snapshot));
167 if (msg.claim_id().c_str())
168 ret->claim_id = strdupz(msg.claim_id().c_str());
169 if (msg.node_id().c_str())
170 ret->node_id = strdupz(msg.node_id().c_str());
171 if (msg.snapshot_uuid().c_str())
172 ret->snapshot_uuid = strdupz(msg.snapshot_uuid().c_str());
173
174 return ret;
175 }
176
177 void destroy_send_alarm_snapshot(struct send_alarm_snapshot *ptr)
178 {
179 freez(ptr->snapshot_uuid);
180 freez(ptr);
181 }
182
183 alarm_snapshot_proto_ptr_t generate_alarm_snapshot_proto(struct alarm_snapshot *data)
184 {
185 AlarmSnapshot *msg = new AlarmSnapshot;
186 if (unlikely(!msg)) fatal("Cannot allocate memory for AlarmSnapshot");
187
188 msg->set_node_id(data->node_id);
189 msg->set_claim_id(data->claim_id);
190 msg->set_snapshot_uuid(data->snapshot_uuid);
191 msg->set_chunks(data->chunks);
192 msg->set_chunk(data->chunk);
193
194 // this is handled automatically by add_alarm_log_entry2snapshot function
195 msg->set_chunk_size(0);
196
197 return msg;
198 }
199
200 void add_alarm_log_entry2snapshot(alarm_snapshot_proto_ptr_t snapshot, struct alarm_log_entry *data)
201 {
202 AlarmSnapshot *alarm_snapshot = (AlarmSnapshot *)snapshot;
203 AlarmLogEntry *alarm_log_entry = alarm_snapshot->add_alarms();
204
205 fill_alarm_log_entry(data, alarm_log_entry);
206
207 alarm_snapshot->set_chunk_size(alarm_snapshot->chunk_size() + 1);
208 }
209
210 char *generate_alarm_snapshot_bin(size_t *len, alarm_snapshot_proto_ptr_t snapshot)
211 {
212 AlarmSnapshot *alarm_snapshot = (AlarmSnapshot *)snapshot;
213 *len = PROTO_COMPAT_MSG_SIZE_PTR(alarm_snapshot);
214 char *bin = (char*)mallocz(*len);
215 if (!alarm_snapshot->SerializeToArray(bin, *len)) {
216 delete alarm_snapshot;
217 return NULL;
218 }
219
220 delete alarm_snapshot;
221 return bin;
222 }