Prometheus資源監控工具使用小結

前沿

有段時間沒有更新博客了,在保持低產這方面,我算是契而不捨了ε=ε=ε=ε=ε=ε=┌(; ̄◇ ̄)┘
雖然寫的東西已經爛大街,也算是一種回顧,這種心路歷程和對所寫東西的理解纔是本文中獨一無二的東西,照例會把參考文檔都寫到最後以供參考。

上篇中主要介紹了Prometheus的部署、配置;
本章主要介紹Prometheus的使用。
(再次強調看官方文檔的重要性)

主要包括5各部分:

  1. Prometheus介紹
  2. Prometheus 組成及架構
  3. PromQL使用
  4. 可視化
  5. 告警

每個部分不會盡善盡美,但足夠起到拋磚引玉的作用

Prometheus介紹

Prometheus是由SoundCloud開發的開源監控報警系統時序列數據庫(TSDB)。Prometheus使用Go語言開發,是Google BorgMon監控系統的開源版本。

其性能足夠支持上萬臺規模的集羣。

Prometheus的特點

  • 多維度數據模型。(所有的 metrics/指標數據 都可以設置任意的多維標籤,可以對數據模型進行聚合,切割和切片操作)
  • 靈活的查詢語言。(PromQL:在同一個查詢語句,可以對多個 metrics 進行乘法、加法、連接、取分數位等操作。)
  • 易於管理:Prometheus server 是一個單獨的二進制文件,可直接在本地工作,不依賴於分佈式存儲。
  • 通過基於HTTP的pull方式採集時序數據。 可以通過中間網關進行時序列數據推送。(Push Gateway)
  • 可以通過服務發現或者靜態配置去獲取監控的 targets。 支持多種多樣的圖表和界面展示,比如Grafana等。(可視化)

需要注意的是:由於數據採集可能會有丟失,所以 Prometheus 不適用對採集數據要 100% 準確的情形。但如果用於記錄時間序列數據,Prometheus 具有很大的查詢優勢,此外,Prometheus 適用於微服務的體系架構。

上面的介紹裏面有一些專屬的名詞數據,這些將在接下來進行介紹。

Prometheus基本原理

Prometheus的基本原理是通過HTTP協議週期性抓取被監控組件的狀態,任意組件只要提供對應的HTTP接口就可以接入監控。不需要任何SDK或者其他的集成過程。
這樣做非常適合做虛擬化環境監控系統,比如VM、Docker、Kubernetes等。輸出被監控組件信息的HTTP接口被叫做exporter 。目前互聯網公司常用的組件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系統信息(包括磁盤、內存、CPU、網絡等等)。

Prometheus的工作流程

Prometheus server 定期從配置好的 jobs 或者 exporters 中拉 metrics,或者接收來自 Pushgateway 發過來的 metrics,或者從其他的 Prometheus server 中拉 metrics。
Prometheus server 在本地存儲收集到的 metrics,並運行已定義好的 alert.rules,記錄新的時間序列或者向 Alertmanager 推送警報。
Alertmanager 根據配置文件,對接收到的警報進行處理,發出告警。
在圖形界面中,可視化採集數據。

Prometheus組成及架構

Prometheus架構
這個Prometheus及其套件的架構如圖所示。
(查找過一些架構圖,這張與我的理解最爲符合,)

Prometheus Server

先來看看圖上中間的Prometheus Server部分,其內部主要分爲三大塊:

  1. Retrieval是負責定時去暴露的目標頁面上去抓取採樣指標數據;
  2. Storage是負責將採樣數據寫磁盤;
  3. PromQL是Prometheus提供的查詢語言模塊,可以類比數據庫SQL語言

上面描述中多次提到metric,metric是Prometheus監控的基石,沒有metric,監控也就無從談起了。
首先metric長這樣:

上面就是Prometheus抓取的原始數據了,其中:

  • Metric name代表了一類的指標,他們可以攜帶不同的Label
  • 每個Metric name + Label組合成代表了一條時間序列的數據
  • timestamp代表當前抓取時刻的時間戳
  • value是指標數值

我們可以按照字面意思解讀一下圖中的一條數據:

http_request_total(status="200", method="GET") @14343317560938  94355

http_request_total應該是代表http請求總耗時,
括號裏的是過濾條件,及返回狀態200,方法爲GET的http請求。
最後的數據94355表示總耗時,單位爲微妙。

