Prometheus
Prometheus是一套開源的監(jiān)控&報警&時間序列數(shù)據(jù)庫的組合,起始是由SoundCloud公司開發(fā)的。成立于2012年夜惭,之后許多公司和組織接受和采用prometheus,他們便將它獨立成開源項目言秸,并且有公司來運作.該項目有非初尾妫活躍的社區(qū)和開發(fā)人員称杨,目前是獨立的開源項目匾竿,任何公司都可以使用它,2016年篱蝇,Prometheus加入了云計算基金會贺待,成為kubernetes之后的第二個托管項目.google SRE的書內(nèi)也曾提到跟他們BorgMon監(jiān)控系統(tǒng)相似的實現(xiàn)是Prometheus。現(xiàn)在最常見的Kubernetes容器管理系統(tǒng)中态兴,通常會搭配Prometheus進行監(jiān)控狠持。
特性
prometheus的主要特點
- 自定義多維數(shù)據(jù)模型(時序列數(shù)據(jù)由metric名和一組key/value標(biāo)簽組成)
- 非常高效的存儲 平均一個采樣數(shù)據(jù)占 ~3.5 bytes左右疟位,320萬的時間序列,每30秒采樣,保持60天撇寞,消耗磁盤大概228G礁芦。
- 在多維度上靈活且強大的查詢語言(PromQl)
- 不依賴分布式存儲,支持單主節(jié)點工作
- 通過基于HTTP的pull方式采集時序數(shù)據(jù)
- 可以通過push gateway進行時序列數(shù)據(jù)推送(pushing)
- 可以通過服務(wù)發(fā)現(xiàn)或者靜態(tài)配置去獲取要采集的目標(biāo)服務(wù)器
- 多種可視化圖表及儀表盤支持
pull方式
Prometheus采集數(shù)據(jù)是用的pull也就是拉模型,通過HTTP協(xié)議去采集指標(biāo)得院,只要應(yīng)用系統(tǒng)能夠提供HTTP接口就可以接入監(jiān)控系統(tǒng)傻铣,相比于私有協(xié)議或二進制協(xié)議來說開發(fā)、簡單祥绞。
push方式
對于定時任務(wù)這種短周期的指標(biāo)采集非洲,如果采用pull模式鸭限,可能造成任務(wù)結(jié)束了,Prometheus還沒有來得及采集两踏,這個時候可以使用加一個中轉(zhuǎn)層败京,客戶端推數(shù)據(jù)到Push Gateway緩存一下,由Prometheus從push gateway pull指標(biāo)過來梦染。(需要額外搭建Push Gateway赡麦,同時需要新增job去從gateway采數(shù)據(jù))
prometheus適用于監(jiān)控所有時間序列的項目
目前其生態(tài)中已經(jīng)有很多exporter實現(xiàn),例如:
- Node/system metrics exporter
- AWS CloudWatch exporter
- Blackbox exporter
- Collectd exporter
- Consul exporter
- Graphite exporter
- HAProxy exporter
- InfluxDB exporter
- JMX exporter
- Memcached exporter
- Mesos task exporter
- MySQL server exporter
- SNMP exporter
- StatsD exporter
組成及架構(gòu)
Prometheus生態(tài)系統(tǒng)由多個組件組成帕识。其中許多組件都是可選的
-
Prometheus server
主要負(fù)責(zé)數(shù)據(jù)采集和存儲泛粹,提供PromQL查詢語言的支持
-
客戶端sdk官方提供的客戶端類庫:
go、java肮疗、scala晶姊、python、ruby伪货,其他還有很多第三方開發(fā)的類庫帽借,支持nodejs、php超歌、erlang等
-
Push Gateway
支持臨時性Job主動推送指標(biāo)的中間網(wǎng)關(guān)
-
PromDash
使用rails開發(fā)的dashboard砍艾,用于可視化指標(biāo)數(shù)據(jù)
-
exporters
支持其他數(shù)據(jù)源的指標(biāo)導(dǎo)入到Prometheus,支持?jǐn)?shù)據(jù)庫巍举、硬件脆荷、消息中間件、存儲系統(tǒng)懊悯、http服務(wù)器蜓谋、jmx等
-
alertmanager
實驗性組件、用來進行報警
-
prometheus_cli
命令行工具
其他輔助性工具
prometheus大多數(shù)組件都是用Go編寫的炭分,他們可以非常輕松的基于二進制文件部署和構(gòu)建
它的服務(wù)過程是這樣的 Prometheus Server 負(fù)責(zé)定時去目標(biāo)上抓取 metrics(指標(biāo)) 數(shù)據(jù)桃焕,每個抓取目標(biāo)需要暴露一個http服務(wù)的接口給它定時抓取。
Prometheus支持通過配置文件捧毛、kubernetes观堂、zookeeper、Consul呀忧、DNS SRV lookup等方式指定抓取目標(biāo)师痕。
Alertmanager 是獨立于Prometheus的一個組件,可以支持Prometheus的查詢語句編寫規(guī)則而账,提供十分靈活的報警方式胰坟。
Prometheus支持很多方式的圖表可視化,例如十分精美的Grafana泞辐,自帶的Promdash笔横,以及自身提供的模版引擎等等竞滓,還提供HTTP API的查詢方式,自定義所需要的輸出吹缔。
PushGateway這個組件是支持Client主動推送 metrics 到PushGateway虽界,而Prometheus只是定時去Gateway上抓取數(shù)據(jù)。
如果有使用過statsd的用戶涛菠,則會覺得這十分相似莉御,只是statsd是直接發(fā)送給服務(wù)器端,而Prometheus主要還是靠進程主動去抓取俗冻。
概念
Prometheus 的數(shù)據(jù)模型
Prometheus 從根本上所有的存儲都是按時間序列去實現(xiàn)的礁叔,相同的 metrics(指標(biāo)名稱) 和 label(一個或多個標(biāo)簽) 組成一條時間序列,不同的label表示不同的時間序列迄薄。為了支持一些查詢琅关,有時還會臨時產(chǎn)生一些時間序列存儲。
metrics name & label 指標(biāo)名稱和標(biāo)簽
每條時間序列是由唯一的 指標(biāo)名稱 和 一組 標(biāo)簽 (key=value)的形式組成讥蔽。
-
指標(biāo)名稱
一般是給監(jiān)測對像起一名字涣易,例如 http_requests_total 這樣,它有一些命名規(guī)則冶伞,可以包字母數(shù)字之類的的新症。通常是以應(yīng)用名稱開頭監(jiān)測對像數(shù)值類型單位這樣。例如:
- push_total - userlogin_mysql_duration_seconds - app_memory_usage_bytes
-
標(biāo)簽
就是對一條時間序列不同維度的識別了响禽,例如 一個http請求用的是POST還是GET徒爹,它的endpoint是什么,這時候就要用標(biāo)簽去標(biāo)記了芋类。最終形成的標(biāo)識便是這樣了http_requests_total{method="POST",endpoint="/api/tracks"}
記住隆嗅,針對http_requests_total這個metrics name 無論是增加標(biāo)簽還是刪除標(biāo)簽都會形成一條新的時間序列。
查詢語句就可以跟據(jù)上面標(biāo)簽的組合來查詢聚合結(jié)果了侯繁。
如果以傳統(tǒng)數(shù)據(jù)庫的理解來看這條語句胖喳,則可以考慮 http_requests_total是表名,標(biāo)簽是字段贮竟,而timestamp是主鍵丽焊,還有一個float64字段是值了。(Prometheus里面所有值都是按float64存儲)
Prometheus 的四種數(shù)據(jù)類型
Counter
Counter 用于累計值坝锰,例如 記錄 請求次數(shù)粹懒、任務(wù)完成數(shù)重付、錯誤發(fā)生次數(shù)顷级。
一直增加,不會減少确垫。
-
重啟進程后弓颈,會被重置帽芽。
例如:http_response_total{method="GET",endpoint="/api/tracks"} 10 10秒后抓取 http_response_total{method="GET",endpoint="/api/tracks"} 100
Gauge
Gauge 常規(guī)數(shù)值,例如 溫度變化翔冀、CPU,內(nèi)存,網(wǎng)絡(luò)使用變化导街。
可變大,可變小纤子。
-
重啟進程后搬瑰,會被重置
例如: memory_usage_bytes{host="master-01"} 100 < 抓取值 memory_usage_bytes{host="master-01"} 30 memory_usage_bytes{host="master-01"} 50 memory_usage_bytes{host="master-01"} 80 < 抓取值
Histogram
Histogram 可以理解為柱狀圖的意思,常用于跟蹤事件發(fā)生(通常是請求持續(xù)時間或響應(yīng)大小)的規(guī)模控硼,例如:請求耗時泽论、響應(yīng)大小。它特別之處是可以對記錄的內(nèi)容進行分組卡乾,提供 count 和 sum 全部值的功能翼悴。
例如:{小于10=5次,小于20=1次幔妨,小于30=2次}鹦赎,count=7次,sum=7次的求和值

