Prometheus 初探
首先-什么是 TSDB (Time Series Database):
我們可以簡單的理解為.一個優(yōu)化后用來處理時間序列數(shù)據(jù)的軟件,并且數(shù)據(jù)中的數(shù)組是由時間進行索引的.
時間序列數(shù)據(jù)庫的特點:
- 大部分時間都是寫入操作
- 寫入操作幾乎是順序添加;大多數(shù)時候數(shù)據(jù)到達后都以時間排序.
- 寫操作很少寫入很久之前的數(shù)據(jù),也很少更新數(shù)據(jù).大多數(shù)情況在數(shù)據(jù)被采集到數(shù)秒或者數(shù)分鐘后就會被寫入數(shù)據(jù)庫.
- 刪除操作一般為區(qū)塊刪除,選定開始的歷史時間并指定后續(xù)的區(qū)塊.很少單獨刪除某個時間或者分開的隨機時間的數(shù)據(jù).
- 數(shù)據(jù)一般遠遠超過內(nèi)存大小,所以緩存基本無用.系統(tǒng)一般是 IO 密集型
- 讀操作是十分典型的升序或者降序的順序讀,
- 高并發(fā)的讀操作十分常見.
常見的時間序列數(shù)據(jù)庫:
部分常見 TSDB 官網(wǎng)如下:
| influxDB | https://influxdata.com/ |
| RRDtool | http://oss.oetiker.ch/rrdtool/ |
| Graphite | http://graphite.readthedocs.org/en/latest/ |
| OpenTSDB | http://opentsdb.net/ |
| Kdb+ | http://kx.com/ |
| Druid | http://druid.io/ |
| KairosDB | http://kairosdb.github.io/ |
| Prometheus | https://prometheus.io/ |
?
關(guān)于 Prometheus
Prometheus是什么?
Prometheus?是由 SoundCloud 開發(fā)的開源監(jiān)控報警系統(tǒng)和時序列數(shù)據(jù)庫(TSDB).自2012年起,許多公司及組織已經(jīng)采用 Prometheus,并且該項目有著非常活躍的開發(fā)者和用戶社區(qū).現(xiàn)在已經(jīng)成為一個獨立的開源項目核,并且保持獨立于任何公司,Prometheus 在2016加入 CNCF (?Cloud Native Computing Foundation?), 作為在 kubernetes 之后的第二個由基金會主持的項目.
prometheus 的特點
和其他監(jiān)控系統(tǒng)相比,Prometheus的特點包括:
- 多維數(shù)據(jù)模型(時序列數(shù)據(jù)由metric名和一組key/value組成)
- 在多維度上靈活的查詢語言(PromQl)
- 不依賴分布式存儲,單主節(jié)點工作.
- 通過基于HTTP的pull方式采集時序數(shù)據(jù)
- 可以通過中間網(wǎng)關(guān)進行時序列數(shù)據(jù)推送(pushing)
- 目標(biāo)服務(wù)器可以通過發(fā)現(xiàn)服務(wù)或者靜態(tài)配置實現(xiàn)
- 多種可視化和儀表盤支持
prometheus 相關(guān)組件
Prometheus生態(tài)系統(tǒng)由多個組件組成,其中許多是可選的:
- Prometheus 主服務(wù),用來抓取和存儲時序數(shù)據(jù)
- client library 用來構(gòu)造應(yīng)用或 exporter 代碼 (go,java,python,ruby)
- push 網(wǎng)關(guān)可用來支持短連接任務(wù)
- 可視化的dashboard (兩種選擇,promdash 和 grafana.目前主流選擇是 grafana.)
- 一些特殊需求的數(shù)據(jù)出口(用于HAProxy, StatsD, Graphite等服務(wù))
- 實驗性的報警管理端(alartmanager,單獨進行報警匯總,分發(fā),屏蔽等 )
promethues 的各個組件基本都是用 golang 編寫,對編譯和部署十分友好.并且沒有特殊依賴.基本都是獨立工作.
prometheus 的架構(gòu)
部署及配置
promethues 官方給出了多重部署方案,包括但不限于 docker 容器,ansible,chef,saltstack 等.
其實官方已經(jīng)給了預(yù)編譯的二進制文件.如果沒有修改代碼的特殊需求,直接拿到二進制文件進行部署也是可以的.
下載地址:?https://prometheus.io/download/
部署方式十分簡單
tar xvfz prometheus-*.tar.gz cd prometheus-*在 prometheus 目錄下有一個名為 prometheus.yml 的主配置文件.其中包含大多數(shù)標(biāo)準配置及 prometheus 的自檢控配置,配置文件如下.
global:scrape_interval: 15s # 默認抓取間隔, 15秒向目標(biāo)抓取一次數(shù)據(jù)# 和外部系統(tǒng)交互時每一條從本機獲取的數(shù)據(jù)都會打上如下標(biāo)簽external_labels:monitor: 'codelab-monitor'# 這里是抓去 promethues 自身的配置 scrape_configs:# job name 會以標(biāo)簽`job=<job_name>`添加到每一條由該配置抓去到的時序數(shù)據(jù)- job_name: 'prometheus'# 覆蓋默認抓取間隔scrape_interval: 5sstatic_configs:- targets: ['localhost:9090']# 添加兩個線上抓取實例- job_name: 'ceph'scrape_interval: 5sstatic_configs:- targets: ['k0140v:9128']labels:group: 'shbt' # 會對該配置生成的時序數(shù)據(jù)添加一條 `group=<group_name>`的標(biāo)簽- targets: ['ceph01:9128']labels:group: 'bjyt'- job_name: 'openstack'scrape_interval: 30sstatic_configs:#target 可以使用 "," 分割,添加多個目標(biāo)- targets: ['openstack185:9128', 'openstack194:9128']labels:group: "bjyt"然后我們通過該配置文件啟動 promethues
./prometheus -config.file=prometheus.ymlprometheus 本身是自帶 exporter 的,我們通過請求?http://localhost:9090/metrics?可以查看從 exporter 中能具體抓到哪些數(shù)據(jù)
監(jiān)控數(shù)據(jù)
數(shù)據(jù)樣本
和大多數(shù) TSDB 類似,promethus 支持的數(shù)據(jù)樣本非常簡單:
- 一個 float64 的值
- 一個毫秒精度的時間戳
標(biāo)識
標(biāo)識監(jiān)控數(shù)據(jù)的方式十分簡單,給一個監(jiān)控項名稱和一些標(biāo)簽,時序數(shù)據(jù)經(jīng)常使用這種標(biāo)識方法
<metric name>{<label name>=<label value>, ...}舉例來說, 一個時間序列的監(jiān)控名稱為?api_http_requests_total?標(biāo)簽為?method="POST"?和?handler="/message"?,那么監(jiān)控數(shù)據(jù)的標(biāo)識如下:
api_http_requests_total{method="POST", handler="/messages"}這種標(biāo)識方式與?OpenTSDB?相同.
監(jiān)控結(jié)果
我們實際收集到的數(shù)據(jù)大多如下:
ceph_osd_avail_bytes{osd="osd.0"} 3.205084244e+12 ceph_osd_avail_bytes{osd="osd.1"} 2.892447332e+12 ceph_osd_avail_bytes{osd="osd.10"} 3.21853432e+12 ceph_osd_avail_bytes{osd="osd.100"} 3.062200424e+12 ceph_osd_avail_bytes{osd="osd.101"} 3.126474844e+12 ceph_osd_avail_bytes{osd="osd.102"} 3.079620512e+12 ceph_pool_available_bytes{pool="backups"} 1.30342001987587e+14 ceph_pool_available_bytes{pool="images"} 1.30342001987587e+14 ceph_pool_available_bytes{pool="rbd"} 1.30342001987587e+14 ceph_pool_available_bytes{pool="rgw-test"} 1.30342001987587e+14 ceph_pool_available_bytes{pool="test_crush"} 1.30342001987587e+14 ceph_pool_available_bytes{pool="vms"} 1.30342001987587e+14 ceph_pool_available_bytes{pool="vmscache"} 2.301547932444e+12監(jiān)控數(shù)據(jù)類型
- Counter:計數(shù)器是一個累加的度量類型,記錄單調(diào)遞增的數(shù)據(jù).一般用于記錄服務(wù)的請求數(shù),任務(wù)完成數(shù),錯誤發(fā)生數(shù).
- Gauge:量表用于記錄可任意變大變小的數(shù)值,如cpu idle,內(nèi)存使用率,磁盤IO等。
- Historgram:直方圖用于度量數(shù)據(jù)中值的分布情況,如請求時間或響應(yīng)大小。
- Summary: 用于度量數(shù)據(jù)累價值或總數(shù).
自帶 dashboard及查詢語句
prometheus 自帶一個比較簡單的dashboard 可以查看表達式搜索結(jié)果,報警配置,prometheus 配置,exporter 狀態(tài)等
我們以一些真實數(shù)據(jù)為例看一下表達式及查詢結(jié)果.
1. 我們可直接查詢監(jiān)控項ceph_pool_read_total并繪圖如下
2. 我們也可以在查詢語句中通過添加一組標(biāo)簽,并用?{}?闊起來,來細化查詢.
例如我們只想查看 bjyt 這個 group 各個 pool 全局讀取的數(shù)據(jù).
ceph_pool_read_total{group="bjyt"}另外,也可以也可以將標(biāo)簽值反向匹配,或者對正則表達式匹配標(biāo)簽值:
- =:選擇相等的字符串標(biāo)簽
- !=:選擇不相等的字符串標(biāo)簽
- =~:選擇匹配正則表達式的字符串標(biāo)簽(或子標(biāo)簽)
- !=:選擇不匹配正則表達式的字符串標(biāo)簽(或子標(biāo)簽)
例如
ceph_pool_read_total{pool=~"vms.*"}會如上圖但只查詢出 pool 名為 vms 及 vmscahe 的數(shù)據(jù).
3. 如果我們以時間窗口來作為篩選緯度計算各個 pool 讀IO的真實速率,可以用以下語句查詢
irate(ceph_pool_read_total{pool=~"vms"}[1m])這里的 irate() 為 promethues 的查詢函數(shù).與之對應(yīng)的是rate().
這兩個函數(shù)在 promethues 中經(jīng)常用來計算增量或者速率,在使用時需要指定時間范圍如[1m]
- irate(): 計算的是給定時間窗口內(nèi)的每秒瞬時增加速率.
- rate(): 計算的是給定時間窗口內(nèi)的每秒的平均值.
如果還是以前面的監(jiān)控項進行查詢但是以 rate() 計算速率的話,繪制的結(jié)果如下:
rate(ceph_pool_read_total{pool=~"vms"}[1m])promethues 支持的函數(shù)還有很多,具體的函數(shù)說明可詳見官方文檔?Functions
如果在線上使用的話,可以將 Prometheus 和 grafana 相結(jié)合.可以進行十分豐富的監(jiān)控結(jié)果展示.
比如 ceph 單機房集群的監(jiān)控可以是這樣的:
先簡單介紹這么多.
后面會通過幾篇文章詳細介紹一些常用的查詢方法, exporter的編寫及使用方法,以及 promethues 如何結(jié)合 grafana使用和promethues 是如何進行報警的.
參考文獻 :
- http://liubin.org/blog/2016/02/18/tsdb-intro/
- https://www.xaprb.com/blog/2014/06/08/time-series-database-requirements/
- https://www.xaprb.com/blog/2014/03/02/time-series-databases-influxdb/
- https://zhuanlan.zhihu.com/p/24811652
總結(jié)
以上是生活随笔為你收集整理的Prometheus 初探的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10张图带你深入理解Docker容器和镜
- 下一篇: docker运行prometheus