目录:gmond模块位于ganglia源码的gmond目录下。
依赖文件:Gmond模块依赖于gmond.c、cmdline.c.in、cmdline.c、cmdline.h、dtd.h、g25_config.c、core_metrics.c、g25_config.h、gmond_internal.h文件(如果支持sflow模块,还需依赖sflow.h、sflow.c、sflow_gmetric.h文件)
文件及目录作用:
cmdline.c(cmdline.c.in)、cmdline.h、cmdline.sh:该四个文件都是处理与cmd输入参数解析相关的功能。
conf.pod:该文件时gmond生产gmond.conf配置文件的示例文件(在自动生成配置文件的过程中可能用到该文件定义的信息)。
core_metrics.c:实现对core模块的信息监控
dtd.h:估计是实现数据类型转换(编码转换)
g25_config.c、g25_config.h:与gmond.conf配置文件解析相关。
gmond.aix.init:与gmond的启动相关的脚本(korn shell脚本)
gmond.c:gmond主模块,gmond主要功能都在该文件中实现和完成。
gmond.conf.5和gmond.conf.html:这两个文件可能和配置文件信息相关,html文件应该是配置文件的说明文件。.5文件具体功能不是特别清楚,但也应该和配置文件相关。
gmond.init:gmond的启动脚本文件,当要配置成自启动时,可将该文件copy到/etc/init.d/目录下,并命名为gmond,这样就可以用service服务直接启动gmond。
gmond.init.SuSE:应该是SuSE下的启动脚本(功能应该同gmond.init)
gmond.solaris.init:应该是solaris系统下的启动脚本(功能同gmond.init)
gmond_internal.h:定义有关ganglia-host的有段信息。
modules/:该目录下实现了一些监控模块和扩展支持模块。监控模块由cpu、disk、memory、 network、status、system等。扩展支持模块主要实现对扩展模块的支持,可以实现对由其他语言编写的监控模块的支持,可支持的扩展模块有perl、python、php。在编译阶段,可以通过对./configure的参数添加决定是否支持python、perl、php等扩展功能。
Perl_modules:存放用perl语言编写的模块(有example例子,可根据该例子编自己的模块)
Php_modules:存放用php脚本编写的模块(同上)
Python_modules:存放用python语言编写的模块(用户可以根据该目录下的例子自己编写)
Sflow.c、sflow_gmetric.h、sflow.h:这三个文件可能与sflow的支持相关。
gmond本身提供了大量的检测指标,如对cpu数量等,内存使用情况等,但是有时候,可能这些监控指标并不能满足我们的需求(如监控GPU工作情况),这时候就需要我们队gmond监控功能进行扩展。由于gmond实现了对模块化扩展的支持,并且支持python、perl、php脚本编写的模块,我们可以通过修改源码(编写模块)实现功能扩展。
1:从https://github.com/ganglia/gmond_python_modules下载python扩展模块包,解压
2:查看是否有要自己要扩展的模块,如果有,进入该模块并根据README提示进行扩展
Eg:扩展GPU监控
Cd gmond_python_modules
Cd gpu/nvidia
根究README配置
1)将python_modules目录下的*.py文件copy到/ganglia安装目录/ganglia/python_modules/ 目录下面
2)将conf.d/目录下的*.pyconf文件copy到/ganglia安装目录/etc/ganglia/conf.d/目录下
3)将graph.d/* 文件copy到/gweb安装目录/graph.d/ 目录下(该过程在监控住节点实现)
当重新进行web访问的时候,即可实现gpu的信息获取及监控
c/c++模块编写方法
1:定义自己的mmodule变量(该变量名称为自己编写的模块的名称,变量名必须和conf文件中module模块的name相同,如果不相同,该模块将不能被加载应用),该变量包含初始信息(version,name等)、init函数句柄、cleanup函数句柄、handler函数句柄、Info字典信息。
2:定义自己的xxx_metric_init函数:该函数用来初始化一些基本的metric信息
3:定义xxx_metric_cleanup函数:该函数释放资源用
4:定义xxx_metric_hander函数:该函数主要实现对该模块中各个指标的收集
5:定义xxx_metric_ino字典:该字典用来定义指标的各种信息
6:编译模块,并将.so文件放到/ganglia安装路径/ganglia/lib64/ganglia/ 目录下
7:编写配置文件,并将配置文件放到/ganglia安装路径/etc/conf.d/目录下
注:具体可参考ganglia/gmond/modules/example/mod_example.c
c/c++模块加载方法分析
在用C/C++编写模块的时候首先需要定义mmodule全局变量,该变量名称一定要与config中该模块的名称相同,gmond是通过该变量的名称来查找模块并实现对conf中定义模块的支持的,如果该变量名称与conf中模块名不同,将无法支持该模块。
特别需要注意的是,在编译自己编写的模块时,尽量不要进行优化(去除字符表)
模块加载过程如下:
Gmond根据conf中模块的path路径找到so文件所在目录->调用load函数(gmond用的是apr中的一个包装函数,功能与load相似)加载so->根据conf中模块名称,在加载的so中找到该变量位置(用变量名查找)->将模块添加到模块链表中->初始化模块。
Python语言支持模块
Gmond本身是用c/c++语言编写的,为了支持python语言编写的模块,gmond中实现了一个特殊的模块——该模块部进行数据等指标收集,而仅仅是实现对python的解析支持(该模块由c/c++编写),这样当gmond加载该模块后,就可以支持由python编写的模块了。(python支持模块位于:ganglia/gmond/modules/python/ 目录中)
使用python编写模块的优点
1:开发人员无需再管理mmodule结构体,初始化宏,apr库接口等信息
2:编写的模块可以脱离gmond单独运行,无需ganglia环境的支持。在单独运行调试完成后加入到gmond中即可应用。编写调试非常方便。
例如用户可以进入到 ganglia/gmond/python_modules/process/ 目录中,运行procsstat.py
命令:python procsstat.py
运行后,该信息即可打印出来,而且可将该文件copy到任意机器(支持python,可以没安装ganglia),切可正确运行。
Python模块编写
每种python模块需要定义一个全局链表并至少实现三个函数:metric_init(parms),metric_cleanup(),metric_handler(name).
全局链表 descriptors = []:该全局变量存储所有收集到的指标信息
metric_init(parms):该函数必须要有参数传递,且在初始化的时候被调用,返回要收集的指标的字典(初始化该字典并返回,该字典以后将被用到)
metric_cleanup():释放资源函数
metric_hander(name):该函数是具体的收集函数,函数名称可以改变(函数名必须与init初始化的收集指标字典中指定的调用函数名相同)
注:可参考 ganglia/gmond/python_modules/example/ 中的例子