Cacti 簡單自製圖表詳解


Cacti 簡單自製圖表詳解
一般人接觸Cacti時,總會覺得它好方便,設定一下,選單拉一拉,圖表就顯示出來了,但是一旦要開始自製圖表時,就會搞不清楚其設計理念及方式。本文簡單的示範一下如何製作出自訂的圖表。
且假設你已經知道如何安裝、設定並且能自行產生基本的趨勢記錄圖。
文章有點長。

本文使用的Cacti是0.8.8版本。



非經本人同意,請勿轉載,謝謝!

Cacti的建圖功能
在Cacti中,以SNMP建立新圖表,是最簡單的方式,在新裝好的環境中,你可以看內建到網卡的流量圖表:
看到資料有收進來,並畫出圖,表示這個Device已經能正常和Cacti通訊了,但是,如何能夠產生自製的圖表?
先試著不勞而獲
首先,可以到Cacti官網的Template區,下載別人已經包好的一些圖表,只要簡單的幾個動作,就能得到圖表。
網址:http://docs.cacti.net/templates
例如Cisco設備旳CPU使用量,就是別人貢獻的成果,只要設定正確,就能輕鬆抓到圖:


HP 伺服器的溫度報告:


萬一沒有人提供,或是特殊的需求(例如要記錄自己開發程式的資料),那就要自己動手做了。
了解Cacti收資料的流程
整個Cacti是經由Data Input Method和Data Query來收資料,並透過Data Template的定義,將資料存在RRD中;而顯示圖形的地方,則是透過Graph Template來定義其格式。真正的資料是放在Data Source中,經Graph顯示出來。而Data Input Method和Data Query中,又有很多種不同的方式可收資料,而以SNMP為起手是較簡單的方式,只要可以知道SNMP MIB,取得OID代表的意義,就可很方便的收資料進來。
會弄得這麼複雜的原因,是為了要將這段不同的步驟切開;同一個Graph Template在理論上,是可以給多個Data Template使用,在實際的使用上,通常是一個Data Template可對應到多個Graph Template。另外就是如果修改了Graph Template的設定,所有目前已經使用到該Template的圖,皆會跟著修改。但修改Data Template的話,似乎是不會修改已經現現存的RRD。
我們要建立一張新圖時,從頭到尾都要自行設計才行。
先來張無意義的圖表吧
為了要熟悉Cacti的架構,在此建立一張圖表,這張圖表本身沒有任何意義,它只是一張亂數產生的圖,我們的目的,只是要有一個資料的源頭來畫圖而已。這張圖中,會畫二條線出來。


從簡單的Data Input Method開始
和Data Query比起來,Data Input Method相對來說是較簡單的,初學者在開始設計自製的圖表時,也多會從Data Input Method下手。
Data Input Method提供了很多方式可以收資料:

  • SNMP:收取SNMP資料,需要知道OID
  • SNMP Query:(TBD)
  • Script/Command:執行主機的一支命令列程序
  • Script Query:(TBD)
  • Script – Script Server (PHP):由Poller執行主機的PHP Script命令列程序
  • Script Query – Script Server:(TBD)

說明中標示為(TBD)者:沒用過,請自行查相關資料。
Data Input Method的缺點是:只能提供靜態的資料項目回報;例如伺服器中的網路卡常不止一張,但每一台主機的網卡數又不一定是固定數量;又或者CPU的核心數,並不是每一台主機都相同,這時Data Input Method就不適合使用。
Data Input Method適合使用的時機為:能有明確數量的項資時使用,例如主機目前執行中的程序數量,一定是每一台主機只會有一個數值;又或者是主機的Loading,不管CPU有幾顆幾核心,Loading值永遠只有一個。


伺服器的Loading:一台主機只會有一張圖


使用Script/Command或是Script - Script Server (PHP)這二種方式傳回資料時,傳回的值需遵守以下的格式:
  • 項次一的標籤:項次一的值 項次二的標籤:項次二的值 項次三的標籤:項次三的值 …..
  • 傳回值和下一項次間,有個空白作為區別。項次的標籤不可重覆。



在此,我們先定義這次要實作的回傳值格式為:value1:nn value2:nn
那麼,開始實作這一段:
先選到ConsoleData Input Methods後,按右上角的「Add」:
接著在欄位中填入:
  • Name:Random Number Generator
  • Input Type:Script - Script Server (PHP)
  • Input String:<path_cacti>/scripts/gen_random.php rndnum <hostname>
  • Input String指的是要執行的PHP程式碼放在哪,通常我們會放在Cacti目錄的scripts中。gen_random.php就是要執行的PHP程式碼,後面帶的命令列格式如下:
  • gen_random.php procedure_name [parameter1] [parameter2] …..

