你知道Zabbix吗?源码分析Zabbix启动过程

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 你知道Zabbix吗?源码分析Zabbix启动过程

zabbix的简介

Zabbix是一款开源的网络监控、管理系统和监控解决方案。它提供了强大的监控、报警和可视化功能,用于跟踪和分析网络设备、服务器、应用程序和其他 IT 基础设施的性能和可用性。以下是关于Zabbix的一些主要特征和功能:

  1. 监控多样性: Zabbix支持对各种网络设备、服务器、虚拟机、应用程序等进行监控。它能够收集和分析各种性能指标和日志数据。
  2. 灵活的报警机制: Zabbix可以配置灵活的报警规则,以便在检测到问题或异常时发送通知。报警可以通过电子邮件、短信、即时消息等方式进行。
  3. 可视化和报表: Zabbix提供了直观的图形化界面,用户可以创建自定义的监控仪表板、图形和报表,以更好地理解和分析性能趋势。
  4. 自动发现: Zabbix支持自动发现新设备和服务,简化了对新设备的集成和监控。
  5. 远程命令执行: Zabbix允许用户通过其界面执行远程命令,以便在检测到问题时采取快速响应。
  6. 分布式监控: Zabbix支持分布式监控,允许用户跨多个地理位置和网络进行集中式管理。
  7. 开源和可扩展: 作为开源软件,Zabbix提供了灵活的架构,允许用户根据需要进行自定义和扩展。
  8. 活跃的社区支持: Zabbix拥有一个庞大的活跃社区,用户可以在社区中获取支持、分享经验和参与开发。

Zabbix适用于中小型到大型企业的各种监控需求,它的功能和可扩展性使其成为IT基础设施监控的强大工具。

zabbix可以对哪些内容进行监控

  1. 服务器性能监控: 监控服务器的 CPU 使用率、内存利用率、磁盘空间、网络流量等性能指标。
  2. 网络设备监控: 监控网络设备如路由器、交换机的接口状态、带宽利用率、错误率等。
  3. 操作系统监控: 监控各种操作系统(Windows、Linux、Unix等)的性能和系统日志,包括进程状态、服务状态、日志文件等。
  4. 数据库监控: 监控数据库服务器的性能,包括查询性能、连接数、缓冲区利用率等。
  5. 应用程序监控: 监控各种应用程序的性能和可用性,包括Web服务器、应用服务器、数据库应用等。
  6. 虚拟化平台监控: 监控虚拟机和虚拟化平台的性能,包括虚拟机的CPU、内存、磁盘和网络使用情况。
  7. Web 监控: 监控Web应用程序的性能,包括页面加载时间、HTTP状态码、响应时间等。
  8. 日志文件监控: 监控各种日志文件,通过正则表达式或关键字匹配来检测错误或异常。
  9. SNMP 设备监控: 通过 Simple Network Management Protocol(SNMP)监控支持 SNMP 协议的设备,包括路由器、交换机等。
  10. 自定义监控: Zabbix支持自定义监控项,用户可以通过脚本或其他方式添加对特定应用或设备的监控。

总体而言,Zabbix提供了广泛的监控能力,用户可以根据其特定需求和环境进行灵活的配置和扩展。这种综合性的监控功能使得Zabbix成为企业级监控解决方案。

zabbix的实现

Zabbix 的技术栈包括多个组件,主要涉及以下方面:

  1. Zabbix Server: Zabbix 服务器是核心组件,负责接收来自被监控主机的数据、处理触发器、存储历史数据等。它使用 C 语言编写。
  2. Zabbix Agent: Zabbix 代理是安装在被监控主机上的轻量级程序,用于采集主机性能数据并将其发送给 Zabbix 服务器。代理支持多种操作系统。
  3. Zabbix Web 前端: Zabbix Web 前端是通过 Web 浏览器访问的用户界面,用户可以通过它配置监控项、查看监控数据、设置报警等。前端使用 PHP 编写,基于 MVC(模型-视图-控制器) 架构。
  4. Zabbix 数据库: Zabbix 数据库存储配置信息、监控数据、事件等。支持多种数据库管理系统,如 MySQL、PostgreSQL、Oracle 和 SQLite。
  5. Zabbix Proxy: Zabbix 代理是一个中间组件,它可以在被监控主机所在的网络中收集数据,并将其传递给 Zabbix 服务器。代理可以减轻 Zabbix 服务器的负载,尤其在大规模监控环境中。
  6. Zabbix Sender 和 Zabbix Get: Zabbix Sender 是一个用于发送主动数据到 Zabbix 服务器的工具,而 Zabbix Get 用于从命令行获取主动数据。
  7. Zabbix API: Zabbix 提供了 API,允许用户通过编程方式与 Zabbix 交互,执行配置更改、获取监控数据等操作。
  8. Zabbix Java Gateway: 用于支持 Java 应用程序的监控,通过 JMX(Java Management Extensions)协议获取 Java 应用的性能数据。
  9. Zabbix Sender 和 Zabbix Get: Zabbix Sender 用于主动向 Zabbix Server 发送数据,而 Zabbix Get 用于获取主动监控数据。
  10. 其他工具: Zabbix 还有一些辅助工具,用于数据库升级、配置检查、日志分析等。

