5分鐘瞭解Prometheus

Prometheus(譯:普羅米修斯)用領先的開源監控解決方案爲你的指標和警報提供動力(賦能)。面試

在這裏插入圖片描述

1 概述

1.1. Prometheus是什麼正則表達式

Prometheus是一個開源的系統監控和警報工具包。自2012年啓動以來,許多公司和組織都採用了Prometheus,該項目擁有很是活躍的開發人員和用戶社區。它如今是一個獨立的開源項目,獨立於任何公司進行維護。Prometheus於2016年加入雲原生計算基金會,成爲繼Kubernetes以後的第二個託管項目。算法

1.1.1. Prometheus的主要特性:數據庫

一個多維數據模型,包含由指標名稱和鍵/值對(Tag)標識的時間序列數據express

PromQL是一種靈活的查詢語音,用於查詢並利用這些維度數據
不依賴分佈式存儲,單個服務器節點是自治的api

時間序列收集是經過HTTP上的pull模型進行的(支持Pull)瀏覽器

推送時間序列是經過一箇中間網關來支持的(也支持Push)服務器

目標是經過服務發現或靜態配置發現的網絡

多種模式的圖形和儀表盤支持架構

總結一下,就是多維數據模型、PromQL查詢語言、節點自治、HTTP主動拉取或者網關主動推送的方式獲取時間序列數據、自動發現目標、多種儀表盤支持

1.1.2. 組件:

Prometheus server,它負責抓取和存儲時間序列數據,是最主要的組件

client libraries,用於檢測應用程序代碼的客戶端庫

push gateway,用於支持短時間的jobs

exporters,用於支持HAProxy等第三方

alertmanager,用於處理告警

各類支持工具

大多數Prometheus組件都是用Go編寫的,這使得它們易於做爲靜態二進制文件構建和部署

1.1.3. 架構:

這張圖展現了架構及其生態系統的一些組成部分:
在這裏插入圖片描述

Prometheus從工具化的做業中獲取指標,要麼直接獲取,要麼經過中介推送網關獲取短時間做業。它在本地存儲全部抓取的樣本,並對這些數據應用規則將這些數據進行聚合,並記錄新的時間序列,或者生成警報。能夠用Grafana或其餘API來可視化收集的數據。

1.2. 何時用它合適

Prometheus能夠很好地記錄任何純數字時間序列。它既適合以機器爲中心的監視,也適合高度動態的面向服務的體系結構的監視。在微服務的世界中,它對多維數據收集和查詢的支持是一個特別的優點。

Prometheus是爲可靠性而設計的,在你的服務宕機的時候,你能夠快速診斷問題。每臺Prometheus服務器都是獨立的,不依賴於網絡存儲或其餘遠程服務。

1.3. 何時用它不合適

Prometheus的值的可靠性。你老是能夠查看有關係統的統計信息,即便在出現故障的狀況下也是如此。若是你須要100%的準確性,例如按請求計費,Prometheus不是一個好的選擇,由於收集的數據可能不夠詳細和完整。在這種狀況下,最好使用其餘系統來收集和分析用於計費的數據,並使用Prometheus來完成剩下的監視工做。

1.4. Prometheus VS InfluxDB

InfluxDB是一個開源的時間序列數據庫,具備擴展和集羣的商業選項。InfluxDB項目是在Prometheus開發開始將近一年後發佈的,因此當時沒法考慮將其做爲替代方案。儘管如此,Prometheus和fluxdb之間仍然存在顯著的差別。兩者有許多類似之處。二者都有標籤(在InfluxDB中稱爲tags)來有效地支持多維度度量。它們基本上使用相同的數據壓縮算法。二者都具備普遍的集成,包括彼此之間的集成。二者都有掛鉤,容許進一步擴展它們,例如在統計工具中分析數據或執行自動化操做。

下列狀況,用InfluxDB更好:

若是你正在進行事件日誌記錄

商業選項爲InfluxDB提供集羣,這對於長期數據存儲也更好

最終實現副本之間數據的一致性

下列狀況,用Prometheus更好:

若是你主要作的是度量

若是你須要更強大的查詢語言、警報和通知功能

更高的可用性和正常運行時間,用於繪圖和報警

InfluxDB由一家遵循開放核心模型的商業公司維護,提供高級特性,如閉源集羣、託管和支持。

Prometheus是一個徹底開源和獨立的項目,由許多公司和我的維護,其中一些還提供商業服務和支持。

2. 基本概念

2.1. 數據模型

