Prometheus 和 Grafana 是目前容器化環境中廣泛使用的監控工具組合。要有效監控叢集效能,首先需透過瀏覽器存取 Prometheus UI,觀察收集的統計資料。接著,將這些資料匯入 Grafana,藉助其視覺化功能開發更直觀的監控儀錶板。除了預設儀錶板,更可以根據需求建立自定義儀錶板,例如顯示容器 CPU 負載、記憶體使用率等。最後,整合 Alertmanager 可以根據設定的規則觸發警示,例如當容器資源使用率過高或服務中斷時傳送通知,進一步提升系統穩定性。

叢集監控工具實務應用與自定義儀錶板建立

在前述章節中,我們已經瞭解如何使用 Prometheus 和 Grafana 進行容器監控。本章節將探討如何實際操作這些工具,以及如何建立自定義的監控儀錶板。

步驟 1:存取 Prometheus UI

首先,我們需要存取 Prometheus 的使用者介面。請在瀏覽器中輸入 http://localhost:9090。點選 Execute 按鈕旁的下拉式選單,可以選擇不同的查詢陳述式來檢視收集到的統計資料。點選 Execute 後,即可看到查詢結果,如圖 10.15 所示。

圖 10.15:檢視收集統計資料

在圖 10.16 的範例中,我們選擇了 container_cpu_system_seconds_total 查詢陳述式。結果顯示了所有容器的總系統 CPU 時間消耗(以秒為單位)。

圖 10.16:容器結果:總系統 CPU 時間消耗

步驟 2:匯入 Prometheus 統計資料到 Grafana

雖然 Prometheus 提供了基本的監控資料,但其顯示效果有待改進。因此,我們將 Prometheus 的統計資料匯入 Grafana,以獲得更好的視覺化效果。首先,請在瀏覽器中輸入 http://localhost:3000 以存取 Grafana UI。使用預設的使用者名稱和密碼(admin/admin)登入。點選頂部的下拉式選單,選擇 Data Sources,然後點選 Dashboards 分頁,如圖 10.17 所示。

圖 10.17:編輯資料來源

在 Dashboards 分頁中,您應該已經看到了一個名為 Prometheus Stats 的條目。這是因為我們之前已經完成了資料來源的組態(如圖 10.14 所示)。點選 Prometheus Stats 條目右端的 Import 按鈕,即可匯入所有來自 Prometheus 資料函式庫的統計資料和事件。這個步驟只需執行一次;之後,Grafana 將自動在每次重新整理時提取新的資料。

點選 Prometheus Stats,即可檢視剛剛匯入的範例統計資料。您應該會看到新的、更具吸引力的儀錶板,如圖 10.18 所示。

圖 10.18:美觀的儀錶板

步驟 3:建立自定義儀錶板

接下來,我們將進一步建立一個簡單的自定義儀錶板,以顯示主機上容器的累積 CPU 負載。首先,請存取 Grafana UI,點選左上角的選單,選擇 Dashboards,然後點選 New,如圖 10.19 所示。

圖 10.19:建立自定義儀錶板

點選 Single Stat,並進行以下組態:

sum(rate(container_cpu_user_seconds_total{image!=""}[1m])) / count(node_cpu{mode="system"}) * 100

此查詢陳述式將提取某一時間點的 CPU 資源利用率,如圖 10.20 所示。該資料將即時更新。

圖 10.20:提取 CPU 資源利用率

同樣的方法也可以用來建立記憶體利用率和系統負載圖表,如圖 10.21 和圖 10.22 所示。

圖 10.21:提取記憶體負載

圖 10.22:提取系統負載

#### 程式碼解密:

  • sum(rate(container_cpu_user_seconds_total{image!=""}[1m])):計算容器在過去一分鐘內的 CPU 使用率總和。
  • count(node_cpu{mode="system"}):計算系統 CPU 的核心數。
  • 將 CPU 使用率總和除以 CPU 核心數,再乘以 100,即可得出 CPU 利用率的百分比。

步驟 4:整合 Alertmanager

最後,我們將 Alertmanager 整合到現有的組態中。Alertmanager 可以根據 Prometheus 中的資料收集結果組態警示。

首先,請在 Docker Compose 檔案中新增以下內容:

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
  labels:
    org.label-schema.group: "monitoring for PK containers"

然後,在 Prometheus 容器服務中新增 Alertmanager:

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'
  restart: unless-stopped
  expose:
    - 9090
  ports:
    - 9090:9090
  networks:
    - pk_network
  labels:
    org.label-schema.group: "monitoring for PK containers"

