年初二开始翻译这篇文章的,过年嘛事情特别多,一下拜年一下来客人的,表弟啥的还要过来抢电脑玩~真心纠结。翻译这篇文章我发现我的英文水平真都很烂啊!!。。仅供参考,不负责任
Gmond扩展Python度量模块
在最新的Ganglia3.1.x版本中,我们可以创造出C/Python的度量收集模块,这些模块能被直接插入到gmond中以用来监视用户自定义的度量。
在早期的版本中(2.5.x,3.0.x),添加用户自定义的度量只有通过命令行调用gmetric这么一种方法,它可以简单地通过一个cronjob或者其他进程将度量插入到gmond中。虽然这种方法对大多数人来说是可行的,但是他使得用户自定义的度量难以管理。
本文将介绍自己编写一个python度量监视模块的一些细节问题
以下的组件是建立/使用Python支持所必须的
- Ganglia 3.1.x
- Python 2.3.4+(这是在RHEL4上测试的最老的支持版本,2.3以后的版本应该都能正常工作)
- Python开发头文件(通常在python-devel这个软件包中)
安装
RPM安装
如果你安装Python度量模块在基于RPM软件包管理的系统上,安装“ganglia-gmond-modules-python”这个软件包即可。这包含了Python模块开发的所有东西。
APT安装
执行 apt-get install ganglia-monitor
然后看下面的注意事项
源码安装
如果你是从源码编译的,确保添加了 –with-python这个选项。如果Python解释器被检测到,这个选项是会被自动添加
检查
为了确保Ganglia的安装有了Python支持的设置,检查一下以下设置:
- gmond.conf 有一行 include (“/etc/ganglia/conf.d/*.conf”),这是你应该放置.pyconf格式的python模块配置文件所在的目录。
- modpython.conf 这个文件应该存在于/etc/ganglia/conf.d 他包含了pyconf文件的所在位置
- modpython.so应该在/usr/lib{64}/ganglia中
- /usr/lib{64}/ganglia/python_modules这个目录应该存在,这是你放置以.py结尾的python模块文件所在的目录
如果你通过二进制文件安装python模块支持,上面的这些应该会被自动生成。假如有些文件缺失的话,请把bug提交给我们
Ubuntu 10.10 注意事项
Ubuntu 10.10 没有Python支持的设置,你需要:
- 建立/etc/ganglia/conf.d/modpython.conf,让他看起来像这样,https://sourceforge.net/apps/trac/ganglia/browser/trunk/monitor-core/gmond/modules/conf.d/modpython.conf.in
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' ) |
- 建立目录 /usr/lib(64)/ganglia/python_modules
- 确保 /usr/lib(64)/ganglia/modpython.so 已经存在(如果你通过apt安装的话,Ubuntu 10.10 将会默认有这个文件)
编写自定义Python模块
编写一个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 ) |
模块要求
有三个函数必须存在于每个模块中,他们是
- def metric_init(params):
- def metric_cleanup():
- def metric_handler(name):
前两个函数必须明确的存在(命名也需要一样),metric_hangder()这个函数可以命名成任何。下面是三个函数的详细解释:
def metric_init(params):
在你的模块中,这个函数必须存在,而且命名一致。他会被在初始化时调用一次,也就是在gmond启动的时候。他可以被用来做收集度量的各种初始化。metric_init() t同时也有一个单字典类型的参数,他包含了在gmond.conf中为这个模块设计的配置指令。除了完成其他的初始化工作之外,metric_init()必须创建,填充,返回这个度量描述字典或者字典列表。每个描述字典都必须包含以下几个元素:
- name:度量名称
- call_back: 在收集度量数据时被调用的函数
- 如果你的度量模块支持多种度量,每一个都通过他们的自己的度量描述被定义,那么你的模块中就需要实现不止一个的metric_handler 函数。
- time_max:以秒为单位的收集时调用函数的最大时间间隔
- 该元素的确切性质还不清楚,因为它关系到你的模块的pyconf配置文件中的“collect_every”配置指令。对于所有意图和目的,这个因素似乎没用。
- value_type: string | uint | float | double
- units: 你的度量单位
- slope: zero | positive | negative | both
- 这个值映射到为RRDTool定义的数据源类型
- If ‘positive’, RRD file generated will be of COUNTER type (calculating the rate of change)
- 如果是’postive’,生成的RRD文件是COUNTER类型的(计算变化的速率)
- If ‘negative’, ????(官方的也是如此)
- ‘both’的话就是GAUGE类型(没有计算,仅仅以报告的值绘图)
- metric如果是’zero’,这个度量会被呈现在”Time and String Metrics“ 或者 “Constant Metrics”,取决于度量的单位。
- format: 度量的格式字符串
- 必须符合value_type,否则你的度量就会未知(参考:http://docs.python.org/library/stdtypes.html#string-formatting)
- description: 度量的描述
- 在前台网页中,在划过主机度量图形时被呈现。
- groups (optional): 度量的隶属分组
- 相同分组的度量在前台网页中会被关联在一起
除了回调函数以外,这些元数基本上和那些需要提供给gmetric命令行工具的数据是同一类型的。可以查看gmetric帮助文档获取更多信息。度量描述符也可以包含额外的属性和值,他们会作为额外的数据附加到度量元数据中。附加数据会被Ganglia本身忽略,不过他可以作为显示或者度量处理数据被用在前台网页中。(使用SPOOF_HOST和SPOOF_NAME这两个额外属性的例子将在以后的版本中介绍)
def metric_cleanup():
在你的模块中,这个函数必须存在而且命名为’metric_cleanup’。他会在gmond关闭时被调用一次。任意模块的清理代码都可以放在这里,函数不应该有返回值。
def metric_handler(name):
这个’metric_handler‘函数可以被定义为任何你喜欢的名字,因为他和你定义在度量描述块中的’call_balck’函数想匹配。他有一个参数’name’,就是在你的度量描述块中的name元素。
pyconf
和这个模块想匹配的配置文件,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
这个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
配置文件剩下的部分具有相同的格式,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
这是你定义特殊度量设置的地方
- name:特殊度量的名字,也定义在你模块里描述符字典类型上
- title:可选的友好度量名称,将会在Ganglia前台被显示
- value_threshold: 如果收集到的度量报告的值(在你的描述符中定义的单位)超过定义在这里的值,那么它就会报告给ganglia而忽略collection_group中定义的 ‘time_threshold’参数
来源:oschina
链接:https://my.oschina.net/u/157821/blog/133193