圖中的指標目的是記錄累計時間,他在Prometheus中被定義爲計數器類型,除此之外,Prometheus Metric還有以下類型:

  • Counter:只增不減的計數器,可以在應用程序中記錄某些事件發生的次數(e.g. http_requests_total,node_cpu)
  • Gauge:可增可減的儀表盤,這類指標側重於反應系統的當前狀態,因此指標的樣本數據可增可減。
  • Histogram、Summary:用於分析數據分佈情況(e.g. 監控CPU的平均使用率、頁面的平均響應時間)

Prometheus本身通過時間序列存儲數據(過去的數據一般是隻讀的,不會變更,當前時間的數據纔會可能在寫),存儲形式爲key-value,
使用了LevelDB的引擎(順序讀寫性能非常高,本質是SSTables,排序字符串列表)

Exporter採集器

在Prometheus的架構設計中,Prometheus Server並不直接服務監控特定的目標,其主要任務是負責數據的收集,存儲並且對外提供數據查詢支持。
因此爲了能夠能夠監控到某些東西,如主機的CPU使用率,我們需要使用到Exporter。Prometheus週期性的從Exporter暴露的HTTP服務地址(通常是/metrics)拉取監控樣本數據。

以node exporter爲例,搭載了node_expoter後,我們訪問:http://xxx.xx.xx.xx/metrics,可以看到如下信息:
在這裏插入圖片描述
其中HELP用於解釋當前指標的含義,TYPE則說明當前指標的數據類型。

其他組件

Client Library

客戶端庫,爲需要監控的服務生成相應的 metrics 並暴露給 Prometheus server。當 Prometheus server 來 pull 時,直接返回實時狀態的 metrics。

Push Gateway

主要用於短期的 jobs。由於這類 jobs 存在時間較短,可能在 Prometheus 來 pull 之前就消失了。爲此,這次 jobs 可以直接向 Prometheus server 端推送它們的 metrics。這種方式主要用於服務層面的 metrics,對於機器層面的 metrices,需要使用 node exporter。

Alertmanager

從 Prometheus server 端接收到 alerts 後,會進行去除重複數據,分組,並路由到對收的接受方式,發出報警。常見的接收方式有:電子郵件,pagerduty,OpsGenie, webhook 等。

PromQL

Promql介紹

通過PromQL我們可以非常方便地對監控樣本數據進行統計分析,PromQL支持常見的運算操作符,同時PromQL中還提供了大量的內置函數可以實現對數據的高級處理。

告警監控也是依賴PromQL實現的。

特性

這裏列舉一些PromQL的特性:

  • 可以直接使用指標名稱進行查詢
  • PromQL支持用戶根據時間序列的標籤匹配模式來對時間序列進行過濾,目前主要支持兩種匹配模式:完全匹配正則匹配
  • PromQL支持基於時間位移範圍內的查詢
  • PromQL直接支持用戶使用標量(Scalar)字符串(String)
  • PromQL能夠支持基礎的數學運算(加減乘除求餘求冪)及布爾運算集合運算
  • 內置聚合操作符,這些操作符作用域瞬時向量。可以將瞬時表達式返回的樣本數據進行聚合,形成一個新的時間序列。
  • 還有其他內置函數,用於對時序數據進行豐富的處理

PS : 所有的PromQL表達式都必須至少包含一個指標名稱(例如http_request_total),或者一個不會匹配到空字符串的標籤過濾器

下面將會一一介紹以下PromQL的這些特性。

完全匹配模式

完全匹配模式由PromQL通過 = 和 != 支持

  • 通過使用label=value可以選擇那些標籤滿足表達式定義的時間序列;
  • 反之使用label!=value則可以根據標籤匹配排除時間序列;
# 舉個例子
apiserver_request_total{instance="10.10.11.79:6443"}

使用正則表達式

PromQL還可以支持使用正則表達式作爲匹配條件,多個表達式之間使用|進行分離

  • 使用label=~regx表示選擇那些標籤符合正則表達式定義的時間序列;
  • 反之使用label!~regx進行排除
# 舉個例子
apiserver_request_total{instance!="10.10.11.79:6443", verb=~"CONNECT|WATCH"}

範圍查詢和時間位移

  • 使用區間向量表達式,使用時間範圍選擇器“[ ]”篩選時間區間,使用關鍵 字offset進行時間位移操作(改變查詢的時間基準)
  • 查詢支持的時間單位有:s/秒,m/分鐘,h/小時,d/天,w/周,y/年
# 舉個例子
apiserver_request_total{}[5m] offset 2d

聚合操作

Promql內置聚合操作符,這些操作符作用域瞬時向量。可以將瞬時表達式返回的樣本數據進行聚合,形成一個新的時間序列

基本的聚合函數

