alarm_stream.cc 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. // SPDX-License-Identifier: GPL-3.0-or-later
  2. #include "alarm_stream.h"
  3. #include "proto/alarm/v1/stream.pb.h"
  4. #include "libnetdata/libnetdata.h"
  5. #include "schema_wrapper_utils.h"
  6. using namespace alarms::v1;
  7. struct start_alarm_streaming parse_start_alarm_streaming(const char *data, size_t len)
  8. {
  9. struct start_alarm_streaming ret;
  10. memset(&ret, 0, sizeof(ret));
  11. StartAlarmStreaming msg;
  12. if (!msg.ParseFromArray(data, len))
  13. return ret;
  14. ret.node_id = strdupz(msg.node_id().c_str());
  15. ret.batch_id = msg.batch_id();
  16. ret.start_seq_id = msg.start_sequnce_id();
  17. return ret;
  18. }
  19. char *parse_send_alarm_log_health(const char *data, size_t len)
  20. {
  21. SendAlarmLogHealth msg;
  22. if (!msg.ParseFromArray(data, len))
  23. return NULL;
  24. return strdupz(msg.node_id().c_str());
  25. }
  26. char *generate_alarm_log_health(size_t *len, struct alarm_log_health *data)
  27. {
  28. AlarmLogHealth msg;
  29. LogEntries *entries;
  30. msg.set_claim_id(data->claim_id);
  31. msg.set_node_id(data->node_id);
  32. msg.set_enabled(data->enabled);
  33. switch (data->status) {
  34. case alarm_log_status_aclk::ALARM_LOG_STATUS_IDLE:
  35. msg.set_status(alarms::v1::ALARM_LOG_STATUS_IDLE);
  36. break;
  37. case alarm_log_status_aclk::ALARM_LOG_STATUS_RUNNING:
  38. msg.set_status(alarms::v1::ALARM_LOG_STATUS_RUNNING);
  39. break;
  40. case alarm_log_status_aclk::ALARM_LOG_STATUS_UNSPECIFIED:
  41. msg.set_status(alarms::v1::ALARM_LOG_STATUS_UNSPECIFIED);
  42. break;
  43. default:
  44. error("Unknown status of AlarmLogHealth LogEntry");
  45. return NULL;
  46. }
  47. entries = msg.mutable_log_entries();
  48. entries->set_first_sequence_id(data->log_entries.first_seq_id);
  49. entries->set_last_sequence_id(data->log_entries.last_seq_id);
  50. set_google_timestamp_from_timeval(data->log_entries.first_when, entries->mutable_first_when());
  51. set_google_timestamp_from_timeval(data->log_entries.last_when, entries->mutable_last_when());
  52. *len = PROTO_COMPAT_MSG_SIZE(msg);
  53. char *bin = (char*)mallocz(*len);
  54. if (!msg.SerializeToArray(bin, *len))
  55. return NULL;
  56. return bin;
  57. }
  58. static alarms::v1::AlarmStatus aclk_alarm_status_to_proto(enum aclk_alarm_status status)
  59. {
  60. switch (status) {
  61. case aclk_alarm_status::ALARM_STATUS_NULL:
  62. return alarms::v1::ALARM_STATUS_NULL;
  63. case aclk_alarm_status::ALARM_STATUS_UNKNOWN:
  64. return alarms::v1::ALARM_STATUS_UNKNOWN;
  65. case aclk_alarm_status::ALARM_STATUS_REMOVED:
  66. return alarms::v1::ALARM_STATUS_REMOVED;
  67. case aclk_alarm_status::ALARM_STATUS_NOT_A_NUMBER:
  68. return alarms::v1::ALARM_STATUS_NOT_A_NUMBER;
  69. case aclk_alarm_status::ALARM_STATUS_CLEAR:
  70. return alarms::v1::ALARM_STATUS_CLEAR;
  71. case aclk_alarm_status::ALARM_STATUS_WARNING:
  72. return alarms::v1::ALARM_STATUS_WARNING;
  73. case aclk_alarm_status::ALARM_STATUS_CRITICAL:
  74. return alarms::v1::ALARM_STATUS_CRITICAL;
  75. default:
  76. error("Unknown alarm status");
  77. return alarms::v1::ALARM_STATUS_UNKNOWN;
  78. }
  79. }
  80. void destroy_alarm_log_entry(struct alarm_log_entry *entry)
  81. {
  82. //freez(entry->node_id);
  83. //freez(entry->claim_id);
  84. freez(entry->chart);
  85. freez(entry->name);
  86. freez(entry->family);
  87. freez(entry->config_hash);
  88. freez(entry->timezone);
  89. freez(entry->exec_path);
  90. freez(entry->conf_source);
  91. freez(entry->command);
  92. freez(entry->value_string);
  93. freez(entry->old_value_string);
  94. freez(entry->rendered_info);
  95. freez(entry->chart_context);
  96. }
  97. static void fill_alarm_log_entry(struct alarm_log_entry *data, AlarmLogEntry *proto)
  98. {
  99. proto->set_node_id(data->node_id);
  100. proto->set_claim_id(data->claim_id);
  101. proto->set_chart(data->chart);
  102. proto->set_name(data->name);
  103. if (data->family)
  104. proto->set_family(data->family);
  105. proto->set_batch_id(data->batch_id);
  106. proto->set_sequence_id(data->sequence_id);
  107. proto->set_when(data->when);
  108. proto->set_config_hash(data->config_hash);
  109. proto->set_utc_offset(data->utc_offset);
  110. proto->set_timezone(data->timezone);
  111. proto->set_exec_path(data->exec_path);
  112. proto->set_conf_source(data->conf_source);
  113. proto->set_command(data->command);
  114. proto->set_duration(data->duration);
  115. proto->set_non_clear_duration(data->non_clear_duration);
  116. proto->set_status(aclk_alarm_status_to_proto(data->status));
  117. proto->set_old_status(aclk_alarm_status_to_proto(data->old_status));
  118. proto->set_delay(data->delay);
  119. proto->set_delay_up_to_timestamp(data->delay_up_to_timestamp);
  120. proto->set_last_repeat(data->last_repeat);
  121. proto->set_silenced(data->silenced);
  122. if (data->value_string)
  123. proto->set_value_string(data->value_string);
  124. if (data->old_value_string)
  125. proto->set_old_value_string(data->old_value_string);
  126. proto->set_value(data->value);
  127. proto->set_old_value(data->old_value);
  128. proto->set_updated(data->updated);
  129. proto->set_rendered_info(data->rendered_info);
  130. proto->set_chart_context(data->chart_context);
  131. }
  132. char *generate_alarm_log_entry(size_t *len, struct alarm_log_entry *data)
  133. {
  134. AlarmLogEntry le;
  135. fill_alarm_log_entry(data, &le);
  136. *len = PROTO_COMPAT_MSG_SIZE(le);
  137. char *bin = (char*)mallocz(*len);
  138. if (!le.SerializeToArray(bin, *len)) {
  139. freez(bin);
  140. return NULL;
  141. }
  142. return bin;
  143. }
  144. struct send_alarm_snapshot *parse_send_alarm_snapshot(const char *data, size_t len)
  145. {
  146. SendAlarmSnapshot msg;
  147. if (!msg.ParseFromArray(data, len))
  148. return NULL;
  149. struct send_alarm_snapshot *ret = (struct send_alarm_snapshot*)callocz(1, sizeof(struct send_alarm_snapshot));
  150. if (msg.claim_id().c_str())
  151. ret->claim_id = strdupz(msg.claim_id().c_str());
  152. if (msg.node_id().c_str())
  153. ret->node_id = strdupz(msg.node_id().c_str());
  154. ret->snapshot_id = msg.snapshot_id();
  155. ret->sequence_id = msg.sequence_id();
  156. return ret;
  157. }
  158. void destroy_send_alarm_snapshot(struct send_alarm_snapshot *ptr)
  159. {
  160. freez(ptr->claim_id);
  161. freez(ptr->node_id);
  162. freez(ptr);
  163. }
  164. alarm_snapshot_proto_ptr_t generate_alarm_snapshot_proto(struct alarm_snapshot *data)
  165. {
  166. AlarmSnapshot *msg = new AlarmSnapshot;
  167. if (unlikely(!msg)) fatal("Cannot allocate memory for AlarmSnapshot");
  168. msg->set_node_id(data->node_id);
  169. msg->set_claim_id(data->claim_id);
  170. msg->set_snapshot_id(data->snapshot_id);
  171. msg->set_chunks(data->chunks);
  172. msg->set_chunk(data->chunk);
  173. // this is handled automatically by add_alarm_log_entry2snapshot function
  174. msg->set_chunk_size(0);
  175. return msg;
  176. }
  177. void add_alarm_log_entry2snapshot(alarm_snapshot_proto_ptr_t snapshot, struct alarm_log_entry *data)
  178. {
  179. AlarmSnapshot *alarm_snapshot = (AlarmSnapshot *)snapshot;
  180. AlarmLogEntry *alarm_log_entry = alarm_snapshot->add_alarms();
  181. fill_alarm_log_entry(data, alarm_log_entry);
  182. alarm_snapshot->set_chunk_size(alarm_snapshot->chunk_size() + 1);
  183. }
  184. char *generate_alarm_snapshot_bin(size_t *len, alarm_snapshot_proto_ptr_t snapshot)
  185. {
  186. AlarmSnapshot *alarm_snapshot = (AlarmSnapshot *)snapshot;
  187. *len = PROTO_COMPAT_MSG_SIZE_PTR(alarm_snapshot);
  188. char *bin = (char*)mallocz(*len);
  189. if (!alarm_snapshot->SerializeToArray(bin, *len)) {
  190. delete alarm_snapshot;
  191. return NULL;
  192. }
  193. delete alarm_snapshot;
  194. return bin;
  195. }