Gmond扩展Python模块

↘锁芯ラ 提交于 2019-11-27 06:59:07

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

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支持的设置,你需要:

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:
=  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’参数
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!