Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/zabbix/zabbix.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladislavs Sokurenko <vladislavs.sokurenko@zabbix.com>2021-07-12 18:00:31 +0300
committerVladislavs Sokurenko <vladislavs.sokurenko@zabbix.com>2021-07-12 18:00:31 +0300
commite57007fb712f299a218765a0d7ff12a116dc2b94 (patch)
treecbe71ed22ac3fffb67ae25b04d9bee466a85ba43
parentaedd87d5dd7f14d2d5a2a2c64a86556baf2adfb9 (diff)
........S. [ZBXNEXT-6755] process root cause request
-rw-r--r--include/service_protocol.h5
-rw-r--r--include/zbxservice.h3
-rw-r--r--src/libs/zbxservice/service.c26
-rw-r--r--src/libs/zbxservice/service_protocol.c9
-rw-r--r--src/zabbix_server/escalator/escalator.c29
-rw-r--r--src/zabbix_server/service/service_manager.c16
-rw-r--r--src/zabbix_server/triggerhousekeeper/trigger_housekeeper.c2
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;