/* ** Zabbix ** Copyright (C) 2001-2023 Zabbix SIA ** ** 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. **/ #include "httppoller.h" #include "zbxdbhigh.h" #include "log.h" #include "zbxnix.h" #include "zbxself.h" #include "httptest.h" #include "zbxtime.h" /****************************************************************************** * * * Purpose: main loop of processing of httptests * * * * Comments: never returns * * * ******************************************************************************/ ZBX_THREAD_ENTRY(httppoller_thread, args) { int sleeptime = -1, httptests_count = 0, old_httptests_count = 0; double sec, total_sec = 0.0, old_total_sec = 0.0; time_t last_stat_time, nextcheck = 0; const zbx_thread_info_t *info = &((zbx_thread_args_t *)args)->info; int server_num = ((zbx_thread_args_t *)args)->info.server_num; int process_num = ((zbx_thread_args_t *)args)->info.process_num; unsigned char process_type = ((zbx_thread_args_t *)args)->info.process_type; zabbix_log(LOG_LEVEL_INFORMATION, "%s #%d started [%s #%d]", get_program_type_string(info->program_type), server_num, get_process_type_string(process_type), process_num); zbx_update_selfmon_counter(info, ZBX_PROCESS_STATE_BUSY); #define STAT_INTERVAL 5 /* if a process is busy and does not sleep then update status not faster than */ /* once in STAT_INTERVAL seconds */ zbx_setproctitle("%s #%d [connecting to the database]", get_process_type_string(process_type), process_num); last_stat_time = time(NULL); zbx_db_connect(ZBX_DB_CONNECT_NORMAL); while (ZBX_IS_RUNNING()) { sec = zbx_time(); zbx_update_env(get_process_type_string(process_type), sec); if (0 != sleeptime) { zbx_setproctitle("%s #%d [got %d values in " ZBX_FS_DBL " sec, getting values]", get_process_type_string(process_type), process_num, old_httptests_count, old_total_sec); } if ((int)sec >= nextcheck) { httptests_count += process_httptests((int)sec, &nextcheck); total_sec += zbx_time() - sec; if (0 == nextcheck) nextcheck = time(NULL) + POLLER_DELAY; } sleeptime = zbx_calculate_sleeptime(nextcheck, POLLER_DELAY); if (0 != sleeptime || STAT_INTERVAL <= time(NULL) - last_stat_time) { if (0 == sleeptime) { zbx_setproctitle("%s #%d [got %d values in " ZBX_FS_DBL " sec, getting values]", get_process_type_string(process_type), process_num, httptests_count, total_sec); } else { zbx_setproctitle("%s #%d [got %d values in " ZBX_FS_DBL " sec, idle %d sec]", get_process_type_string(process_type), process_num, httptests_count, total_sec, sleeptime); old_httptests_count = httptests_count; old_total_sec = total_sec; } httptests_count = 0; total_sec = 0.0; last_stat_time = time(NULL); } zbx_sleep_loop(info, sleeptime); } zbx_setproctitle("%s #%d [terminated]", get_process_type_string(process_type), process_num); while (1) zbx_sleep(SEC_PER_MIN); #undef STAT_INTERVAL }