总体而言,Zabbix 的技术栈包括了服务器端、代理、数据库、Web 前端、API 等组件,提供了一个完整的监控解决方案。

源码分析之zabbix启动过程

zabbix服务端位于源码的src\zabbix_server目录下,在src\zabbix_server\server.c中,提供了main函数,作用如下:

  1. 初始化变量和结构体:
  • 初始化 config_icmpping 结构体,其中包括获取源 IP 地址、获取 fping 路径等函数的指针。
  • 初始化 ZBX_TASK_EX 结构体 t,表示 Zabbix Server 的任务,初始设置为 ZBX_TASK_START
  1. 命令行参数解析:
  • 设置一些全局变量和选项,包括 zbx_config_tlszbx_config_dbhigh
  • 如果定义了 PS_OVERWRITE_ARGVPS_PSTAT_ARGV,通过 setproctitle_save_env 处理命令行参数。
  • 获取程序名字,保存到 progname
  1. 命令行参数处理:
  • 使用 zbx_getopt_long 解析命令行参数,处理配置文件路径、运行时控制等选项。
  • 如果指定了 -c--config,将配置文件路径保存到 config_file
  • 如果指定了 -R--runtime-control,将运行时控制的参数保存到 t.opts,并将任务类型设置为 ZBX_TASK_RUNTIME_CONTROL
  • 如果指定了 -h,打印帮助信息并退出。
  • 如果指定了 -V,打印版本信息和可能的 TLS 版本信息,并退出。
  • 如果指定了 -f,设置任务标志 ZBX_TASK_FLAG_FOREGROUND
  1. 选项重复检查:
  • 检查是否有重复指定 -c-R 选项,如果有则输出错误信息并退出。
  1. 无效参数检查:
  • 检查是否有无效的命令行参数,如果有则输出错误信息并退出。
  1. 设置默认配置文件路径:
  • 如果未指定配置文件路径,则将其设置为默认配置文件路径。
  1. 初始化 Zabbix 模块和库:
  • 初始化一些模块和库,包括指标、配置、数据库升级、ICMP Ping、IPC 服务、统计信息、系统信息等。
  • 调用 zbx_load_config 函数加载配置。
  1. 运行时控制处理:
  • 如果任务类型为 ZBX_TASK_RUNTIME_CONTROL,则初始化 IPC 服务并调用 rtc_process 处理运行时控制任务。
  1. 启动 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 结构体的指针,该结构体包含有关任务的信息。

函数主要实现了以下功能:

  1. 验证启动配置:检查是否存在必要的配置参数以及它们的合法性,例如 StartPollersUnreachable 参数的合法性,以及 JavaGateway 参数的存在性。
  2. 验证缓存大小配置:检查与缓存大小相关的配置参数,如 ValueCacheSizeTrendFunctionCacheSize,确保它们的合法性。
  3. 验证 IP 地址配置:检查 SourceIPStatsAllowedIP 配置参数的合法性。
  4. 验证导出类型配置:检查 ExportType 配置参数的合法性。
  5. 验证节点地址配置:检查 NodeAddress 配置参数的合法性。
  6. 检查相关功能的可用性:根据编译时的特性检查一些相关功能的可用性,如 IPv6 支持、cURL 库、VMware 收集器、TLS 支持、IPMI 支持等。
  7. 验证日志参数:调用 zbx_validate_log_parameters 函数,验证日志参数的合法性。
  8. 验证 TLS 配置:根据 TLS 配置参数检查 TLS 相关的功能和文件路径的合法性。
  9. 验证数据库配置:调用 zbx_db_validate_config_features 函数,验证数据库配置的相关特性。
  10. 其他验证:验证与 Report Writer 相关的配置参数,确保在启用 Report Writer 时必须设置 WebServiceURL
  11. 错误处理和退出:如果发现配置错误,通过记录日志信息并调用 exit(EXIT_FAILURE) 终止程序。

