Prometheus(譯:普羅米修斯)用領先的開源監控解決方案爲你的指標和警報提供動力(賦能)。面試
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.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的一部分
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))
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大廠面試題戳領