年初二開始翻譯這篇文章的,過年嘛事情特別多,一下拜年一下來客人的,表弟啥的還要過來搶電腦玩~真心糾結。翻譯這篇文章我發現個人英文水平真都很爛啊!!。。僅供參考,不負責任 html
在最新的Ganglia3.1.x版本中,咱們能夠創造出C/Python的度量收集模塊,這些模塊能被直接插入到gmond中以用來監視用戶自定義的度量。
在早期的版本中(2.5.x,3.0.x),添加用戶自定義的度量只有經過命令行調用gmetric這麼一種方法,它能夠簡單地經過一個cronjob或者其餘進程將度量插入到gmond中。雖然這種方法對大多數人來講是可行的,可是他使得用戶自定義的度量難以管理。
本文將介紹本身編寫一個python度量監視模塊的一些細節問題 python
如下的組件是創建/使用Python支持所必須的 服務器
若是你安裝Python度量模塊在基於RPM軟件包管理的系統上,安裝「ganglia-gmond-modules-python」這個軟件包便可。這包含了Python模塊開發的全部東西。
app
執行 apt-get install ganglia-monitor
而後看下面的注意事項
dom
若是你是從源碼編譯的,確保添加了 –with-python這個選項。若是Python解釋器被檢測到,這個選項是會被自動添加
函數
爲了確保Ganglia的安裝有了Python支持的設置,檢查一下如下設置:
工具
若是你經過二進制文件安裝python模塊支持,上面的這些應該會被自動生成。假若有些文件缺失的話,請把bug提交給咱們 post
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' ) |
編寫一個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: 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 ) |
有三個函數必須存在於每一個模塊中,他們是
前兩個函數必須明確的存在(命名也須要同樣),metric_hangder()這個函數能夠命名成任何。下面是三個函數的詳細解釋:
在你的模塊中,這個函數必須存在,並且命名一致。他會被在初始化時調用一次,也就是在gmond啓動的時候。他能夠被用來作收集度量的各類初始化。metric_init() t同時也有一個單字典類型的參數,他包含了在gmond.conf中爲這個模塊設計的配置指令。除了完成其餘的初始化工做以外,metric_init()必須建立,填充,返回這個度量描述字典或者字典列表。每一個描述字典都必須包含如下幾個元素:
除了回調函數之外,這些元數基本上和那些須要提供給gmetric命令行工具的數據是同一類型的。能夠查看gmetric幫助文檔獲取更多信息。度量描述符也能夠包含額外的屬性和值,他們會做爲額外的數據附加到度量元數據中。附加數據會被Ganglia自己忽略,不過他能夠做爲顯示或者度量處理數據被用在前臺網頁中。(使用SPOOF_HOST和SPOOF_NAME這兩個額外屬性的例子將在之後的版本中介紹)
在你的模塊中,這個函數必須存在並且命名爲’metric_cleanup’。他會在gmond關閉時被調用一次。任意模塊的清理代碼均可以放在這裏,函數不該該有返回值。
這個’metric_handler‘函數能夠被定義爲任何你喜歡的名字,由於他和你定義在度量描述塊中的’call_balck’函數想匹配。他有一個參數’name’,就是在你的度量描述塊中的name元素。
和這個模塊想匹配的配置文件,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區域包含每一個模塊被加載的配置數據。他應該包含一個或者多個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 或者 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
這是你定義特殊度量設置的地方