Summary
Summary和Histogram十分相似误堡,常用于跟蹤事件(通常是要求持續(xù)時間和響應(yīng)大小)發(fā)生的規(guī)模古话,例如:請求耗時、響應(yīng)大小锁施。同樣提供 count 和 sum 全部值的功能煞额。
例如:count=7次,sum=7次的值求值
它提供一個quantiles的功能沾谜,可以按%比劃分跟蹤的結(jié)果膊毁。例如:quantile取值0.95,表示取采樣值里面的95%數(shù)據(jù)基跑。
Jobs and Instances
在prometheus中婚温,任何被采集的目標(biāo)被稱為instance,通常對應(yīng)于單個進程,而相同類型(可擴展性和可靠性的復(fù)制)的instance集合被稱為Job媳否。例如:Api server job由4個復(fù)制instance組成:
- job: api-server
- instance1: 1.2.3.4:5670
- instance2: 1.2.3.4:5671
- instance3: 5.6.7.8:5670
- instance3: 5.6.7.8:5671
自動生成標(biāo)簽和時間序列
當(dāng)prometheus采集目標(biāo)時栅螟,它會自動附加某些標(biāo)簽,用于識別被采集的目標(biāo)篱竭。
- job: 配置目標(biāo)所屬的job名稱
- instance: 目標(biāo) HTTP URL<host>:<port>部分
如果任何一個標(biāo)簽已經(jīng)存在于采集的數(shù)據(jù)中力图,則此行為依賴honor_labels 配置選項。
對于每個被采集的instance,prometheus存儲如下的時間序列樣本:
- up{job="<job-name>",instance="<instance-id>"}:1 如果實例處于health掺逼,為1吃媒,否則為0
- scrape_duration_seconds{job="<job-name>",instance="<instance-id>"} 持續(xù)采集時間
“up”時間序列metric對于instance可用性監(jiān)控是有效的。