Gmond模块分析

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

目录及文件分析:

目录:gmond模块位于ganglia源码的gmond目录下。

依赖文件:Gmond模块依赖于gmond.ccmdline.c.incmdline.ccmdline.hdtd.hg25_config.ccore_metrics.cg25_config.hgmond_internal.h文件(如果支持sflow模块,还需依赖sflow.hsflow.csflow_gmetric.h文件)

文件及目录作用:

cmdline.c(cmdline.c.in)cmdline.hcmdline.sh:该四个文件都是处理与cmd输入参数解析相关的功能。

conf.pod:该文件时gmond生产gmond.conf配置文件的示例文件(在自动生成配置文件的过程中可能用到该文件定义的信息)。

core_metrics.c:实现对core模块的信息监控

dtd.h:估计是实现数据类型转换(编码转换)

g25_config.cg25_config.h:与gmond.conf配置文件解析相关。

gmond.aix.init:与gmond的启动相关的脚本(korn shell脚本)

gmond.cgmond主模块,gmond主要功能都在该文件中实现和完成。

gmond.conf.5gmond.conf.html:这两个文件可能和配置文件信息相关,html文件应该是配置文件的说明文件。.5文件具体功能不是特别清楚,但也应该和配置文件相关。

gmond.initgmond的启动脚本文件,当要配置成自启动时,可将该文件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/:该目录下实现了一些监控模块和扩展支持模块。监控模块由cpudiskmemory networkstatussystem等。扩展支持模块主要实现对扩展模块的支持,可以实现对由其他语言编写的监控模块的支持,可支持的扩展模块有perlpythonphp。在编译阶段,可以通过对./configure的参数添加决定是否支持pythonperlphp等扩展功能。

Perl_modules:存放用perl语言编写的模块(有example例子,可根据该例子编自己的模块)

Php_modules:存放用php脚本编写的模块(同上)

Python_modules:存放用python语言编写的模块(用户可以根据该目录下的例子自己编写)

Sflow.csflow_gmetric.hsflow.h:这三个文件可能与sflow的支持相关。

 

gmond扩展:

gmond本身提供了大量的检测指标,如对cpu数量等,内存使用情况等,但是有时候,可能这些监控指标并不能满足我们的需求(如监控GPU工作情况),这时候就需要我们队gmond监控功能进行扩展。由于gmond实现了对模块化扩展的支持,并且支持pythonperlphp脚本编写的模块,我们可以通过修改源码(编写模块)实现功能扩展。

用开源源码扩展基本功能(主要由python实现)

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++编写模块

c/c++模块编写方法

1:定义自己的mmodule变量(该变量名称为自己编写的模块的名称,变量名必须和conf文件中module模块的name相同,如果不相同,该模块将不能被加载应用),该变量包含初始信息(versionname等)、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编写模块

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/ 中的例子

 


转载于:https://my.oschina.net/u/1459307/blog/209960

你可能感兴趣的:(Gmond模块分析)