Ganglia與Centreon整合構建智能化監控報警平台


一、智能運維監控報警平台的組成

隨着大數據時代的來臨,運維工作的難度越來越大,每個運維人員都要面臨不計其數的服務器和海量的數據,如何保證眾多服務器和業務系統穩定高效地運行並盡量減少死機時間,成為考核運維工作的重要指標,而要實現大規模的運維,必須要有一套行之有效的智能運維監控管理系統,本章就詳細介紹下如何構建一套完善的運維監控報警平台。

運維的核心工作可以分為運行監控和故障處理兩個方面,對業務系統進行精確、完善的監控,保證能夠在第一時間發現故障並迅速通知運維人員處理故障是運維監控系統要實現的基礎功能;一個功能完善的智能監控系統,不但可以自動處理一些簡單故障,減少運維工作量,還應該在應用可能出現故障時預先發出報警,預防故障的發生。因此,構建一個智能的運維監控平台,必須以運行監控和故障報警這兩個方面為重點,將所有業務系統中涉及的網絡資源、硬件資源、軟件資源、數據庫資源等納入統一的運維監控平台中,並通過消除管理軟件的差別,數據采集手段的差別,對各種不同的數據來源實現統一管理、統一規范、統一處理、統一展現、統一用戶登錄、統一權限控制,最終實現運維規范化、自動化、智能化的大運維管理。

一個智能的運維監控平台,一般的設計架構從低到高可以分為6層,三大模塊,如下圖所示。

其中:

 數據收集層:位於最底層,主要收集網絡數據、業務系統數據、數據庫數據、操作系統數據等,然后將收集到的數據進行規范化並進行存儲。
 數據展示層:位於第二層,是一個Web展示界面,主要是將數據收集層獲取到的數據進行統一展示,展示的方式可以是曲線圖、柱狀圖、餅狀態等,通過將數據圖形化,可以幫助運維人員了解一段時間內主機或網絡的運行狀態和運行趨勢,並作為運維人員排查問題或解決問題的依據。
 數據提取層:位於第三層,主要是對從數據收集層獲取到的數據進行規格化和過濾處理,提取需要的數據到監控報警模塊,這個部分是監控和報警兩個模塊的銜接點。
 報警規則配置層:位於第四層,主要是根據第三層獲取到的數據進行報警規則設置、報警閥值設置、報警聯系人設置和報警方式設置等。
 報警事件生成層:位於第五層,主要是對報警事件進行實時記錄,將報警結果存入數據庫以備調用,並將報警結果形成分析報表,以統計一段時間內的故障率和故障發生趨勢。
 用戶展示管理層:位於最頂層,是一個Web展示界面,主要是將監控統計結果、報警故障結果進行統一展示,並實現多用戶、多權限管理,實現統一用戶和統一權限控制。
在這6層中,從功能實現划分,又分為三個模塊,分別是數據收集模塊、數據提取模塊和監控報警模塊,每個模塊完成的功能如下:
 數據收集模塊:此模塊主要完成基礎數據的收集與圖形展示。數據收集的方式有很多種,可以通過SNMP實現,也可以通過代理模塊實現,還可以通過自定義腳本實現。常用的數據收集工具有Cacti、Ganglia等。
 數據提取模塊:此模板主要完成數據的篩選過濾和采集,將需要的數據從數據收集模塊提取到監控報警模塊中。可以通過數據收集模塊提供的接口或自定義腳本實現數據的提取。
 監控報警模塊:此模塊主要完成監控腳本的設置、報警規則設置,報警閥值設置、報警聯系人設置等,並將報警結果進行集中展現和歷史記錄。常見的監控報警工具有Nagios、Centreon等。

在了解了運維監控平台的一般設計思路之后,接下來詳細介紹下如何通過軟件實現這樣一個智能運維監控系統。

