普罗米修斯笔记:初识Prometheus
文章目錄
- Prometheus簡介
- Prometheus特性
- pull方式
- push方式
- 核心組成部分
- Prometheus server
- Client libraries
- Push Gateway
- Exporters
- Alertmanager
- 架構圖
- Prometheus工作流程
- Prometheus數據模型
- 指標名稱
- 標簽
- 時序樣本
- Prometheus 的四種數據類型
- Counter(計數器)
- Gauge(儀表盤)
- Histogram(直方圖)
- Summary(摘要)
- Jobs and Instances
Prometheus簡介
Prometheus官網地址:https://prometheus.io/
Prometheus是一套開源的監控&報警&時間序列數據庫的組合,起始是由SoundCloud公司開發的。成立于2012年,之后許多公司和組織接受和采用prometheus,他們便將它獨立成開源項目,并且有公司來運作.該項目有非常活躍的社區和開發人員,目前是獨立的開源項目,任何公司都可以使用它,2016年,Prometheus加入了云計算基金會,成為kubernetes之后的第二個托管項目.google
SRE的書內也曾提到跟他們BorgMon監控系統相似的實現是Prometheus。現在最常見的Kubernetes容器管理系統中,通常會搭配Prometheus進行監控。
Prometheus特性
Prometheus是一個開源的系統監控和報警工具,它有以下特點:
- 自定義多維數據模型(時序列數據由metric名和一組key/value組成)
- 多維度上靈活的查詢語言(PromQI)
- 不依賴分布式存儲,支持單主節點工作
- 通過基于HTTP的pull方式采集時序數據
- 可以通過push gateway進行時序數據推送(pushing)
- 可以通過服務發現或者靜態配置取獲取要采集的目標服務器
- 多種可視化圖表及儀表盤支持
pull方式
Prometheus采集數據時用的pull也就是拉模型,通過HTTP協議去采集指標,只要應用系統能夠提供HTTP接口就可以接入監控系統,相比于私有協議或二進制協議來說開發、簡單。
push方式
對于定時任務這種短周期的指標采集,如果采用pull模式,可能造成任務結束了,Prometheus還沒有來得及采集,這個時候可以使用加一個中轉層,客戶端推數據到push gateway緩存一下,由prometheus從push gateway pull指標過來。(需要額外搭建push gateway,同事需要新增job去從gateway采數據)
核心組成部分
Prometheus server
主要負責數據采集和存儲,并提供PromQL查詢語言支持。Prometheus server本身就是一個實時數據庫,將采集到的監控數據按照時間序列的方式存儲在本地磁盤中。
Client libraries
豐富的客戶端sdk,官方提供的客戶端類庫有go、java、scala、python、ruby,其他還有很多第三方類庫,支持nodejs、php、erlang等。
Push Gateway
支持臨時性Job主動推送指標的中間網關。主要用于短期的jobs。由于這類jobs存在時間較短,可能在Prometheus來pull之前就消失了。為此,這次jobs可以直接向Prometheus中間網關推送他們的metrics。這種方式主要用于服務層面的metrics,對于機器層面的metrices,需要使用node exporter。
Exporters
支持其他數據源的指標導入到Prometheus,支持數據庫、硬件、消息中間件、存儲系統、HTTP服務器、jmx等。
Exporter將監控數據采集的端點通過HTTP服務形式暴露給Prometheus Server,將其轉化為Prometheus支持的格式,Prometheus Server通過訪問該Exporter提供的Endpoint端點,即可以獲取到需要采集的監控數據。可以將exporter分成2類:
直接采集:這一類exporter直接內置了對Prometheus監控支持,比如cAdvisor、Kubernetes、Etcd、Gokit等,都直接內置了用于向Prometheus暴露監控數據的端點。
間接采集:原有監控目標并不直接支持Prometheus,因此需要通過Prometheus提供的Client Library編寫該監控目標的監控采集程序。目前其生態中已經有很多exporter實現,例如:
| 數據庫 | MySQL Exporter, Redis Exporter, MongoDB Exporter, MSSQL Exporter等 |
| 硬件 | Apcupsd Exporter,IoT Edison Exporter, IPMI Exporter, Node Exporter等 |
| 消息隊列 | Beanstalkd Exporter, Kafka Exporter, NSQ Exporter, RabbitMQ Exporter等 |
| 存儲 | Ceph Exporter, Gluster Exporter, HDFS Exporter, ScaleIO Exporter等 |
| HTTP服務 | Apache Exporter, HAProxy Exporter, Nginx Exporter等 |
| API服務 | AWS ECS Exporter, Docker Cloud Exporter, Docker Hub Exporter, GitHub Exporter等 |
| 日志 | Fluentd Exporter, Grok Exporter等 |
| 監控系統 | Collectd Exporter, Graphite Exporter, InfluxDB Exporter, Nagios Exporter, SNMP Exporter等 |
| 其它 | Blockbox Exporter, JIRA Exporter, Jenkins Exporter, Confluence Exporter等 |
Alertmanager
一個警告控制組件用來控制警告。在Prometheus中支持基于PromQL創建告警規則,如果滿足PromQL定義的規則,則會產生一條告警。當AlertManager從Prometheus server端接收到alerts后,會進行去除重復數據,分組,并路由到對端接收方式,發出報警。常見的接收方式有:電子郵件,pargerduty,webhook等。
大部分的Prometheus組件是用Go語言編寫的,他們很易于以二進制文件方式構建和部署。
架構圖
數據可以通過直接jobs或者通過push gateway方式抽取樣本指標。它將所有抽取的樣本存儲在本地,并對這些數據運行規則,從現有數據中聚合和記錄新的時間學列,或者生成告警。可以使用Grafana或者其他API使用者來可視化收集的數據。
Prometheus工作流程
1、Prometheus server定期從配置好的jobs或者exporters中拉取metrics,或者從push gateway拉取metrics,或者從其他的Prometheus server中拉取metrics
2、Prometheus server在本地存儲收集的metrics,并運行定義好的alert.rules,通過一定規則進行清理和整理數據,并把得到的結果存儲到新的時間序列中。記錄新的時間序列或者向Alertmanager推送警報。
3、Prometheus通過PromQL和其他可視化的展現收集的數據。Prometheus支持很多方式的圖表可視化,例如Grafana、自帶的Promdash以及自身提供的模板引擎等等。Promenade還提供HTTP API的查詢方式,自定義所需要的輸出。
Prometheus數據模型
Prometheus 從根本上所有的存儲都是按時間序列去實現的,相同的 metrics(指標名稱) 和 label(一個或多個標簽) 組成一條時間序列,不同的label表示不同的時間序列。為了支持一些查詢,有時還會臨時產生一些時間序列存儲。
Prometheus數據格式與OpenTSDB相似:
指標名稱
一般是給監測對像起一名字,例如 http_requests_total 這樣,它有一些命名規則,可以包字母數字之類的的。通常是以應用名稱開頭監測對像數值類型單位這樣。例如:
http_requests_total標簽
就是對一條時間序列不同維度的識別了,例如 一個http請求用的是POST還是GET,它的endpoint是什么,這時候就要用標簽去標記了。最終形成的標識便是這樣了:
http_requests_total{method="POST",endpoint="/api/tracks"}時序樣本
按照某個時序以時間維度采集的數據據,稱之為樣本,其值包含:
- 一個float64值
- 一個毫秒級的unix時間戳
Prometheus隨時間采集監控數據點,每個數據點都是時間戳和值的元組。出于監控的目的,時間戳是一個整數,值是任意數字–64位浮點數對于Counter和Gauge類型來說都是一個很好的表示方式。按時間戳嚴格單調遞增的數據點序列是一個由標識符尋址的Series。標識符是帶有標簽維度的監控項名稱,標簽維度劃分單個監控項的度量空間**,每個監控項名稱加上一組唯一標簽是其自己的時間序列**,其具有與之關聯的值流。
## series格式為 identifier -> (t0, v0), (t1, v1), (t2, v2), (t3, v3), .... ## 一組典型的系列標識符,是請求技術監控度量的一部分 requests_total{path="/status", method="GET", instance=”10.0.0.1:80”} requests_total{path="/status", method="POST", instance=”10.0.0.3:80”} requests_total{path="/", method="GET", instance=”10.0.0.2:80”} ## 簡化表示,監控項名稱可以是另一個標簽維度__name__,在查詢是它可能會被特殊處理,但與我們存儲它的方式無關 {__name__="requests_total", path="/status", method="GET", instance=”10.0.0.1:80”} {__name__="requests_total", path="/status", method="POST", instance=”10.0.0.3:80”} {__name__="requests_total", path="/", method="GET", instance=”10.0.0.2:80”} 因此,identifier 形如 metricName{label1=value1,label2=value2,...} 或 {__name__="metricName",label1=value1,label2=value2,...} ## 在簡化的視圖中,所有數據點可以在二維平面上展開。水平維度表示時間,垂直維度按series展開 series^ │ . . . . . . . . . . . . . . . . . . . . . . {__name__="request_total", method="GET"}│ . . . . . . . . . . . . . . . . . . . . . . {__name__="request_total", method="POST"}│ . . . . . . .│ . . . . . . . . . . . . . . . . . . . ... │ . . . . . . . . . . . . . . . . . . . . . │ . . . . . . . . . . . . . . . . . . . . . {__name__="errors_total", method="POST"}│ . . . . . . . . . . . . . . . . . {__name__="errors_total", method="GET"}│ . . . . . . . . . . . . . .│ . . . . . . . . . . . . . . . . . . . ... │ . . . . . . . . . . . . . . . . . . . . v<-------------------- time --------------------->Prometheus 的四種數據類型
Counter(計數器)
- Counter 用于累計值,例如 記錄 請求次數、任務完成數、錯誤發生次數。
- 一直增加,不會減少。
- 重啟進程后,會被重置。
Gauge(儀表盤)
- Gauge 常規數值,例如 溫度變化、CPU,內存,網絡使用變化。
- 可變大,可變小。
- 重啟進程后,會被重置
Histogram(直方圖)
Histogram 可以理解為柱狀圖的意思,常用于跟蹤事件發生(通常是請求持續時間或響應大小)的規模,例如:請求耗時、響應大小。它特別之處是可以對記錄的內容進行分組,提供 count 和 sum 全部值的功能。
例如:{小于10=5次,小于20=1次,小于30=2次},count=7次,sum=7次的求和值Summary(摘要)
Summary和Histogram十分相似,常用于跟蹤事件(通常是要求持續時間和響應大小)發生的規模,例如:請求耗時、響應大小。同樣提供 count 和 sum 全部值的功能。
例如:count=7次,sum=7次的值求值它提供一個quantiles的功能,可以按%比劃分跟蹤的結果。例如:quantile取值0.95,表示取采樣值里面的95%數據
Jobs and Instances
在prometheus中,任何被采集的目標被稱為instance,通常對應于單個進程,而相同類型(可擴展性和可靠性的復制)的instance集合被稱為Job。例如:Api server job由4個復制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當prometheus采集目標時,它會自動附加某些標簽,用于識別被采集的目標。
job: 配置目標所屬的job名稱。
instance:目標 HTTP URL:部分
如果任何一個標簽已經存在于采集的數據中,則此行為依賴honor_labels 配置選項。
總結
以上是生活随笔為你收集整理的普罗米修斯笔记:初识Prometheus的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SpringBoot笔记:SpringB
- 下一篇: JVM调优笔记:认识JVM内存模型(jd