diff options
-rw-r--r-- | include/service_protocol.h | 11 | ||||
-rw-r--r-- | include/zbxservice.h | 1 | ||||
-rw-r--r-- | src/libs/zbxservice/service_protocol.c | 40 | ||||
-rw-r--r-- | src/zabbix_server/actions.h | 2 | ||||
-rw-r--r-- | src/zabbix_server/service/service_manager.c | 24 | ||||
-rw-r--r-- | src/zabbix_server/taskmanager/taskmanager.c | 43 |
6 files changed, 120 insertions, 1 deletions
diff --git a/include/service_protocol.h b/include/service_protocol.h index 0dcc2c47b04..a1482f8175b 100644 --- a/include/service_protocol.h +++ b/include/service_protocol.h @@ -29,6 +29,13 @@ #include "zbxalgo.h" #include "zbxservice.h" +typedef struct +{ + zbx_uint64_t eventid; + int severity; +} +zbx_event_severity_t; + void zbx_service_serialize(unsigned char **data, size_t *data_alloc, size_t *data_offset, zbx_uint64_t eventid, int clock, int ns, int value, int severity, const zbx_vector_ptr_t *tags); void zbx_service_deserialize(const unsigned char *data, zbx_uint32_t size, zbx_vector_ptr_t *events); @@ -41,4 +48,8 @@ void zbx_service_serialize_rootcause(unsigned char **data, size_t *data_alloc, s zbx_uint64_t serviceid, const zbx_vector_uint64_t *eventids); void zbx_service_deserialize_rootcause(const unsigned char *data, zbx_uint32_t size, zbx_vector_service_t *services); + +zbx_uint32_t zbx_service_serialize_event_severities(unsigned char **data, const zbx_vector_ptr_t *event_severities); +void zbx_service_deserialize_event_severities(const unsigned char *data, zbx_vector_ptr_t *event_severities); + #endif diff --git a/include/zbxservice.h b/include/zbxservice.h index e77f6876b4a..dceb8d6a253 100644 --- a/include/zbxservice.h +++ b/include/zbxservice.h @@ -32,6 +32,7 @@ ZBX_PTR_VECTOR_DECL(service, DB_SERVICE *) #define ZBX_IPC_SERVICE_SERVICE_PROBLEMS_TAGS 2 #define ZBX_IPC_SERVICE_SERVICE_PROBLEMS_DELETE 3 #define ZBX_IPC_SERVICE_SERVICE_ROOTCAUSE 4 +#define ZBX_IPC_SERVICE_EVENT_SEVERITIES 5 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); diff --git a/src/libs/zbxservice/service_protocol.c b/src/libs/zbxservice/service_protocol.c index 214001aaec0..c74b791b397 100644 --- a/src/libs/zbxservice/service_protocol.c +++ b/src/libs/zbxservice/service_protocol.c @@ -311,3 +311,43 @@ void zbx_service_deserialize_rootcause(const unsigned char *data, zbx_uint32_t s } } } + +zbx_uint32_t zbx_service_serialize_event_severities(unsigned char **data, const zbx_vector_ptr_t *event_severities) +{ + zbx_uint32_t size; + unsigned char *ptr; + int i; + zbx_event_severity_t *es; + + size = sizeof(event_severities->values_num); + size += event_severities->values_num * (sizeof(es->eventid) + sizeof(es->severity)); + ptr = *data = (zbx_uint32_t *)zbx_malloc(NULL, size); + + ptr += zbx_serialize_value(ptr, event_severities->values_num); + for (i = 0; i < event_severities->values_num; i++) + { + es = (zbx_event_severity_t *)event_severities->values[i]; + + ptr += zbx_serialize_value(ptr, es->eventid); + ptr += zbx_serialize_value(ptr, es->severity); + } + + return size; +} + +void zbx_service_deserialize_event_severities(const unsigned char *data, zbx_vector_ptr_t *event_severities) +{ + int i, es_num; + zbx_event_severity_t *es; + + data += zbx_deserialize_value(data, &es_num); + zbx_vector_ptr_reserve(event_severities, es_num); + + for (i = 0; i < es_num; i++) + { + es = (zbx_event_severity_t *)zbx_malloc(NULL, sizeof(zbx_event_severity_t)); + data += zbx_deserialize_value(data, &es->eventid); + data += zbx_deserialize_value(data, &es->severity); + zbx_vector_ptr_append(event_severities, es); + } +} diff --git a/src/zabbix_server/actions.h b/src/zabbix_server/actions.h index 1e6485694c0..8d68d979e19 100644 --- a/src/zabbix_server/actions.h +++ b/src/zabbix_server/actions.h @@ -31,6 +31,8 @@ typedef struct zbx_uint64_t eventid; zbx_uint64_t acknowledgeid; zbx_uint64_t taskid; + int old_severity; + int new_severity; } zbx_ack_task_t; diff --git a/src/zabbix_server/service/service_manager.c b/src/zabbix_server/service/service_manager.c index 12464cce880..811417d5024 100644 --- a/src/zabbix_server/service/service_manager.c +++ b/src/zabbix_server/service/service_manager.c @@ -2864,6 +2864,27 @@ static void process_rootcause(const zbx_ipc_message_t *message, zbx_service_mana zbx_vector_uint64_destroy(&serviceids); } +static void process_event_severities(const zbx_ipc_message_t *message) +{ + zbx_vector_ptr_t event_severities; + int severities_num; + + zabbix_log(LOG_LEVEL_DEBUG, "In %s() size:%u" , __func__, message->size); + + zbx_vector_ptr_create(&event_severities); + + zbx_service_deserialize_event_severities(message->data, &event_severities); + severities_num = event_severities.values_num; + + // TODO: update service problems/services + + zbx_vector_ptr_clear_ext(&event_severities, zbx_ptr_free); + zbx_vector_ptr_destroy(&event_severities); + + zabbix_log(LOG_LEVEL_DEBUG, "End of %s() severities_num:%d", __func__, severities_num); +} + + 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, @@ -3259,6 +3280,9 @@ ZBX_THREAD_ENTRY(service_manager_thread, args) case ZBX_IPC_SERVICE_SERVICE_ROOTCAUSE: process_rootcause(message, &service_manager, client); break; + case ZBX_IPC_SERVICE_EVENT_SEVERITIES: + process_event_severities(message); + break; default: THIS_SHOULD_NEVER_HAPPEN; } diff --git a/src/zabbix_server/taskmanager/taskmanager.c b/src/zabbix_server/taskmanager/taskmanager.c index 461905552ec..04ea8311337 100644 --- a/src/zabbix_server/taskmanager/taskmanager.c +++ b/src/zabbix_server/taskmanager/taskmanager.c @@ -29,6 +29,7 @@ #include "export.h" #include "taskmanager.h" #include "zbxdiag.h" +#include "service_protocol.h" #define ZBX_TM_PROCESS_PERIOD 5 #define ZBX_TM_CLEANUP_PERIOD SEC_PER_HOUR @@ -301,6 +302,42 @@ static void tm_process_data_result(zbx_uint64_t taskid) zabbix_log(LOG_LEVEL_DEBUG, "End of %s()", __func__); } +static void notify_service_manager(const zbx_vector_ptr_t *ack_tasks) +{ + int i; + zbx_vector_ptr_t event_severities; + + zbx_vector_ptr_create(&event_severities); + + for (i = 0; i < ack_tasks->values_num; i++) + { + zbx_ack_task_t *ack_task = (zbx_ack_task_t *)ack_tasks->values[i]; + + if (ack_task->old_severity != ack_task->new_severity) + { + zbx_event_severity_t *es; + + es = (zbx_event_severity_t *)zbx_malloc(NULL, sizeof(zbx_event_severity_t)); + es->eventid = ack_task->eventid; + es->severity = ack_task->new_severity; + zbx_vector_ptr_append(&event_severities, es); + } + } + + if (0 != event_severities.values_num) + { + unsigned char *data; + zbx_uint32_t size; + + size = zbx_service_serialize_event_severities(&data, &event_severities); + zbx_service_send(ZBX_IPC_SERVICE_EVENT_SEVERITIES, data, size, NULL); + zbx_free(data); + } + + zbx_vector_ptr_clear_ext(&event_severities, zbx_ptr_free); + zbx_vector_ptr_destroy(&event_severities); +} + /****************************************************************************** * * * Function: tm_process_acknowledgements * @@ -327,7 +364,7 @@ static int tm_process_acknowledgements(zbx_vector_uint64_t *ack_taskids) zbx_vector_ptr_create(&ack_tasks); zbx_snprintf_alloc(&sql, &sql_alloc, &sql_offset, - "select a.eventid,ta.acknowledgeid,ta.taskid" + "select a.eventid,ta.acknowledgeid,ta.taskid,a.old_severity,a.new_severity" " from task_acknowledge ta" " left join acknowledges a" " on ta.acknowledgeid=a.acknowledgeid" @@ -354,6 +391,8 @@ static int tm_process_acknowledgements(zbx_vector_uint64_t *ack_taskids) ZBX_STR2UINT64(ack_task->eventid, row[0]); ZBX_STR2UINT64(ack_task->acknowledgeid, row[1]); ZBX_STR2UINT64(ack_task->taskid, row[2]); + ack_task->old_severity = atoi(row[3]); + ack_task->new_severity = atoi(row[4]); zbx_vector_ptr_append(&ack_tasks, ack_task); } DBfree_result(result); @@ -362,6 +401,8 @@ static int tm_process_acknowledgements(zbx_vector_uint64_t *ack_taskids) { zbx_vector_ptr_sort(&ack_tasks, ZBX_DEFAULT_UINT64_PTR_COMPARE_FUNC); processed_num = process_actions_by_acknowledgements(&ack_tasks); + + notify_service_manager(&ack_tasks); } sql_offset = 0; |