上圖是根據上圖的設計思路形成的一個運維監控平台實現拓撲圖,從圖中可以看出,主要有三大部分組成,分別是數據收集模塊、監控報警模塊和數據提取模塊,其中,數據提取模塊用於其他兩個模塊之間的數據通信,而數據收集模塊可以有一台或多台數據收集服務器組成,每個數據收集服務器可以直接從服務器群組收集各種數據指標,經過規范數據格式,最終將數據存儲到數據收集服務器中。監控報警模塊通過數據抽取模塊從數據收集服務器獲取需要的數據,然后設置報警閥值、報警聯系人等,最終實現實時報警。報警方式支持手機短信報警、郵件報警等,另外,也可以通過插件或者自定義腳本來擴展報警方式。這樣一整套監控報警平台就基本實現了。

二、Ganglia作為數據收集模塊

關於Ganglia的基本應用,在前面章節已經詳細介紹過,這里將Ganglia作為監控報警平台的數據收集模塊,主要基於以下幾方面的原因:

1、靈活的分布式、分層體系結構,使Ganglia支持上萬個監控節點的數據收集,並且性能表現穩定,同時,Ganglia也可以根據地域環境、網絡結構的不同,分地域、分層次靈活部署Ganglia數據收集點,而對於數據收集節點可以動態添加或刪除,對Ganglia整體監控不產生任何影響,因此,可以靈活擴展Ganglia數據收集節點。

2、收集數據更加精確,不但可以收集實時數據,以圖表的形式展示出來,而且還允許用戶查看歷史統計數據,因此,用戶可以通過這些數據,做出性能調整、升級、擴容等決策,從而保證應用系統能夠滿足不斷增長的業務需求。

3、可以通過組播、單播的方式收集數據。在監控的節點較多時通過組播方式收集數據可以大大降低數據收集的負載,提高監控和數據收集性能。而對於不能使用組播收集數據的網絡環境,還可以通過單播的方式收集數據,因此Ganglia在數據收集方式上非常靈活。

4、可收集各種度量的數據。Ganglia默認可收集cpu、memory、disk、I/O、process、network六大方面的數據,同時還提供了C或者Python接口,用戶通過這個接口可以自定義數據收集模塊,並且這些模塊可以被直接插入到Ganglia中以監控用戶自定義的應用。

基於以上這些優點,Ganglia非常適合作為監控報警平台的數據收集模塊。雖然Cacti也可以實現數據的收集和圖形報表的展示,但是當監控節點越來越多時,Cacti的缺點就慢慢暴露出來了,數據收集的准確性、實時性就很難得到保障了。因此,要構建一個高性能的監控報警平台,Ganglia是首選的數據收集模塊。

三、Centreon作為監控報警模塊

有了Ganglia收集數據還是不夠的,運維人員不可能天天盯着數據報表,因此,還需要對收集到的數據進行監控和報警:對每個需要監控的主機或服務,設置一個報警閥值,當收集到的數據超過這個閥值時,在第一時間能自動報警並通知運維人員,而在收集到的數據沒有超過指定的報警閥值時,運維人員就可以去做別的事情,而不用時刻盯着數據報表,這是構建智能監控報警平台必須要實現的一個功能。

對主機或服務的狀態值進行監控,當達到指定閥值時進行報警,要實現這個功能並不是什么難的事情,寫個簡單的腳本就能實現,但是這樣太原始了,沒有層次,維護性差,並且當需要監控報警的主機或服務越來越多時,腳本的性能就變得很差,管理也非常不方便,更別說有什么可視化效果了,因此,需要有一個專業的監控報警工具來實現這個功能。

Centreon就是這樣一個專業的分布式監控、報警工具,它通過第三方組件可以實現對網絡、操作系統和應用程序的監控與報警。在底層,Centreon通過nagios作為監控軟件;在數據層,Centreon通過ndoutil模塊將監控到的數據定時寫入數據庫中;在展示層,Centreon提供了Web界面來配置、管理需要監控的主機或服務,並提供多種報警通知方式,同時還可以展現監控數據和報警狀態,並且可查詢歷史報警記錄。

關於Centreon的介紹和使用,在前面專欄已經做過非常詳細的介紹,這里不再多說。通過對Centreon的使用可知,Centreon無論在配置、管理、可視化等方面都做得非常專業和完善,並且在多主機、多服務監控的環境下,性能表現也非常穩定,因此,將Centreon作為智能監控報警平台的監控報警模塊非常適合。

