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

简介: 你知道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日志并进行多维度分析。
目录
相关文章
|
7月前
|
监控 关系型数据库 MySQL
Zabbix分布式监控实战(二)——CentOS 7.5安装Zabbix-agent 5.0监控Mysql数据库
Zabbix分布式监控实战(二)——CentOS 7.5安装Zabbix-agent 5.0监控Mysql数据库
|
12月前
|
运维 监控
JPOM - Server启动流程&脚本初始化源码解析
JPOM - Server启动流程&脚本初始化源码解析
152 0
|
12月前
|
监控 Java 应用服务中间件
【Zabbix】Zabbix JMX 接口配置
【Zabbix】Zabbix JMX 接口配置
zabbix 启动用户问题
zabbix 启动用户问题
|
监控 前端开发 数据可视化
【从零开始学zabbix】一丶Zabbix的介绍与部署Zabbix
大家好,docker篇完结之后苦思冥想了很久不知道做什么,看了一下感觉做监控方面文章并不多,于是过来撰写一下zabbix的文章,普罗米修斯的话要后面去了,zabbix也是很有意思的一个东西,如果你没有学过可以来跟着一起学一下,这个东西比较简单,可视化,学过的话可以当作复习来看一看,废话就不多说了,直接开始正题了。
321 0
【从零开始学zabbix】一丶Zabbix的介绍与部署Zabbix
|
监控 前端开发 关系型数据库
配置zabbix
zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。
223 0
配置zabbix
|
运维 监控 关系型数据库
Zabbix 配置 | 学习笔记
快速学习Zabbix 配置,进行运维监控系统的配置。
Zabbix 配置 | 学习笔记
|
存储 监控 网络协议
|
监控
Zabbix snmptrap 配置
服务器通过snmptrap主动上报告警,在zabbix配置snmptrap监控也是很简单的。 1.登录被监控的设备的bmc管理系统配置snmptrap地址指向我们的zabbix服务器或代理服务器。
2063 0