名稱 功能
sum 求和
min 最小值
max 最大值
avg 平均值
stddev 標準差
stdvar 標準差異
count 計數
count_values 對value計數
bottomk 後n條時序
topk 前n條時序
count 計數
quantile 分佈統計
itrae 計算增長率

其他就不一一列舉了,可前往官網查看

數學運算,布爾運算,集合運算

PromQL還支持豐富的操作符,用戶可以使用這些操作符對進一步的對事件序列進行二次加工。這些操作符包括:數學運算符,邏輯運算符,布爾運算符等等。

名稱 功能
+ 加法
- 減法
* 乘法
% 除法
^ 冪運算
== 等於
!= 不等於
> 大於
< 小於
>= 大於等於
<= 小於等於
and 加法
or 減法
less 乘法

可視化

Prometheus Graph界面介紹

Prometheus基礎界面如下所示
在這裏插入圖片描述

菜單

  • Alert:預警相關的信息,當監控指標滿足一定規則時,會產生預警信息
  • Graph:監控指標查詢界面,可輸入表達式查詢監控指標,查詢結果可以用簡單的圖表進行展示
  • Status:記錄Prometheus運行狀態,配置,集成的採集節點等信息
  • Help:Prometheus官方文檔鏈接

Status 子菜單

  • command-line flags:用來配置一些系統參數,比如數據存儲路徑,磁盤、內存的使用上限等;
  • Configuration:配置與採集節點相關的有所配置,以及要加載的規則文件
  • Rules:配置的規則展示
  • Targets:配置Exporter節點的展示
  • Service Discovery:用於發現服務
  • Help:Prometheus官方文檔鏈接

使用Grafana作爲Prometheus儀表盤

Grafana 是一款數據可視化看板,可指定多個數據源執行查詢,將枯燥的數據轉化爲多維度的面板。

Grafana的界面長這樣(如何部署請看上篇):
在這裏插入圖片描述
我們可以使用現成的Dashboard,也可以手動導入Metric配置自己的圖表

我這裏直接導入一個現成的圖表看看效果:
在這裏插入圖片描述
狂拽酷炫掉渣天的感覺

DashBoard的配置也需要花費較長時間去描述,這裏就不細講了。

告警(Alertmanager)

告警能力在Prometheus的架構中被劃分成兩個獨立的部分。通過在Prometheus中定義AlertRule(告警規則),Prometheus會週期性的對告警規則進行計算,如果滿足告警觸發條件就會向Alertmanager發送告警信息。
在這裏插入圖片描述
Alertmanager作爲一個獨立的組件,負責接收並處理來自Prometheus Server(也可以是其它的客戶端程序)的告警信息。Alertmanager可以對這些告警信息進行進一步的處理,比如:

  • 當接收到大量重複告警時能夠消除重複的告警信息(可以更加精準的定位問題,並且避免你的郵箱被告警郵件爆破(¬_¬))
  • 對告警信息進行分組並且路由到正確的通知方
  • 當不希望某種告警觸發時可以通過配置對告警進行靜默處理(不會發送告警通知)

一條典型的基於node_exporter的告警規則

groups:
- name: hostStatsAlert
  rules:
  - alert: InstanceDown  # 告警規則的名稱
    expr: up == 0  # 基於PromQL表達式告警觸發條件,用於計算是否有時間序列滿足該條件
    for: 1m  # 評估等待時間,可選參數。用於表示只有當觸發條件持續一段時間後才發送告警。在等待期間新產生告警的狀態爲pending。
    labels:  # 自定義標籤,允許用戶指定要附加到告警上的一組附加標籤。
      severity: page
    annotations:  # 用於指定一組附加信息,比如用於描述告警詳細信息的文字等,annotations的內容在告警產生時會一同作爲參數發送到Alertmanager。
      summary: "Instance {{$labels.instance}} down"
      description: "{{$labels.instance}} of job {{$labels.job}} has been down for more than 5 minutes."

這條配置的效果就是,當node exporter掛掉時,Alertmanager會發送預警信息

如何部署請看上篇 :)

告警郵件長這樣
在這裏插入圖片描述
Prometheus的基本介紹和使用就到此結束了,如果有什麼不明白的話,可以留言或者參考其他文檔

參考文檔

  1. Prometheus入門
  2. Prometheus實踐(IBM Developer)
  3. Prometheus-book
  4. Prometheus getting started
  5. 剖析Prometheus的內部存儲機制
  6. 《Designing Data-Intensive Applications》

今天發什麼圖好呢,來個彌豆子治癒一下( ̄~ ̄)
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章