四、Ganglia與Centreon的無縫整合

通過前面的介紹,確定了以Ganglia作為數據收集模塊,Centreon作為監控報警模塊的方案,這樣,一個智能監控報警平台兩大主要功能模塊已經基本實現了。但現在的問題是,如何將收集到的數據傳送給監控報警模塊呢,這就是數據抽取模塊要完成的功能。

數據抽取模塊要完成的功能是:從數據收集模塊中定時采集指定的數據,然后將采集到的數據與指定的報警閥值進行比較,如果發現采集到的數據大於或小於指定的報警閥值,那么就通過監控報警模塊設置的報警方式進行故障通知。在這個過程中,只有采集數據在數據收集模塊中完成,其他操作,例如:采集數據時間間隔、報警閥值設置、報警方式設置、報警聯系人設置等都在監控報警模塊中完成。

從數據抽取模塊完成的功能可以看出,此模塊主要用來銜接數據收集模塊和監控報警模塊,進而實現Ganglia和Centreon的無縫整合。要實現數據抽取模塊的功能,方法有很多,最簡單最直接的方法就是編寫監控腳本,這里提供幾個常用的數據抽取腳本,然后將腳本添加到Centreon中,下面介紹具體的操作過程。

4.1、數據抽取腳本

這里提供一個數據抽取腳本,是基於Python編寫的,介紹如下。

這個腳本的原理是通過Ganglia提供的數據匯總端口來獲取數據,然后將獲取到的數據與指定的閥值進行對比,以判斷服務是否有異常。腳本內容如下:

#!/usr/bin/env python import sys import getopt import socket import xml.parsers.expat class GParser: def __init__(self, host, metric): self.inhost =0 self.inmetric = 0 self.value = None self.host = host self.metric = metric def parse(self, file): p = xml.parsers.expat.ParserCreate() p.StartElementHandler = parser.start_element p.EndElementHandler = parser.end_element p.ParseFile(file) if self.value == None: raise Exception('Host/value not found') return float(self.value) def start_element(self, name, attrs): if name == "HOST": if attrs["NAME"]==self.host: self.inhost=1 elif self.inhost==1 and name == "METRIC" and attrs["NAME"]==self.metric: self.value=attrs["VAL"] def end_element(self, name): if name == "HOST" and self.inhost==1: self.inhost=0 def usage(): print """Usage: check_ganglia_metric \ -h|--host= -m|--metric= -w|--warning= \ -c|--critical= """ sys.exit(3) if __name__ == "__main__": ############################################################## ganglia_host = '127.0.0.1' ganglia_port = 8651 host = None metric = None warning = None critical = None try: options, args = getopt.getopt(sys.argv[1:], "h:m:w:c:s:p:", ["host=", "metric=", "warning=", "critical=", "server=", "port="], ) except getopt.GetoptError, err: print "check_gmond:", str(err) usage() sys.exit(3) for o, a in options: if o in ("-h", "--host"): host = a elif o in ("-m", "--metric"): metric = a elif o in ("-w", "--warning"): warning = float(a) elif o in ("-c", "--critical"): critical = float(a) elif o in ("-p", "--port"): ganglia_port = int(a) elif o in ("-s", "--server"): ganglia_host = a if critical == None or warning == None or metric == None or host == None: usage() sys.exit(3) try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((ganglia_host,ganglia_port)) parser = GParser(host, metric) value = parser.parse(s.makefile("r")) s.close() except Exception, err: print "CHECKGANGLIA UNKNOWN: Error while getting value \"%s\"" % (err) sys.exit(3) if critical > warning: if value >= critical: print "CHECKGANGLIA CRITICAL: %s is %.2f" % (metric, value) sys.exit(2) elif value >= warning: print "CHECKGANGLIA WARNING: %s is %.2f" % (metric, value) sys.exit(1) else: print "CHECKGANGLIA OK: %s is %.2f" % (metric, value) sys.exit(0) else: if critical >= value: print "CHECKGANGLIA CRITICAL: %s is %.2f" % (metric, value) sys.exit(2) elif warning >= value: print "CHECKGANGLIA WARNING: %s is %.2f" % (metric, value) sys.exit(1) else: print "CHECKGANGLIA OK: %s is %.2f" % (metric, value) sys.exit(0)

