1 安装ganglia
1.1安装环境
CentOS, fedora
1.2单机版安装步骤
假设机器的IP地址是192.168.1.253, 首先安装好所需要的软件
1 gmond的设置文件位置是/etc/gmond.conf,打开其进行编辑,只需修改下面的内容:
cluster {
name = "cluster1"
owner = "owner1"
latlong = "unspecified"
url = "unspecified"
}
udp_send_channel {
host = 192.168.1.253
port = 8649
ttl = 1
}
udp_recv_channel {
port = 8649
}
2 gmetad的设置文件位置是/etc/gmetad.conf,打开其进行编辑,只需修改下面的内容:
1.4 启动服务
1 启动gmond
chkconfig gmond on
service gmond start
2 启动gmetad
chkconfig gmetad on
service gmetad start
3启动httpd
chkconfig httpd on
service httpd start
打开localhost/ganglia就可以看到结果了。
2 python模块扩展
yum install ganglia-gmond-python
gmond.conf 有这一行代码include ("/etc/ganglia/conf.d/*.conf").这个目录是放模块的配置文件的,python模块的配置文件的后缀名应该是.pyconf
在/etc/ganglia/conf.d下有modpython.conf。这个文件的内容是:
/*params指明了python模块存放的目录。
params - path to the directory where mod_python
should look for python metric modules
the "pyconf" files in the include directory below
will be scanned for configurations for those modules
*/
modules {
module {
name = "python_module"
path = "modpython.so"
params = "/usr/lib/ganglia/python_modules"
}
}
include ('/etc/ganglia/conf.d/*.pyconf')
include ('/etc/ganglia/conf.d/*.pyconf') 指明了python模块配置文件的目录。
在 /usr/lib/ganglia下有modpython.so。该文件是 Ganglia Python 扩展的动态库文件。
/usr/lib/ganglia/python_modules文件夹存在。所有的python模块存放在这个位置,后缀名是.py
定制一个python模块很简单,只需按照一定的模板编写.py文件,然后将这个模块(.py)放在 /usr/lib/ganglia/python_modules 目录下。对应的配置文件(.pyconf)放在/etc/ganglia/conf.d/目录下。
python模块可能要访问服务器的多个文件,由于运行python模块的用户和运行gmond的用户是一致的,所以必须保证运行gmond的用户有访问这些文件的权限。
在安装好ganglia-gmond-python后,已经自带了一个例子/usr/lib/ganglia/python_modules/example.py。下面将针对example.py解释python模块的格式,以及它的配置文件。
以example为例(安装完ganglia-gmond-python 后已经自带)
import random
descriptors = list()
Random_Max = 50
Constant_Value = 50
def Random_Numbers(name):
'''Return a random number.'''
global Random_Max
return int(random.uniform(0,Random_Max))
def Constant_Number(name):
'''Return a constant number.'''
global Constant_Value
return int(Constant_Value)
def metric_init(params):
'''Initialize the random number generator and create the
metric definition dictionary object for each metric.'''
global descriptors
global Random_Max
global Constant_Value
random.seed()
print '[pyexample] Received the following parameters'
print params
if 'RandomMax' in params:
Random_Max = int(params['RandomMax'])
if 'ConstantValue' in params:
Constant_Value = int(params['ConstantValue'])
d1 = {'name': 'PyRandom_Numbers',
'call_back': Random_Numbers,
'time_max': 90,
'value_type': 'uint',
'units': 'N',
'slope': 'both',
'format': '%u',
'description': 'Example module metric (random numbers)',
'groups': 'example,random'}
d2 = {'name': 'PyConstant_Number',
'call_back': Constant_Number,
'time_max': 90,
'value_type': 'uint',
'units': 'N',
'slope': 'zero',
'format': '%hu',
'description': 'Example module constant (constant number)'}
descriptors = [d1,d2]
return descriptors
def metric_cleanup():
'''Clean up the metric module.'''
pass
#This code is for debugging and unit testing
if __name__ == '__main__':
params = {'RandomMax': '500',
'ConstantValue': '322'}
metric_init(params)
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_handler可以任意命名。
__main__是便于debug用,可以单独调试该模块,以检测是否有错。
下面将对每个方法的功能做解释。
对模块的初始化,在gmond服务被启动的时候,运行一次。
该方法必须返回一个词典列表,每个词典表示了一个metric的信息。每个词典的格式如下:
d1 = {'name': 'PyRandom_Numbers', #metric的名字
'call_back': Random_Numbers, #收集到数据后调用的方法
'time_max': 90, #没有什么用。。。
'value_type': 'uint', #string | uint | float | double
'units': 'N', # metric的单位
'slope': 'both', #zero | positive | negative | both
'format': '%u', #必须和value_type对应 (reference: http://docs.python.org/library/stdtypes.html#string-formatting)
'description': 'Example module metric (random numbers)', #对metric的描述,在前端可以看到
'groups': 'example,random'} #这个metric属于的组,如果没有定义,会分到no_group metric中
This value maps to the data source types defined for RRDTool
If 'positive',表示数据的变化率(calculating the rate of change)
If 'negative', ????
'both' 直接显示值
If 'zero', 将显示在 "Time and String Metrics" 或者 "Constant Metrics"中(根据metric的value_type)
在example这个例子中,d2的slope是zero,最后显示在Constant Metrics中,而不显示在下面的面板里。
gmond关掉的时候执行,不能返回值。
可以取任何的名字,要在call_back中调用,参数name在是metric字典里定义的name。
pyconf是python模块的配置文件,位置是/etc/ganglia/conf.d/example.pyconf(没有自带,需自己创建example.pyconf), 代码如下
modules{
module {
name = "example"
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 = "PyRandom_Numbers"
#要显示的metric,与example.py中的d1名字对应
title = "Random"
#metric在网页上显示的标题
value_threshold = 70
}
metric {
name = "PyConstant_Number"
#要显示的metric,与example.py中的d2名字对应
title = "Constant"
#metric在网页上显示的标题
value_threshold = 70
}
}
Modules:对每个模块进行配置
name:模块名,同时必须与创建的python文件名一致
language: 语言
param:参数列表,所有的参数作为一个dict(即map)传给python脚本的metric_init(params)函数。
本例中,metric_init调用时, params={“RandomMax”:”600”,”ConstantValue”:”112”}
collection_group:需要收集的metric列表,一个模块中可以扩展任意个metric
collect_every: 汇报周期,以秒为单位。
metric:可以有多个,定义每个metric的信息。