返回文章列表

Prometheus現代監控方法與實踐

本文探討現代監控方法並詳盡介紹 Prometheus 的核心概念、架構設計、實作步驟及生態系統。從監控指標的收集、服務發現、警示管理到 Kubernetes 佈署,涵蓋 Prometheus 的完整生命週期,並提供程式碼範例與實務操作,協助讀者快速上手並應用於實際場景。

監控 DevOps

Prometheus 作為雲原生時代領先的監控解決方案,提供強大的時間序列資料收集和查詢功能,有效支援動態微服務架構的監控需求。其提取式機制簡化佈署,多維度資料模型則賦予高度靈活性。本文將探討 Prometheus 的核心概念,包含架構、資料模型、警示機制以及與 Kubernetes 的整合,並提供實際操作範例,幫助讀者建立穩固的監控體系。從指標收集到警示觸發,Prometheus 的完整生態系統確保應用程式和基礎設施的健康狀態得到全面監控,讓開發團隊能快速診斷和解決問題,提升系統穩定性。

現代監控方法與Prometheus簡介

在監控領域中,選擇適合的工具和方法對於實作有效的監控至關重要。本文將介紹現代監控方法,並重點介紹Prometheus這一領先的提取式監控工具。

為何選擇Prometheus?

Prometheus的誕生源自於Google的Borgmon系統。Borgmon是一個針對動態雲端和容器化微服務的即時監控系統。Prometheus由前Google SRE Matt T. Proud作為研究專案開發,後來在SoundCloud繼續開發並於2015年公開發布。

本文內容概述

本文旨在介紹一種良好的監控方法,並使用Prometheus來實作這一監控方法。書中內容涵蓋了從監控節點和容器指標、服務發現、警示、應用程式檢測到監控堆積疊(如Kubernetes)的各個方面。

本文章節安排

  • 第一章:介紹現代監控方法
  • 第二章:介紹Prometheus
  • 第三章:安裝Prometheus
  • 第四章:監控節點和容器
  • 第五章:服務發現
  • 第六章:警示和AlertManager
  • 第七章:擴充套件
  • 第八章:檢測應用程式
  • 第九章:日誌作為檢測手段
  • 第十章:探測
  • 第十一章:Pushgateway
  • 第十二章:監控堆積疊 - Kubernetes
  • 第十三章:監控堆積疊 - 應用程式

Prometheus架構與設計

Prometheus主要設計用於提供近乎即時的動態雲端和容器化微服務、服務和應用程式的內省監控。其資料模型根據時間序列資料,用於收集和儲存監控指標。

Prometheus的生態系統

Prometheus擁有豐富的生態系統,包括多種匯出器、客戶端函式庫和整合工具,能夠與多種技術堆積疊和環境相容。

Prometheus簡介

Prometheus的由來

Prometheus的靈感來自於Google的Borgmon。Borgmon是一個即時監控系統,用於識別問題和發出警示。雖然Borgmon未曾開源,但其設計理念對Prometheus的發展產生了深遠影響。

Prometheus的設計理念

Prometheus被設計為一個即時監控系統,專注於動態雲端和容器化環境。其主要特點包括:

  • 根據提取式的資料收集
  • 使用時間序列資料模型
  • 支援多維度資料收集和查詢

Prometheus生態系統

Prometheus擁有豐富的生態系統,包括多種客戶端函式庫、匯出器和整合工具,能夠與多種技術堆積疊和環境相容。

程式碼範例:使用Prometheus客戶端函式庫

from prometheus_client import Counter, start_http_server

# 定義一個計數器指標
counter = Counter('my_counter', 'An example counter')

def main():
    # 啟動HTTP伺服器
    start_http_server(8000)
    
    while True:
        # 增加計數器值
        counter.inc()

if __name__ == '__main__':
    main()

