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:
-rw-r--r--include/service_protocol.h11
-rw-r--r--include/zbxservice.h1
-rw-r--r--src/libs/zbxservice/service_protocol.c40
-rw-r--r--src/zabbix_server/actions.h2
-rw-r--r--src/zabbix_server/service/service_manager.c24
-rw-r--r--src/zabbix_server/taskmanager/taskmanager.c43
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;