Gmond扩展Python模块

年初二开始翻译这篇文章的,过年嘛事情特别多,一下拜年一下来客人的,表弟啥的还要过来抢电脑玩~真心纠结。翻译这篇文章我发现个人英文水平真都很烂啊!!。。仅供参考,不负责任 html

Gmond扩展Python度量模块

在最新的Ganglia3.1.x版本中,咱们能够创造出C/Python的度量收集模块,这些模块能被直接插入到gmond中以用来监视用户自定义的度量。
在早期的版本中(2.5.x,3.0.x),添加用户自定义的度量只有经过命令行调用gmetric这么一种方法,它能够简单地经过一个cronjob或者其余进程将度量插入到gmond中。虽然这种方法对大多数人来讲是可行的,可是他使得用户自定义的度量难以管理。
本文将介绍本身编写一个python度量监视模块的一些细节问题 python

如下的组件是创建/使用Python支持所必须的 服务器

  • Ganglia 3.1.x
  • Python 2.3.4+(这是在RHEL4上测试的最老的支持版本,2.3之后的版本应该都能正常工做)
  • Python开发头文件(一般在python-devel这个软件包中)


安装

RPM安装

若是你安装Python度量模块在基于RPM软件包管理的系统上,安装“ganglia-gmond-modules-python”这个软件包便可。这包含了Python模块开发的全部东西。
app

APT安装

执行 apt-get install ganglia-monitor
而后看下面的注意事项
dom

源码安装

若是你是从源码编译的,确保添加了 –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提交给咱们 post

Ubuntu 10.10 注意事项

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' )
  • 创建目录 /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中。
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:
=  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:
= 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: 度量的格式字符串
  • 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’参数
相关文章
相关标签/搜索