Prometheus基本上將全部數據存儲爲時間序列:屬於同一指標和同一組標記維度的時間戳值流。除了存儲時間序列外,Prometheus還能夠根據查詢結果生成臨時派生的時間序列。

(PS:這裏對時間序列的解釋是這樣的,

time series: streams of timestamped values belonging to the same metric and the same set of labeled dimensions

2.1.1. Metric names and labels

Every time series is uniquely identified by its metric name and optional key-value pairs called labels.

(每一個時間序列都由其指標名稱和稱爲標籤的可選鍵值對惟一標識)

指標名稱指定要度量的系統的通常特性(例如,http_requests_total表示接收的HTTP請求的總數)。它可能包含ASCII字母和數字,以及下劃線和冒號。它必須匹配正則表達式a-zA-Z_:*

標籤名稱能夠包含ASCII字母、數字和下劃線。它們必須匹配正則表達式a-zA-Z_*。以__開頭的標籤名稱保留內部使用。

標籤值能夠包含任何Unicode字符。

2.1.2. Sample(樣本)

樣本構成實際的時間序列數據。每一個樣本包括:

a float64 value
a millisecond-precision timestamp

2.1.3. notation(記法)

給定一個度量名稱和一組標籤,時間序列一般使用如下符號標識:

<metric name>{<label name>=<label value>,...}

例如,有這樣一個時間序列,指標名稱是api_http_requests_total,有兩個標籤method="POST"和handler="/messages",那麼這個時間序列能夠這樣寫:

api_http_requests_total{method="POST", handler="/messages"}

2.2. metric types(指標類型)

2.2.1. Counter(計數器)

計數器是一個累積指標,它表示一個單調遞增的計數器,其值只能在重啓時遞增或重置爲零。例如,可使用計數器來表示已服務的請求數、已完成的任務數或錯誤數。不要使用計數器來反映一個可能會減少的值。例如,不要使用計數器表示當前正在運行的進程的數量,這種狀況下,你應該用gauge。

2.2.2. Gauge(計量器)

計量器表示一個能夠任意上下移動的數值。

計量器一般用於測量溫度或當前內存使用量等,也用於「計數」,好比並發請求的數量。

2.2.3. Histogram(直方圖、柱狀圖)

直方圖對觀察結果(一般是請求持續時間或響應大小之類的東西)進行採樣,並在可配置的桶中計數。它還提供了全部觀測值的和。

直方圖用一個基本的指標名<basename>暴露在一個抓取期間的多個時間序列:

觀察桶的累積計數器,格式爲<basename>_bucket{le="<upper inclusive bound>"}
全部觀測值的總和,格式爲<basename>_sum
已觀察到的事件的計數,格式爲<basename>_count

2.2.4. Summary(摘要)

與柱狀圖相似,摘要樣例觀察結果(一般是請求持續時間和響應大小之類的內容)。雖然它還提供了觀測值的總數和全部觀測值的總和,但它計算了一個滑動時間窗口上的可配置分位數。

2.3. Jobs AND Instances(做業與實例)

在Prometheus的術語中,能夠抓取的端點稱爲實例,一般對應於單個進程。具備相同目的的實例集合稱爲做業。

例如,一個API Server job 有4個副本instances:

job: api-server

instance 1: 1.2.3.4:5670
instance 2: 1.2.3.4:5671
instance 3: 5.6.7.8:5670
instance 4: 5.6.7.8:5671

2.3.1. 自動生成標籤和時間序列

當Prometheus抓取目標時,它會自動在抓取的時間序列上附加一些標籤,用來識別被抓取的目標:

job:目標所屬的已配置做業名稱
instance:<host>:<port>是被抓取的目標URL的一部分

  1. 快速開始

Prometheus是一個開源的系統監控和警報工具包,具備活躍的生態系統。

3.1. 下載與安裝
在這裏插入圖片描述

Prometheus是一個監控平臺,它經過抓取這些目標上的HTTP端點來收集被監控目標的指標。

須要下載、安裝並運行Prometheus。還須要下載並安裝一個exporter,它是將主機和服務上的時間序列數據導出的工具。

https://prometheus.io/download/

在運行Prometheus以前,咱們先配置一下

3.1.1. 配置Prometheus監視它本身

Prometheus經過抓取目標上的HTTP端點數據來從被監控的目標收集數據。因爲Prometheus也以一樣的方式公開本身的數據,所以它還能夠抓取和監測本身的健康情況。

雖然Prometheus服務器在實踐中只收集關於本身的數據不是頗有用,可是它是一個很好的開始示例。將如下基本的Prometheus配置保存爲一個名爲Prometheus.yml的文件:

1 global:

2   scrape_interval:     15s # By default, scrape targets every 15 seconds.
 3 
 4   # Attach these labels to any time series or alerts when communicating with
 5   # external systems (federation, remote storage, Alertmanager).
 6   external_labels:
 7     monitor: 'codelab-monitor'
 8 
 9 # A scrape configuration containing exactly one endpoint to scrape:
10 # Here it's Prometheus itself.
11 scrape_configs:
12   # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
13   - job_name: 'prometheus'
14 
15     # Override the global default and scrape targets from this job every 5 seconds.
16     scrape_interval: 5s
17 
18     static_configs:
19       - targets: ['localhost:9090']

3.1.2. 啓動Prometheus

1 # Start Prometheus.
2 # By default, Prometheus stores its database in ./data (flag --storage.tsdb.path).
3 ./prometheus --config.file=prometheus.yml

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

3.2. 配置

Prometheus能夠經過命令行和配置文件進行配置。配置文件定義了與抓取做業及其實例相關的全部內容,以及要加載哪些規則文件。

運行./prometheus -h能夠查看全部支持的命令

爲了指定要加載哪一個配置文件,請使用--config選項

配置文件是YAML格式的

配置項太多,不一一列舉,自行查看

https://prometheus.io/docs/pr...

global:

# How frequently to scrape targets by default.
   [ scrape_interval: <duration> | default = 1m ]
 
   # How long until a scrape request times out.
   [ scrape_timeout: <duration> | default = 10s ]
 
   # How frequently to evaluate rules.
   [ evaluation_interval: <duration> | default = 1m ]
 
   # The labels to add to any time series or alerts when communicating with
   # external systems (federation, remote storage, Alertmanager).
   external_labels:
     [ <labelname>: <labelvalue> ... ]
 
 # Rule files specifies a list of globs. Rules and alerts are read from
 # all matching files.
 rule_files:
   [ - <filepath_glob> ... ]
 
 # A list of scrape configurations.
 scrape_configs:
   [ - <scrape_config> ... ]
 
 # Alerting specifies settings related to the Alertmanager.
 alerting:
   alert_relabel_configs:
     [ - <relabel_config> ... ]
   alertmanagers:
     [ - <alertmanager_config> ... ]
 
 # Settings related to the remote write feature.
 remote_write:
   [ - <remote_write> ... ]
 
 # Settings related to the remote read feature.
 remote_read:
   [ - <remote_read> ... ]

這裏有一個有效的示例配置文件

3.3. 查詢

Prometheus提供了一種名爲PromQL(Prometheus查詢語言)的函數式查詢語言,容許用戶實時選擇和聚合時間序列數據。表達式的結果既能夠顯示爲圖形,也能夠在Prometheus的表達式瀏覽器中做爲表格數據查看,或者經過HTTP API由外部系統使用。

3.3.1. 表達式數據類型

在Prometheus的表達式語言中,表達式或子表達式能夠計算爲如下四種類型之一:

Instant vector(瞬時向量):一組時間序列,每一個時間序列包含一個樣本,全部樣本共享相同的時間戳

Range vector(範圍向量):一組時間序列,其中包含每一個時間序列隨時間變化的數據點範圍

Scalar(標量):一個簡單的數值浮點值

String(字符串):一個簡單的字符串值,目前未使用

3.3.2. 字面值

字符串字面值

字符串能夠指定爲單引號、雙引號或反引號中的文字。例如:

1 "this is a string"
2 'these are unescaped: \n \\ \t'
3 `these are not unescaped: \n ' " \t`

浮點數字面值

例如:-2.34

3.3.3. 時間序列選擇器

瞬時向量選擇器

瞬時向量選擇器容許在給定的時間戳(瞬時)上爲每一個時間序列選擇一組時間序列和一個樣本值:在最簡單的形式中,只指定一個度量名稱。這樣一個向量就會包含這個度量名稱的全部時間序列元素。

下面的例子,選擇指標名稱是http_requests_total的全部時間序列:

http_requests_total

經過在花括號({ })中添加一組匹配的標籤,能夠進一步過濾這些時間序列。

下面的例子,選擇指標名稱是http_requests_total,而且有job標籤值是prometheus,而且group標籤值是canary的時間序列:

http_requests_total{job="prometheus",group="canary"}

標籤匹配操做符:

= : 選擇與提供的字符串徹底相同的標籤(等於)
!= :選擇不等於提供的字符串的標籤(不等於)
=~ :正則匹配
!~ : 非正則匹配

下面的例子,選擇全部staging, testing, development環境,而且HTTP請求方式不是GET的http_requests_total時間序列

http_requests_total{environment=~"staging|testing|development",method!="GET"}
不要匹配空標籤

{job=~".+"}              # Good!
 {job=~".*",method="get"} # Good!

3.3.4. 範圍向量選擇器

範圍向量字面量的工做原理與瞬時向量字面量相似,只是它們從當前瞬時量中選擇一個樣本範圍。從語法上講,範圍持續時間被添加到向量選擇器末尾的方括號([ ])中,以指定應該爲每一個結果範圍向量元素獲取多少時間值。

時間期限指定爲一個數字,緊接其後的是下列單位之一:s(秒)、m(分鐘)、h(小時)、d(天) 、w(周)、y(年)

下面的例子,選擇指標名是http_requests_total,且job標籤值是prometheus的已經記錄的最近5分鐘內的時間序列:

http_requests_total{job="prometheus"}[5m]
Offset修飾符

下面的表達式返回http_requests_total在過去5分鐘相對於當前查詢計算時間的值:

http_requests_total offset 5m
注意,offset老是緊跟在選擇器後面的

sum(http_requests_total{method="GET"} offset 5m)
下面的例子,返回一週前的最近5分鐘http_requests_total的時間序列

rate(http_requests_total[5m] offset 1w)

3.3.5. 子查詢

Syntax: <instant_query> '[' <range> ':' [<resolution>] ']' [ offset <duration> ]

3.3.5. 運算符

Prometheus的查詢語言支持基本的邏輯運算符和算術運算符。

算術二元運算符

+(加)、-(減)、*(乘)、/(除)、%(餘數)、^(指數)

二進制算術運算符定義在標量/標量、向量/標量和向量/向量值對之間

比較二元運算符

== 、!= 、> 、< 、>= 、<=

邏輯運算符

and 、or 、unless

聚合運算符

sum(求和)、min(最小值)、max(最大值)、avg(求平均)、stddev(標準誤差)、stdvar(方差)、count(個數)、count_values(相同值的元素個數)、bottomk(樣本值的最小元素)、topk(樣本值的最大元素)、quantile(0 ≤ φ ≤ 1)

這些操做符既能夠用於聚合全部標籤維度,也能夠經過包含without子句或by子句來保存不一樣的維度。

1 <aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]