內容解密:

  1. 匯入必要的函式庫:程式碼首先從prometheus_client匯入Counter類別和start_http_server函式。
  2. 定義計數器指標:使用Counter類別定義一個名為my_counter的計數器指標,並提供一個描述字串。
  3. 啟動HTTP伺服器:在main函式中,呼叫start_http_server(8000)啟動一個HTTP伺服器,監聽8000埠,用於提供Prometheus指標。
  4. 增加計數器值:在無限迴圈中,呼叫counter.inc()增加計數器的值,模擬計數器的累積效果。

這個範例展示瞭如何使用Prometheus客戶端函式庫建立一個簡單的計數器指標,並透過HTTP伺服器提供給Prometheus伺服器抓取。

Prometheus 簡介

Prometheus 是為應對現代雲端原生應用程式的監控需求而設計的監控系統。它被廣泛應用於各類別企業,用於監控其基礎設施和應用程式。Prometheus 的設計理念是專注於即時的監控資料,而不是長期儲存歷史資料。這根據大多數監控查詢和警示都是根據最近的資料(通常小於一天)這一事實。

Prometheus 架構

Prometheus 的運作方式是透過抓取(scrape)或提取(pull)應用程式暴露的時間序列資料。這些資料通常透過客戶端函式庫或稱為 exporters 的代理程式,以 HTTP 端點的形式暴露出來。Prometheus 支援多種語言、框架和開源應用程式的客戶端函式庫和 exporters,例如 Apache 和 MySQL 等。

Metric 收集

Prometheus 稱可以被抓取的指標來源為 endpoint。通常,一個 endpoint 對應於一個單一的程式、主機、服務或應用程式。為了抓取一個 endpoint,Prometheus 定義了一個稱為 target 的組態,這包含了進行抓取所需的資訊,例如何連線、要套用的後設資料、連線所需的驗證資訊等。具有相同角色的 target 組成了一個 job,例如一組位於負載平衡器後面的 Apache 伺服器叢集。

服務發現

Prometheus 支援多種服務發現機制,包括靜態組態、檔案型發現、自動化發現(如查詢 Consul、AWS 或 Google Cloud 中的執行例項,或使用 DNS SRV 記錄)等。

聚合與警示

Prometheus 伺服器可以查詢和聚合時間序列資料,並建立規則以記錄常用的查詢和聚合結果。這使得使用者可以根據現有的時間序列資料建立新的時間序列,例如計算速率和比率,或生成匯總結果。Prometheus 還支援定義警示規則,當滿足特定條件時觸發警示。警示會被推播到 Alertmanager,由 Alertmanager 負責管理和分發警示。

查詢資料

Prometheus 提供了內建的查詢語言 PromQL,以及表示式瀏覽器和圖形介面,使用者可以利用這些工具探索伺服器上的資料。

自主性

每個 Prometheus 伺服器都被設計為盡可能自主。它能夠擴充套件到數百萬個時間序列,並且其資料儲存格式設計為減少磁碟使用量並提供快速檢索時間序列的能力。

冗餘和高用性

Prometheus 的冗餘和高用性設計主要關注警示還原能力,而不是資料永續性。建議佈署多個 Prometheus 伺服器到特定的用途和團隊,而不是單一的單體 Prometheus 伺服器。如果需要佈署在 HA 組態中,可以使用兩個或多個相同組態的 Prometheus 伺服器收集時間序列資料,並由高可用性的 Alertmanager 組態處理任何生成的警示。

@startuml
skinparam backgroundColor #FEFEFE
skinparam defaultTextAlignment center
skinparam rectangleBackgroundColor #F5F5F5
skinparam rectangleBorderColor #333333
skinparam arrowColor #333333

title 冗餘和高用性

rectangle "scrape" as node1
rectangle "push" as node2
rectangle "notify" as node3

node1 --> node2
node2 --> node3

@enduml

此圖示展示了 Prometheus 的基本架構,包括從 Targets 抓取資料和將警示推播到 Alertmanager。

資料模型

Prometheus 的資料模型是一種多維度時間序列資料模型,它結合了時間序列名稱和鍵值對(稱為標籤)。每個時間序列都由其名稱和標籤的組合唯一標識。

