主頁 > 軟體工程 > Prometheus的一些基礎知識

Prometheus的一些基礎知識

2022-07-13 14:32:48 軟體工程

  • 核心組件
  • 任務和實體
  • 時間序列
  • PromQL

核心組件

Prometheus是一個開源的監控告警系統,它支持按多個維度存盤監控資料,配套的PromQL可以對資料進行靈活的查詢,
下圖為其整體的架構:
arch

主要包含四部分:

  • Prometheus Server,Prometheus Server用于從Exporters拉取資料,將采集到的監控資料按照時間序列的方式存盤在本地磁盤當中(Prometheus Server本身也是一個時序資料庫);并支持通過PromQL和通過API Client對資料進行查詢; 它還負責通過服務發現或者靜態配置的方式來識別監控目標,
  • Exporters,用于從監控目標采集資料,并先Prometheus Server提供收集資料的埠,是一個廣義的概念,只要可以支持Server獲取監控資料,就可以稱為Exporter,具體分為兩類:直接采集:此類Exporter直接內置了對Prometheus監控的支持,如cAdvisor, Kubernetes, Etcd等;間接采集:被監控目標不支持直接采集,需要集成專門的類別庫,比如Mysql Exporter, Consule Exporter, ASP.NET Core Exporter等,
  • PushGateway,Prometheus采用Pull模式采集資料,Server會定期呼叫Exporter提供的埠;但對于定期運行的Job類應用來說,并不是總能采集到資料,此外也可能受網路的限制,Server無法訪問到Exporter,這些情況下,可以使用PushGateway進行資料的中轉,由Exporter采用Push模式主動將資料發送到PushGateway,再由Server從PushGateway拉取資料,
  • AlertManager,Prometheus Server支持基于PromQL創建告警規則,如果規則滿足,會產生一條告警,告警的后續處理流程由AlertManager來處理,它內置支持郵件、Slack等方式,也可以通過WebHook支持更多的自定義方式,

通過Docker容器啟動

docker run -p 9090:9090 -v ${pwd}\prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

啟動完成后,可以通過http://localhost:9090/graph 訪問Prometheus的UI界面,或者通過http://localhost:9090/metrics查看原始資料,

任務和實體

prometheus.yml的配置示例:

global:
  scrape_interval:     15s
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']

這段基本的prometheus.yml進行了對任務(job_name)、實體(targets)、抓取間隔(scrape_interval)的配置,
實體:暴露監控樣本資料的HTTP服務,也就是Exporter的HTTP埠地址;
任務: 一組相同采集目的的實體,或者同一個采集行程的多個副本則通過任務來管理,

時間序列

Prometheus會將所有采集到的樣本資料以時間序列(time-series)的方式保存在記憶體資料庫中,并且定時保存到硬碟上,time-series是按照時間戳和值的序列順序存放的,稱為向量(vector). 每條time-series通過指標名稱(metrics name)和一組標簽集(labelset)命名,可以將time-series理解為一個以時間為X軸的數字矩陣,

  ^
  │   . . . . . . . . . . . . . . . . .   . .   node_cpu{cpu="cpu0",mode="idle"}
  │     . . . . . . . . . . . . . . . . . . .   node_cpu{cpu="cpu0",mode="system"}
  │     . . . . . . . . . .   . . . . . . . .   node_load1{}
  │     . . . . . . . . . . . . . . . .   . .  
  v
    <------------------ time ---------------->

Sample

矩陣的每一個點稱為一個樣本(sample),樣本由以下三部分組成:

  • 指標(metric):metric name和描述當前樣本特征的labelsets;
  • 時間戳(timestamp):一個精確到毫秒的時間戳;
  • 樣本值(value):一個float64的浮點型資料,表示當前樣本的值,
<--------------- metric ---------------------><-timestamp -><-value->
http_request_total{status="200", method="GET"}@1434417560938 => 94355

Metric

Metric的格式:

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

其中,一個metric可以包含多個標簽(label),用來從多個維度反映當前樣本的特征,通過這些維度,Prometheus可以對樣本資料進行過濾、聚合等計算,

Metric的型別:

在Prometheus的存盤實作上所有的監控樣本都是以time-series的形式保存在記憶體TSDB(時序資料庫)中的,而time-series又歸屬于不同的metric,所以從存盤上來講所有的metric都是相同的,但是在不同的場景下這些metric又有區別,具體分為:

  • Counter(計數器)
  • Gauge(儀表盤)
  • Histogram(直方圖)
  • Summary(摘要)
