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