Metric 名稱

Metric 名稱描述了所收集的時間序列資料的一般性質。例如,website_visits_total 代表網站造訪總數。名稱可以包含 ASCII 字母、數字、下劃線和冒號。

內容解密:

  • Prometheus 使用多維度資料模型來處理時間序列資料。
  • Metric 名稱和標籤共同定義了一個時間序列。
  • 標籤提供了額外的維度,使得查詢和分析更加靈活。

Prometheus 簡介

Prometheus 的維度資料模型由標籤(Labels)提供支援。標籤為特定的時間序列增加了上下文。例如,total_website_visits 時間序列可以具有標籤,以識別網站的名稱、請求者的 IP 或其他具體識別該時間序列並將其與其來源連線的維度。Prometheus 可以查詢這些維度以選擇一個時間序列、一組時間序列或所有相關的時間序列。

標籤型別

標籤主要分為兩種型別:

  1. 儀表標籤(Instrumentation Labels):來自被監控的資源。例如,對於與 HTTP 相關的時間序列,標籤可能顯示所使用的特定 HTTP 動詞。這些標籤在被客戶端或匯出器抓取之前新增到時間序列中。

  2. 目標標籤(Target Labels):與架構相關。例如,可能識別時間序列來源的資料中心。目標標籤由 Prometheus 在抓取期間和之後新增。

標籤命名規則

  • 標籤名稱可以包含 ASCII 字母、數字和底線。
  • 以雙底線(__)為字首的標籤名稱保留給 Prometheus 內部使用。

時間序列表示法

時間序列由其名稱和標籤共同識別(雖然技術上名稱本身也是一個名為 __name__ 的標籤)。如果在時間序列上新增或更改標籤,Prometheus 將其視為新的時間序列。

時間序列表示範例

total_website_visits{site="MegaApp", location="NJ", instance="webserver", job="web"}

在這個範例中,total_website_visits 是時間序列名稱,而 {site="MegaApp", location="NJ", instance="webserver", job="web"} 則是附加的標籤鍵值對。大多數時間序列通常具有 instance 標籤,用於識別來源主機或應用程式,以及 job 標籤,包含抓取特定時間序列的作業名稱。

樣本(Samples)

時間序列的實際值稱為樣本,由以下組成:

  • 一個 float64 值。
  • 一個毫秒精確度的時間戳。

指標保留(Metrics Retention)

Prometheus 預設將時間序列資料儲存在本地資料函式庫中,保留期限為 15 天。若需要更長的保留期限,建議將所需資料傳送到遠端第三方平台。Prometheus 具有寫入外部資料儲存的能力。

安全模型

Prometheus 對信任做出兩個基本假設:

  1. 不受信任的使用者將能夠存取 Prometheus 伺服器的 HTTP API,從而存取資料函式庫中的所有資料。
  2. 只有受信任的使用者才能存取命令列、組態檔、規則檔以及 Prometheus 及其元件的執行階段組態。

由於 Prometheus 不提供伺服器端的身份驗證、授權或加密,因此在更安全的環境中,需要自行實施額外的控制措施,例如透過反向代理或代理匯出器來前端化 Prometheus 伺服器。

Prometheus 生態系統

Prometheus 生態系統包括由 Prometheus 專案本身提供的元件,以及豐富的開源整合和工具。主要元件包括:

  • Prometheus 伺服器:生態系統的核心,下章將詳細介紹。
  • Alertmanager:為 Prometheus 提供警示管理和引擎。
  • 匯出器(Exporters):用於對應用程式和服務進行檢測,並在端點上公開相關指標以供抓取。核心匯出器支援常見工具,如網頁伺服器、資料函式庫等。
  • 客戶端函式庫(Client Libraries):用於對多種語言編寫的應用程式和服務進行檢測,包括 Python、Ruby、Go 和 Java 等常見選擇。

Prometheus 安裝與快速上手