Counter

Counter計數器的值只增不減(除非系統發生重置),這種metric用途非常廣泛,比如可以在應用程式中記錄某些事件發生的次數,然后通過使用PromQL內置的一系列函式對資料做進一步的分析,比如計算該事件產生速率隨時間的變化,

通過rate()計算5m內的平均增長率:

rate(process_cpu_seconds_total[5m])

通過topk查詢埠訪問量前10:

topk(10,prometheus_http_requests_total)
Gauge

與Counter不同,Gauge型別的指標側重于反應系統的當前狀態,因此這類指標的樣本資料可增可減,常見指標如node_exporter提供的node_memory_MemFree(主機當前空閑的內容大小)、node_memory_MemAvailable(可用記憶體大小)等,

直接查看系統的當前狀態:

go_goroutines

通過delta()可以獲取樣本在一段時間回傳內的增減情況:

delta(go_goroutines[2h])
Summary和Histogram

這兩類指標主要用于統計和分析樣本的分布情況,對于一些量化的指標,一般情況下都會計算其平均值,比如API平均回應時間,但這些統計方式會受長尾問題的影響,比如假設大多數API回應都在500ms之間,只有少部分回應時間需要5s,那么統計平均值后就無法識別這少部分回應特別慢的請求,
為了區分是平均的慢還是長尾的慢,可以按照請求回應的時間范圍進行分組,Summary和Histogram都可以用于這類統計,但Histogram會按值所在的范圍,統計各范圍區間的數量;Summary則會按照中位數來統計,
比如Summary型別的go_gc_duration_seconds:

# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 3.8753e-05
go_gc_duration_seconds{quantile="0.25"} 7.731e-05
go_gc_duration_seconds{quantile="0.5"} 0.000111513
go_gc_duration_seconds{quantile="0.75"} 0.000220177
go_gc_duration_seconds{quantile="1"} 0.00450966
go_gc_duration_seconds_sum 0.164080505
go_gc_duration_seconds_count 1003

從上面的樣本可以得知go_gc的總次數為1003次,總耗時0.164080505s,中位數耗時0.000111513s,

PromQL

PromQL是Prometheus內置的資料查詢語言,其提供對時間序列資料豐富的查詢、聚合以及邏輯運算能力的支持,常用于資料查詢、可視化、告警處理等場景,

查詢時間序列

Prometheus通過指標名稱(metrics name)以及對應的一組標簽(labelset)唯一定義一條時間序列,
當直接使用監控指標名稱查詢時,可以查詢該指標名稱下的所有時間序列:
promhttp_metric_handler_requests_total

promhttp_metric_handler_requests_total{code="200", instance="host.docker.internal:9090", job="prometheus"} 893
promhttp_metric_handler_requests_total{code="500", instance="host.docker.internal:9090", job="prometheus"} 0
promhttp_metric_handler_requests_total{code="503", instance="host.docker.internal:9090", job="prometheus"} 0
標簽匹配模式
  • 完全匹配,=和!=
promhttp_metric_handler_requests_total{code="200"}
promhttp_metric_handler_requests_total{code!="200"}
  • 正則匹配,=~和!~
promhttp_metric_handler_requests_total{code=~"200|500"}
promhttp_metric_handler_requests_total{code!~"200|500"}

范圍查詢

直接使用監控指標名稱查詢時,回傳值中只包含該時間序列中最新的一個樣本值,這樣的回傳結果也叫瞬時向量,對應的運算式稱為瞬時向量運算式
如果想查詢過去一段時間范圍內的樣本資料時,則需要使用區間向量運算式,通過[]來定義

promhttp_metric_handler_requests_total[5m]

支持的時間單位有s m h d w y

promhttp_metric_handler_requests_total{code="200", instance="host.docker.internal:9090", job="prometheus"}[15s]
1280 @1653186543.159
1281 @1653186548.16
1282 @1653186553.16

時間位移操作

瞬時向量運算式或者區間向量運算式都是以當前時間為基準,而通過時間位移操作,可以改變時間基準,如位移到2天前:

promhttp_metric_handler_requests_total[15s] offset 2d

聚合操作

