summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimotej S <6674623+underhood@users.noreply.github.com>2021-08-27 08:26:10 +0200
committerGitHub <noreply@github.com>2021-08-27 08:26:10 +0200
commit96cac58ec8307a7088a4abc90e3ba6c1553745a1 (patch)
treef743d442d08f1d6fc95aa426f269a90bf790a757
parent2ef8442d850b5e631befcaac2ff5ef78a22284e1 (diff)
Adds Alert Related API for new protocol (#11424)
* adds alarm related message generators, parsers and API for the new protocol
-rw-r--r--Makefile.am18
-rw-r--r--aclk/aclk.c5
-rw-r--r--aclk/aclk.h2
-rw-r--r--aclk/aclk_alarm_api.c37
-rw-r--r--aclk/aclk_alarm_api.h13
-rw-r--r--aclk/aclk_query.c2
-rw-r--r--aclk/aclk_query_queue.c2
-rw-r--r--aclk/aclk_query_queue.h4
-rw-r--r--aclk/aclk_util.c6
-rw-r--r--aclk/aclk_util.h5
-rw-r--r--aclk/schema-wrappers/alarm_config.cc147
-rw-r--r--aclk/schema-wrappers/alarm_config.h69
-rw-r--r--aclk/schema-wrappers/alarm_stream.cc176
-rw-r--r--aclk/schema-wrappers/alarm_stream.h110
-rw-r--r--aclk/schema-wrappers/node_info.cc72
-rw-r--r--aclk/schema-wrappers/schema_wrappers.h2
16 files changed, 638 insertions, 32 deletions
diff --git a/Makefile.am b/Makefile.am
index f47fea1ea3..d3302fa393 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -578,6 +578,8 @@ ACLK_NG_FILES = \
aclk/https_client.h \
aclk/aclk_charts_api.c \
aclk/aclk_charts_api.h \
+ aclk/aclk_alarm_api.c \
+ aclk/aclk_alarm_api.h \
mqtt_websockets/src/mqtt_wss_client.c \
mqtt_websockets/src/include/mqtt_wss_client.h \
mqtt_websockets/src/mqtt_wss_log.c \
@@ -599,6 +601,10 @@ ACLK_NG_FILES = \
aclk/schema-wrappers/chart_stream.h \
aclk/schema-wrappers/chart_config.cc \
aclk/schema-wrappers/chart_config.h \
+ aclk/schema-wrappers/alarm_stream.cc \
+ aclk/schema-wrappers/alarm_stream.h \
+ aclk/schema-wrappers/alarm_config.cc \
+ aclk/schema-wrappers/alarm_config.h \
aclk/schema-wrappers/node_info.cc \
aclk/schema-wrappers/node_info.h \
aclk/schema-wrappers/schema_wrappers.h \
@@ -638,6 +644,10 @@ ACLK_NG_PROTO_BUILT_FILES = aclk/aclk-schemas/proto/agent/v1/connection.pb.cc \
aclk/aclk-schemas/proto/chart/v1/config.pb.h \
aclk/aclk-schemas/proto/aclk/v1/lib.pb.cc \
aclk/aclk-schemas/proto/aclk/v1/lib.pb.h \
+ aclk/aclk-schemas/proto/alarm/v1/config.pb.cc \
+ aclk/aclk-schemas/proto/alarm/v1/config.pb.h \
+ aclk/aclk-schemas/proto/alarm/v1/stream.pb.cc \
+ aclk/aclk-schemas/proto/alarm/v1/stream.pb.h \
aclk/aclk-schemas/proto/nodeinstance/info/v1/info.pb.cc \
aclk/aclk-schemas/proto/nodeinstance/info/v1/info.pb.h \
$(NULL)
@@ -678,6 +688,14 @@ aclk/aclk-schemas/proto/aclk/v1/lib.pb.cc \
aclk/aclk-schemas/proto/aclk/v1/lib.pb.h: aclk/aclk-schemas/proto/aclk/v1/lib.proto
$(PROTOC) -I=aclk/aclk-schemas --cpp_out=$(builddir)/aclk/aclk-schemas $^
+aclk/aclk-schemas/proto/alarm/v1/config.pb.cc \
+aclk/aclk-schemas/proto/alarm/v1/config.pb.h: aclk/aclk-schemas/proto/alarm/v1/config.proto
+ $(PROTOC) -I=aclk/aclk-schemas --cpp_out=$(builddir)/aclk/aclk-schemas $^
+
+aclk/aclk-schemas/proto/alarm/v1/stream.pb.cc \
+aclk/aclk-schemas/proto/alarm/v1/stream.pb.h: aclk/aclk-schemas/proto/alarm/v1/stream.proto
+ $(PROTOC) -I=aclk/aclk-schemas --cpp_out=$(builddir)/aclk/aclk-schemas $^
+
aclk/aclk-schemas/proto/nodeinstance/info/v1/info.pb.cc \
aclk/aclk-schemas/proto/nodeinstance/info/v1/info.pb.h: aclk/aclk-schemas/proto/nodeinstance/info/v1/info.proto
$(PROTOC) -I=aclk/aclk-schemas --cpp_out=$(builddir)/aclk/aclk-schemas $^
diff --git a/aclk/aclk.c b/aclk/aclk.c
index 23d77291c4..359ecaed72 100644
--- a/aclk/aclk.c
+++ b/aclk/aclk.c
@@ -1014,3 +1014,8 @@ void aclk_send_node_instances()
}
freez(list_head);
}
+
+void aclk_send_bin_msg(char *msg, size_t msg_len, enum aclk_topics subtopic, const char *msgname)
+{
+ aclk_send_bin_message_subtopic_pid(mqttwss_client, msg, msg_len, subtopic, msgname);
+}
diff --git a/aclk/aclk.h b/aclk/aclk.h
index 18cdbd248c..fb7116f2c3 100644
--- a/aclk/aclk.h
+++ b/aclk/aclk.h
@@ -47,4 +47,6 @@ void ng_aclk_host_state_update(RRDHOST *host, int cmd);
void aclk_send_node_instances(void);
+void aclk_send_bin_msg(char *msg, size_t msg_len, enum aclk_topics subtopic, const char *msgname);
+
#endif /* ACLK_H */
diff --git a/aclk/aclk_alarm_api.c b/aclk/aclk_alarm_api.c
new file mode 100644
index 0000000000..9826fdc2ea
--- /dev/null
+++ b/aclk/aclk_alarm_api.c
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "aclk_alarm_api.h"
+
+#include "aclk_query_queue.h"
+
+#include "aclk_util.h"
+
+#include "aclk.h"
+
+void aclk_send_alarm_log_health(struct alarm_log_health *log_health)
+{
+ aclk_query_t query = aclk_query_new(ALARM_LOG_HEALTH);
+ query->data.bin_payload.payload = generate_alarm_log_health(&query->data.bin_payload.size, log_health);
+ query->data.bin_payload.topic = ACLK_TOPICID_ALARM_HEALTH;
+ query->data.bin_payload.msg_name = "AlarmLogHealth";
+ if (query->data.bin_payload.payload)
+ aclk_queue_query(query);
+}
+
+void aclk_send_alarm_log_entry(struct alarm_log_entry *log_entry)
+{
+ size_t payload_size;
+ char *payload = generate_alarm_log_entry(&payload_size, log_entry);
+
+ aclk_send_bin_msg(payload, payload_size, ACLK_TOPICID_ALARM_LOG, "AlarmLogEntry");
+}
+
+void aclk_send_provide_alarm_cfg(struct provide_alarm_configuration *cfg)
+{
+ aclk_query_t query = aclk_query_new(ALARM_PROVIDE_CFG);
+ query->data.bin_payload.payload = generate_provide_alarm_configuration(&query->data.bin_payload.size, cfg);
+ query->data.bin_payload.topic = ACLK_TOPICID_ALARM_CONFIG;
+ query->data.bin_payload.msg_name = "ProvideAlarmConfiguration";
+ if (query->data.bin_payload.payload)
+ aclk_queue_query(query);
+}
diff --git a/aclk/aclk_alarm_api.h b/aclk/aclk_alarm_api.h
new file mode 100644
index 0000000000..e99de208b5
--- /dev/null
+++ b/aclk/aclk_alarm_api.h
@@ -0,0 +1,13 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifndef ACLK_ALARM_API_H
+#define ACLK_ALARM_API_H
+
+#include "../daemon/common.h"
+#include "schema-wrappers/schema_wrappers.h"
+
+void aclk_send_alarm_log_health(struct alarm_log_health *log_health);
+void aclk_send_alarm_log_entry(struct alarm_log_entry *log_entry);
+void aclk_send_provide_alarm_cfg(struct provide_alarm_configuration *cfg);
+
+#endif /* ACLK_ALARM_API_H */
diff --git a/aclk/aclk_query.c b/aclk/aclk_query.c
index 12984ac661..114589ce31 100644
--- a/aclk/aclk_query.c
+++ b/aclk/aclk_query.c
@@ -294,6 +294,8 @@ aclk_query_handler aclk_query_handlers[] = {
{ .type = CHART_RESET, .name = "reset chart messages", .fnc = send_bin_msg },
{ .type = RETENTION_UPDATED, .name = "update retention info", .fnc = send_bin_msg },
{ .type = UPDATE_NODE_INFO, .name = "update node info", .fnc = send_bin_msg },
+ { .type = ALARM_LOG_HEALTH, .name = "alarm log health", .fnc = send_bin_msg },
+ { .type = ALARM_PROVIDE_CFG, .name = "provide alarm config", .fnc = send_bin_msg },
{ .type = UNKNOWN, .name = NULL, .fnc = NULL }
};
diff --git a/aclk/aclk_query_queue.c b/aclk/aclk_query_queue.c
index c4383cf1dc..1f84dcdaf9 100644
--- a/aclk/aclk_query_queue.c
+++ b/aclk/aclk_query_queue.c
@@ -171,6 +171,8 @@ void aclk_query_free(aclk_query_t query)
case CHART_RESET:
case RETENTION_UPDATED:
case UPDATE_NODE_INFO:
+ case ALARM_LOG_HEALTH:
+ case ALARM_PROVIDE_CFG:
freez(query->data.bin_payload.payload);
break;
diff --git a/aclk/aclk_query_queue.h b/aclk/aclk_query_queue.h
index 25a72dc43f..8293770d2a 100644
--- a/aclk/aclk_query_queue.h
+++ b/aclk/aclk_query_queue.h
@@ -23,7 +23,9 @@ typedef enum {
CHART_CONFIG_UPDATED,
CHART_RESET,
RETENTION_UPDATED,
- UPDATE_NODE_INFO
+ UPDATE_NODE_INFO,
+ ALARM_LOG_HEALTH,
+ ALARM_PROVIDE_CFG
} aclk_query_type_t;
struct aclk_query_metadata {
diff --git a/aclk/aclk_util.c b/aclk/aclk_util.c
index da9b0de3ff..8401ea02f5 100644
--- a/aclk/aclk_util.c
+++ b/aclk/aclk_util.c
@@ -125,6 +125,9 @@ struct topic_name {
{ .id = ACLK_TOPICID_CHART_RESET, .name = "reset-charts" },
{ .id = ACLK_TOPICID_RETENTION_UPDATED, .name = "chart-retention-updated" },
{ .id = ACLK_TOPICID_NODE_INFO, .name = "node-instance-info" },
+ { .id = ACLK_TOPICID_ALARM_LOG, .name = "alarm-log" },
+ { .id = ACLK_TOPICID_ALARM_HEALTH, .name = "alarm-health" },
+ { .id = ACLK_TOPICID_ALARM_CONFIG, .name = "alarm-config" },
{ .id = ACLK_TOPICID_UNKNOWN, .name = NULL }
};
@@ -151,6 +154,9 @@ enum aclk_topics compulsory_topics_new_cloud_arch[] = {
ACLK_TOPICID_CHART_RESET,
ACLK_TOPICID_RETENTION_UPDATED,
ACLK_TOPICID_NODE_INFO,
+ ACLK_TOPICID_ALARM_LOG,
+ ACLK_TOPICID_ALARM_HEALTH,
+ ACLK_TOPICID_ALARM_CONFIG,
ACLK_TOPICID_UNKNOWN
};
diff --git a/aclk/aclk_util.h b/aclk/aclk_util.h
index baf8e97543..3b5e7d7451 100644
--- a/aclk/aclk_util.h
+++ b/aclk/aclk_util.h
@@ -69,7 +69,10 @@ enum aclk_topics {
ACLK_TOPICID_CHART_CONFIGS_UPDATED = 10,
ACLK_TOPICID_CHART_RESET = 11,
ACLK_TOPICID_RETENTION_UPDATED = 12,
- ACLK_TOPICID_NODE_INFO = 13
+ ACLK_TOPICID_NODE_INFO = 13,
+ ACLK_TOPICID_ALARM_LOG = 14,
+ ACLK_TOPICID_ALARM_HEALTH = 15,
+ ACLK_TOPICID_ALARM_CONFIG = 16
};
const char *aclk_get_topic(enum aclk_topics topic);
diff --git a/aclk/schema-wrappers/alarm_config.cc b/aclk/schema-wrappers/alarm_config.cc
new file mode 100644
index 0000000000..e6c9e9974e
--- /dev/null
+++ b/aclk/schema-wrappers/alarm_config.cc
@@ -0,0 +1,147 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "alarm_config.h"
+
+#include "proto/alarm/v1/config.pb.h"
+
+#include "libnetdata/libnetdata.h"
+
+#include "schema_wrapper_utils.h"
+
+using namespace alarmconfig::v1;
+
+void destroy_aclk_alarm_configuration(struct aclk_alarm_configuration *cfg)
+{
+ freez(cfg->alarm);
+ freez(cfg->tmpl);
+ freez(cfg->on_chart);
+
+ freez(cfg->classification);
+ freez(cfg->type);
+ freez(cfg->component);
+
+ freez(cfg->os);
+ freez(cfg->hosts);
+ freez(cfg->plugin);
+ freez(cfg->module);
+ freez(cfg->charts);
+ freez(cfg->families);
+ freez(cfg->lookup);
+ freez(cfg->every);
+ freez(cfg->units);
+
+ freez(cfg->green);
+ freez(cfg->red);
+
+ freez(cfg->calculation_expr);
+ freez(cfg->warning_expr);
+ freez(cfg->critical_expr);
+
+ freez(cfg->recipient);
+ freez(cfg->exec);
+ freez(cfg->delay);
+ freez(cfg->repeat);
+ freez(cfg->info);
+ freez(cfg->options);
+ freez(cfg->host_labels);
+
+ freez(cfg->p_db_lookup_dimensions);
+ freez(cfg->p_db_lookup_method);
+ freez(cfg->p_db_lookup_options);
+}
+
+char *generate_provide_alarm_configuration(size_t *len, struct provide_alarm_configuration *data)
+{
+ ProvideAlarmConfiguration msg;
+ AlarmConfiguration *cfg = msg.mutable_config();
+
+ msg.set_config_hash(data->cfg_hash);
+
+ if (data->cfg.alarm)
+ cfg->set_alarm(data->cfg.alarm);
+ if (data->cfg.tmpl)
+ cfg->set_template_(data->cfg.tmpl);
+ if(data->cfg.on_chart)
+ cfg->set_on_chart(data->cfg.on_chart);
+
+ if (data->cfg.classification)
+ cfg->set_classification(data->cfg.classification);
+ if (data->cfg.type)
+ cfg->set_type(data->cfg.type);
+ if (data->cfg.component)
+ cfg->set_component(data->cfg.component);
+
+ if (data->cfg.os)
+ cfg->set_os(data->cfg.os);
+ if (data->cfg.hosts)
+ cfg->set_hosts(data->cfg.hosts);
+ if (data->cfg.plugin)
+ cfg->set_plugin(data->cfg.plugin);
+ if(data->cfg.module)
+ cfg->set_module(data->cfg.module);
+ if(data->cfg.charts)
+ cfg->set_charts(data->cfg.charts);
+ if(data->cfg.families)
+ cfg->set_families(data->cfg.families);
+ if(data->cfg.lookup)
+ cfg->set_lookup(data->cfg.lookup);
+ if(data->cfg.every)
+ cfg->set_every(data->cfg.every);
+ if(data->cfg.units)
+ cfg->set_units(data->cfg.units);
+
+ if (data->cfg.green)
+ cfg->set_green(data->cfg.green);
+ if (data->cfg.red)
+ cfg->set_red(data->cfg.red);
+
+ if (data->cfg.calculation_expr)
+ cfg->set_calculation_expr(data->cfg.calculation_expr);
+ if (data->cfg.warning_expr)
+ cfg->set_warning_expr(data->cfg.warning_expr);
+ if (data->cfg.critical_expr)
+ cfg->set_critical_expr(data->cfg.critical_expr);
+
+ if (data->cfg.recipient)
+ cfg->set_recipient(data->cfg.recipient);
+ if (data->cfg.exec)
+ cfg->set_exec(data->cfg.exec);
+ if (data->cfg.delay)
+ cfg->set_delay(data->cfg.delay);
+ if (data->cfg.repeat)
+ cfg->set_repeat(data->cfg.repeat);
+ if (data->cfg.info)
+ cfg->set_info(data->cfg.info);
+ if (data->cfg.options)
+ cfg->set_options(data->cfg.options);
+ if (data->cfg.host_labels)
+ cfg->set_host_labels(data->cfg.host_labels);
+
+ cfg->set_p_db_lookup_after(data->cfg.p_db_lookup_after);
+ cfg->set_p_db_lookup_before(data->cfg.p_db_lookup_before);
+ if (data->cfg.p_db_lookup_dimensions)
+ cfg->set_p_db_lookup_dimensions(data->cfg.p_db_lookup_dimensions);
+ if (data->cfg.p_db_lookup_method)
+ cfg->set_p_db_lookup_method(data->cfg.p_db_lookup_method);
+ if (data->cfg.p_db_lookup_options)
+ cfg->set_p_db_lookup_options(data->cfg.p_db_lookup_options);
+ cfg->set_p_update_every(data->cfg.p_update_every);
+
+ *len = PROTO_COMPAT_MSG_SIZE(msg);
+ char *bin = (char*)mallocz(*len);
+ if (!msg.SerializeToArray(bin, *len))
+ return NULL;
+
+ return bin;
+}
+
+char *parse_send_alarm_configuration(const char *data, size_t len)
+{
+ SendAlarmConfiguration msg;
+ if (!msg.ParseFromArray(data, len))
+ return NULL;
+ if (!msg.config_hash().c_str())
+ return NULL;
+ return strdupz(msg.config_hash().c_str());
+}
+
diff --git a/aclk/schema-wrappers/alarm_config.h b/aclk/schema-wrappers/alarm_config.h
new file mode 100644
index 0000000000..157fbc60f0
--- /dev/null
+++ b/aclk/schema-wrappers/alarm_config.h
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifndef ACLK_SCHEMA_WRAPPER_ALARM_CONFIG_H
+#define ACLK_SCHEMA_WRAPPER_ALARM_CONFIG_H
+
+#include <stdlib.h>
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct aclk_alarm_configuration {
+ char *alarm;
+ char *tmpl;
+ char *on_chart;
+
+ char *classification;
+ char *type;
+ char *component;
+
+ char *os;
+ char *hosts;
+ char *plugin;
+ char *module;
+ char *charts;
+ char *families;
+ char *lookup;
+ char *every;
+ char *units;
+
+ char *green;
+ char *red;
+
+ char *calculation_expr;
+ char *warning_expr;
+ char *critical_expr;
+
+ char *recipient;
+ char *exec;
+ char *delay;
+ char *repeat;
+ char *info;
+ char *options;
+ char *host_labels;
+
+ int32_t p_db_lookup_after;
+ int32_t p_db_lookup_before;
+ char *p_db_lookup_dimensions;
+ char *p_db_lookup_method;
+ char *p_db_lookup_options;
+ int32_t p_update_every;
+};
+
+void destroy_aclk_alarm_configuration(struct aclk_alarm_configuration *cfg);
+
+struct provide_alarm_configuration {
+ char *cfg_hash;
+ struct aclk_alarm_configuration cfg;
+};
+
+char *generate_provide_alarm_configuration(size_t *len, struct provide_alarm_configuration *data);
+char *parse_send_alarm_configuration(const char *data, size_t len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ACLK_SCHEMA_WRAPPER_ALARM_CONFIG_H */
diff --git a/aclk/schema-wrappers/alarm_stream.cc b/aclk/schema-wrappers/alarm_stream.cc
new file mode 100644
index 0000000000..c74e053675
--- /dev/null
+++ b/aclk/schema-wrappers/alarm_stream.cc
@@ -0,0 +1,176 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include "alarm_stream.h"
+
+#include "proto/alarm/v1/stream.pb.h"
+
+#include "libnetdata/libnetdata.h"
+
+#include "schema_wrapper_utils.h"
+
+struct start_alarm_streaming parse_start_alarm_streaming(const char *data, size_t len)
+{
+ struct start_alarm_streaming ret;
+ memset(&ret, 0, sizeof(ret));
+
+ alarmstream::v1::StartAlarmStreaming msg;
+
+ if (!msg.ParseFromArray(data, len))
+ return ret;
+
+ ret.node_id = strdupz(msg.node_id().c_str());
+ ret.batch_id = msg.batch_id();
+ ret.start_seq_id = msg.start_sequnce_id();
+
+ return ret;
+}
+
+char *parse_send_alarm_log_health(const char *data, size_t len)
+{
+ alarmstream::v1::SendAlarmLogHealth msg;
+ if (!msg.ParseFromArray(data, len))
+ return NULL;
+ return strdupz(msg.node_id().c_str());
+}
+
+char *generate_alarm_log_health(size_t *len, struct alarm_log_health *data)
+{
+ alarmstream::v1::AlarmLogHealth msg;
+ alarmstream::v1::LogEntries *entries;
+
+ msg.set_claim_id(data->claim_id);
+ msg.set_node_id(data->node_id);
+ msg.set_enabled(data->enabled);
+
+ switch (data->status) {
+ case ALARM_LOG_STATUS_IDLE:
+ msg.set_status(alarmstream::v1::ALARM_LOG_STATUS_IDLE);
+ break;
+ case ALARM_LOG_STATUS_RUNNING:
+ msg.set_status(alarmstream::v1::ALARM_LOG_STATUS_RUNNING);
+ break;
+ case ALARM_LOG_STATUS_UNSPECIFIED:
+ msg.set_status(alarmstream::v1::ALARM_LOG_STATUS_UNSPECIFIED);
+ break;
+ default:
+ error("Unknown status of AlarmLogHealth LogEntry");
+ return NULL;
+ }
+
+ entries = msg.mutable_log_entries();
+ entries->set_first_sequence_id(data->log_entries.first_seq_id);
+ entries->set_last_sequence_id(data->log_entries.last_seq_id);
+
+ set_google_timestamp_from_timeval(data->log_entries.first_when, entries->mutable_first_when());
+ set_google_timestamp_from_timeval(data->log_entries.last_when, entries->mutable_last_when());
+
+ *len = PROTO_COMPAT_MSG_SIZE(msg);
+ char *bin = (char*)mallocz(*len);
+ if (!msg.SerializeToArray(bin, *len))
+ return NULL;
+
+ return bin;
+}
+
+static alarmstream::v1::AlarmStatus aclk_alarm_status_to_proto(enum aclk_alarm_status status)
+{
+ switch (status) {
+ case ALARM_STATUS_NULL:
+ return alarmstream::v1::ALARM_STATUS_NULL;
+ case ALARM_STATUS_UNKNOWN:
+ return alarmstream::v1::ALARM_STATUS_UNKNOWN;
+ case ALARM_STATUS_REMOVED:
+ return alarmstream::v1::ALARM_STATUS_REMOVED;
+ case ALARM_STATUS_NOT_A_NUMBER:
+ return alarmstream::v1::ALARM_STATUS_NOT_A_NUMBER;
+ case ALARM_STATUS_CLEAR:
+ return alarmstream::v1::ALARM_STATUS_CLEAR;
+ case ALARM_STATUS_WARNING:
+ return alarmstream::v1::ALARM_STATUS_WARNING;
+ case ALARM_STATUS_CRITICAL:
+ return alarmstream::v1::ALARM_STATUS_CRITICAL;
+ default:
+ error("Unknown alarm status");
+ return alarmstream::v1::ALARM_STATUS_UNKNOWN;
+ }
+}
+
+void destroy_alarm_log_entry(struct alarm_log_entry *entry)
+{
+ freez(entry->node_id);
+ freez(entry->claim_id);
+
+ freez(entry->chart);
+ freez(entry->name);
+ freez(entry->family);
+
+ freez(entry->config_hash);
+
+ freez(entry->timezone);
+
+ freez(entry->exec_path);
+ freez(entry->conf_source);
+ freez(entry->command);
+
+ freez(entry->value_string);
+ freez(entry->old_value_string);
+
+ freez(entry->rendered_info);
+}
+
+char *generate_alarm_log_entry(size_t *len, struct alarm_log_entry *data)
+{
+ alarmstream::v1::AlarmLogEntry le;
+
+ le.set_node_id(data->node_id);
+ le.set_claim_id(data->claim_id);
+
+ le.set_chart(data->chart);
+ le.set_name(data->name);
+ if (data->family)
+ le.set_family(data->family);
+
+ le.set_batch_id(data->batch_id);
+ le.set_sequence_id(data->sequence_id);
+ le.set_when(data->when);
+
+ le.set_config_hash(data->config_hash);
+
+ le.set_utc_offset(data->utc_offset);
+ le.set_timezone(data->timezone);
+
+ le.set_exec_path(data->exec_path);
+ le.set_conf_source(data->conf_source);
+ le.set_command(data->command);
+
+ le.set_duration(data->duration);
+ le.set_non_clear_duration(data->non_clear_duration);
+
+
+ le.set_status(aclk_alarm_status_to_proto(data->status));
+ le.set_old_status(aclk_alarm_status_to_proto(data->old_status));
+ le.set_delay(data->delay);
+ le.set_delay_up_to_timestamp(data->delay_up_to_timestamp);
+
+ le.set_last_repeat(data->last_repeat);
+ le.set_silenced(data->silenced);
+
+ if (data->value_string)
+ le.set_value_string(data->value_string);
+ if (data->old_value_string)
+ le.set_old_value_string(data->old_value_string);
+
+ le.set_value(data->value);
+ le.set_old_value(data->old_value);
+
+ le.set_updated(data->updated);
+
+ le.set_rendered_info(data->rendered_info);
+
+ *len = PROTO_COMPAT_MSG_SIZE(le);
+ char *bin = (char*)mallocz(*len);
+ if (!le.SerializeToArray(bin, *len))
+ return NULL;
+
+ return bin;
+}
diff --git a/aclk/schema-wrappers/alarm_stream.h b/aclk/schema-wrappers/alarm_stream.h
new file mode 100644
index 0000000000..a81834149a
--- /dev/null
+++ b/aclk/schema-wrappers/alarm_stream.h
@@ -0,0 +1,110 @@
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#ifndef ACLK_SCHEMA_WRAPPER_ALARM_STREAM_H
+#define ACLK_SCHEMA_WRAPPER_ALARM_STREAM_H
+
+#include <stdlib.h>
+
+#include "database/rrd.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum alarm_log_status_aclk {
+ ALARM_LOG_STATUS_UNSPECIFIED = 0,
+ ALARM_LOG_STATUS_RUNNING = 1,
+ ALARM_LOG_STATUS_IDLE = 2
+};
+
+struct alarm_log_entries {
+ int64_t first_seq_id;
+ struct timeval first_when;
+
+ int64_t last_seq_id;
+ struct timeval last_when;
+};
+
+struct alarm_log_health {
+ char *claim_id;
+ char *node_id;
+ int enabled;
+ enum alarm_log_status_aclk status;
+ struct alarm_log_entries log_entries;
+};
+
+struct start_alarm_streaming {
+ char *node_id;
+ uint64_t batch_id;
+ uint64_t start_seq_id;
+};
+
+struct start_alarm_streaming parse_start_alarm_streaming(const char *data, size_t len);
+char *parse_send_alarm_log_health(const char *data, size_t len);
+
+char *generate_alarm_log_health(size_t *len, struct alarm_log_health *data);
+
+enum aclk_alarm_status {
+ ALARM_STATUS_NULL = 0,
+ ALARM_STATUS_UNKNOWN = 1,
+ ALARM_STATUS_REMOVED = 2,
+ ALARM_STATUS_NOT_A_NUMBER = 3,
+ ALARM_STATUS_CLEAR = 4,
+ ALARM_STATUS_WARNING = 5,
+ ALARM_STATUS_CRITICAL = 6
+};
+
+struct alarm_log_entry {
+ char *node_id;
+ char *claim_id;
+
+ char *chart;
+ char *name;
+ char *family;
+
+ uint64_t batch_id;
+ uint64_t sequence_id;
+ uint64_t when;
+
+ char *config_hash;
+
+ int32_t utc_offset;
+ char *timezone;
+
+ char *exec_path;
+ char *conf_source;
+ char *command;
+
+ uint32_t duration;
+ uint32_t non_clear_duration;
+
+ enum aclk_alarm_status status;
+ enum aclk_alarm_status old_status;
+ uint64_t delay;
+ uint64_t delay_up_to_timestamp;
+
+ uint64_t last_repeat;
+ int silenced;
+
+ char *value_string;
+ char *old_value_string;
+
+ double value;
+ double old_value;
+
+ // updated alarm entry, when the status of the alarm has been updated by a later entry
+ int updated;
+
+ // rendered_info
+ char *rendered_info;
+};
+
+void destroy_alarm_log_entry(struct alarm_log_entry *entry);
+
+char *generate_alarm_log_entry(size_t *len, struct alarm_log_entry *data);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ACLK_SCHEMA_WRAPPER_ALARM_STREAM_H */
diff --git a/aclk/schema-wrappers/node_info.cc b/aclk/schema-wrappers/node_info.cc
index 7509756c26..f6638aa5f5 100644
--- a/aclk/schema-wrappers/node_info.cc
+++ b/aclk/schema-wrappers/node_info.cc
@@ -9,54 +9,66 @@ static int generate_node_info(nodeinstance::info::v1::NodeInfo *info, struct acl
struct label *label;
google::protobuf::Map<std::string, std::string> *map;
- try
- {
+ if (data->name)
info->set_name(data->name);
-
+
+ if (data->os)
info->set_os(data->os);
+ if (data->os_name)
info->set_os_name(data->os_name);
+ if (data->os_version)
info->set_os_version(data->os_version);
-
+
+ if (data->kernel_name)
info->set_kernel_name(data->kernel_name);
+ if (data->kernel_version)
info->set_kernel_version(data->kernel_version);
-
+
+ if (data->architecture)
info->set_architecture(data->architecture);
-
- info->set_cpus(data->cpus);
-
+
+ info->set_cpus(data->cpus);
+
+ if (data->cpu_frequency)
info->set_cpu_frequency(data->cpu_frequency);
-
+
+ if (data->memory)
info->set_memory(data->memory);
-
+
+ if (data->disk_space)
info->set_disk_space(data->disk_space);
-
+
+ if (data->version)
info->set_version(data->version);
-
+
+ if (data->release_channel)
info->set_release_channel(data->release_channel);
-
+
+ if (data->timezone)
info->set_timezone(data->timezone);
-
+
+ if (data->virtualization_type)
info->set_virtualization_type(data->virtualization_type);
-
+
+ if (data->container_type)
info->set_container_type(data->container_type);
-
+
+ if (data->custom_info)
info->set_custom_info(data->custom_info);
-
- for (size_t i = 0; i < data->service_count; i++)
- info->add_services(data->services[i]);
-
+
+ for (size_t i = 0; i < data->service_count; i++)
+ info->add_services(data->services[i]);
+
+ if (data->machine_guid)
info->set_machine_guid(data->machine_guid);
-
- map = info->mutable_host_labels();
- label = data->host_labels_head;
- while (label) {
- map->insert({label->key, label->value});
- label = label->next;
- }
- }
- catch(...) {
- return 1;
+
+ map = info->mutable_host_labels();
+ label = data->host_labels_head;
+ while (label) {
+ map->insert({label->key, label->value});
+ label = label->next;
}
+
return 0;
}
diff --git a/aclk/schema-wrappers/schema_wrappers.h b/aclk/schema-wrappers/schema_wrappers.h
index be5311055f..a3975fca3e 100644
--- a/aclk/schema-wrappers/schema_wrappers.h
+++ b/aclk/schema-wrappers/schema_wrappers.h
@@ -10,6 +10,8 @@
#include "node_creation.h"
#include "chart_config.h"
#include "chart_stream.h"
+#include "alarm_config.h"
+#include "alarm_stream.h"
#include "node_info.h"
#endif /* SCHEMA_WRAPPERS_H */