总体而言,这个函数对 Zabbix 的配置文件进行了广泛的检查,确保配置的一致性和正确性。如果发现配置错误,函数会记录错误日志并终止程序的执行。

zbx_daemon_start

位于src\libs\zbxnix\daemon.c下,这是 Zabbix Server 主进程启动的函数 zbx_daemon_start。以下是函数的主要功能:

  1. 设置回调函数:
  • 设置获取 PID 文件路径名的回调函数为 get_pid_file_cb
  1. 切换用户和用户组:
  • 如果不允许以 root 用户身份运行,检查当前用户是否为 root。
  • 如果指定了用户,则获取该用户的信息,并使用 setgidinitgroupssetuid 等函数切换用户和用户组。
  • 如果用户为 root,且不允许以 root 运行,则输出错误信息并退出。
  1. 设置文件权限掩码:
  • 调用 umask 设置文件权限掩码为 0002。
  1. 后台运行:
  • 如果不是设置为前台运行,创建子进程,父进程退出。
  • 子进程调用 setsid 创建新的会话,并忽略 SIGHUP 信号。
  • 再次创建子进程,父进程退出。
  • 修改当前工作目录为根目录。
  • 如果配置日志类型为文件,调用 zbx_redirect_stdio 将标准输入、标准输出、标准错误输出重定向到配置的日志文件。
  1. 创建 PID 文件:
  • 调用 create_pid_file 函数创建 PID 文件,如果失败则退出。
  1. 设置退出处理函数:
  • 使用 atexit 注册 zbx_daemon_stop 函数,以确保在程序退出时进行清理。
  1. 记录父进程 PID:
  • 记录当前进程的 PID 为父进程 PID。
  1. 设置信号处理函数:
  • 调用 zbx_set_common_signal_handlers 设置常见的信号处理函数。
  • 调用 set_daemon_signal_handlers 设置守护进程特定的信号处理函数。
  • 设置子进程退出信号处理函数。
  1. 调用主 Zabbix 入口点:
  • 调用 MAIN_ZABBIX_ENTRY 宏,该宏在具体的 Zabbix 源码中可能展开为 main 函数的具体实现。

总体来说,这个函数主要完成了用户切换、后台运行、PID 文件创建、信号处理函数的设置等工作,然后调用 Zabbix Server 的主入口点进行主程序的执行。

zbx_daemon_stop

这是 zbx_daemon_stop 函数,该函数是通过 atexit 注册的,在程序终止时调用。主要功能是删除进程的 PID 文件。以下是函数的主要内容:

  1. 检查父进程ID:
  • 如果当前进程的 PID 不等于之前记录的父进程的 PID,则直接返回,不执行后续操作。
  1. 删除 PID 文件:
  • 调用 drop_pid_file 函数,该函数通过之前注册的 get_pid_file_pathname_cb 回调函数获取 PID 文件路径,然后尝试删除该文件。

此函数的作用是确保在程序终止时删除 PID 文件,清理进程退出时遗留的资源。

MAIN_ZABBIX_ENTRY

MAIN_ZABBIX_ENTRY 函数是 Zabbix Agent 启动的主要入口点,以下是函数中的主要步骤:

  1. 处理预定义宏和全局变量初始化:
  • 检查并初始化 Windows 下的异常处理机制(可选)。
  • 初始化变量,包括一个用于存储线程句柄的数组。
  1. 输出启动信息:
  • 如果是以前台模式启动,输出启动信息。
  1. 创建锁和打开日志:
  • 在非 Windows 平台上,创建并初始化锁,防止并发问题。
  • 打开日志文件,如果失败则输出错误信息并退出。
  1. 输出启用的功能信息:
  • 输出当前启用的功能,如 IPv6 支持和 TLS 支持。
  1. 初始化模块和加载用户参数:
  • 如果不是 Windows,禁用核心转储。
  • 在非 Windows 平台上,加载模块。
  • 加载用户定义的参数。
  1. 初始化监听套接字和模块:
  • 如果定义了 CONFIG_FORKS[ZBX_PROCESS_TYPE_LISTENER],则初始化 TCP 监听套接字。
  • 初始化 Modbus 模块。
  1. 初始化和启动数据收集器线程:
  • 初始化数据收集器。
  • 在 Windows 上,初始化性能计数器收集器。
  1. 释放配置内存:
  • 释放配置文件相关的内存。
  1. 初始化 TLS 父线程:
  • 如果启用了 TLS,初始化 TLS 父线程。
  1. 启动各个线程:
  • 计算线程总数。
  • 为每个线程创建参数结构和线程信息结构,然后根据线程类型启动相应的线程(收集器线程、监听线程、主动检查线程)。
  1. 在 Windows 上等待线程退出:
  • 在 Windows 下,使用 WaitForMultipleObjectsEx 等待线程退出。
  1. 在非 Windows 平台上等待任何子进程退出:
  • 在非 Windows 平台上,使用 wait 等待任何子进程退出。
  1. 退出处理:
  • 输出退出信号的日志信息。
  • 在 Windows 下,清理监听套接字并等待服务工作线程终止。
  • 调用 zbx_on_exit 处理程序。
  1. 返回执行结果:
  • 返回 SUCCEED 表示成功,FAIL 表示失败。