通過PromQL查詢時,如果指標和標簽不能唯一確定一條時間序列,則會回傳多條滿足這些特征維度的結果,而通過聚合操作可以對這些時間序列進行處理,現成一條新的時間序列,

sum (求和)
min (最小值)
max (最大值)
avg (平均值)
stddev (標準差)
stdvar (標準方差)
count (計數)
count_values (對value進行計數)
bottomk (后n條時序)
topk (前n條時序)
quantile (分位數)

sum(promhttp_metric_handler_requests_total)
{} 1387
avg(promhttp_metric_handler_requests_total) by (code)

{code="200"} 1395
{code="500"} 0
{code="503"} 0

標量和字串

除了向量型別,PromQL還支持使用標量(Scalar)和字串(String), Scalar是浮點型別的數字值,直接使用字串作為PromQL的運算式,則會直接回傳字串,

PromQL 運算子

數學運算

瞬時向量與標量直接可以進行加減乘除、取余、冪運算等數學運算,數學運算子會依次作用于瞬時向量的每個樣本值,從而得到一組新的時間序列,

而如果是瞬時向量與瞬時向量之間進行數學運算時,程序會相對復雜一點, 例如,如果我們想根據node_disk_bytes_written和node_disk_bytes_read獲取主機磁盤IO的總量,可以使用如下運算式:

node_disk_bytes_written + node_disk_bytes_read

PromQL會根據這個運算式依次找到與左邊向量元素匹配(標簽完全一致)的右邊向量元素進行運算,如果沒找到匹配元素,則直接丟棄,同時新的時間序列將不會包含指標名稱,

布爾運算

布爾運算可以根據時間序列中樣本的值,對其進行過濾,PrmoQL支持的布爾運算子有:

== (相等) 
!= (不相等) 
> (大于)
< (小于)
>= (大于等于)
<= (小于等于)

瞬時向量與標量進行布爾運算時,會依次對向量中所有時間序列樣本的值進行比較,如果結果為true則保留,否則會丟棄,

使用bool修飾符改變布爾運算子的行為

布爾運算子的默認行為是對時序資料進行過濾,而在其它的情況下我們可能需要的是真正的布爾結果,
比如判斷promhttp_metric_handler_requests_total的值是否大于1800,是則回傳1,否則回傳0,這時可以使用bool修飾符:

promhttp_metric_handler_requests_total > bool 1800

PromQL內置函式

通過內置函式可以對時序資料進行豐富的處理,

Increase: 計算Counter指標增長率

Counter型別的監控指標其特點是只增不減,在沒有發生重置(如服務器重啟,應用重啟)的情況下其樣本值應該是不斷增大的,為了能夠更直觀的表示樣本資料的變化劇烈情況,需要計算樣本的增長速率,
increase(v range-vector),引數v是一個區間向量,increase函式獲取區間向量中的第一個和最后一個樣本并回傳其增長量,因此promhttp_metric_handler_requests_total的增長率可以這樣計算:

increase(promhttp_metric_handler_requests_total[1m]) / 60
rate/irate

除了上述方法,使用rate函式也可以直接計算增長率:

rate(promhttp_metric_handler_requests_total[1m])

需要注意的是使用rate或者increase函式去計算樣本的平均增長速率,容易陷入“長尾問題”當中,其無法反應在時間視窗內樣本資料的突發變化, 例如,對于主機而言在2分鐘的時間視窗內,可能在某一個由于訪問量或者其它問題導致CPU占用100%的情況,但是通過計算在時間視窗內的平均增長率卻無法反應出該問題,
為了解決該問題,PromQL提供了另外一個靈敏度更高的函式irate(v range-vector),irate同樣用于計算區間向量的計算率,但是其反應出的是瞬時增長率,

irate(promhttp_metric_handler_requests_total[1m])

irate函式是通過區間向量中最后兩個樣本資料來計算區間向量的增長速率,這種方式可以避免在時間視窗范圍內的“長尾問題”,并且體現出更好的靈敏度,通過irate函式繪制的圖示能夠更好的反應樣本資料的瞬時變化狀態,

參考資料
https://yunlzheng.gitbook.io/prometheus-book/

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/498933.html

標籤:其他

上一篇:README.exe 是的,你看錯是EXE

下一篇:SmartIDE v0.1.18 已經發布 - 助力阿里國產IDE OpenSumi 插件安裝提速10倍、Dapr和Jupyter支持、CLI k8s支持

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more