下一代應用監控指標採集器Prometheus基礎介紹

Prometheus簡介

Prometheus是一個最初在SoundCloud上構建的開源系統監視和警報工具包 。自2012年成立以來,許多公司和組織都採用Prometheus,該項目擁有一個很是活躍的開發人員和用戶社區。它如今是一個獨立的開源項目。Prometheus於2016年加入谷歌主導的頂級開源社區雲原生計算基金會(CNCF),成爲第二個頂級託管項目。第一是大名鼎鼎的k8s。 prometheus是屬於下一代監控。可用來監控應用、容器、JVM、nginx 等nginx

特徵

普羅米修斯的主要特色是:正則表達式

  • 多維度數據模型(時序由metric名稱和k/v結構的labels構成)。
  • 靈活的查詢語句(PromQL)。
  • 無依賴存儲,支持本地和遠程。
  • 採用http協議,使用pull模式拉取數據。
  • 監控目標,能夠採用服務發現或靜態配置的方式。
  • 支持多種統計數據模型,圖形化友好。

組件

Prometheus生態系統由多個組件組成,其中許多組件是可選的,主要有:數據庫

  • Prometheus server - 收集和存儲時間序列數據
  • client library - 用於client訪問server/pushgateway
  • pushgateway - 對於短暫運行的任務,負責接收和緩存時間序列數據,同時也是一個數據源
  • exporter - 各類專用exporter,面向硬件、存儲、數據庫、HTTP服務等
  • alertmanager - 告警管理器,用以監控指標告警

架構

此圖說明了Prometheus的體系結構及其一些生態系統組件: api

Prometheus直接或者間接拉取應用的監控指標,彙總並轉化成自有的時間序列數據模型或者生成告警信息。提供api給具備可視化的一些UI展示層。緩存

適用場景

Prometheus在記錄時間序列的數據方面表現很是好。它既適用於面向服務器等硬件指標的監控,也適用於高動態的面向服務架構的監控。對於如今流行的微服務,Prometheus的多維度數據收集和數據篩選查詢語言也是很是的強大。Prometheus是爲服務的可靠性而設計的,當服務出現故障時,它可使你快速定位和診斷問題。它的搭建過程對硬件和服務沒有很強的依賴關係。
Prometheus的價值在於可靠性,甚至在很惡劣的環境下,你均可以隨時訪問它和查看系統服務各類指標的統計信息。 若是你對統計數據須要百分之百的精確,那麼Prometheus不是一個很好的選擇。服務器

即時向量選擇器

Prometheus存儲的是時序數據, 即按照相同時序(相同的名字和標籤),以時間維度存儲連續的數據的集合。時間序列由metric名稱和label組成,由於隨着時間而改變,因此時序數據都是向量。架構

    • metric 監控的指標名稱。名稱能夠包含ASCII字母、數字、下劃線和冒號,必須知足正則表達式 [a-zA-Z_:][a-zA-Z0-9_:]*, 其名字應該具備語義化,通常表示一個能夠度量的指標。假如咱們來度量http請求的總數,咱們能夠用http_requests_total來表示。
    • label 用來標識其所屬的metric的特性。由kv匹配表達式組成。好比上面的http_requests_total,若是咱們須要監控來自應用名稱爲myapp的應用時,咱們就能夠這樣來過濾出咱們想要的數據:http_requests_total{ appliaction="myapp",}

    若是有多個label用逗號隔開並以逗號結尾。app

    綜上所述,能夠概括出即時向量選擇器通用pattern爲:
    [metric name]{[label name]=[label value], ...}函數

    匹配運算符

    上面提到label是一個kv匹配表達式。並不侷限於 = 匹配。 如下是label的匹配運算符:微服務

    • = 選擇相同匹配。
    • != 選擇不等於匹配。
    • =~ 選擇正則表達式匹配。
    • !~ 選擇正則表達式不匹配。

    以下例子:

    http_requests_total{environment=~"prod|testing",method!="GET"}
    用來匹配生產或者測試環境,並且不是get請求的總請求數。

    範圍向量選擇器

    範圍向量選擇器與即時向量選擇器工做原理相同,只不過返回當前時間之前的一系列採樣。時間範圍由附加在向量選擇器尾部的[]指定,具體的值由數字和單位組成,時間單位包括:

    • s - 秒
    • m - 分鐘
    • h - 小時
    • d - 天
    • w - 星期
    • y - 年

    例如,返回5分鐘內metric名爲http_requests_total、job是prometheus的所有時間序列:

    http_requests_total{job="prometheus"}[5m]
    也就是若是咱們對即時向量要作範圍度量,能夠在其後用[rangTime] 來定義。

    偏移修改器

    offset修飾符容許在單個即時向量或範圍向量查詢中設置相對於當前時間的時間偏移。下面的表達式返回http_requests_total5分鐘前的值:

    http_requests_total offset 5m
    請注意語法上offset修飾符應緊跟在selector後面。

    內置函數

    函數
    內置函數不少,說幾個使用過的,其餘函數可參考https://prometheus.io/docs/pr...

    函數 功能
    rate 計算每秒平均值,僅適用於Counter,例如統計QPS
    sum 計算求和
    histogram_quantile 計算分位值

    時序類型

    Prometheus的時序數據分爲 Counter, Gauge, Histogram, Summary 四種類型:

    • Counter:計數器。只容許重置或者增長。咱們每每用它記錄服務請求總量,錯誤總數等。例如 Prometheus server 中 http_requests_total, 表示 Prometheus 處理的 http 請求總數,咱們可使用data, 很容易獲得任意區間數據的增量。
    • Gauge:表示蒐集的數據是一個瞬時的,與時間沒有關係,能夠任意變高變低,每每能夠用來記錄內存使用率、磁盤使用率等。表達一個瞬時的狀態。
    • Histogram: 採樣觀測值,可進行分位計算和數據聚合,計算在server端完成。一個名爲<basename>的metric,其histogram有3個固定的時間序列

      • <basename>_bucket 不一樣bucket下的觀測值的累加數量
      • <basename>_sum 觀測值的總和
      • <basename>_count 觀測值的數量
    • Summary:不是根據區間計算出來的而是直接統計一段區間的採樣結果。如請求持續時間或響應大小。不一樣於Histogram,該數值是在客戶端直接統計計算。由於沒有最初值,故而不能聚合。

    注意事項

    • 時間要對齊 大多數聚合的時間序列數據所對應的時間戳沒有對齊。因爲它們的獨立性,咱們須要在這些時間戳中選擇一個時間戳,並已這個時間戳爲基準,獲取小於且最接近這個時間戳的時間序列數據。
    • 數據過時 若是5分鐘內,沒有獲取到任何的時間序列數據,則這個時間戳不會存在。那麼在圖表中看到的數據都是在當前時刻5分鐘前的數據
    • 避免慢查詢和過載 若是一個查詢須要操做很是大的數據量,圖表繪製極可能會超時,或者服務器負載太高。因此對於一個選擇器指標來講須要儘量的精確度。簡而言之就是要儘量經過label來進行標記。

    關注公衆號:碼農小胖哥 獲取更多資訊

    相關文章
    相關標籤/搜索