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’參數
相關文章
相關標籤/搜索