你可以下載源碼:https://www.ixdba.net/jk/ganglia_shell.tar.gz

在這個腳本中,需要修改的地方有兩個,分別是ganglia_host和ganglia_port。ganglia_host表示gmetad服務所在服務器的IP地址,Ganglia可以和Centreon安裝到一起,也可以分開部署,當Ganglia和Centreon安裝在一起時,這個值就是“127.0.0.1”。ganglia_port表示gmetad收集數據匯總的交互端口,默認是8651。

本例中,我們的centreon和ganglia gmetad沒在一起,因此,ganglia_host要填寫ganglia gmetad的IP為172.16.213.157,需要注意的是,因為是centreon主機要訪問ganglia gmetad主機,所以還需要在ganglia gmetad的配置文件gmetad中增加如下選項:

[root@centreonserver bestjob]# cat gmetad.conf |grep “trusted_hosts” trusted_hosts 127.0.0.1 172.16.213.229

其中,172.16.213.229是centreon主機的ip地址。

上面所有配置完成后,將此腳本命名為check_ganglia.py,然后放到Centreon存放nagios插件的目錄下,默認為/usr/lib64/nagios/plugins,並授予可執行權限。接着介紹此腳本的用法。

[root@centreonserver plugins]# chmod 755 check_ganglia.py

在命令行直接執行check_ganglia.py腳本,即可獲得使用幫助:

[root@centreonserver plugins]# python check_ganglia.py Usage: check_ganglia_metric -h|--host= -m|--metric= -w|--warning= -c|--critical=

下面分別介紹其中各個參數的意義。

 -h:表示從哪個主機上提取數據,后跟主機名或IP地址。這里需要注意的是,Ganglia默認將收集到的數據存放在gmetad配置文件中“rrd_rootdir”參數指定的目錄下,如果被監控的主機沒有主機名或主機名沒有進行DNS解析,那么Ganglia就會用此主機的IP地址作為目錄名來存儲收集到的數據,反之,就會以主機名作為存儲數據的目錄名稱。

因此,這里的“-h“參數就要以Ganglia存儲rrds數據的目錄名稱為准。下面是Ganglia收集到的rrds數據的存儲結構:

[root@centreonserver bestjob]# pwd /data/rrdsdata/rrds/bestjob [root@centreonserver bestjob]# ls 192.168.11.188 host0080.bestjob.com host0078.bestjob.com 192.168.16.10 host0022.bestjob.com host0065.bestjob.com [root@centreonserver bestjob]# cd 192.168.11.188 [root@centreonserver 192.168.11.188]# ls cpu_num.rrd cpu_system.rrd disk_free.rrd load_five.rrd mem_cached.rrd mem_total.rrd cpu_speed.rrd cpu_user.rrd disk_total.rrd load_one.rrd mem_free.rrd part_max_used.rrd

 -m:表示要收集的指標值,例如cpu_num、disk_free、cpu_user、disk_total、load_one、part_max_used等,這些指標值可以在Ganglia存儲rrds數據的目錄中找到,也可以在Ganglia的Web界面中查找到。
 -w:表示警告的閥值,當此腳本收集到的指標值低於或者高於指定的警告閥值時,此腳本就會發出告警通知,同時此腳本返回狀態值1。
 -c:表示故障閥值,當此腳本收集到的指標值低於或者高於指定的故障閥值事,此腳本就會發出故障通知,同時此腳本返回狀態值2。

下面演示一下此腳本的用法,這里以檢測host0080.bestjob.com主機的磁盤剩余空間為例,其他指標值以此類推:

