zabbix的构成
zabbix主要由数据库、zabbix_server、zabbix_agent、zabbix_proxy和zabbix_web构成。各个部分的组成结构如下:
zabbix_server
这是zabbix的服务端,是zabbix的逻辑核心。
下面是zabbix_server的main函数的启动过程
也就是说,启动程序最终是 zabbix_server中的server.c里面的MAIN_ZABBIX_ENTRY
方法。
以下是该函数的主要步骤和调用的方法:
- 初始化环境和锁:
- 初始化 IPC 服务。
- 创建锁。
- 打开日志。
zbx_ipc_service_init_env(CONFIG_SOCKET_PATH, &error); zbx_locks_create(&error); zabbix_open_log(&log_file_cfg, CONFIG_LOG_LEVEL, &error);
- 打印启动信息:
- 打印 Zabbix 版本和修订版本信息。
- 打印启动消息。
printf("Starting Zabbix Server. Zabbix %s (revision %s).\nPress Ctrl+C to exit.\n\n", ZABBIX_VERSION, ZABBIX_REVISION); zabbix_log(LOG_LEVEL_INFORMATION, "Starting Zabbix Server. Zabbix %s (revision %s).", ZABBIX_VERSION, ZABBIX_REVISION);
- 初始化 IPC 服务和加载模块:
- 初始化 IPC 服务环境。
- 创建并加载模块。
- 释放配置。
zbx_ipc_service_init_env(CONFIG_SOCKET_PATH, &error); zbx_load_modules(CONFIG_LOAD_MODULE_PATH, CONFIG_LOAD_MODULE, config_timeout, 1); zbx_free_config();
- 初始化运行时控制服务和 Vault:
- 初始化运行时控制服务。
- 从环境变量获取 Vault 令牌。
- 初始化 Vault。
- 从 Vault 获取数据库凭据。
zbx_rtc_init(&rtc, &error); zbx_vault_token_from_env_get(&(zbx_config_vault.token), &error); zbx_vault_init(&zbx_config_vault, &error); zbx_vault_db_credentials_get(&zbx_config_vault, zbx_config_dbhigh->config_dbuser, &zbx_config_dbhigh->config_dbpassword, &error);
- 初始化数据库:
- 初始化数据库。
- 检查数据库类型。
- 初始化数据库缓存。
- 检查字符集。
zbx_db_init(DCget_nextid, program_type, &error); zbx_db_get_database_type(); init_database_cache(&error); zbx_db_check_character_set(); zbx_check_db(); zbx_db_save_server_status(); DBcheck_double_type(zbx_config_dbhigh); zbx_db_check_instanceid();
- 初始化导出功能和历史存储:
- 初始化导出功能。
- 初始化历史存储。
zbx_initialize_events(); zbx_init_library_export(&zbx_config_export, &error); zbx_history_init(&error);
- 启动 HA 管理器:
- 初始化 HA 配置。
- 启动 HA 管理器。
- 获取 HA 节点的状态。
zbx_ha_start(&rtc, ha_config, &error); zbx_ha_get_status(CONFIG_HA_NODE_NAME, &ha_status, &ha_failover_delay, &error);
- 根据 HA 状态执行相应操作:
- 如果是 Active 节点,则执行启动操作。
- 如果是 Standby 节点,则进行相关处理。
if (ZBX_NODE_STATUS_ACTIVE == ha_status) { server_startup(&listen_sock, &ha_status, &ha_failover_delay, &rtc); //... } else if (ZBX_NODE_STATUS_STANDBY == ha_status) { //... }
- 在运行中处理消息和事件:
- 接收并处理 IPC 消息。
- 处理 HA 消息。
- 处理运行时控制服务消息。
while (ZBX_IS_RUNNING()) { //... zbx_ipc_service_recv(&rtc.service, &rtc_timeout, &client, &message); zbx_ha_dispatch_message(CONFIG_HA_NODE_NAME, message, &ha_status, &ha_failover_delay, &error); zbx_rtc_dispatch(&rtc, client, message, rtc_process_request_ex_server); //... }
- 根据 HA 状态进行相关操作:
- 根据 HA 状态进行不同的操作,例如日志记录、处理状态切换等。
if (ZBX_NODE_STATUS_ERROR != ha_status) { //... if (ZBX_NODE_STATUS_ACTIVE == ha_status) { //... } else if (ZBX_NODE_STATUS_STANDBY == ha_status) { //... } }
- 在退出时进行清理和关闭:
- 关闭子系统。
- 暂停 HA 管理器。
- 清理数据库版本信息。
- 注册退出函数。
zbx_rtc_shutdown_subs(&rtc); zbx_ha_pause(&error); zbx_db_version_info_clear(&db_version_info); zbx_on_exit(ZBX_EXIT_STATUS());
- 返回 SUCCEED 表示正常退出。
以上是 MAIN_ZABBIX_ENTRY
函数的主要流程和调用的一些关键方法。此函数主要负责初始化 Zabbix 服务端的各个模块,处理 HA 状态,接收和处理消息,执行相应的操作,并在退出时进行清理。
zabbix_agent
这是zabbix中负责实现信息采集的部分。
MAIN_ZABBIX_ENTRY
MAIN_ZABBIX_ENTRY
函数是 Zabbix Agent 启动的主要入口点,以下是函数中的主要步骤:
- 处理预定义宏和全局变量初始化:
- 检查并初始化 Windows 下的异常处理机制(可选)。
- 初始化变量,包括一个用于存储线程句柄的数组。
- 输出启动信息:
- 如果是以前台模式启动,输出启动信息。
- 创建锁和打开日志:
- 在非 Windows 平台上,创建并初始化锁,防止并发问题。
- 打开日志文件,如果失败则输出错误信息并退出。
- 输出启用的功能信息:
- 输出当前启用的功能,如 IPv6 支持和 TLS 支持。
- 初始化模块和加载用户参数:
- 如果不是 Windows,禁用核心转储。
- 在非 Windows 平台上,加载模块。
- 加载用户定义的参数。
- 初始化监听套接字和模块:
- 如果定义了
CONFIG_FORKS[ZBX_PROCESS_TYPE_LISTENER]
,则初始化 TCP 监听套接字。 - 初始化 Modbus 模块。
- 初始化和启动数据收集器线程:
- 初始化数据收集器。
- 在 Windows 上,初始化性能计数器收集器。
- 释放配置内存:
- 释放配置文件相关的内存。
- 初始化 TLS 父线程:
- 如果启用了 TLS,初始化 TLS 父线程。
- 启动各个线程:
- 计算线程总数。
- 为每个线程创建参数结构和线程信息结构,然后根据线程类型启动相应的线程(收集器线程、监听线程、主动检查线程)。
- 在 Windows 上等待线程退出:
- 在 Windows 下,使用
WaitForMultipleObjectsEx
等待线程退出。
- 在非 Windows 平台上等待任何子进程退出:
- 在非 Windows 平台上,使用
wait
等待任何子进程退出。
- 退出处理:
- 输出退出信号的日志信息。
- 在 Windows 下,清理监听套接字并等待服务工作线程终止。
- 调用
zbx_on_exit
处理程序。
- 返回执行结果:
- 返回
SUCCEED
表示成功,FAIL
表示失败。
这个函数主要负责初始化 Zabbix Agent 的各个模块,启动监听套接字,初始化并启动各个线程,处理异常情况,并在退出时清理资源。
zabbix_proxy
这段代码是 Zabbix Proxy 中的主函数,主要实现了以下功能:
- 初始化环境和日志:
- 初始化 IPC 服务,用于进程间通信。
- 创建锁。
- 打开日志文件,根据配置设置日志级别。
if (FAIL == zbx_ipc_service_init_env(CONFIG_SOCKET_PATH, &error)) { // 处理错误,退出程序 } if (SUCCEED != zbx_locks_create(&error)) { // 处理错误,退出程序 } if (SUCCEED != zabbix_open_log(&log_file_cfg, CONFIG_LOG_LEVEL, &error)) { // 处理错误,退出程序 }
- 打印启动信息和启用的特性:
- 打印 Zabbix Proxy 的启动信息,包括代理模式、主机名、Zabbix 版本和修订版本。
- 打印已启用的特性,如 SNMP 监控、IPMI 监控、Web 监控等。
printf("Starting Zabbix Proxy (%s) [%s]. Zabbix %s (revision %s).\nPress Ctrl+C to exit.\n\n", ZBX_PROXYMODE_PASSIVE == config_proxymode ? "passive" : "active", CONFIG_HOSTNAME, ZABBIX_VERSION, ZABBIX_REVISION); zabbix_log(LOG_LEVEL_INFORMATION, "Starting Zabbix Proxy (%s) [%s]. Zabbix %s (revision %s).", ZBX_PROXYMODE_PASSIVE == config_proxymode ? "passive" : "active", CONFIG_HOSTNAME, ZABBIX_VERSION, ZABBIX_REVISION); zabbix_log(LOG_LEVEL_INFORMATION, "**** Enabled features ****"); zabbix_log(LOG_LEVEL_INFORMATION, "SNMP monitoring: " SNMP_FEATURE_STATUS); // ... 其他特性 zabbix_log(LOG_LEVEL_INFORMATION, "**************************");
- 加载模块和释放配置:
- 加载 Zabbix 模块。
- 释放配置文件。
if (FAIL == zbx_load_modules(CONFIG_LOAD_MODULE_PATH, CONFIG_LOAD_MODULE, config_timeout, 1)) { // 处理错误,退出程序 } zbx_free_config();
- 初始化运行时控制服务和其他初始化:
- 初始化运行时控制服务(
zbx_rtc_init
)。 - 初始化数据库缓存、代理历史锁、配置缓存等。
- 初始化自监控、VMware 缓存、Vault 等。
- 初始化并获取数据库凭证。
if (SUCCEED != zbx_rtc_init(&rtc, &error)) { // 处理错误,退出程序 } if (SUCCEED != init_database_cache(&error)) { // 处理错误,退出程序 } // ... 其他初始化 if (0 != CONFIG_FORKS[ZBX_PROCESS_TYPE_VMWARE] && SUCCEED != zbx_vmware_init(&error)) { // 处理错误,退出程序 } if (SUCCEED != zbx_vault_token_from_env_get(&(zbx_config_vault.token), &error)) { // 处理错误,退出程序 } // ... 其他初始化 proxy_db_init();
- 注册统计信息和禁用核心转储:
- 注册统计信息函数。
- 注册统计信息扩展函数。
- 注册进程信息函数。
- 初始化诊断。
zabbix_log(LOG_LEVEL_INFORMATION, "using configuration file: %s", config_file); #if defined(HAVE_GNUTLS) || defined(HAVE_OPENSSL) if (SUCCEED != zbx_coredump_disable()) { // 处理错误,退出程序 } #endif zbx_register_stats_data_func(zbx_preproc_stats_ext_get, NULL); // ... 其他注册统计信息 zbx_diag_init(diag_add_section_info);
- 启动子进程:
- 根据配置启动不同的子进程,如配置同步器、传送程序、数据发送器、轮询器等。
- 为每个子进程启动一个线程。
for (i = 0; i < threads_num; i++) { // 获取进程信息 if (FAIL == get_process_info_by_thread(i + 1, &thread_args.info.process_type, &thread_args.info.process_num)) { // 处理错误,退出程序 } // 设置线程信息 thread_args.info.server_num = i + 1; thread_args.args = NULL; // 启动不同类型的子进程 switch (thread_args.info.process_type) { case ZBX_PROCESS_TYPE_CONFSYNCER: // ... 启动配置同步器线程 break; case ZBX_PROCESS_TYPE_TRAPPER: // ... 启动传送程序线程 break; // ... 其他子进程类型 } }
- 主循环:
- 在主循环中,等待 IPC 消息,根据消息调用运行时控制服务处理函数。
- 检查子进程状态,如果子进程退出,则设置服务端退出标志。
while (ZBX_IS_RUNNING()) { zbx_ipc_client_t *client; zbx_ipc_message_t *message; (void)zbx_ipc_service_recv(&rtc.service, &rtc_timeout, &client, &message); if (NULL != message) { zbx_rtc_dispatch(&rtc, client, message, rtc_process_request_func); zbx_ipc_message_free(message); } if (NULL != client) zbx_ipc_client_release(client); if (0 < (ret = waitpid((pid_t)-1, &i, WNOHANG))) { zbx_set_exiting_with_fail(); break; } if (-1 == ret && EINTR != errno) { zabbix_log(LOG_LEVEL_ERR, "failed to wait on child processes: %s", zbx_strerror(errno)); zbx_set_exiting_with_fail(); break; } }
- 程序退出:
- 在主循环结束后,记录退出信号,并在合适的时机进行清理和退出。
out: zbx_log_exit_signal(); if (SUCCEED == ZBX_EXIT_STATUS()) zbx_rtc_shutdown_subs(&rtc); zbx_on_exit(ZBX_EXIT_STATUS()); return SUCCEED;
总体来说,这个主函数完成了 Zabbix Proxy 的初始化、配置加载、模块加载、子进程启动和主循环等一系列操作,保证了代理的正常运行。
zabbix_web
主要就是利用Php编写的网站界面和逻辑代码。位于源码的ui
目录下。