alarm_stream.cc 6.6 KB

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