[root@centreonserver plugins]# ./ check_ganglia.py \ > -h host0080.bestjob.com -m disk_free -w 1000 -c 500 CHECKGANGLIA OK: disk_free is 3045.75 [root@centreonserver plugins]# echo $? 0 [root@centreonserver plugins]# ./ check_ganglia.py \ > -h host0080.bestjob.com -m disk_free -w 3045 -c 3000 CHECKGANGLIA WARNING: disk_free is 3043.68 [root@centreonserver nagios]# echo $? 1 [root@centreonserver plugins]# ./ check_ganglia.py \ > -h host0080.bestjob.com -m disk_free -w 3050 -c 3045 CHECKGANGLIA CRITICAL: disk_free is 3044.55 [root@centreonserver plugins]# echo $? 2 [root@centreonserver plugins]# ./ check_ganglia.py \ > -h host0080.bestjob.com -m part_max_used -w 90 -c 95 CHECKGANGLIA OK: part_max_used is 81.70

前三個例子主要用來檢測磁盤的剩余空間。在檢測磁盤剩余空間時使用的是“disk_free”這個指標值,這個“disk_free”是host0080.bestjob.com主機所有磁盤剩余空間的總和,這里的指標單位為GB。

腳本的執行過程為:如果剩余磁盤空間正常,將輸出OK字樣,同時輸出剩余磁盤空間量,並返回狀態值0,;如果檢測磁盤處於WARNING狀態,將返回狀態值1;如果檢測磁盤處於CRITICAL狀態,將返回狀態值2。這其實就是Nagios下狀態檢測腳本的基本寫法,Nagios就是通過腳本的返回狀態值來判斷服務處於何種狀態。

接着看最后一個例子,這個例子用到了“part_max_used”這個指標。這個指標表示磁盤分區的最大使用率,單位是百分比,它用來輸出系統中磁盤分區使用率的最大值。這個指標非常有用,經常用來判斷系統中某個磁盤分區是否已滿。在這個例子中,指定WARNING狀態的閥值是90%,CRITICAL狀態的閥值是95%,也就是當系統磁盤最大使用率達到95%時將發出CRITICAL報警。

最后,登錄Ganglia的web界面,查看host0080.bestjob.com主機的“disk_free”和“part_max_used”狀態圖,檢查一下通過Python腳本輸出的值是否和Ganglia生成的狀態圖一致,如下圖所示。

從圖中可以看出,通過Python提取到的數值和Ganglia生成的狀態圖基本一致,如果要查看更詳細的統計,可以點擊上圖進入詳細統計頁面,在這個詳細頁面,可以查看每小時、每天、每周的磁盤狀態統計圖。另外,通過上圖還可以發現,統計的指標值“disk_free”和“part_max_used”就在狀態圖的左上角,並配有指標含義解釋。

4.2、實現Ganglia與Centreon的完美整合

上面介紹了一個常用的數據抽取腳本及其用法,在實際應用中要實現對主機的監控報警,最簡單的方法是將上面例子中的操作命令寫到一個腳本,然后將這個腳本放到系統守護進程中,定期執行腳本檢測即可,但是這種方法不夠靈活,無法設定詳細的聯系人和聯系人組,並且維護也不方便。

由於Centreon底層監控引擎跟Nagios類似,因此將這些腳本作為Nagios的插件,即可實現靈活的報警設置和便捷的管理。接下來以check_ganglia.py腳本為例,演示下如何將此腳本集成到Centreon平台上來,將其他腳本集成到Centreon的方法與此完全相同。

Ganglia和Centreon可以分開獨立部署在兩台服務器上,也可以部署在一起,這里設定Ganglia和Centreon部署在兩台服務器上。結合前面介紹的Centreon知識,在監控服務器的Centreon Web界面,選擇 Configuration—>Commands—>Checks,然后點擊Add新建一個Command,如下圖所示。

在上圖中,創建了一個名為check_ganglia_py的Command,選擇“Command Type”為“Check”。接着重點看“Command Line”的內容,其中,“$USER1$”就是Centreon服務器上Nagios監控插件的路徑,默認是“/usr/lib64/nagios/plugins”,前面已經把這個監控腳本放到了此路徑下,這里直接引用即可。在這個腳本對應的參數中定義了三個參數變量“$ARG1$”、“$ARG2$”和“$ARG3$”,分別用於指定Ganglia metric、警告條件和CRITICAL閥值。這里建議將每個參數變量的作用都在“Argument Descriptions”選項中做個描述,以保證在添加服務時不容易出錯。

