Prometheus是一個開源的系統監控和報警工具,特色是php
多維數據模型(時序列數據由metric名和一組key/value組成)java
在多維度上靈活的查詢語言(PromQl)node
不依賴分佈式存儲,單主節點工做.python
經過基於HTTP的pull方式採集時序數據git
能夠經過push gateway進行時序列數據推送(pushing)github
能夠經過服務發現或者靜態配置去獲取要採集的目標服務器docker
多種可視化圖表及儀表盤支持數據庫
Prometheus採集數據是用的pull也就是拉模型,經過HTTP協議去採集指標,只要應用系統可以提供HTTP接口就能夠接入監控系統,相比於私有協議或二進制協議來講開發、簡單。緩存
對於定時任務這種短週期的指標採集,若是採用pull模式,可能形成任務結束了,Prometheus尚未來得及採集,這個時候可使用加一箇中轉層,客戶端推數據到Push Gateway緩存一下,由Prometheus從push gateway pull指標過來。(須要額外搭建Push Gateway,同時須要新增job去從gateway採數據
)ruby
Prometheus server
主要負責數據採集和存儲,提供PromQL查詢語言的支持
客戶端sdk
官方提供的客戶端類庫有go、java、scala、python、ruby,其餘還有不少第三方開發的類庫,支持nodejs、php、erlang等
Push Gateway
支持臨時性Job主動推送指標的中間網關
PromDash
使用rails開發的dashboard,用於可視化指標數據
exporters
支持其餘數據源的指標導入到Prometheus,支持數據庫、硬件、消息中間件、存儲系統、http服務器、jmx等
alertmanager
實驗性組件、用來進行報警
prometheus_cli
命令行工具
其餘輔助性工具
架構圖以下:
docker exec -it a9bd827a1d18 less /etc/prometheus/prometheus.yml
獲得
# my global config global: scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. # scrape_timeout is set to the global default (10s). # Attach these labels to any time series or alerts when communicating with # external systems (federation, remote storage, Alertmanager). external_labels: monitor: 'codelab-monitor' # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first.rules" # - "second.rules" # A scrape configuration containing exactly one endpoint to scrape: # Here it's Prometheus itself. scrape_configs: # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config. - job_name: 'prometheus' # metrics_path defaults to '/metrics' # scheme defaults to 'http'. static_configs: - targets: ['localhost:9090']
scrape_interval
這裏是指每隔15秒鐘去抓取數據(這裏
)
evaluation_interval
指的是計算rule的間隔
pushgateway有單獨的鏡像
docker pull prom/pushgateway
對於喜歡用push模式的應用來講,能夠專門搭建一個push gateway,來適配一下。
prometheus使用了G家的LevelDB來作索引(PromSQL重度依賴LevelDB
),對於大量的採樣數據有本身的存儲層,Prometheus爲每一個時序數據建立一個本地文件,以1024byte大小的chunk來組織。
Prometheus在storage.local.path指定的路徑存儲文件,默認爲./data。關於chunk編碼有三種
type 0
第一代的編碼格式,simple delta encoding
type 1
目前默認的編碼格式,double-delta encoding
type 2
variable bit-width encoding,facebook的時間序列數據庫Beringei採用的編碼方式
prometheus在內存裏保存了最近使用的chunks,具體chunks的最大個數能夠經過storage.local.memory-chunks來設定,默認值爲1048576,即1048576個chunk,大小爲1G。
除了採用的數據,prometheus還須要對數據進行各類運算,所以總體內存開銷確定會比配置的local.memory-chunks大小要來的大,所以官方建議要預留3倍的local.memory-chunks的內存大小。
As a rule of thumb, you should have at least three times more RAM available than needed by the memory chunks alone
能夠經過server的metrics去查看prometheus_local_storage_memory_chunks以及process_resident_memory_byte兩個指標值。
prometheus_local_storage_memory_chunks
The current number of chunks in memory, excluding cloned chunks
目前內存中暴露的chunks的個數
process_resident_memory_byte
Resident memory size in bytes
駐存在內存的數據大小
prometheus_local_storage_persistence_urgency_score
介於0-1之間,當該值小於等於0.7時,prometheus離開rushed模式。
當大於0.8的時候,進入rushed模式
prometheus_local_storage_rushed_mode
1表示進入了rushed mode,0表示沒有。進入了rushed模式的話,prometheus會利用storage.local.series-sync-strategy以及storage.local.checkpoint-interval的配置加速chunks的持久化。
docker run -p 9090:9090 \ -v /tmp/prometheus-data:/prometheus-data \ prom/prometheus \ -storage.local.retention 168h0m0s \ -storage.local.max-chunks-to-persist 3024288 \ -storage.local.memory-chunks=50502740 \ -storage.local.num-fingerprint-mutexes=300960
設定prometheus內存中保留的chunks的最大個數,默認爲1048576,即爲1G大小
用來配置採用數據存儲的時間,168h0m0s即爲24*7小時,即1周
用來控制序列文件rewrite的時機,默認是在10%的chunks被移除的時候進行rewrite,若是磁盤空間夠大,不想頻繁rewrite,能夠提高該值,好比0.3,即30%的chunks被移除的時候才觸發rewrite。
該參數控制等待寫入磁盤的chunks的最大個數,若是超過這個數,Prometheus會限制採樣的速率,直到這個數降到指定閾值的95%。建議這個值設定爲storage.local.memory-chunks的50%。Prometheus會盡力加速存儲速度,以免限流這種狀況的發送。
當prometheus server端在進行checkpoint操做或者處理開銷較大的查詢的時候,採集指標的操做會有短暫的停頓,這是由於prometheus給時間序列分配的mutexes可能不夠用,能夠經過這個指標來增大預分配的mutexes,有時候能夠設置到上萬個。
控制寫入數據以後,什麼時候同步到磁盤,有'never', 'always', 'adaptive'. 同步操做能夠下降由於操做系統崩潰帶來數據丟失,可是會下降寫入數據的性能。
默認爲adaptive的策略,即不會寫完數據就馬上同步磁盤,會利用操做系統的page cache來批量同步。
進行checkpoint的時間間隔,即對還沒有寫入到磁盤的內存chunks執行checkpoint操做。