diff options
author | Vladislavs Sokurenko <vladislavs.sokurenko@zabbix.com> | 2021-07-12 18:00:31 +0300 |
---|---|---|
committer | Vladislavs Sokurenko <vladislavs.sokurenko@zabbix.com> | 2021-07-12 18:00:31 +0300 |
commit | e57007fb712f299a218765a0d7ff12a116dc2b94 (patch) | |
tree | cbe71ed22ac3fffb67ae25b04d9bee466a85ba43 | |
parent | aedd87d5dd7f14d2d5a2a2c64a86556baf2adfb9 (diff) |
........S. [ZBXNEXT-6755] process root cause request
-rw-r--r-- | include/service_protocol.h | 5 | ||||
-rw-r--r-- | include/zbxservice.h | 3 | ||||
-rw-r--r-- | src/libs/zbxservice/service.c | 26 | ||||
-rw-r--r-- | src/libs/zbxservice/service_protocol.c | 9 | ||||
-rw-r--r-- | src/zabbix_server/escalator/escalator.c | 29 | ||||
-rw-r--r-- | src/zabbix_server/service/service_manager.c | 16 | ||||
-rw-r--r-- | src/zabbix_server/triggerhousekeeper/trigger_housekeeper.c | 2 |
7 files changed, 75 insertions, 15 deletions
diff --git a/include/service_protocol.h b/include/service_protocol.h index 7b09dd9e02f..26974d6d70d 100644 --- a/include/service_protocol.h +++ b/include/service_protocol.h @@ -31,7 +31,6 @@ void zbx_service_deserialize(const unsigned char *data, zbx_uint32_t size, zbx_v void zbx_service_serialize_problem_tags(unsigned char **data, size_t *data_alloc, size_t *data_offset, zbx_uint64_t eventid, const zbx_vector_tags_t *tags); void zbx_service_deserialize_problem_tags(const unsigned char *data, zbx_uint32_t size, zbx_vector_ptr_t *events); -void zbx_service_serialize_eventid(unsigned char **data, size_t *data_alloc, size_t *data_offset, - zbx_uint64_t eventid); -void zbx_service_deserialize_eventids(const unsigned char *data, zbx_uint32_t size, zbx_vector_uint64_t *eventids); +void zbx_service_serialize_id(unsigned char **data, size_t *data_alloc, size_t *data_offset, zbx_uint64_t id); +void zbx_service_deserialize_ids(const unsigned char *data, zbx_uint32_t size, zbx_vector_uint64_t *ids); #endif diff --git a/include/zbxservice.h b/include/zbxservice.h index 7a3754914c4..5321f054582 100644 --- a/include/zbxservice.h +++ b/include/zbxservice.h @@ -23,12 +23,15 @@ #include "zbxtypes.h" #include "zbxalgo.h" #include "db.h" +#include "zbxipcservice.h" #define ZBX_IPC_SERVICE_SERVICE "service" #define ZBX_IPC_SERVICE_SERVICE_PROBLEMS 1 #define ZBX_IPC_SERVICE_SERVICE_PROBLEMS_TAGS 2 #define ZBX_IPC_SERVICE_SERVICE_PROBLEMS_DELETE 3 +#define ZBX_IPC_SERVICE_SERVICE_ROOTCAUSE 4 void zbx_service_flush(zbx_uint32_t code, unsigned char *data, zbx_uint32_t size); +void zbx_service_send(zbx_uint32_t code, unsigned char *data, zbx_uint32_t size, zbx_ipc_message_t *response); #endif /* ZABBIX_AVAILABILITY_H */ diff --git a/src/libs/zbxservice/service.c b/src/libs/zbxservice/service.c index a0b920952bd..f6cd30083c8 100644 --- a/src/libs/zbxservice/service.c +++ b/src/libs/zbxservice/service.c @@ -45,3 +45,29 @@ void zbx_service_flush(zbx_uint32_t code, unsigned char *data, zbx_uint32_t size } } +void zbx_service_send(zbx_uint32_t code, unsigned char *data, zbx_uint32_t size, zbx_ipc_message_t *response) +{ + char *error = NULL; + static zbx_ipc_socket_t socket = {0}; + + /* each process has a permanent connection to preprocessing manager */ + if (0 == socket.fd && FAIL == zbx_ipc_socket_open(&socket, ZBX_IPC_SERVICE_SERVICE, SEC_PER_MIN, + &error)) + { + zabbix_log(LOG_LEVEL_CRIT, "cannot connect to preprocessing service: %s", error); + exit(EXIT_FAILURE); + } + + if (FAIL == zbx_ipc_socket_write(&socket, code, data, size)) + { + zabbix_log(LOG_LEVEL_CRIT, "cannot send data to preprocessing service"); + exit(EXIT_FAILURE); + } + + if (NULL != response && FAIL == zbx_ipc_socket_read(&socket, response)) + { + zabbix_log(LOG_LEVEL_CRIT, "cannot receive data from preprocessing service"); + exit(EXIT_FAILURE); + } +} + diff --git a/src/libs/zbxservice/service_protocol.c b/src/libs/zbxservice/service_protocol.c index 61c7c130621..68504f26737 100644 --- a/src/libs/zbxservice/service_protocol.c +++ b/src/libs/zbxservice/service_protocol.c @@ -205,13 +205,12 @@ void zbx_service_deserialize_problem_tags(const unsigned char *data, zbx_uint32_ } } -void zbx_service_serialize_eventid(unsigned char **data, size_t *data_alloc, size_t *data_offset, - zbx_uint64_t eventid) +void zbx_service_serialize_id(unsigned char **data, size_t *data_alloc, size_t *data_offset, zbx_uint64_t id) { zbx_uint32_t data_len = 0; unsigned char *ptr; - zbx_serialize_prepare_value(data_len, eventid); + zbx_serialize_prepare_value(data_len, id); if (NULL != *data) { @@ -227,10 +226,10 @@ void zbx_service_serialize_eventid(unsigned char **data, size_t *data_alloc, siz ptr = *data + *data_offset; *data_offset += data_len; - (void)zbx_serialize_value(ptr, eventid); + (void)zbx_serialize_value(ptr, id); } -void zbx_service_deserialize_eventids(const unsigned char *data, zbx_uint32_t size, zbx_vector_uint64_t *eventids) +void zbx_service_deserialize_ids(const unsigned char *data, zbx_uint32_t size, zbx_vector_uint64_t *eventids) { const unsigned char *end = data + size; diff --git a/src/zabbix_server/escalator/escalator.c b/src/zabbix_server/escalator/escalator.c index ab103ef2e1b..5e8a71a852d 100644 --- a/src/zabbix_server/escalator/escalator.c +++ b/src/zabbix_server/escalator/escalator.c @@ -35,6 +35,8 @@ #include "comms.h" #include "../../libs/zbxserver/get_host_from_event.h" #include "../../libs/zbxserver/zabbix_users.h" +#include "zbxservice.h" +#include "service_protocol.h" extern int CONFIG_ESCALATOR_FORKS; @@ -2380,6 +2382,26 @@ static void add_ack_escalation_r_eventids(zbx_vector_ptr_t *escalations, zbx_vec zbx_vector_uint64_destroy(&r_eventids); } +static void get_services_by_serviceids(const zbx_vector_uint64_t *serviceids) +{ + unsigned char *data = NULL; + size_t data_alloc = 0, data_offset = 0; + int i; + zbx_ipc_message_t response; + + for (i = 0; i < serviceids->values_num; i++) + zbx_service_serialize_id(&data, &data_alloc, &data_offset, serviceids->values[i]); + + if (NULL == data) + return; + + zbx_ipc_message_init(&response); + zbx_service_send(ZBX_IPC_SERVICE_SERVICE_ROOTCAUSE, data, data_offset, &response); + zbx_ipc_message_clean(&response); + + zbx_free(data); +} + static void db_get_services(const zbx_vector_ptr_t *escalations, zbx_vector_service_t *services) { DB_RESULT result; @@ -2428,6 +2450,8 @@ static void db_get_services(const zbx_vector_ptr_t *escalations, zbx_vector_serv DBfree_result(result); } + get_services_by_serviceids(&serviceids); + zbx_free(sql); zbx_vector_uint64_destroy(&serviceids); @@ -2600,11 +2624,6 @@ static int process_db_escalations(int now, int *nextcheck, zbx_vector_ptr_t *esc } } - if (EVENT_SOURCE_SERVICE == event->source) - { - - } - if (0 != escalation->r_eventid) { if (FAIL == (index = zbx_vector_ptr_bsearch(&events, &escalation->r_eventid, diff --git a/src/zabbix_server/service/service_manager.c b/src/zabbix_server/service/service_manager.c index e067714af30..c5b303dea9b 100644 --- a/src/zabbix_server/service/service_manager.c +++ b/src/zabbix_server/service/service_manager.c @@ -2218,6 +2218,17 @@ static void process_events(zbx_vector_ptr_t *events, zbx_service_manager_t *serv zabbix_log(LOG_LEVEL_DEBUG, "End of %s()", __func__); } +static void process_rootcause(zbx_ipc_message_t *message, zbx_service_manager_t *service_manager) +{ + zbx_vector_uint64_t serviceids; + + zbx_vector_uint64_create(&serviceids); + + zbx_service_deserialize_ids(message->data, message->size, &serviceids); + + zbx_vector_uint64_destroy(&serviceids); +} + static void service_manager_init(zbx_service_manager_t *service_manager) { zbx_hashset_create_ext(&service_manager->problem_events, 1000, default_uint64_ptr_hash_func, @@ -2601,10 +2612,13 @@ ZBX_THREAD_ENTRY(service_manager_thread, args) tags_update_num += events.values_num; break; case ZBX_IPC_SERVICE_SERVICE_PROBLEMS_DELETE: - zbx_service_deserialize_eventids(message->data, message->size, &eventids); + zbx_service_deserialize_ids(message->data, message->size, &eventids); process_deleted_problems(&eventids, &service_manager); problems_delete_num += events.values_num; break; + case ZBX_IPC_SERVICE_SERVICE_ROOTCAUSE: + process_rootcause(message, &service_manager); + break; default: THIS_SHOULD_NEVER_HAPPEN; } diff --git a/src/zabbix_server/triggerhousekeeper/trigger_housekeeper.c b/src/zabbix_server/triggerhousekeeper/trigger_housekeeper.c index 0e2aca7821a..83d8a70265f 100644 --- a/src/zabbix_server/triggerhousekeeper/trigger_housekeeper.c +++ b/src/zabbix_server/triggerhousekeeper/trigger_housekeeper.c @@ -43,7 +43,7 @@ static void housekeep_service_problems(const zbx_vector_uint64_t *eventids) int i; for (i = 0; i < eventids->values_num; i++) - zbx_service_serialize_eventid(&data, &data_alloc, &data_offset, eventids->values[i]); + zbx_service_serialize_id(&data, &data_alloc, &data_offset, eventids->values[i]); if (NULL == data) return; |