这个函数主要负责初始化 Zabbix Agent 的各个模块,启动监听套接字,初始化并启动各个线程,处理异常情况,并在退出时清理资源。

自此,整个zabbix启动过程变分析完毕。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
6月前
|
缓存 监控 安全
zabbix服务器监控之了解agent的启动过程
zabbix服务器监控之了解agent的启动过程
183 0
|
6月前
|
存储 SQL 监控
修改Zabbix源码实现监控数据双写,满足业务需求!
虽然对接Elasticsearch后有诸多好处,但是它不往数据库写历史数据了,同时还不再计算趋势数据了。有这么一个场景...
修改Zabbix源码实现监控数据双写,满足业务需求!
|
6月前
|
数据采集 监控 数据库
OceanBase社区版可以通过Zabbix监控
OceanBase社区版可以通过Zabbix监控
266 4
|
11月前
|
监控 关系型数据库 机器人
小白带你学习linux的监控平台zabbix
小白带你学习linux的监控平台zabbix
263 0
|
3月前
|
监控 安全 Linux
在Linux中,zabbix如何监控脑裂?
在Linux中,zabbix如何监控脑裂?
|
2天前
|
SQL 监控 数据库
OceanBase社区版可以通过Zabbix监控
OceanBase社区版可以通过Zabbix监控
16 7
|
25天前
|
SQL 监控 数据库
OceanBase社区版可以通过Zabbix监控
【10月更文挑战第5天】随着OceanBase社区版的广泛应用,企业纷纷采用这一高性能、高可用的分布式数据库系统。为了确保系统的稳定运行,使用成熟的Zabbix监控工具进行全面监控至关重要。本文通过具体示例介绍了如何配置Zabbix监控OceanBase,包括安装配置、创建监控模板和监控项、编写脚本、设置触发器及图形展示等步骤,帮助读者快速上手,及时发现并解决问题,确保业务始终处于最佳状态。
33 2
|
2月前
|
监控 关系型数据库 MySQL
zabbix agent集成percona监控MySQL的插件实战案例
这篇文章是关于如何使用Percona监控插件集成Zabbix agent来监控MySQL的实战案例。
46 2
zabbix agent集成percona监控MySQL的插件实战案例
|
3月前
|
SQL 监控 分布式数据库
【解锁数据库监控的神秘力量!】OceanBase社区版与Zabbix的完美邂逅 —— 揭秘分布式数据库监控的终极奥秘!
【8月更文挑战第7天】随着OceanBase社区版的普及,企业广泛采用这一高性能、高可用的分布式数据库。为保障系统稳定,使用成熟的Zabbix监控工具对其进行全方位监控至关重要。本文通过实例介绍如何在Zabbix中配置监控OceanBase的方法,包括创建监控模板、添加监控项(如TPS)、设置触发器及图形展示,并提供示例脚本帮助快速上手。通过这些步骤,可以有效监控OceanBase状态,确保业务连续性。
100 0
|
5月前
|
监控 数据库 Docker
Zabbix监控神通数据库教程
**摘要:** 本文介绍了如何使用Docker安装和配置神舟通用数据库,并利用Zabbix进行监控。首先,通过Docker安装数据库镜像,启动容器并映射端口。接着,使用默认凭证连接数据库并验证安装。然后,将数据库的Python模块和库文件复制到主机,并安装Python3.5及相应模块,创建外部检查脚本以实现Zabbix的监控功能。示例展示了查询数据库版本的监控指标配置。最后,提到了监控结果的界面展示,并邀请读者探索更多Zabbix监控技巧。
79 0
Zabbix监控神通数据库教程