這樣,就將check_ganglia.py腳本作為一個命令集成到Centreon中了。接下來演示一下如何通過這個腳本檢測一批主機的磁盤空間最大占用率。首先在Centreon Web界面選擇Configuration—>Services—>Services by host group,點擊Add添加一個主機組服務,如下圖所示。

這里先看一下“General Information”標簽中的幾個選項:“Description”就是監控服務的名稱,這里定義為check_disk_group ;“Linked with Host Groups”是指定此服務鏈接的主機組,如果有很多主機都需要監控同一個服務時,向主機一個一個添加服務就變得十分繁瑣,此時通過添加主機組的方式,一次性完成主機組下所有主機的監控,簡單而靈活。

接下來,“Template”是指定服務的模板,這里仍然選擇“generic-service”; “Service Check Options”選項下的“Check Command”選項用來指定服務檢查的命令,從下拉菜單中選擇剛才創建的命令check_ganglia_py即可;最后一個選項“Args”就是剛才創建check_ganglia_py命令時指定的三個變量,根據每個變量的含義,依次填寫Ganglia metric、警告條件和CRITICAL閥值。
對於“Service Scheduling Options”選項以及“Notifications”標簽的報警通知的設置,因為已經在服務模板中都統一配置過了,所以無需設置。在完成所有設置后,保存退出,check_disk_group服務添加完成。

至此,已經完成check_ganglia.py腳本和Centreon的集成,其實也就是Ganglia和Centreon的集成,而這個腳本就是兩者集成的橋梁而已。

在完成所有配置后,需要重啟Centreon服務,這樣所有的配置和修改才能生效。在重啟Centreon服務后,查看check_disk_group服務的運行狀態,如下圖所示。

從上圖中可以看出,hostgroup1主機組中包含了四台主機,每個主機的磁盤最大占用率都處於正常狀態,並且輸出了目前磁盤最大占用率的比值。由此可知,check_ganglia.py腳本集成到Centreon后工作正常,完美實現了從Ganglia采集數據,在Centreon中設置報警規則的監控、報警一體化過程。

五、在Centreon中實現批量數據收集與監控報警

在上面已經介紹了如何通過數據抽取腳本從Ganglia中抽取數據,然后通過腳本的判斷最終實現在Centreon上的報警通知。這個過程看似很完美,其實隱藏着一些問題,比如,從給出的兩個數據抽取文件中,腳本每次只能檢測一台主機的一個服務狀態,如果要檢測多台主機的多個服務狀態,就需要多次重復執行這個腳本。例如,要檢測100台主機的磁盤最大占用率,腳本就要重復執行100次,同理,要檢測100台主機中的10個服務狀態,腳本就要執行1000次,在Centreon平台中,腳本檢測是定期執行的,如果每個小時執行一次檢測,那么每個小時就要執行腳本1000次。由此可知,這種腳本執行方式效率低下,嚴重浪費服務器資源,在監控主機較少的環境中,監控效率還勉強能夠接受,但是當監控的主機超過500台或更多,監控的服務超過100或更多時,監控效率將更加低下,監控腳本從Ganglia抽取數據的時間也將變得很長,可能還會發生獲取監控數據超時的情況,這對於要求監控精度很高、報警及時性強的監控報警平台來說,是不可容忍的。

如果能將監控腳本重復執行檢查的次數減少,或者讓腳本一次檢查多台服務器的多個服務狀態,那么腳本的執行效率將大大提升。在上節介紹的第二個腳本中,是通過讀取Ganglia Web的頁面信息來獲取監控數據的,既然通過此腳本能一次獲取某台主機的信息,那么也能一次獲取多台主機的數據。非常幸運,這個功能Ganglia本身已經實現了,這里只需稍作修改拿過來使用即可。在Ganglia Web的程序目錄下,有一個nagios目錄,這個目錄下有多個shell腳本和PHP腳本,這里重點介紹下check_host_regex.sh和check_host_regex.php這兩個腳本,其他腳本的使用方法與此類似。

