Prometheus 和 Grafana 的組合在現代叢集監控中扮演著至關重要的角色。本文旨在提供一個實踐,引導讀者從零開始搭建一套根據 Prometheus 和 Grafana 的監控系統。首先,我們會介紹如何使用 Prometheus 查詢容器的 CPU 使用情況等基礎指標。接著,將重點放在如何利用 Grafana 的視覺化能力,將 Prometheus 收集的資料以更直觀的圖表形式呈現,例如建立儀錶板來顯示容器 CPU 載荷。更進一步,我們將探討如何整合 Alertmanager,組態告警規則,以便在系統出現異常時及時收到通知,例如設定 Tomcat 服務中斷的告警。最後,我們會簡要介紹其他可監控的指標,例如記憶體使用率和系統負載,並提供一些常用的 Prometheus 查詢語法。
下一步
未來可以進一步探索如何最佳化監控系統、設定警示規則以及更深入地利用 Grafana 的視覺化功能來提升系統管理效率。
使用 Prometheus 與 Grafana 進行叢集監控
在現代的雲端與容器化環境中,叢集監控是維持系統穩定性與可靠性的關鍵。Prometheus 與 Grafana 是目前最受歡迎的開源監控解決方案,本文將探討如何利用這兩者來實作叢集的全面監控。我們將從 Prometheus 的基本操作開始,進一步展示如何將資料匯入 Grafana 進行視覺化展示,最後介紹如何整合 Alertmanager 來設定告警機制。
Prometheus 基本操作
首先,我們需要啟動 Prometheus 的使用者介面。存取 http://localhost:9090 即可進入 Prometheus 的首頁面。在這裡,我們可以選擇並執行各種查詢來檢視收集的統計資料。例如,我們可以選擇 container_cpu_system_seconds_total 查詢來檢視所有容器的系統 CPU 時間消耗。
container_cpu_system_seconds_total
內容解密:
- container_cpu_system_seconds_total:這個查詢會傳回所有容器的系統 CPU 時間消耗總和,單位為秒。
- 使用場景:這對於監控容器的 CPU 使用情況非常有幫助,可以幫助我們瞭解哪些容器在消耗大量的系統資源。
提升視覺化效果:將 Prometheus 資料匯入 Grafana
儘管 Prometheus 提供了豐富的資料查詢功能,但其介面並不友好。此時,Grafana 的出現就顯得尤為重要。Grafana 是一個強大的圖表化工具,能夠將 Prometheus 收集到的資料以更直觀的方式展示出來。
步驟一:啟動 Grafana 介面
存取 http://localhost:3000 進入 Grafana 的登入頁面。使用預設的登入憑證 admin/admin 登入。
步驟二:新增資料來源
登入成功後,點選頁面頂部的下拉選單,選擇「Data Sources」。在這裡我們可以看到之前組態好的 Prometheus 資料來源。
步驟三:匯入圖表
點選「Dashboards」標籤,選擇「Import」按鈕來匯入 Prometheus 的統計資料和事件。這一步只需執行一次,之後 Grafana 會自動重新整理並提取最新資料。
內容解密:
- Grafana:是一個開源的圖表化工具,能夠將資料視覺化展示。
- Prometheus 資料來源:我們需要先在 Grafana 中組態好 Prometheus 作為資料來源,才能匯入相關圖表。
- 自動重新整理:匯入後,Grafana 會自動重新整理並提取最新資料,無需手動操作。
自定義展示容器 CPU 載荷
接下來,我們將建立一個簡單的自定義圖表來展示容器在主機上的累積 CPU 載荷。這樣可以幫助我們更直觀地瞭解容器的資源使用情況。
步驟一:建立新圖表
在 Grafana 的頁面頂部選單中選擇「Dashboards」,點選「New」來建立新圖表。
步驟二:組態查詢
選擇「Single Stat」圖表型別,並組態以下查詢:
sum(rate(container_cpu_user_seconds_total{image!=""}[1m])) /
count(node_cpu{mode="system"}) * 100
內容解密:
- sum(rate(…)):這個查詢會計算一分鐘內容器 CPU 的使用率。
- count(node_cpu{mode=“system”}):計算系統模式下的 CPU 數量。
- 自定義圖表:透過組態這些查詢,我們可以建立出適合自己需求的圖表。
其他監控指標
除了 CPU 載荷之外,我們還可以監控記憶體使用率和系統負載等指標。以下是一些其他常見的監控指標範例:
# 檢索記憶體使用率
container_memory_usage_bytes{image!=""}
# 檢索系統負載
node_load1
node_load5
node_load15
內容解密:
- container_memory_usage_bytes:這個查詢會傳回所有容器的記憶體使用情況。
- node_load1、node_load5、node_load15:這些查詢會傳回系統負載平均值(過去1分鐘、5分鐘、15分鐘)。
整合 Alertmanager 告警系統
最後,我們需要整合 Alertmanager 來設定告警機制。Alertmanager 能夠根據 Prometheus 收集到的資料發出告警通知。
步驟一:修改 Docker Compose 組態檔案
在 Docker Compose 組態檔案中新增 Alertmanager 的服務:
alertmanager:
image: prom/alertmanager
container_name: alertmanager_pk
volumes:
- ./alertmanager/:/etc/alertmanager/
command:
- '-config.file=/etc/alertmanager/config.yml'
- '-storage.path=/alertmanager'
restart: unless-stopped
expose:
- 9093
ports:
- 9093:9093
networks:
- pk_network
步驟二:修改 Prometheus 組態檔案
在 Prometheus 組態檔案中新增 Alertmanager 的 URL:
prometheus:
image: prom/prometheus
container_name: prometheus_pk
volumes:
- ./prometheus/:/etc/prometheus/
- prometheus_data:/prometheus
command:
- '-config.file=/etc/prometheus/prometheus.yml'
- '-storage.local.path=/prometheus'
- '-alertmanager.url=http://alertmanager:9093'
- '-storage.local.memory-chunks=100000'
內容解密:
- Alertmanager:是一個強大的告警管理工具,能夠根據收集到的資料發出告警通知。
- Docker Compose 組態:需要在 Docker Compose 組態檔案中新增 Alertmanager 的服務。
- Prometheus 組態:需要在 Prometheus 組態檔案中新增 Alertmanager 的 URL。
建立告警規則
接下來,我們需要建立一些告警規則來監控特定應用程式(例如 Tomcat)。以下是一個範例規則:
ALERT tomcat_down
IF absent(container_memory_usage_bytes{name="tomcat"})
FOR 10s
LABELS { severity = "critical" }
ANNOTATIONS {
summary= "tomcat down",
description= "tomcat container is down for more than 10 seconds."
}
內容解密:
- ALERT tomcat_down:這是一個告警規則,用於檢測 Tomcat 的狀態。
- IF absent(…):如果 Tomcat 的記憶體使用情況資料缺失超過10秒鐘。
- LABELS 和 ANNOTATIONS:這些標籤和註解用於描述告警資訊。
測試告警機制
最後,執行 Docker Compose 組態檔案並重啟相關服務:
docker-compose up –d
存取 http://localhost:9090 ,點選頂部的「Alerts」選單即可檢視活躍中的告警通知。
內容解密:
- docker-compose up –d:重啟 Docker Compose 中定義好的服務。
- 活躍告警通知:可以透過存取 Prometheus 告警頁面來檢視當前活躍中的告警通知。
叢集監控的重要性
監控是維持系統穩定性與可靠性的關鍵環節。無論是在傳統應用還是現代雲端與容器化環境中,都需要實施有效的監控策略。Prometheus 與 Grafana 提供了強大且靈活的工具來實作叢集級別的監控與告警管理。透過這些工具,我們可以更好地瞭解系統運作狀況、及時發現問題並採取相應措施。
在未來的技術發展中,隨著更多新型監控工具和方法的出現,我們必須保持學習與探索精神。只有不斷提升技術水平與專業能力才能應對日益複雜多變的技術挑戰。
認識幫助台應用程式的單體架構
在現實世界中,這個幫助台應用程式為手機供應商提供客戶支援。它具備以下功能:
- 帳戶管理:提供使用者帳戶管理功能(新增/修改/刪除)。身份驗證透過本地資料函式庫中的使用者名稱和密碼來簡化操作。
- 事件建立與管理:允許提交新事件並檢視和更新現有事件。
- 產品目錄管理(僅限管理員):儲存和管理根據所售產品和庫存的產品目錄。
- 預約設定:允許與支援專業人員安排預約。
- 搜尋功能:允許搜尋現有問題及解決方案,以及搜尋產品目錄。
- 訊息板:客戶社群板供客戶合作互助。
技術架構
我們將使用以下技術來構建這個應用程式:
- 使用者介面:HTML、JavaScript 和 jQuery
- 中介層:Java 7、Spring 3.x、Jersey 1.8 和 Hibernate
- 資料函式庫:MySQL 5.x
透過參考附錄 A,可以更好地瞭解應用程式的工作流程和逐步過程。所有的程式碼和資源都可在 GitHub 儲存函式庫中找到:https://github.com/kocherMSD/Helpdesk_Monolithic.git。你可以使用 git clone 指令將程式碼複製到本機。
應用程式架構
瞭解了應用程式的使用方式後,讓我們探討其技術細節。此圖示展示了應用程式的元件基礎架構:
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title Prometheus 與 Grafana 叢集監控及告警機制實踐
package "資料庫架構" {
package "應用層" {
component [連線池] as pool
component [ORM 框架] as orm
}
package "資料庫引擎" {
component [查詢解析器] as parser
component [優化器] as optimizer
component [執行引擎] as executor
}
package "儲存層" {
database [主資料庫] as master
database [讀取副本] as replica
database [快取層] as cache
}
}
pool --> orm : 管理連線
orm --> parser : SQL 查詢
parser --> optimizer : 解析樹
optimizer --> executor : 執行計畫
executor --> master : 寫入操作
executor --> replica : 讀取操作
cache --> executor : 快取命中
master --> replica : 資料同步
note right of cache
Redis/Memcached
減少資料庫負載
end note
@enduml
此圖示展示了三層架構的應用程式,包含資料函式庫、業務邏輯/服務和使用者介面。接下來,我們來看看應用程式的一些主要服務。
身份驗證、攔截器與授權
這個模組提供身份驗證服務,並根據使用者角色授權他們可以存取的資訊等級。為了簡化操作,我們實作了簡單的身份驗證(本地資料函式庫中的使用者名稱/密碼)和角色基礎的授權(本地資料函式庫中的使用者名稱和角色)。我們使用 Spring 攔截器確保每個請求都經過身份驗證。角色和登入資訊會儲存在會話中,並在需要時從會話中取出。
身份驗證服務
以下是身份驗證服務的偽碼:
@Override
@POST
@Consumes({"application/xml", "application/json"})
@Produces({"application/json"})
@Path("/authenticate/")
public AuthenticationResponse authenticate(
@Context HttpHeaders headers,
AuthenticationRequest request)
{
// To-do: 實作身份驗證邏輯
}
攔截器
攔截器會攔截所有進入應用伺服器的請求,使用 ./* 模式比對來執行前置處理函式。以下是 Spring 的偽碼:
<interceptors>
<interceptor>
<mapping path="/*"/>
<beans:bean class="org.spring.controller.AuthenticationInterceptor">
<!-- 組態 -->
</beans:bean>
</interceptor>
</interceptors>
@Override
public boolean preHandle(
HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
// To-do: 實作攔截邏輯
}
授權
我們的應用程式擁有多個角色,當使用者登入時,他們的角色會作為攔截器邏輯的一部分儲存在 HTTP 會話中。以下是從授權控制器取出 HTTP 會話的程式碼片段:
LoginForm userData = (LoginForm)
context.getSession().getAttribute("LOGGEDIN_USER");
以下是前端 JavaServer Pages (JSP) 的授權程式碼片段:
<%
LoginForm loginform = (LoginForm)session.getAttribute("LOGGEDIN_USER");
String user = loginform.getUsername();
if (session.getAttribute("ACCESS_LEVEL").equals("4")) {
%>
帳戶管理
這個元件提供與管理使用者帳戶相關的服務,包括相關合約或授權詳細資訊、購買詳細資訊(如產品資訊、序列號等)。例如,客戶可能購買了一或多部手機,並附帶保修和專業支援服務。這些詳細資訊將透過 API 提供給授權檢查和支援。以下是提供的服務:
getAccount:取得已上線使用者的詳細資訊。addAccount:上線新使用者。updateAccount:更新現有已上線使用者。deleteAccount:從系統中移除現有使用者。
以下是服務類別的簽名:
@Component
@Path("/AccountService")
public class AccountServiceImpl implements AccountService {
// 實作各項方法
}
常見問題解答(FAQ)
如何將幫助台應用程式佈署到本機?
你可以透過 GitHub 儲存函式庫複製程式碼到本機並進行佈署。具體步驟如下:
- 克隆 GitHub 儲存函式庫:
git clone https://github.com/kocherMSD/Helpdesk_Monolithic.git - 進入儲存函式庫目錄:
cd Helpdesk_Monolithic - 根據需要組態資料函式庫連線等設定。
- 執行應用程式。
應用程式如何處理身份驗證?
應用程式透過 Spring 攔截器確保每個請求都經過身份驗證。登入時,角色和登入資訊會儲存在 HTTP 會話中,並在需要時從會話中取出。
帳戶管理模組提供哪些服務?
帳戶管理模組提供了 getAccount、addAccount、updateAccount 和 deleteAccount 四項服務,分別用於取得已上線使用者的詳細資訊、上線新使用者、更新現有已上線使用者以及從系統中移除現有使用者。
希望這些內容能夠幫助你更好地理解幫助台應用程式的單體架構及其功能。如果有任何問題或需要進一步協助,歡迎隨時聯絡我們!