接下來,建立一個名為 container.rules 的規則檔案,以組態警示規則:

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_down 的警示規則。
  • IF absent(container_memory_usage_bytes{name="tomcat"}):如果 Tomcat 容器的記憶體使用量統計資料缺失,則觸發警示。
  • FOR 10s:持續時間為 10 秒。
  • LABELS { severity = "critical" }:將警示的嚴重性標記為 critical。
  • ANNOTATIONS:提供警示的詳細資訊,包括摘要和描述。

最後,將此規則新增到 Prometheus.yml 檔案中,並重新執行 Docker Compose 檔案。存取 Prometheus UI,點選頂部的 Alerts 分頁,即可檢視活動中的警示,如圖 10.23 所示。

圖 10.23:顯示活動中的警示

您可以進一步組態通知工具,以改善警示通知的功能。有關更多資訊,請參閱 Prometheus 網站:https://prometheus.io/。

本章節介紹瞭如何使用 Prometheus 和 Grafana 建立叢集監控工具,並整合 Alertmanager 以實作警示功能。這些工具和技術對於確保容器化應用的可靠性和效能至關重要。

第11章 案例研究:單體式幫助台應用程式

本章節將探討一個真實世界的幫助台應用程式,該程式為某手機供應商提供客戶支援服務。該應用程式具備以下功能:

功能概述

  • 帳戶管理:提供使用者帳戶管理功能(新增、修改、刪除),並透過本地資料函式庫的使用者名稱和密碼進行簡單驗證。
  • 事件建立與管理:允許提交新的事件,並可檢視和更新現有的事件。
  • 產品目錄管理(僅限管理員):儲存和管理根據銷售產品和庫存的產品目錄。
  • 約會設定:提供與支援專業人員安排約會的功能。
  • 搜尋:允許搜尋現有問題和解決方案,以及搜尋產品目錄。
  • 留言板:客戶社群論壇,供客戶相互協助。

技術堆疊

  • 使用者介面:HTML、JavaScript 和 JQuery
  • 中間層:Java 7、Spring 3.x、Jersey 1.8 和 Hibernate
  • 資料函式庫:MySQL 5.x

應用程式架構

圖11.1展示了該應用程式的元件式架構。可以看出,這是一個由資料函式庫、業務邏輯/服務和使用者介面組成 的三層架構應用程式。

認證、攔截器和授權

此模組提供服務以驗證使用者並根據其角色授權其存取資訊的級別。為了簡化,實作了根據資料函式庫使用者名稱/密碼的簡單認證和根據角色(資料函式庫使用者名稱和角色)的授權。使用 Spring 攔截器確保每個請求都經過認證。

認證服務

認證服務用於使用登入頁面文字欄位中的使用者名稱和密碼驗證使用者。使用者名稱/密碼對與資料函式庫中的條目進行匹配。

  • 上下文:authenticate
  • 方法:POST
  • 消耗:application/xml、application/json
  • 生成:application/json
  • 輸入:HttpHeaders、request
  • 輸出:回應狀態(即成功或失敗)
@Override
@POST
@Consumes({"application/xml", "application/json"})
@Produces({"application/json"})
@Path("/authenticate/")
public AuthenticationResponse authenticate(
    @Context HttpHeaders headers,
    AuthenticationRequest request) {
    // 待實作
}

攔截器

攔截器使用./*模式匹配攔截所有進入應用伺服器的請求,這有助於執行預處理函式。

<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 {
    // 待實作
}

授權

應用程式具有多個角色,當使用者登入時,其角色將作為攔截器邏輯的一部分儲存在HTTP會話中。以下程式碼片段用於在授權控制器中取得HTTP會話。

LoginForm userData = (LoginForm) context.getSession().getAttribute("LOGGEDIN_USER");
授權前端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 {
    // 服務實作
}

#### 內容解密:

  1. 認證服務

    • 使用@POST註解表明這是一個處理HTTP POST請求的方法。
    • @Consumes註解指定了該方法可以接受的媒體型別(application/xml 和 application/json)。
    • @Produces註解指定了該方法可以產生的媒體型別(application/json)。
    • @Path("/authenticate/")註解定義了該服務的URL路徑。
  2. 攔截器組態

    • 在Spring組態檔案中使用<interceptors>元素定義攔截器。
    • <mapping path="/*"/>表示攔截所有進入應用程式的請求。
  3. 攔截器實作

    • preHandle方法在請求被處理之前執行,用於進行身份驗證檢查。
  4. 授權邏輯

    • 從HTTP會話中取得登入使用者的資料,並根據其角色進行相應的操作。
  5. 帳戶管理服務

    • 提供了一系列管理使用者帳戶的服務,包括取得、新增、更新和刪除帳戶資訊。

以上是對幫助台應用程式架構和部分關鍵功能的技術解析。這些功能的實作確保了應用程式的安全性和功能的完整性。