經過修改后的check_host_regex.sh腳本內容如下:

GANGLIA_URL="http:// 172.16.213.157/ganglia/nagios/check_host_regex.php" # Build the rest of the arguments into the arg string for the URL. CHECK_ARGS='' if [ "$#" -gt "0" ] then CHECK_ARGS=$1 shift for ARG in "$@" do CHECK_ARGS=${CHECK_ARGS}"&"${ARG} done else echo "Sample invocation $0 hreg=web|apache checks=load_one,more,1:load_five,more,2 ignore_unknowns=0" echo " Set ignore_unknowns=1 if you want to ignore hosts that don't posses a particular metric." echo " This is useful if you want to use a catchall regex e.g. .* however some hosts lack a metric" exit 1 fi RESULT=`curl -s -g "${GANGLIA_URL}?${CHECK_ARGS}"` EXIT_CODE=`echo $RESULT | cut -f1 -d'!'` REST=`echo $RESULT | cut -f2 -d'!'` for x in $EXIT_CODE; do case $x in OK) echo $REST exit 0;; WARNING) echo $REST exit 1;; CRITICAL) echo $REST exit 2;; *) echo $REST exit 3;; esac done

你可以下載源碼:https://www.ixdba.net/jk/ganglia_shell.tar.gz

這里主要看下此文件第一行“GANGLIA_URL”的內容,這個變量用於指定http方式訪問check_host_regex.php腳本的路徑,后面跟的URL只要服務器本身能夠訪問到即可。默認是http://localhost, 表示centreon服務器和gmetad服務器在一起,如果centreon服務器和gmetad服務器不在一起的話,那么就需要修改GANGLIA_URL的值為centreon服務器的地址。我們這里修改為:

GANGLIA_URL=http://172.16.213.157/ganglia/nagios/check_host_regex.php。

從腳本內容看,check_host_regex.sh主要用於對獲取的監控數據進行判斷,而check_host_regex.php腳本主要用來獲取監控數據。check_host_regex.php腳本在ganglia web安裝包中自帶,因此這里不在講述。

下面介紹check_host_regex.sh腳本的用法。直接在命令行執行check_host_regex.sh腳本,即可顯示詳細用法,例如:

[root@centreonserver plugins]# ./check_host_regex.sh Sample invocation ./check_host_regex.sh hreg=Hostname checks=load_one,more,1:load_five,more,2 ignore_unknowns=0 Set ignore_unknowns=1 if you want to ignore hosts that don't posses a particular metric.

下面介紹其中各個參數的意義。

 hreg:后面跟主機名或主機名標識。這個參數的含義與check_ganglia_metric.php腳本中“hostname”參數的含義相同,但用法稍有不同。如果在hreg后面指定一個完整的主機名,那么就收集此台主機的狀態信息。同時,hreg參數還支持正則表達式,只需提供一個主機名的標識,就可以批量檢測包含此標識的所有主機,例如,有800台主機,主機名都包含有“bestjob”這個字符,那么只需設置“hreg=bestjob”即可實現一個腳本一次檢查800台主機的服務狀態。

 checks:后面跟檢測服務的指標值、檢查條件和告警閥值。常見的服務指標有load_one、disk_free、swap_free、part_max_used等,檢查條件有more(大於)、less(小於)、equal(等於)、notequal(不等於)四種,告警閥值根據實際應用環境來設置。這個參數還有個功能就是可以一次設置多個服務狀態,每個服務之間用“:”進行分割即可。有了這個功能,就可以通過一個腳本一次檢測多個服務的運行狀態,大大提高了腳本檢測的效率。

 ignore_unknowns:此參數用來設置是否忽略UNKNOWN狀態的服務。設置此參數為1表示忽略UNKNOWN狀態的服務,反之,設置為0表示不忽略。

下面演示一下此腳本的用法,這里以檢測主機名含有”bestjob“標識的主機為例,操作過程如下:

[root@centreonserver plugins]# ./check_host_regex.sh \