Prometheus 是一款強大的開源監控系統,本文將介紹如何在不同平台上安裝 Prometheus,並對其基本組態進行說明。

在 Linux 上安裝 Prometheus

  1. 下載 Prometheus 二進位制檔案:首先,我們需要從 Prometheus 的官方下載頁面取得適合 Linux 平台的二進位制檔案。可以使用 wgetcurl 命令下載。

    $ cd /tmp
    $ wget https://github.com/prometheus/prometheus/releases/download/v2.3.0/prometheus-2.3.0.linux-amd64.tar.gz
    
  2. 解壓並安裝 Prometheus:下載完成後,解壓縮檔案並將 Prometheus 二進位制檔案複製到適當的目錄,如 /usr/local/bin/

    $ tar -xzf prometheus-2.3.0.linux-amd64.tar.gz
    $ sudo cp prometheus-2.3.0.linux-amd64/prometheus /usr/local/bin/
    $ sudo cp prometheus-2.3.0.linux-amd64/promtool /usr/local/bin/
    
  3. 驗證安裝:透過執行 --version 引數來檢查 Prometheus 是否正確安裝。

    $ prometheus --version
    prometheus, version 2.3.0 (branch: HEAD, revision: 3569eef8b1bc062bb5df43181b938277818f365b)
    build user: root@bd4857492255
    build date: 20171006-22:16:15
    go version: go1.9.1
    

內容解密:

  • 使用 wget 下載 Prometheus 的壓縮檔。
  • 透過 tar 命令解壓縮檔案。
  • prometheuspromtool 複製到 /usr/local/bin/ 目錄下,以便於在任何路徑下執行。
  • 使用 --version 引數驗證 Prometheus 版本,確認安裝成功。

在 Microsoft Windows 上安裝 Prometheus

  1. 建立目錄並下載 Prometheus:首先,在 Windows 上建立一個目錄用於存放 Prometheus 的執行檔。然後從官方網站下載 Windows 版本的 Prometheus。

    C:\> MKDIR prometheus
    C:\> CD prometheus
    
  2. 解壓縮並設定路徑:使用工具如 7-Zip 解壓縮下載的檔案,並將內容複製到 C:\prometheus 目錄。最後,將 C:\prometheus 新增至系統路徑中。

    $env:Path += ";C:\prometheus"
    
  3. 驗證安裝:執行 prometheus.exe --version 以確認安裝成功。

內容解密:

  • 在 Windows 上建立一個名為 prometheus 的目錄。
  • 下載並解壓縮 Windows 版本的 Prometheus 到該目錄。
  • 將該目錄新增至系統路徑,以便於在任何位置執行 prometheus.exe
  • 執行 --version 引數來驗證版本。

在 Mac OS X 上安裝 Prometheus

Mac OS X 使用者可以使用 Homebrew 來安裝 Prometheus。

$ brew install prometheus

安裝完成後,可以透過 prometheus --version 命令來驗證安裝。

內容解密:

  • 使用 Homebrew 安裝 Prometheus。
  • Homebrew 會將 prometheus 二進位制檔案安裝在 /usr/local/bin/ 目錄下。
  • 執行 --version 檢查版本,確認安裝成功。

使用組態管理工具安裝 Prometheus

對於生產環境,建議使用組態管理工具(如 Puppet、Chef、Ansible 或 SaltStack)來安裝和管理 Prometheus,以確保佈署的一致性和可重複性。

內容解密:

  • Puppet、Chef、Ansible 和 SaltStack 都提供了相應的模組或配方來安裝 Prometheus。
  • 使用組態管理工具可以簡化佈署流程,提高管理效率。

在 Kubernetes 上佈署 Prometheus

在 Kubernetes 上佈署 Prometheus 有多種方式,最適合的方法取決於您的環境。您可以建立自己的佈署並透過服務公開 Prometheus,使用多種捆綁組態之一,或使用來自 CoreOS 的 Prometheus Operator。