From ebec5b63bb5dad1eb3d2badb32e55a319ebca147 Mon Sep 17 00:00:00 2001 From: sasha Date: Fri, 14 Mar 2008 14:55:37 +0000 Subject: - [DEV-110] Heartbeat messages git-svn-id: svn://svn.zabbix.com/trunk@5488 97f52cf1-0a1b-0410-bd0e-c28be96e8082 --- configure.in | 1 + include/zbxjson.h | 1 + misc/conf/zabbix_proxy.conf | 7 +++ src/zabbix_proxy/Makefile.am | 2 + src/zabbix_proxy/heart/Makefile.am | 5 ++ src/zabbix_proxy/heart/heart.c | 116 +++++++++++++++++++++++++++++++++++++ src/zabbix_proxy/heart/heart.h | 27 +++++++++ src/zabbix_proxy/proxy.c | 100 +++++++++++++++++++------------- 8 files changed, 218 insertions(+), 41 deletions(-) create mode 100644 src/zabbix_proxy/heart/Makefile.am create mode 100644 src/zabbix_proxy/heart/heart.c create mode 100644 src/zabbix_proxy/heart/heart.h diff --git a/configure.in b/configure.in index cf884b08..e5741b0e 100644 --- a/configure.in +++ b/configure.in @@ -1072,6 +1072,7 @@ AC_OUTPUT([ src/zabbix_server/utils/Makefile src/zabbix_server/watchdog/Makefile src/zabbix_proxy/Makefile + src/zabbix_proxy/heart/Makefile src/zabbix_proxy/housekeeper/Makefile src/zabbix_proxy/proxyconfig/Makefile src/zabbix_proxy/datasender/Makefile diff --git a/include/zbxjson.h b/include/zbxjson.h index 820b6b1a..f0d702ce 100644 --- a/include/zbxjson.h +++ b/include/zbxjson.h @@ -47,6 +47,7 @@ #define ZBX_PROTO_VALUE_GET_ACTIVE_CHECKS "active checks" #define ZBX_PROTO_VALUE_PROXY_CONFIG "proxy config" +#define ZBX_PROTO_VALUE_PROXY_HEARTBEAT "proxy heartbeat" #define ZBX_PROTO_VALUE_DISCOVERY_DATA "discovery data" #define ZBX_PROTO_VALUE_HISTORY_DATA "history data" #define ZBX_PROTO_VALUE_SENDER_DATA "sender data" diff --git a/misc/conf/zabbix_proxy.conf b/misc/conf/zabbix_proxy.conf index 1db9d08e..637b1c22 100644 --- a/misc/conf/zabbix_proxy.conf +++ b/misc/conf/zabbix_proxy.conf @@ -54,6 +54,13 @@ Hostname=proxy # if this parameter is missing. #ListenIP=127.0.0.1 +# How often ZABBIX will perform sending hearbeat message +# (in seconds) +# Default value is 60 seconds +# Set to 0 to disable heartbeat messages +# This parameter must be between 0 and 3600 +#HeartbeatFrequency=60 + # How often ZABBIX will perform housekeeping procedure # (in hours) # Default value is 1 hour diff --git a/src/zabbix_proxy/Makefile.am b/src/zabbix_proxy/Makefile.am index 27dfd878..57b72d6d 100644 --- a/src/zabbix_proxy/Makefile.am +++ b/src/zabbix_proxy/Makefile.am @@ -1,6 +1,7 @@ ## Process this file with automake to produce Makefile.in SUBDIRS = \ + heart \ ../zabbix_server/dbsyncer \ ../zabbix_server/discoverer \ housekeeper \ @@ -21,6 +22,7 @@ zabbix_proxy_SOURCES = \ proxy.c zabbix_proxy_LDADD = \ + heart/libzbxheart.a \ $(top_srcdir)/src/zabbix_server/dbsyncer/libzbxdbsyncer.a \ $(top_srcdir)/src/zabbix_server/discoverer/libzbxdiscoverer.a \ housekeeper/libzbxhousekeeper.a \ diff --git a/src/zabbix_proxy/heart/Makefile.am b/src/zabbix_proxy/heart/Makefile.am new file mode 100644 index 00000000..ff70f185 --- /dev/null +++ b/src/zabbix_proxy/heart/Makefile.am @@ -0,0 +1,5 @@ +## Process this file with automake to produce Makefile.in + +noinst_LIBRARIES = libzbxheart.a + +libzbxheart_a_SOURCES = heart.c heart.h diff --git a/src/zabbix_proxy/heart/heart.c b/src/zabbix_proxy/heart/heart.c new file mode 100644 index 00000000..e7bc690a --- /dev/null +++ b/src/zabbix_proxy/heart/heart.c @@ -0,0 +1,116 @@ +/* +** ZABBIX +** Copyright (C) 2000-2005 SIA Zabbix +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +**/ + +#include "common.h" +#include "daemon.h" +#include "log.h" +#include "zbxjson.h" + +#include "heart.h" +#include "../servercomms.h" + +/****************************************************************************** + * * + * Function: process_nodes * + * * + * Purpose: calculates checks sum of config data * + * * + * Parameters: * + * * + * Return value: * + * * + * Author: Aleksander Vladishev * + * * + * Comments: never returns * + * * + ******************************************************************************/ +static void send_heartbeat() +{ + zbx_sock_t sock; + struct zbx_json j; + int res; + + zabbix_log(LOG_LEVEL_DEBUG, "In process_configuration_sync()"); + + zbx_json_init(&j, 128); + zbx_json_addstring(&j, "request", ZBX_PROTO_VALUE_PROXY_HEARTBEAT, ZBX_JSON_TYPE_STRING); + zbx_json_addstring(&j, "host", CONFIG_HOSTNAME, ZBX_JSON_TYPE_STRING); + + if (FAIL == connect_to_server(&sock, CONFIG_HEARTBEAT_FREQUENCY)) /* alarm */ + return; + + if (FAIL == (res = put_data_to_server(&sock, &j))) + zabbix_log(LOG_LEVEL_WARNING, "Heartbeat message sendig failed"); + + disconnect_server(&sock); +} + +/****************************************************************************** + * * + * Function: main_watchdog_loop * + * * + * Purpose: periodically send heartbeat message to the server * + * * + * Parameters: * + * * + * Return value: * + * * + * Author: Alexei Vladishev * + * * + * Comments: check database availability every 60 seconds (hardcoded) * + * * + ******************************************************************************/ +void main_heart_loop() +{ + struct sigaction phan; + int start, sleeptime; + + zabbix_log(LOG_LEVEL_WARNING, "In main_heart_loop()"); + + phan.sa_handler = child_signal_handler; + sigemptyset(&phan.sa_mask); + phan.sa_flags = 0; + sigaction(SIGALRM, &phan, NULL); + + if (CONFIG_HEARTBEAT_FREQUENCY == 0) { + zbx_setproctitle("heartbeat sender [do nothing]"); + + for (;;) /* Do nothing */ + sleep(3600); + } + + + for (;;) { + start = time(NULL); + + zbx_setproctitle("heartbeat sender [sending heartbeat message]"); + + send_heartbeat(); + + sleeptime = CONFIG_HEARTBEAT_FREQUENCY - (time(NULL) - start); + + if (sleeptime > 0) { + zbx_setproctitle("heartbeat sender [sleeping for %d seconds]", + sleeptime); + zabbix_log(LOG_LEVEL_DEBUG, "Sleeping for %d seconds", + sleeptime); + sleep(sleeptime); + } + } +} diff --git a/src/zabbix_proxy/heart/heart.h b/src/zabbix_proxy/heart/heart.h new file mode 100644 index 00000000..6f4e565a --- /dev/null +++ b/src/zabbix_proxy/heart/heart.h @@ -0,0 +1,27 @@ +/* +** ZABBIX +** Copyright (C) 2000-2005 SIA Zabbix +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License as published by +** the Free Software Foundation; either version 2 of the License, or +** (at your option) any later version. +** +** This program is distributed in the hope that it will be useful, +** but WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +** GNU General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +**/ + +#ifndef ZABBIX_HEART_H +#define ZABBIX_HEART_H + +extern int CONFIG_HEARTBEAT_FREQUENCY; + +void main_heart_loop(); + +#endif diff --git a/src/zabbix_proxy/proxy.c b/src/zabbix_proxy/proxy.c index c3341b2f..63127342 100644 --- a/src/zabbix_proxy/proxy.c +++ b/src/zabbix_proxy/proxy.c @@ -49,6 +49,7 @@ #include "../zabbix_server/trapper/trapper.h" #include "proxyconfig/proxyconfig.h" #include "datasender/datasender.h" +#include "heart/heart.h" /* #define LISTENQ 1024 @@ -111,6 +112,7 @@ static char shortopts[] = pid_t *threads=NULL; +int CONFIG_CONFSYNCER_FORKS = 1; int CONFIG_DATASENDER_FORKS = 1; int CONFIG_DBSYNCER_FORKS = 0;//1; int CONFIG_DISCOVERER_FORKS = 1; @@ -131,6 +133,8 @@ int CONFIG_HOUSEKEEPING_FREQUENCY = 1; /* h */ int CONFIG_PROXY_LOCAL_BUFFER = 0; /* 24h */ int CONFIG_PROXY_OFFLINE_BUFFER = 1; /* 720h */ +int CONFIG_HEARTBEAT_FREQUENCY = 60; + int CONFIG_PROXYCONFIG_FREQUENCY = 120; int CONFIG_DATASENDER_FREQUENCY = 10; @@ -213,6 +217,7 @@ void init_config(void) {"ProxyLocalBuffer",&CONFIG_PROXY_LOCAL_BUFFER,0,TYPE_INT,PARM_OPT,0,720}, {"ProxyOfflineBuffer",&CONFIG_PROXY_OFFLINE_BUFFER,0,TYPE_INT,PARM_OPT,1,720}, + {"HeartbeatFrequency",&CONFIG_HEARTBEAT_FREQUENCY,0,TYPE_INT,PARM_OPT,0,3600}, {"DataSenderFrequency",&CONFIG_DATASENDER_FREQUENCY,0,TYPE_INT,PARM_OPT,1,3600}, /* {"SenderFrequency",&CONFIG_SENDER_FREQUENCY,0,TYPE_INT,PARM_OPT,5,3600},*/ @@ -490,10 +495,10 @@ int MAIN_ZABBIX_ENTRY(void) }*/ DBinit(); - threads = calloc(1 + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS - + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS - + CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS, - sizeof(pid_t)); + threads = calloc(1 + CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS + + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS + + CONFIG_DBSYNCER_FORKS, sizeof(pid_t)); if (CONFIG_TRAPPERD_FORKS > 0) { if (FAIL == zbx_tcp_listen(&listen_sock, CONFIG_LISTEN_IP, (unsigned short)CONFIG_LISTEN_PORT)) { @@ -503,9 +508,10 @@ int MAIN_ZABBIX_ENTRY(void) } for ( i = 1; - i <= CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS - + CONFIG_HOUSEKEEPER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_HTTPPOLLER_FORKS - + CONFIG_DISCOVERER_FORKS + CONFIG_DBSYNCER_FORKS; + i <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS + + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS + + CONFIG_DBSYNCER_FORKS; i++) { if ((pid = zbx_fork()) == 0) { @@ -519,24 +525,30 @@ int MAIN_ZABBIX_ENTRY(void) if (server_num == 0) { init_main_process(); - zabbix_log(LOG_LEVEL_WARNING, "server #%d started [Configuration syncer]", + zabbix_log(LOG_LEVEL_WARNING, "server #%d started [Heartbeat sender]", server_num); - main_proxyconfig_loop(server_num); - + main_heart_loop(); + for (;;) zbx_sleep(3600); } + if (server_num <= CONFIG_CONFSYNCER_FORKS) + { + zabbix_log(LOG_LEVEL_WARNING, "server #%d started [Configuration syncer]", + server_num); - if (server_num <= CONFIG_DATASENDER_FORKS) + main_proxyconfig_loop(server_num); + } + else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS) { zabbix_log(LOG_LEVEL_WARNING, "server #%d started [Datasender]", server_num); main_datasender_loop(); } - else if (server_num <= CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS) + else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS) { #ifdef HAVE_SNMP init_snmp("zabbix_server"); @@ -545,34 +557,37 @@ int MAIN_ZABBIX_ENTRY(void) zabbix_log(LOG_LEVEL_WARNING, "server #%d started [Poller. SNMP:"SNMP_FEATURE_STATUS"]", server_num); - main_poller_loop(ZBX_PROCESS_PROXY, ZBX_POLLER_TYPE_NORMAL, server_num - CONFIG_DATASENDER_FORKS); + main_poller_loop(ZBX_PROCESS_PROXY, ZBX_POLLER_TYPE_NORMAL, server_num - (CONFIG_CONFSYNCER_FORKS + + CONFIG_DATASENDER_FORKS)); } - else if (server_num <= CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS) + else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + + CONFIG_TRAPPERD_FORKS) { zabbix_log(LOG_LEVEL_WARNING, "server #%d started [Trapper]", server_num); child_trapper_main(ZBX_PROCESS_PROXY, &listen_sock); } - else if(server_num <= CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS - + CONFIG_PINGER_FORKS) + else if(server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS) { zabbix_log(LOG_LEVEL_WARNING, "server #%d started [ICMP pinger]", server_num); - main_pinger_loop(ZBX_PROCESS_PROXY, server_num - (CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS - + CONFIG_TRAPPERD_FORKS)); + main_pinger_loop(ZBX_PROCESS_PROXY, server_num - (CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS + + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS)); } - else if(server_num <= CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS - + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS) + else if(server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS) { zabbix_log(LOG_LEVEL_WARNING, "server #%d started [Housekeeper]", server_num); main_housekeeper_loop(); } - else if(server_num <= CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS - + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS) + else if(server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS + + CONFIG_UNREACHABLE_POLLER_FORKS) { #ifdef HAVE_SNMP init_snmp("zabbix_server"); @@ -582,23 +597,24 @@ int MAIN_ZABBIX_ENTRY(void) server_num); main_poller_loop(ZBX_PROCESS_PROXY, ZBX_POLLER_TYPE_UNREACHABLE, server_num - - (CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS - + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS)); + - (CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS)); } - else if (server_num <= CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS - + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS - + CONFIG_HTTPPOLLER_FORKS) + else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS + + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_HTTPPOLLER_FORKS) { zabbix_log(LOG_LEVEL_WARNING, "server #%d started [HTTP Poller]", server_num); - main_httppoller_loop(ZBX_PROCESS_PROXY, server_num - (CONFIG_DATASENDER_FORKS - + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS - + CONFIG_HOUSEKEEPER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS)); + main_httppoller_loop(ZBX_PROCESS_PROXY, server_num - (CONFIG_CONFSYNCER_FORKS + + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS + + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS + + CONFIG_UNREACHABLE_POLLER_FORKS)); } - else if (server_num <= CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS - + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS - + CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS) + else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS + + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS) { #ifdef HAVE_SNMP init_snmp("zabbix_server"); @@ -607,14 +623,15 @@ int MAIN_ZABBIX_ENTRY(void) zabbix_log(LOG_LEVEL_WARNING, "server #%d started [Discoverer. SNMP:"SNMP_FEATURE_STATUS"]", server_num); - main_discoverer_loop(ZBX_PROCESS_PROXY, server_num - (CONFIG_DATASENDER_FORKS - + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS - + CONFIG_HOUSEKEEPER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS + main_discoverer_loop(ZBX_PROCESS_PROXY, server_num - (CONFIG_CONFSYNCER_FORKS + + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS + + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_HTTPPOLLER_FORKS)); } - else if (server_num <= CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS - + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS - + CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS + CONFIG_DBSYNCER_FORKS) + else if (server_num <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS + + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS + + CONFIG_DBSYNCER_FORKS) { zabbix_log(LOG_LEVEL_WARNING, "server #%d started [DB Syncer]", server_num); @@ -633,8 +650,9 @@ void zbx_on_exit() if (threads != NULL) { for ( i = 1; - i <= CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS - + CONFIG_HOUSEKEEPER_FORKS + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_HTTPPOLLER_FORKS + i <= CONFIG_CONFSYNCER_FORKS + CONFIG_DATASENDER_FORKS + CONFIG_POLLER_FORKS + + CONFIG_TRAPPERD_FORKS + CONFIG_PINGER_FORKS + CONFIG_HOUSEKEEPER_FORKS + + CONFIG_UNREACHABLE_POLLER_FORKS + CONFIG_HTTPPOLLER_FORKS + CONFIG_DISCOVERER_FORKS + CONFIG_DBSYNCER_FORKS; i ++) { if (threads[i]) { -- cgit