hreg=bestjob checks=load_one,more,15
Services OK = 796, CRIT/UNK = 4 ;
CRITICAL host0089.bestjob.com load_one = 16.96,
CRITICAL host0133.bestjob.com load_one = 22.91,
CRITICAL host0028.bestjob.com load_one = 15.02,
CRITICAL host0329.bestjob.com load_one = 16.68
此命令用來檢測主機名含有”bestjob“標識的主機1分鍾內的負載狀態,當負載超過15時進行告警通知。從輸出可知,主機名含有”bestjob“標識的主機共有800台,其中4台主機在一分鍾內的負載狀態超過15,並給出了超載主機的主機名和當前的負載狀態值。

下面是一個腳本檢測多台主機的多個服務的用法,操作過程如下:

[root@centreonserver plugins]# ./check_host_regex.sh \

hreg=bestjob checks=load_one,more,15:disk_free,less,900 ignore_unknowns=1
Services OK = 787, CRIT/UNK = 13 ;
CRITICAL host0081.bestjob.com load_one = 25.51 ,
CRITICAL host0246.bestjob.com load_one = 16.86 ,
CRITICAL host0003.bestjob.com disk_free = 576.318 GB,
CRITICAL dbmysql.bestjob.com disk_free = 520.721 GB,
CRITICAL webapp.bestjob.com disk_free = 461.966 GB,
CRITICAL host0200.bestjob.com disk_free = 852.420 GB,
CRITICAL host0055.bestjob.com disk_free = 279.465 GB,
CRITICAL dbdata.bestjob.com disk_free = 636.190 GB,
CRITICAL webui.bestjob.com disk_free = 525.538 GB,
CRITICAL server0232.bestjob.com disk_free = 861.330 GB,
CRITICAL server0159.bestjob.com disk_free = 801.443 GB,
CRITICAL host0080.bestjob.com disk_free = 739.467 GB,
CRITICAL etlserver.bestjob.com disk_free = 826.477 GB

此命令檢測含有”bestjob“標識在主機1分鍾內的負載狀態和剩余空閑磁盤空間情況,並忽略UNKNOWN狀態的服務。從檢測結果中發現,在800台主機中,有13台主機出現負載或磁盤空閑空間告警問題,並輸出了詳細的告警信息。

最后,還需要將此腳本集成到Centreon平台上,以實現主機和服務的批量監控與批量報警。集成方法與上節介紹的集成check_ganglia.py的方法完全相同。

首選將check_host_regex.sh腳本放到/usr/lib64/nagios/plugins目錄下,然后授權:

[root@localhost plugins]# chmod 755 check_host_regex.sh

接着,在Centreon Web界面,選擇 Configuration—>Commands—>Checks,然后點擊Add新建一個Command,如下圖所示。

這里注意,“Enable shell”要選擇啟用。

然后,在Centreon Web界面選擇Configuration—>Services—>Services by host,點擊Add添加一個主機組服務,如下圖所示。

這里注意命令的引用以及命令中監控參數的寫法。其中,“172”是引用的參數,表示以172開頭的所有主機。“part_max_used,more,95”表示對磁盤分區最大占用空間做監控,當某分區或磁盤空間占用率超過95%,那么就告警。

在完成腳本集成后,重啟Centreon服務,即可實現主機和服務的批量監控與報警,通過批量的方式監控主機狀態。對於500台以上主機的運維環境來說,如果需要監控100個服務,那么每個腳本監控20個服務,5個腳本執行1次即可完成所有主機服務狀態的監控,大大減少了腳本的執行次數,同時每個腳本的執行時間也不會顯著加長。實踐證明,通過批量監控的方式基本解決了大運維環境下的監控報警性能問題。

下圖是Centreon在批量監控下的一個運行狀態截圖,通過此圖可以清晰地看出哪些主機出現了告警問題,以及服務上次檢測的時間和下次檢測的時間。

至此,在Centreon中實現批量數據收集和監控報警的方法已經介紹完畢。總體來說,都是借助現有的腳本稍作修改實現的,整個過程比較簡單。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM