Zabbix LLD 文件系统监控源码分析
前2周跟值班的过程中,发现行情服务器上都要去检查网络磁盘映射是否正常,本着固定不变的东西最好让机器来做的原则,就想着能否将这步检查通过自动化的方式来实现。
一开始的思路比较简单粗暴,想着在一台集中服务器上通过一个脚本连接到各个行情服务器上去执行命令检查网络磁盘映射是否正常。 但感觉这样实现是很不优雅的,还涉及到服务器间免密打通的问题。转变思路一想,这个事情不正是监控系统的模式吗,在监控系统中来实现这个功能更合情合理。
咨询了一下赵老师, 公司监控有两套商用,一套开源的zabbix, 商用的系统中有一套已经可以实现该类型监控, zabbix中应该也有类似内置监控项。商用的封闭响应慢,所以想看看zabbix是怎么实现的。回来一番搜索果然发现,zabbix有一种Low-level-discovery 的自动发现机制,通过vfs.fs.discovery这个key可以用来监控文件系统。
跟赵老师沟通了一下,赵老师说印象中zabbix这个内置监控是无法监控网络磁盘映射的,搜了下官方文档中并未提及可以监控的文件系统类型。个人比较好奇就想在本地搭建一套zabbix服务验证一下。结果由于我的电脑是mac os系统, zabbix在这个系统支持不好,没有完整的安装手册, 试了下始终不能正常启动起来,遂作罢。想想只能从源码出发分析了,就将zabbix源码下载下来分析了一下。
Step1. main函数会去加载sysinfo,读取变量配置信息
Step2. 读取到vfs.fs.discovery这个key对应的FUNCTION
Step3. 找到对应的FUNCTION处理逻辑,因为不同系统获取文件系统逻辑是不一样的,要找windows下对应的处理逻辑
Step4. 可以看到通过get_mount_paths获取到mount path后,再通过path循环填充启动类型等其它文件系统数据
Step5. 终于看到最终调用的系统底层函数GetLogicalDriveStrings。
搜了一下GetLogicalDriveStrings确实看不到不同的命名空间中创建的网络驱动器。具体原因可参考文章:https://docs.microsoft.com/zh-cn/windows/win32/fileio/defining-an-ms-dos-device-name?redirectedfrom=MSDN
所以zabbix使用这种方式是监控不到Windows服务器上网络磁盘映射的。
总结:
追踪源代码是比较直接定位问题的方式
多跟同事沟通吸取经验,有时可以少走很多弯路