為了即時掌握系統服務運作及相關資源使用的情況,本文將介紹一套好用的開源碼服務監控軟體Prometheus來監控服務,以及富有盛名的圖形處理軟體Grafana,並結合優異的Prometheus監控與Grafana圖形處理能力,實作出一個具有專業圖形輸出的服務監控解決方案。
為了能夠即時掌握系統上服務運作狀態及相關資源的使用情況,通常都會利用如Nagios等監控軟體來建構相關的監控系統,以便管理者能夠即時掌握系統服務運作的相關狀態。甚至可設定警告條件,一旦偵測到符合條件的事件發生就會通知管理者,以便及時處理。
因此,本文將先介紹一套好用的開源碼服務監控軟體Prometheus(https://prometheus.io/)來監控服務,另外還會介紹開源碼社群中富有盛名的圖形處理軟體Grafana(https://grafana.com/)。 最後,將會結合優異的Prometheus監控與Grafana圖形處理的能力,實作出一個具有專業圖形輸出的服務監控解決方案,而本次實作所使用的作業系統為CentOS Stream 9。
什麼是Prometheus
Prometheus是一套高效能的服務監控系統,可即時取得監控目標(例如主機上CPU資源或運作服務)的相關資訊進行處理。依其運作架構可分為:
Prometheus伺服器
Prometheus伺服器主要負責收取監控目標上的相關資訊,並提供簡單的圖形來呈現資訊,除此之外,也提供一個強大的查詢語言(PromQL)讓使用者能利用此類語言,更有彈性地取得監控目標的資訊。其主要特色說明如下:
一般情況下,人們接觸最多的資料庫應為關聯式資料庫(RDBMS),例如MySQL、MSSQL。但在某些情況下,傳統的RDBMS資料庫並無法適用,例如儲存並處理大量系統稽核紀錄(Log)的資訊。此類資訊由於其資訊量龐大,因此而衍生的儲存、查詢等應用上的問題,將不是RDBMS資料庫所能處理的。而此類資訊通常都具有時間序列(資料會隨著時間的推移而不斷地累積,而且在儲存後通常不會進行修改及刪除)的特性,為因應此類資訊的處理,而有TSDB(Time Series Database,時間序列資料庫)的面世。這是一種設計專門用來儲存及查詢時間序列的資料庫系統,除了應用資料壓縮功能來降低須使用的資料空間外,另外也使用如索引(Index)結構及採用如標籤(Labels)屬性查詢等技術來增進查詢資料的效能。此外,TSDB也部分保留如RDBMS資料庫所使用的統計相關函數(如計算平均值、最小值、最大值),讓管理者可輕易掌握相關統計資訊。
利用定期輪詢的方式,主動向監控的目標收集相關偵測的數據。
就如同SQL(Structured Query Language)語言所提供的結構化語言一樣,Prometheus提供了PromQL(Prometheus Query Language),讓使用者能夠快速地利用結構化語言來查詢相關監控的數據,由於PromQL主要是用來查詢時間序列型式資料庫的查詢語言,因此使用者可輕易地查詢某個時間區間的資訊,或利用算數運算符(如加、減)、布爾運算符(如AND、OR)來執行複雜的邏輯表達式。除此之外,也提供計算平均值及加總等統計函數來取得統計相關數據。甚至提供更進階的子查詢(Sub Query)功能,讓使用者可將不同的查詢組合在一起,以達到更複雜的應用。
除了可定時監控目標的運作外,更可自訂警告條件或門檻值(例如網路每秒超過多少流量即須警示),在符合警告條件的情況,就會以管理者所設定的方式(例如電子郵件)通知管理者。
除了Prometheus本身所提供的功能外,還提供彈性的第三方軟體的應用機制,可輕易地結第三方軟體來增強Prometheus的功能,在本文中即會結合Grafana軟體,為Prometheus提供專業的圖形顯示功能。
Prometheus Exporter
Prometheus伺服器主要功能是在於管理所收集到的資訊,而Exporter主要的功能則是用來取得監控目標的相關數據(如網路流量、記憶體使用率等),並提供給Prometheus進行後續的處理。因此,為因應不同的監控需求,而須有不同的Exporter,以下簡單地說明幾個常用的Exporter:
‧Node Exporter:這是本文所使用的Exporter,主要是用來監控主機系統上的網路傳輸和硬體資源使用狀況。
‧MySQLd_exporter:主要是用於監控MySQL資料庫伺服器的運作狀態,例如使用查詢的次數、資料庫伺服器所使用的系統資源狀態。
‧Apache Exporter:主要是用於監控Apache網站伺服器的運作狀態和日誌檔的統計數據,例如請求(Request)處理時間、錯誤處理比率等,可至「https://github.com/prometheus」取得更多的Exporter資訊。
安裝Prometheus
在簡單說明Prometheus相關功能後,接下來安裝Prometheus(本文使用的版本為2.47.0)。在此將直接利用Prometheus提供的執行檔(名稱為prometheus)和組態檔(名稱為prometheus.yml)進行安裝。
首先,建立Prometheus所使用的資料庫儲存目錄位置(在此為/usr/local/prometheus/data)。
接著,即可繼續設定組態檔(prometheus.yml),相關常用的組態如下例所示(其中#為註解說明):
global: #區段名稱 #設定取得監控目標資料的預設時間間隔, 如果未設定此選項,預設為每分鐘取得一 次,如下例為15秒 scrape_interval: 15s #設定取得監控目標資料的逾時時間,一旦 在時限內未取得相關資料,即不再擷取 scrape_timeout:10s #設定執行警告規則的逾時時間 evaluation_interval: 15s # Alertmanager configuration alerting: #設定警告伺服器的相關組態 alertmanagers: - static_configs: - targets: - alertmanager:9093 scrape_configs: #設定監控對象的相關資訊 - job_name: "prometheus" #設定監控對象的名稱,在此將 Prometheus伺服器視為一個監控對象 static_configs: - targets: ["localhost:9090"] #設定取得監控對象資料所使用 的主機位址及通訊埠口
在設定完成後,即可啟動Prometheus伺服器,執行如下指令:
prometheus --storage.tsdb.path="/ usr/local/prometheus/data/" http://localhost:9090
其中的--storage.tsdb.path參數為設定Prometheus伺服器所使用資料庫的儲存目錄位置,並使用HTTP通訊協定運作在本機上的9090埠。
啟動成功後,使用者可利用瀏覽器來連線至「http://localhost:9090」,應可取得如圖1所示的Prometheus伺服器的管理介面。
進行至此,已成功地執行Prometheus伺服器,但截至目前,此系統僅能算是一個空殼子,尚未針對任何監控目標進行監控,因此繼續安裝Exporter機制來取得相關的監控資訊。
在本文中,將安裝監控主機系統上相關資源運用(例如CPU、記憶體、磁碟空間等裝置的使用率)的Exporter,名稱為「Node Exporter」,在本文使用的版本為1.6.1。就如同安裝Prometheus一樣,直接至Node Exporter的官方網站取得執行檔(名稱為node_exporter)執行即可。
執行成功後,node_exporter同樣會預設以HTTP通訊協定運作在本機的通訊埠9100上。利用瀏覽器連線至「http://localhost:9100」即可取得如圖2所示的輸出。
再點選Metrics連結,就會顯示Node Exporter所取得文字型式的主機監控資訊。進行至此,個別的Prometheus伺服器與Node Exporter均已安裝完成。
最後,將Node Exporter整合進Prometheus伺服器來進行管理。整合步驟很簡單,僅須在prometheus.yml中的scrape_configs區段設定中新增工作(Job),如下所示:
scrape_configs: - job_name: 'node' #設定Node Exporter所顯示的名稱為node static_configs: - targets: ['localhost:9100'] #設定取得Node Exporter監控資料的 通訊埠資訊
而後,再重新啟動Prometheus伺服器及Node Exporter。在啟動成功後,可再利用Prometheus伺服器管理介面中的「open Metrics Explorer」功能來確認是否已成功整合Node Exporter,如圖3所示(須出現有node開頭的選項,每個選項即代表主機上的某些資源)。
至此,已經完成簡單的監控主機上資源使用的系統。
由於Prometheus伺服器主要的功能在於監控目標的資源,並未對呈現資料的輸出介面多所著墨。因此,接下來將安裝開源碼社群中頗富盛名的圖形處理軟體Grafana,利用其優異的圖形處理能力與Prometheus伺服器結合,提供類似儀表板的專業圖形化輸出。
什麼是Grafana
Grafana是一種圖形化處理軟體,可支援不同型式的來源資料數據,並以豐富的圖形來呈現相關數據,其主要功能如下所述:
提供多種類的資料數據
Grafana支援許多不同類型的資料庫資料,其中包括關聯式資料庫(例如MySQL、PostgreSQL)、時間序列資料庫(例如InfluxDB),此項功能可讓使用者更加方便地整合各種不同的資料庫資料進行分析。
多樣化的儀表板圖形支援
除了Grafana所自行定義的儀表板圖形,更可依據使用者的實際需求,利用所提供的圖表(例如折線圖或圓餅圖)來客製化儀表板圖形,使其更加貼近現實的圖形需求。
提供警報與通知
除了提供豐富的圖形功能外,也提供主動通知的警報系統,使用者可自行定義警報規則(例如每分鐘網路流量超過門檻值),一旦發現符合警報規則時,即可以利用事先定義的通知方式(例如電子郵件)來通知管理者。
彈性的第三方支援架構
提供外加第三方元件(plug_in)的功能,方便第三方開發者開發相關功能來延伸Grafana的功能。
跨平台
目前Grafana可在Linux、Windows和macOS等多個作業系統上運作。
安裝Grafana並開始監控
在簡單說明Grafana相關的功能後,接下來安裝Grafana。安裝過程很簡單,直接以RPM套件安裝即可,執行如下指令:
dnf -y install grafana
接著,即可以下指令啟動或關閉:
systemctl enable grafana-server #啟用Grafana伺服器 systemctl start grafana-server #啟動Grafana伺服器 systemctl stop grafana-server #關閉Grafana伺服器
在啟動成功後,利用以下的指令來檢查啟動情形:
systemctl status grafana-server
若畫面如圖4所示,就表示已啟動成功。
在啟動後,Grafana伺服器同樣地會以HTTP通訊協定運作於通訊埠3000。
接下來,使用瀏覽器連線至「http://localhost:3000」的設定介面,來設定Grafana伺服器的資料來源位置。連線後,首先會出現登入畫面,如圖5所示,在第一次執行時,預設的帳號和密碼均為admin。
在登入後,即可開始新增資料來源,如圖6所示,點選DATA SOURCES。
如圖7所示,接著選擇資料來源為Prometheus,表示要取得Prometheus伺服器的輸出資料。
然後,設定Prometheus的相關參數,如圖8所示,其中最重要的是設定Prometheus的服務位置,由於在本文中是將Prometheus安裝於本機上的9090埠且使用HTTP通訊協定,因此在此組態中會設定來源為「http://localhost:9090」,其餘的選項只要使用預設組態即可。
在設定資料來源完成後,接下來將選擇要套用的儀表板圖形,如圖9所示,點選其中的IMPORT。
接著,在「Import via grafana.com」輸入1860,這是Grafana為Node Exporter所設定的專用儀表板,如圖10所示。
最後,再設定相關的組態,設定此儀表板的資料來源為Promethus,如圖11所示。
在完成設定後,即可以儀表板的形式來顯示Node Exporter所取得的系統相關偵測資料,如圖12所示。
至此,已經完成利用Promethus與Grafana來實作一個具有專業圖形輸出的監控系統。
<本文作者:吳惠麟,多年資安經驗,喜好利用開源碼建構相關解決方案,著有「資訊安全原理與實驗」等書。>