年初二开始翻译这篇文章的,过年嘛事情特别多,一下拜年一下来客人的,表弟啥的还要过来抢电脑玩~真心纠结。翻译这篇文章我发现个人英文水平真都很烂啊!!。。仅供参考,不负责任 html
在最新的Ganglia3.1.x版本中,咱们能够创造出C/Python的度量收集模块,这些模块能被直接插入到gmond中以用来监视用户自定义的度量。
在早期的版本中(2.5.x,3.0.x),添加用户自定义的度量只有经过命令行调用gmetric这么一种方法,它能够简单地经过一个cronjob或者其余进程将度量插入到gmond中。虽然这种方法对大多数人来讲是可行的,可是他使得用户自定义的度量难以管理。
本文将介绍本身编写一个python度量监视模块的一些细节问题 python
如下的组件是创建/使用Python支持所必须的 服务器
若是你安装Python度量模块在基于RPM软件包管理的系统上,安装“ganglia-gmond-modules-python”这个软件包便可。这包含了Python模块开发的全部东西。
app
执行 apt-get install ganglia-monitor
而后看下面的注意事项
dom
若是你是从源码编译的,确保添加了 –with-python这个选项。若是Python解释器被检测到,这个选项是会被自动添加
函数
为了确保Ganglia的安装有了Python支持的设置,检查一下如下设置:
工具
若是你经过二进制文件安装python模块支持,上面的这些应该会被自动生成。假若有些文件缺失的话,请把bug提交给咱们 post
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中。
ui
让咱们来看一下一个监测主机温度的实在的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
这是你定义特殊度量设置的地方