年初二开始翻译这篇文章的,过年嘛事情特别多,一下拜年一下来客人的,表弟啥的还要过来抢电脑玩~真心纠结。翻译这篇文章我发现我的英文水平真都很烂啊!!。。仅供参考,不负责任
在最新的Ganglia3.1.x版本中,我们可以创造出C/Python的度量收集模块,这些模块能被直接插入到gmond中以用来监视用户自定义的度量。
在早期的版本中(2.5.x,3.0.x),添加用户自定义的度量只有通过命令行调用gmetric这么一种方法,它可以简单地通过一个cronjob或者其他进程将度量插入到gmond中。虽然这种方法对大多数人来说是可行的,但是他使得用户自定义的度量难以管理。
本文将介绍自己编写一个python度量监视模块的一些细节问题
以下的组件是建立/使用Python支持所必须的
如果你安装Python度量模块在基于RPM软件包管理的系统上,安装“ganglia-gmond-modules-python”这个软件包即可。这包含了Python模块开发的所有东西。
执行 apt-get install ganglia-monitor
然后看下面的注意事项
如果你是从源码编译的,确保添加了 –with-python这个选项。如果Python解释器被检测到,这个选项是会被自动添加
为了确保Ganglia的安装有了Python支持的设置,检查一下以下设置:
如果你通过二进制文件安装python模块支持,上面的这些应该会被自动生成。假如有些文件缺失的话,请把bug提交给我们
Ubuntu 10.10 没有Python支持的设置,你需要:
1
2 3 4 5 6 7 8 |
modules
{
module { name = "python_module" path = "/usr/lib(64)/ganglia/modpython.so" params = "/usr/lib(64)/ganglia/python_modules" } } include ( '/etc/ganglia/conf.d/*.pyconf' ) |
编写一个Python模块是非常简单的。你只需要根据模板编写,完成之后将以.py结尾的模块放到/usr/lib(64)/ganglia/python_modules下面。同时将对应的.pyconf格式的配置文件放置在/etc/ganglia/conf.d/下。
如果你的Python模块需要访问服务器上的一些文件,记住他是以运行gmond进程的用户执行的。换句话说,如果gmond以nobody运行,那么你的模块就是nobody运行。所以确保运行gmond的用户有权限访问这些文件。Ganglia有示例模块在/usr/lib(64)/ganglia/python_modules/example.py中。
让我们来看一下一个监测主机温度的实在的Python模块实例,它通过读取/proc文件系统,让我们称他为temp.py
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
acpi_file
=
"/proc/acpi/thermal_zone/THRM/temperature"
def temp_handler (name ): try: f = open (acpi_file , 'r' ) except IOError: return 0 for l in f: line = l. split ( ) return int (line [ 1 ] ) def metric_init (params ): global descriptors , acpi_file if 'acpi_file' in params: acpi_file = params [ 'acpi_file' ] d1 = { 'name': 'temp' , 'call_back': temp_handler , 'time_max': 90 , 'value_type': 'uint' , 'units': 'C' , 'slope': 'both' , 'format': '%u' , 'description': 'Temperature of host' , 'groups': 'health' } descriptors = [d1 ] return descriptors def metric_cleanup ( ): '''Clean up the metric module.''' pass #This code is for debugging and unit testing if __name__ == '__main__': metric_init ( { } ) for d in descriptors: v = d [ 'call_back' ] (d [ 'name' ] ) print 'value for %s is %u' % (d [ 'name' ] , v ) |
有三个函数必须存在于每个模块中,他们是
前两个函数必须明确的存在(命名也需要一样),metric_hangder()这个函数可以命名成任何。下面是三个函数的详细解释:
在你的模块中,这个函数必须存在,而且命名一致。他会被在初始化时调用一次,也就是在gmond启动的时候。他可以被用来做收集度量的各种初始化。metric_init() t同时也有一个单字典类型的参数,他包含了在gmond.conf中为这个模块设计的配置指令。除了完成其他的初始化工作之外,metric_init()必须创建,填充,返回这个度量描述字典或者字典列表。每个描述字典都必须包含以下几个元素:
除了回调函数以外,这些元数基本上和那些需要提供给gmetric命令行工具的数据是同一类型的。可以查看gmetric帮助文档获取更多信息。度量描述符也可以包含额外的属性和值,他们会作为额外的数据附加到度量元数据中。附加数据会被Ganglia本身忽略,不过他可以作为显示或者度量处理数据被用在前台网页中。(使用SPOOF_HOST和SPOOF_NAME这两个额外属性的例子将在以后的版本中介绍)
在你的模块中,这个函数必须存在而且命名为’metric_cleanup’。他会在gmond关闭时被调用一次。任意模块的清理代码都可以放在这里,函数不应该有返回值。
这个’metric_handler‘函数可以被定义为任何你喜欢的名字,因为他和你定义在度量描述块中的’call_balck’函数想匹配。他有一个参数’name’,就是在你的度量描述块中的name元素。
和这个模块想匹配的配置文件,temp.pyconf,放置于 /etc/ganglia/conf.d/temp.pyconf。看起来像这样:
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
modules
{
module { name = "temp" language = "python" # The following params are examples only # They are not actually used by the temp module param RandomMax { value = 600 } param ConstantValue { value = 112 } } } collection_group { collect_every = 10 time_threshold = 50 metric { name = "temp" title = "Temperature" value_threshold = 70 } } |
上面的配置文件包含各分支的两个主要的区域:modules and collection_group.
这个modules区域包含每个模块被加载的配置数据。他应该包含一个或者多个module子节点。每一个module子节点里面就是度量模块的name,里面的language以及其他的一些参数说明:
name
这个名字和你创建的模块名字想对应(.py结尾)
language
除非你用C/C++编写你的模块,否则你必须明确的声明模块所用的语言。声明‘python’作为你的语言,告诉gmond到python_modules这个目录里搜索你的模块文件。
param
每个param子节点有一个name和一个value,他们组成了name/value对作为参数被传递到上面描述的metric_init()函数中。这个参数是字典类型的,’name’是键,’value’是值。因此你可以自定义你的参数像下面这样:
1
2 3 4 5 6 7 8 9 |
RandomMax
=
500
def metric_init (params ): global RandomMax if 'RandomMax' in params: RandomMax = params [ 'RandomMax' ] ... |
配置文件剩下的部分具有相同的格式,collection_group 或者 metric。查阅gmond.conf的帮助文档是很有收获的,不过我们将简单介绍例子中的 collection_group 指令。
collect_every or collect_once
collect_every 告诉 gmond 从定义在collection_group的度量中收集数据的频率(秒为单位)。在例子中,’temp’度量会间隔十秒被收集。你也可以设定collect_once=yes命令gmond收集静态度量,他们在会在gmond启动时被收集一次。这对那些在运行期间不会改变的东西是很有用的(比如运行的CPU个数)
time_threshold
将度量数据报告给Ganglia的最大频率(秒为单位)。在例子中,temp模块会至少每50秒报告一次。
这个指令会在被收集度量的值大于metirc定义的‘value_threshold’时被抛弃哦。
metric
这是你定义特殊度量设置的地方