其中procedure_name表示要執行這個程式碼中的哪個函式,後面跟著不限長度的參數,主要是供給函式使用。


按Create後,會變成如下的畫面。在此先定義好輸入的參數,按下在Input Fields右方的Add

欄位說明如下:
  • Field [Input]:這是下拉式選單,裡面有幾個欄位,完全由上面的Input String輸入內容而定
  • Friendly Name:這欄位讓人較易懂的說明
  • Allow Empty Input:是否允許空值,不建議勾選
  • Special Type Code:如果這欄位是Cacti內建的資料的話,可在此作對應,例如如果輸入在此輸入「hostname」,則Cacti會把Device中的host name傳給程式碼使用。

這例子中,只有一個輸入欄位,在輸入完後,按Create


接著在Output Fields中,按下「Add」:



我們在前面有提到,輸出的格式指定為「value1:nn value2:nn」,也就是回傳二個值,其標籤分別為value1及value2,輸入的資料如下:
  • Field [Output]:指定標籤名稱
  • Friendly Name:讓人易懂的說明文字
  • Update RRD File:輸出的資料是否要存進RRD中



Value1及value2皆輸入完成後,按Return回到Data Input Methods列表:



到此為止,Cacti已經知道要呼叫哪隻程式,傳什麼值給該程式,並且收什麼值回來。


Data Template決定資料如何儲存
在Data Template中,我們要決定收進來的資料是何種形式,並且定義其收取資料的間隔,資料如何「壓縮」等等,在爾後真的要收資料時,才能以正確的格式存在於RRD中。資料經PHP Script產生後,Cacti依據Data Input Method的定義收進來後,再依Data Templates的設定來儲存資料。



要產生新的Data Templates,先至ConsoleData Templates-->Add:


上半部輸入如下:
  • Data Templates [new] / Name:Data Template的名稱
  • Data Source  / Name:產生的Data Source名稱。這邊使用了一個系統變數 |host_description|,此變數會在實際上產生Data Source時,把Device中的host description帶入
  • Data Input Method:選擇Random Number Generator
  • Associated RRA's:選擇RRA的定義:按Ctrl+點擊來進行複選
  • Step:幾秒鐘收一次資料,內定是300秒。以Cacti來說,一開始裝完後,內定就是300秒收一次資料。




由於在Data Input Method中,我們定義了二個資料要儲存,在下方的欄位中,先輸入第一個輸入資料的定義:
  • Internal Data Source Name:內部的DS名稱,在此輸入dsValue1
  • Maximum Value ('U' for No Maximum):假設上限不知道,在此輸入U
  • Data Source Type:選擇GAUGE
  • Heartbeat:通常為Steps的一偣,在此輸入600

最後,按下「Create」




按下Create後,多了一個Output Field的對應欄,確認dsValue1這個Data Source是對應到「value1 - Output value 1」。下方的Hostname則為空白,代表系統直接代入Host name,按一下「Save」後,再按下「New」定義value2:


我們可以看到Data Source頁變成二個分頁,在新的分頁中,照著圖中所示的輸入資料後,按下「Save」;到此後資料的輸入定義已經完成

疑問依然存在
在Data Template定義好後,新手通常會有二個問題:
  • Associated RRA's是什麼東西?
  • Data Source Type 又是什麼?

在此分別解釋這二樣東西。
Data Source Type:數值來源的長相
Data Source Type中,有下列四種格式:
GAUGE、COUNTER、DERIVE、ABSOUUTE
  • GAUGE:每次傳回的值就是目前的值。應用的例子:可用的記憶體空間、磁碟機已經佔用空間、CPU使用量等。
  • COUNTER:計數器,意即這個值只會向上增加。應用的例子:開機時間、刷卡機使用次數、交易總量等等。
  • DERIVE:同COUNTER,但是這個值有可能會重置歸零。在一般的狀況下,如果資料是COUNTER的形態,建議直接使用DERIVE。
  • ABSOUUTE:傳回的傳是上一個值的相對應值的差異。例如 -1表示和上一個值比起來少了1。這種形式的值,通常是儀器較會有。

