僅供參考,不負責任
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
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
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)
Python 的詳細介紹:請點這裡
Python 的下載地址:請點這裡
推薦閱讀:
《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視頻+代碼] http://www.linuxidc.com/Linux/2013-11/92693.htm
Python腳本獲取Linux系統信息 http://www.linuxidc.com/Linux/2013-08/88531.htm