例如,假設http_requests_total有application 、 instance 、 group三個標籤,那麼下面兩個是等價的:

1 sum(http_requests_total) without (instance)
2 sum(http_requests_total) by (application, group)

3.3.6. 函數

https://prometheus.io/docs/pr...

3.3.7. 示例

1 # 返回http_requests_total的全部時間序列
 2 http_requests_total
 3 
 4 # 返回http_requests_total的且限定了job和handler標籤的時間序列
 5 http_requests_total{job="apiserver", handler="/api/comments"}
 6 http_requests_total{job="apiserver", handler="/api/comments"}[5m]
 7 
 8 # 正則表達式
 9 http_requests_total{job=~".*server"}
10 http_requests_total{status!~"4.."}
11 
12 # 過去的5分鐘內每秒HTTP請求速率
13 rate(http_requests_total{job="api-server"}[5m])
14 # 過去的30分鐘內每5分鐘
15 rate(http_requests_total[5m])[30m:1m]
16 # 過去5分鐘的全部請求速率求和,保留job維度
17 sum(rate(http_requests_total[5m])) by (job)
18 # cpu使用率最高的前3個
19 topk(3, sum(rate(instance_cpu_time_ns[5m])) by (app, proc))

4. Grafana支持

Grafana支持查詢Prometheus

下面是Grafana dashboard查詢Prometheus數據的例子:
在這裏插入圖片描述

使用

默認狀況下,Grafana監聽http://localhost:3000,默認用admin/admin登陸

建立一個Prometheus數據源,接着建立面板並定義查詢的指標
在這裏插入圖片描述

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

剛開始,若是不知道PromeQL怎麼寫,能夠去Prometheus上去找 http://localhost:9090/graph

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

※部分文章來源於網絡,若有侵權請聯繫刪除;更多文章和資料|點擊後方文字直達 ↓↓↓
100GPython自學資料包
阿里雲K8s實戰手冊
[阿里雲CDN排坑指南] CDN
ECS運維指南
DevOps實踐手冊
Hadoop大數據實戰手冊
Knative雲原生應用開發指南
OSS 運維實戰手冊
雲原生架構白皮書
Zabbix企業級分佈式監控系統源碼文檔
10G大廠面試題戳領
相關文章
相關標籤/搜索