RRA:資料的間隔及濃縮定義
RRDTool對資料儲存的精神,在於儲存的資料在檔案系統中為固定大小,而且有著高效率的I/O效能。RRDTool的設計,我想應該是用來看所謂的趨勢走向,而不是詳細的記錄每一筆資料,如果要詳細的記錄每一筆資料,建議還是使用資料庫來儲存檔案。


假設資料每300秒抓一次,則隨著時間的推進,資料量會愈來愈多:

一天有1440分鐘,每五分鐘抓一筆資料的話,每天有288筆記錄,則一年有約10萬筆記錄,隨著時間拉長,資料會愈來愈多,相對的所佔用的空間就愈來愈大。
而RRDTool著重的是趨勢走向,故在設計上,並不需要詳細記錄每一筆資料,只要記錄大方向即可。例如每五分鐘收一筆資料,也許我們通常只會看二天內的資料,再來只會看個平均值,一星期內的資料,只要半小時平均的值就可以了,故我們可以把6個點濃縮成一個點:



依此類推,資料可以再度濃縮成每小時一筆資料:

這就是RRA的精神,定義適當的RRA是很重要的。以筆者的例子來說,和使用者在討論時,使用者通常都很堅持最詳細的資料存個半年三個月的長度,這對I/O的影響非常大,因為一旦定義好後,每一個新產生的圖的背後,都會產生一個龐大的RRD檔案;如果這檔案有用處還不要緊,可是使用者通常都不會去看半年前的某個時間點,發生了什麼事,最後還是會去看整個大趨勢。當然在設計RRA上,也可以一整個都不進行資料濃縮,要看當時的設計而定。


正常來說,例如網路流量這種東西,都是慢慢變多的,看幾個月前的某一時間點,通常不具意義。


RRA在定義時,可以存以下四種值:Max (此區間的最大值) 、Min (此區間的最小值) 、Last (此區間最後一點的值)及Avg (此區間的平均值)。通常要的資料,不會超出這四個值。
RRA如何定義
我建議依Cacti中的列表,先自行列出一個表格來進行定義:



可以先在如Excel隨便弄個表格,先定義好自己的濃縮標準,在此示範定義四種標準:
  • 5Min-Daily: 每五分鐘記一筆,記錄長度一天
  • 30Min-Weekly: 每30分鐘間隔記一筆,長度一星期
  • 2Hours-Monthly: 每二小時間隔記一筆,長度一個月
  • Day-Yearly: 每一天記一筆,長度一年


Steps、Rows、Timespan
RRA中最重要的是要定義好Steps、Rows及Timespan這三種資料:
  • Steps:在Data Template中,我們有定義一個Step是多少秒,這邊則是要定義每個RRA的間隔為幾個Step,以最初的5Min-Daily來說,Steps欄當然要設為1,意即最小的資料間隔。
  • Rows:定義該RRA要存幾筆資料,以5Min-Daily來說,如果要存一天,則要有1440/5=288筆資料,但是為了安全起見,可以多存一天,故可設為576
  • Timespan:定義時間超過幾秒後,該RRA可以進行濃縮。在RRDTool中,其實並沒有這欄位,而是取決於要儲存資料點的數量,即上一欄的Rows,在這邊Timespan通常和資料的儲存長度相對應,例如一天的話就是86400,一年的話算366天,為31,622,400秒。

我們可以把5Min-Daily的資料填入了:



再來要填30Min-Weekly,從5分鐘變30分鐘,意即濃縮了6個Steps,故Steps要填6,一星期有7天,每天有288/6=48筆,故Rows要填入48*7=336筆,最後Timespan可填入86400*7=604800,結果如下:



再來是2Hours-Monthly,二小時是5分鐘的24倍濃縮,故Steps要填入24,再用上面一樣的規則,把所有的資料填入:


填完的表格,直接輸入在Cacti的RRA設定即可。
1分鐘Cron下,跑5分鐘間隔的RRA

Cacti可以設定抓取資料的間隔到10秒,但通常使用者都是切換到1分鐘居多,但是有些資料並不需要每分鐘都抓,一定會有一分鐘間隔和五分鐘間隔的趨勢圖共存,在RRA的定義中,你不需要去管Cacti抓取資料的最小的間隔是多少,只要管在Data Template中定義的Step是多少就好,以5分鐘來說,Step就是300,如果是1分鐘間隔,Step就是60,故就算二者的每週資料,都是以30分鐘為單位,設定上就是不一樣:



建立Graph Templates
在Data Input Method及Data Template皆建立好後,我們可以開始來建立Graph Template了,一個Data Template可用於多個Graph template中:




