Ganglia的Python扩展模块开发

1. 概述

Ganglia 项目是由加州大学发起的,现在已经成为一个应用非常广泛集群监控软件。可以监视和显示集群中的节点的各种状态信息,比如如:cpu 、mem、硬盘利用率, I/O负载、网络流量情况等,同时可以将历史数据以曲线方式通过php页面呈现。同时具有很好的扩展性,允许用户加入自己所要监控的状态信息。根据可视化的相关数据,很容易知道集群的健康状态,并且也可以分析出集群的可优化的地方。

所有这些数据收集会多次影响节点性能。网络中的“ 抖动( Jitter ) ” 发生在大量小消息同时出现,通过ntp服务将节点的时钟保持一致,就可以避免这个问题。

Ganglia的工作原理如下图

Ganglia的Python扩展模块开发

2. Ganglia的Metrics

何为metric,在字典中其翻译为标准,度量之意。在ganglia的Web界面中我们看得最多的是如下这些图:

Ganglia的Python扩展模块开发

这些图还不能算是真正的metric,其只是各个种类的metric的汇总后通过rrdtool画出来的图,便于总体观察。下面这些才是本文要讲述的metric(CPU的metrics):

Ganglia的Python扩展模块开发

每一个小图表代表着cpu相关信息的一个数据类型,这些数据都是通过对应的部署在各个集群节点的程序模块搜集,而这个搜集模块的开发就是本文要重点讲解的。

3. 自定义metrics开发

向ganglia加入自定义metric有两种方法,一种是通过命令行的方式运行gmetric,另一种是通过ganglia提供的面向c和python的扩展模块,加入自定义的模块支持。下面使用Python开发一个简单的metric实例:

在/usr/lib64/ganglia/python_modules/中创建random_number.py并添加如下代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import random
import time
descriptors = list()
def random_number_1(name):
    return int(random.uniform(5, 100)) + 10
def random_number_2(name):
    return int(random.randrange(50, 500))
def metric_init(params):
    global descriptors
    random.seed()
    print params
    d1 = {
        'name': 'random_number_1',
        'call_back': random_number_1,
        'time_max': 90,
        'value_type': 'uint',
        'units': 'C',
        'slope': 'both',
        'format': '%u',
        'description': 'Random a number',
        'groups': 'example random'
    }
    d2 = {
        'name': 'random_number_2',
        'call_back': random_number_2,
        'time_max': 90,
        'value_type': 'uint',
        'units': 'C',
        'slope': 'both',
        'format': '%u',
        'description': 'Random a number',
        'groups': 'example random'
    }
    descriptors = [d1, d2]
    return descriptors
def metric_cleanup():
    pass

#This code is for debugging and unit testing
if __name__ == '__main__':
    metric_init({})
    while True:
        for d in descriptors:
            v = d['call_back'](d['name'])
            print ('value for %s is '+d['format']) % (d['name'], v)
        time.sleep(5)

在上面的代码中Ganglia运行的时候会调用metric_init和metric_cleanup两个函数,从这两个函数的名字我们就能得知前一个是做初始化工作,后面一个是做结束资源清理工作的。在Ganglia加载相关模块来运行时,只会调用这两个函数。这里的main函数入口只是为了做调试而写在这里的。

在/etc/ganglia/conf.d/中创建random_number.conf文件,并添加如下代码

modules {

  module {

#这里的name值一定要与/usr/lib64/ganglia/python_modules/random_number.py的文件名保持一致,否则将无法正确运行

    name = "random_number"

    language = "python"

  }


collection_group {

  collect_every = 2

  time_threshold = 90

 


  metric {

    #这里的name值要与random_number.py中的d1里的name保持一致

    name = "random_number_1"

    title = "random number 1"

    value_threshold = 0

  }

 


  metric {

    #这里的name值要与random_number.py中的d2里的name保持一致

    name = "random_number_2"

    title = "random number 2"

    value_threshold = 0

  }

}

配置好文件后重启服务

service gmond restart

service gmetad restart

service httpd restart

--------------------------------------分割线 --------------------------------------

--------------------------------------分割线 --------------------------------------

相关推荐