zabbix的简介
Zabbix是一款开源的网络监控、管理系统和监控解决方案。它提供了强大的监控、报警和可视化功能,用于跟踪和分析网络设备、服务器、应用程序和其他 IT 基础设施的性能和可用性。以下是关于Zabbix的一些主要特征和功能:
- 监控多样性: Zabbix支持对各种网络设备、服务器、虚拟机、应用程序等进行监控。它能够收集和分析各种性能指标和日志数据。
- 灵活的报警机制: Zabbix可以配置灵活的报警规则,以便在检测到问题或异常时发送通知。报警可以通过电子邮件、短信、即时消息等方式进行。
- 可视化和报表: Zabbix提供了直观的图形化界面,用户可以创建自定义的监控仪表板、图形和报表,以更好地理解和分析性能趋势。
- 自动发现: Zabbix支持自动发现新设备和服务,简化了对新设备的集成和监控。
- 远程命令执行: Zabbix允许用户通过其界面执行远程命令,以便在检测到问题时采取快速响应。
- 分布式监控: Zabbix支持分布式监控,允许用户跨多个地理位置和网络进行集中式管理。
- 开源和可扩展: 作为开源软件,Zabbix提供了灵活的架构,允许用户根据需要进行自定义和扩展。
- 活跃的社区支持: Zabbix拥有一个庞大的活跃社区,用户可以在社区中获取支持、分享经验和参与开发。
Zabbix适用于中小型到大型企业的各种监控需求,它的功能和可扩展性使其成为IT基础设施监控的强大工具。
zabbix可以对哪些内容进行监控
- 服务器性能监控: 监控服务器的 CPU 使用率、内存利用率、磁盘空间、网络流量等性能指标。
- 网络设备监控: 监控网络设备如路由器、交换机的接口状态、带宽利用率、错误率等。
- 操作系统监控: 监控各种操作系统(Windows、Linux、Unix等)的性能和系统日志,包括进程状态、服务状态、日志文件等。
- 数据库监控: 监控数据库服务器的性能,包括查询性能、连接数、缓冲区利用率等。
- 应用程序监控: 监控各种应用程序的性能和可用性,包括Web服务器、应用服务器、数据库应用等。
- 虚拟化平台监控: 监控虚拟机和虚拟化平台的性能,包括虚拟机的CPU、内存、磁盘和网络使用情况。
- Web 监控: 监控Web应用程序的性能,包括页面加载时间、HTTP状态码、响应时间等。
- 日志文件监控: 监控各种日志文件,通过正则表达式或关键字匹配来检测错误或异常。
- SNMP 设备监控: 通过 Simple Network Management Protocol(SNMP)监控支持 SNMP 协议的设备,包括路由器、交换机等。
- 自定义监控: Zabbix支持自定义监控项,用户可以通过脚本或其他方式添加对特定应用或设备的监控。
总体而言,Zabbix提供了广泛的监控能力,用户可以根据其特定需求和环境进行灵活的配置和扩展。这种综合性的监控功能使得Zabbix成为企业级监控解决方案。
zabbix的实现
Zabbix 的技术栈包括多个组件,主要涉及以下方面:
- Zabbix Server: Zabbix 服务器是核心组件,负责接收来自被监控主机的数据、处理触发器、存储历史数据等。它使用 C 语言编写。
- Zabbix Agent: Zabbix 代理是安装在被监控主机上的轻量级程序,用于采集主机性能数据并将其发送给 Zabbix 服务器。代理支持多种操作系统。
- Zabbix Web 前端: Zabbix Web 前端是通过 Web 浏览器访问的用户界面,用户可以通过它配置监控项、查看监控数据、设置报警等。前端使用 PHP 编写,基于 MVC(模型-视图-控制器) 架构。
- Zabbix 数据库: Zabbix 数据库存储配置信息、监控数据、事件等。支持多种数据库管理系统,如 MySQL、PostgreSQL、Oracle 和 SQLite。
- Zabbix Proxy: Zabbix 代理是一个中间组件,它可以在被监控主机所在的网络中收集数据,并将其传递给 Zabbix 服务器。代理可以减轻 Zabbix 服务器的负载,尤其在大规模监控环境中。
- Zabbix Sender 和 Zabbix Get: Zabbix Sender 是一个用于发送主动数据到 Zabbix 服务器的工具,而 Zabbix Get 用于从命令行获取主动数据。
- Zabbix API: Zabbix 提供了 API,允许用户通过编程方式与 Zabbix 交互,执行配置更改、获取监控数据等操作。
- Zabbix Java Gateway: 用于支持 Java 应用程序的监控,通过 JMX(Java Management Extensions)协议获取 Java 应用的性能数据。
- Zabbix Sender 和 Zabbix Get: Zabbix Sender 用于主动向 Zabbix Server 发送数据,而 Zabbix Get 用于获取主动监控数据。
- 其他工具: Zabbix 还有一些辅助工具,用于数据库升级、配置检查、日志分析等。
总体而言,Zabbix 的技术栈包括了服务器端、代理、数据库、Web 前端、API 等组件,提供了一个完整的监控解决方案。
源码分析之zabbix启动过程
zabbix服务端位于源码的src\zabbix_server
目录下,在src\zabbix_server\server.c
中,提供了main
函数,作用如下:
- 初始化变量和结构体:
- 初始化
config_icmpping
结构体,其中包括获取源 IP 地址、获取 fping 路径等函数的指针。 - 初始化
ZBX_TASK_EX
结构体t
,表示 Zabbix Server 的任务,初始设置为ZBX_TASK_START
。
- 命令行参数解析:
- 设置一些全局变量和选项,包括
zbx_config_tls
和zbx_config_dbhigh
。 - 如果定义了
PS_OVERWRITE_ARGV
或PS_PSTAT_ARGV
,通过setproctitle_save_env
处理命令行参数。 - 获取程序名字,保存到
progname
。
- 命令行参数处理:
- 使用
zbx_getopt_long
解析命令行参数,处理配置文件路径、运行时控制等选项。 - 如果指定了
-c
或--config
,将配置文件路径保存到config_file
。 - 如果指定了
-R
或--runtime-control
,将运行时控制的参数保存到t.opts
,并将任务类型设置为ZBX_TASK_RUNTIME_CONTROL
。 - 如果指定了
-h
,打印帮助信息并退出。 - 如果指定了
-V
,打印版本信息和可能的 TLS 版本信息,并退出。 - 如果指定了
-f
,设置任务标志ZBX_TASK_FLAG_FOREGROUND
。
- 选项重复检查:
- 检查是否有重复指定
-c
或-R
选项,如果有则输出错误信息并退出。
- 无效参数检查:
- 检查是否有无效的命令行参数,如果有则输出错误信息并退出。
- 设置默认配置文件路径:
- 如果未指定配置文件路径,则将其设置为默认配置文件路径。
- 初始化 Zabbix 模块和库:
- 初始化一些模块和库,包括指标、配置、数据库升级、ICMP Ping、IPC 服务、统计信息、系统信息等。
- 调用
zbx_load_config
函数加载配置。
- 运行时控制处理:
- 如果任务类型为
ZBX_TASK_RUNTIME_CONTROL
,则初始化 IPC 服务并调用rtc_process
处理运行时控制任务。
- 启动 Zabbix Server:
- 调用
zbx_daemon_start
函数以守护进程方式启动 Zabbix Server,设置相关参数,包括允许 root 用户运行、指定用户、标志、PID 文件路径等。 - 如果启动失败,输出错误信息。
总体来说,这个 main
函数主要完成了命令行参数解析、配置加载、模块初始化以及 Zabbix Server 的启动等工作。
zbx_load_config
加载配置
zbx_validate_config
它用于验证 Zabbix 的配置文件中的各项参数是否符合要求。以下是函数中每一个参数的作用以及函数体主要实现的功能:
static void zbx_validate_config(ZBX_TASK_EX *task)
task
: 一个指向ZBX_TASK_EX
结构体的指针,该结构体包含有关任务的信息。
函数主要实现了以下功能:
- 验证启动配置:检查是否存在必要的配置参数以及它们的合法性,例如
StartPollersUnreachable
参数的合法性,以及JavaGateway
参数的存在性。 - 验证缓存大小配置:检查与缓存大小相关的配置参数,如
ValueCacheSize
和TrendFunctionCacheSize
,确保它们的合法性。 - 验证 IP 地址配置:检查
SourceIP
和StatsAllowedIP
配置参数的合法性。 - 验证导出类型配置:检查
ExportType
配置参数的合法性。 - 验证节点地址配置:检查
NodeAddress
配置参数的合法性。 - 检查相关功能的可用性:根据编译时的特性检查一些相关功能的可用性,如 IPv6 支持、cURL 库、VMware 收集器、TLS 支持、IPMI 支持等。
- 验证日志参数:调用
zbx_validate_log_parameters
函数,验证日志参数的合法性。 - 验证 TLS 配置:根据 TLS 配置参数检查 TLS 相关的功能和文件路径的合法性。
- 验证数据库配置:调用
zbx_db_validate_config_features
函数,验证数据库配置的相关特性。 - 其他验证:验证与 Report Writer 相关的配置参数,确保在启用 Report Writer 时必须设置
WebServiceURL
。 - 错误处理和退出:如果发现配置错误,通过记录日志信息并调用
exit(EXIT_FAILURE)
终止程序。
总体而言,这个函数对 Zabbix 的配置文件进行了广泛的检查,确保配置的一致性和正确性。如果发现配置错误,函数会记录错误日志并终止程序的执行。
zbx_daemon_start
位于src\libs\zbxnix\daemon.c
下,这是 Zabbix Server 主进程启动的函数 zbx_daemon_start
。以下是函数的主要功能:
- 设置回调函数:
- 设置获取 PID 文件路径名的回调函数为
get_pid_file_cb
。
- 切换用户和用户组:
- 如果不允许以 root 用户身份运行,检查当前用户是否为 root。
- 如果指定了用户,则获取该用户的信息,并使用
setgid
、initgroups
、setuid
等函数切换用户和用户组。 - 如果用户为 root,且不允许以 root 运行,则输出错误信息并退出。
- 设置文件权限掩码:
- 调用
umask
设置文件权限掩码为 0002。
- 后台运行:
- 如果不是设置为前台运行,创建子进程,父进程退出。
- 子进程调用
setsid
创建新的会话,并忽略 SIGHUP 信号。 - 再次创建子进程,父进程退出。
- 修改当前工作目录为根目录。
- 如果配置日志类型为文件,调用
zbx_redirect_stdio
将标准输入、标准输出、标准错误输出重定向到配置的日志文件。
- 创建 PID 文件:
- 调用
create_pid_file
函数创建 PID 文件,如果失败则退出。
- 设置退出处理函数:
- 使用
atexit
注册zbx_daemon_stop
函数,以确保在程序退出时进行清理。
- 记录父进程 PID:
- 记录当前进程的 PID 为父进程 PID。
- 设置信号处理函数:
- 调用
zbx_set_common_signal_handlers
设置常见的信号处理函数。 - 调用
set_daemon_signal_handlers
设置守护进程特定的信号处理函数。 - 设置子进程退出信号处理函数。
- 调用主 Zabbix 入口点:
- 调用
MAIN_ZABBIX_ENTRY
宏,该宏在具体的 Zabbix 源码中可能展开为main
函数的具体实现。
总体来说,这个函数主要完成了用户切换、后台运行、PID 文件创建、信号处理函数的设置等工作,然后调用 Zabbix Server 的主入口点进行主程序的执行。
zbx_daemon_stop
这是 zbx_daemon_stop
函数,该函数是通过 atexit
注册的,在程序终止时调用。主要功能是删除进程的 PID 文件。以下是函数的主要内容:
- 检查父进程ID:
- 如果当前进程的 PID 不等于之前记录的父进程的 PID,则直接返回,不执行后续操作。
- 删除 PID 文件:
- 调用
drop_pid_file
函数,该函数通过之前注册的get_pid_file_pathname_cb
回调函数获取 PID 文件路径,然后尝试删除该文件。
此函数的作用是确保在程序终止时删除 PID 文件,清理进程退出时遗留的资源。
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启动过程变分析完毕。