要䢖立新的Graph Template,點選ConsoleGraph Templates-->Add


  • Name:圖形名稱輸入「Random Number Generator」
  • Title (--title): 圖的標題輸入「|host_description| - Random Number」
  • Width (--width):圖寬改為600
  • Base Value (--base): 這裡通常為1000或是1024,如果是資訊類類的單位,如位元組等,1K = 1024,如果是一般金額或是使用次數等,1K = 1000。
  • Vertical Label (--vertical-label): 垂直座標標籤,輸入「Value」

最後,接下「Create」





按下Create後,我們已經設定完圖形大體上的架構,再來要加上數列資料,按下「Graph Template Items [edit: Random Number Generator]」的「Add」



  • Data Source:選擇「Random Number Generator – (dsValue1)」,如果你的Data Template取不一樣的名稱,則要選你取的名稱
  • Color:隨便選一個,不要空白即可
  • Graph Item Type:選LINE1
  • Consolidation Function:選Average
  • Text Format:輸入「Value 1:」

按下「Create」



系統會顯示已經建好一筆資料,這筆資料是抓取Value1的值來畫線。我們再來需要在圖中顯示最大、目前和平均值的文字,再次按下「Add」

Data Source應該會自行帶出,我們只需要把Graph Item Type選為LEGEND後,按下「Create」即可:


系統自動幫我們帶出三筆資料:顯示LAST、AVERAGE和MAX的文字值


依上述方法,再把Value2加入,結果如下:



到此,Graph Template建立完成:




等等,PHP Script哪去了?
最初在設定Data Input Method時,有設定一支Script,這支程式是抓取資料的核心,再來說明簡單的程式內容。輸出的格式要符合「value1:nn value2:nn」,程式名稱「gen_random.php」。使用任何文字編輯器皆可以編輯程式碼,內容截圖如下:



程式碼中可看出,在程式碼中傳$host這來並沒有作用,因為在此主要只是要做一個示範而已。程式本身也非常的小,這支程式可看為Cacti PHP Script的簡單範本,爾後要增加新功能時,可直接拿它出來修改即可。
最後,檢視結果

所有的設定都完成後,可直接把它設定在Device上,等個約15分鐘可看到結果。先前在設定Data Template時,最小的間隔是5分鐘,故通常要15分鐘左右,才能知道有沒有正確的設定,也可看看Log有沒有顯示錯誤:



過了一會兒後,應該會變示數字出來,圖形還沒有畫出來:



***為了加快畫圖的速度,以下的圖形皆是每分鐘就畫一個點***
Cacti畫出的值,雖然最剛開始的值是整數,但是經RRDTool計算後,是有可能會變成有小數點的,想知道原因,可自行去參考RRDTool的文件。曾有龜毛的使用者表示非整數不可,雖然最後也有達到要求,但是其實這是沒有必要的,往往一開始使用者都會要求,但是後來都變成做白工的笑話。要注意Cacti看的是趨勢走向,如果要詳細的看每一點的資料的話,還是直接存資料庫吧!
畫了一段時間後,圖形已經很明顯了

修改Graph Template
我們可以修改Graph Template,相對應的圖形皆會變更。把value1和value2的Graph Item Type分別改成「AREA」和「STACK」:




圖形變成如下:value1和value2的圖變堆疊圖:



全改成AREA:





Value1設為AREA,value2設為LINE1




Value1改為LINE1,value2改為LINE3:


結語
Cacti自訂圖形其實非常的靈活,只要先設計好要取得什麼樣的資料,並能寫一支程式,將其資料傳給Cacti即可,而Data Template負責資料的定義,Graph Template負責資料的呈現,如果你能細細的讀完本文,相信你已經可以自行設計簡單的Cacti圖表了。不過你馬上就會發現用Data Input Method的缺點,例如前面提到的網路卡,或是磁碟空間等數量不固定的趨勢圖,單靠Data Input Method是畫不出來的,這時要使用Data Query。有關Data Query的使用法,在這荒蕪的部落格,並不一定會出現。
其它關於如何除錯的方法,網路上的資料其實也不多,另外還有比如CDEF的用法、外掛的Plugin等等,在此文章中都沒有說明,不過Cacti最近幾年來的變動不大,傳說中的大改版也不知何時出現,去官網討論區就能找到不少資料。


留言

這個網誌中的熱門文章

Google瀏覽器發生「錯誤107 (net::ERR_SSL_PROTOCOL_ERROR): SSL 通訊協定錯誤」的解決方式