alarm_stream.cc 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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. }
  96. static void fill_alarm_log_entry(struct alarm_log_entry *data, AlarmLogEntry *proto)
  97. {
  98. proto->set_node_id(data->node_id);
  99. proto->set_claim_id(data->claim_id);
  100. proto->set_chart(data->chart);
  101. proto->set_name(data->name);
  102. if (data->family)
  103. proto->set_family(data->family);
  104. proto->set_batch_id(data->batch_id);
  105. proto->set_sequence_id(data->sequence_id);
  106. proto->set_when(data->when);
  107. proto->set_config_hash(data->config_hash);
  108. proto->set_utc_offset(data->utc_offset);
  109. proto->set_timezone(data->timezone);
  110. proto->set_exec_path(data->exec_path);
  111. proto->set_conf_source(data->conf_source);
  112. proto->set_command(data->command);
  113. proto->set_duration(data->duration);
  114. proto->set_non_clear_duration(data->non_clear_duration);
  115. proto->set_status(aclk_alarm_status_to_proto(data->status));
  116. proto->set_old_status(aclk_alarm_status_to_proto(data->old_status));
  117. proto->set_delay(data->delay);
  118. proto->set_delay_up_to_timestamp(data->delay_up_to_timestamp);
  119. proto->set_last_repeat(data->last_repeat);
  120. proto->set_silenced(data->silenced);
  121. if (data->value_string)
  122. proto->set_value_string(data->value_string);
  123. if (data->old_value_string)
  124. proto->set_old_value_string(data->old_value_string);
  125. proto->set_value(data->value);
  126. proto->set_old_value(data->old_value);
  127. proto->set_updated(data->updated);
  128. proto->set_rendered_info(data->rendered_info);
  129. }
  130. char *generate_alarm_log_entry(size_t *len, struct alarm_log_entry *data)
  131. {
  132. AlarmLogEntry le;
  133. fill_alarm_log_entry(data, &le);
  134. *len = PROTO_COMPAT_MSG_SIZE(le);
  135. char *bin = (char*)mallocz(*len);
  136. if (!le.SerializeToArray(bin, *len)) {
  137. freez(bin);
  138. return NULL;
  139. }
  140. return bin;
  141. }
  142. struct send_alarm_snapshot *parse_send_alarm_snapshot(const char *data, size_t len)
  143. {
  144. SendAlarmSnapshot msg;
  145. if (!msg.ParseFromArray(data, len))
  146. return NULL;
  147. struct send_alarm_snapshot *ret = (struct send_alarm_snapshot*)callocz(1, sizeof(struct send_alarm_snapshot));
  148. if (msg.claim_id().c_str())
  149. ret->claim_id = strdupz(msg.claim_id().c_str());
  150. if (msg.node_id().c_str())
  151. ret->node_id = strdupz(msg.node_id().c_str());
  152. ret->snapshot_id = msg.snapshot_id();
  153. ret->sequence_id = msg.sequence_id();
  154. return ret;
  155. }
  156. void destroy_send_alarm_snapshot(struct send_alarm_snapshot *ptr)
  157. {
  158. freez(ptr->claim_id);
  159. freez(ptr->node_id);
  160. freez(ptr);
  161. }
  162. alarm_snapshot_proto_ptr_t generate_alarm_snapshot_proto(struct alarm_snapshot *data)
  163. {
  164. AlarmSnapshot *msg = new AlarmSnapshot;
  165. if (unlikely(!msg)) fatal("Cannot allocate memory for AlarmSnapshot");
  166. msg->set_node_id(data->node_id);
  167. msg->set_claim_id(data->claim_id);
  168. msg->set_snapshot_id(data->snapshot_id);
  169. msg->set_chunks(data->chunks);
  170. msg->set_chunk(data->chunk);
  171. // this is handled automatically by add_alarm_log_entry2snapshot function
  172. msg->set_chunk_size(0);
  173. return msg;
  174. }
  175. void add_alarm_log_entry2snapshot(alarm_snapshot_proto_ptr_t snapshot, struct alarm_log_entry *data)
  176. {
  177. AlarmSnapshot *alarm_snapshot = (AlarmSnapshot *)snapshot;
  178. AlarmLogEntry *alarm_log_entry = alarm_snapshot->add_alarms();
  179. fill_alarm_log_entry(data, alarm_log_entry);
  180. alarm_snapshot->set_chunk_size(alarm_snapshot->chunk_size() + 1);
  181. }
  182. char *generate_alarm_snapshot_bin(size_t *len, alarm_snapshot_proto_ptr_t snapshot)
  183. {
  184. AlarmSnapshot *alarm_snapshot = (AlarmSnapshot *)snapshot;
  185. *len = PROTO_COMPAT_MSG_SIZE_PTR(alarm_snapshot);
  186. char *bin = (char*)mallocz(*len);
  187. if (!alarm_snapshot->SerializeToArray(bin, *len)) {
  188. delete alarm_snapshot;
  189. return NULL;
  190. }
  191. delete alarm_snapshot;
  192. return bin;
  193. }