基于Grafana和Prometheus的監(jiān)視系統(tǒng)
1. Prometheus
1.1 Prometheus 介紹
Prometheus(普羅米修斯)是一套開源的監(jiān)控&報警&時間序列數(shù)據(jù)庫的組合.由SoundCloud公司開發(fā)。
Prometheus基本原理是通過HTTP協(xié)議周期性抓取被監(jiān)控組件的狀態(tài),這樣做的好處是任意組件只要提供HTTP接口就可以接入監(jiān)控系統(tǒng),不需要任何SDK或者其他的集成過程。這樣做非常適合虛擬化環(huán)境比如VM或者Docker 。
Prometheus應該是為數(shù)不多的適合Docker、Mesos、Kubernetes環(huán)境的監(jiān)控系統(tǒng)之一。
輸出被監(jiān)控組件信息的HTTP接口被叫做exporter 。目前互聯(lián)網(wǎng)公司常用的組件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux 系統(tǒng)信息 (包括磁盤、內存、CPU、網(wǎng)絡等等),具體支持的源看:https://github.com/prometheus。
與其他監(jiān)控系統(tǒng)相比,Prometheus的主要特點是:
- 一個多維數(shù)據(jù)模型(時間序列由指標名稱定義和設置鍵/值尺寸)。
- 非常高效的存儲,平均一個采樣數(shù)據(jù)占~3.5bytes左右,320萬的時間序列,每30秒采樣,保持60天,消耗磁盤大概228G。
- 一種靈活的查詢語言。
- 不依賴分布式存儲,單個服務器節(jié)點。
- 時間集合通過HTTP上的PULL模型進行。
- 通過中間網(wǎng)關支持推送時間。
- 通過服務發(fā)現(xiàn)或靜態(tài)配置發(fā)現(xiàn)目標。
- 多種模式的圖形和儀表板支持。
1.2 架構

它的服務過程是這樣的Prometheus daemon負責定時去目標上抓取metrics(指標) 數(shù)據(jù),每個抓取目標需要暴露一個http服務的接口給它定時抓取。
Prometheus:支持通過配置文件、文本文件、zookeeper、Consul、DNS SRV lookup等方式指定抓取目標。支持很多方式的圖表可視化,例如十分精美的Grafana,自帶的Promdash,以及自身提供的模版引擎等等,還提供HTTP API的查詢方式,自定義所需要的輸出。
Alertmanager:是獨立于Prometheus的一個組件,可以支持Prometheus的查詢語句,提供十分靈活的報警方式。
PushGateway:這個組件是支持Client主動推送metrics到PushGateway,而Prometheus只是定時去Gateway上抓取數(shù)據(jù)。
大多數(shù)Prometheus組件都是用Go編寫的,它們可以輕松地構建和部署為靜態(tài)二進制文件。訪問https://prometheus.io以獲取完整的文檔,示例和指南。
1.3 Prometheus的數(shù)據(jù)模型
Prometheus從根本上所有的存儲都是按時間序列去實現(xiàn)的,相同的metrics(指標名稱) 和label(一個或多個標簽) 組成一條時間序列,不同的label表示不同的時間序列。為了支持一些查詢,有時還會臨時產(chǎn)生一些時間序列存儲。
metrics name&label指標名稱和標簽
每條時間序列是由唯一的”指標名稱”和一組”標簽(key=value)”的形式組成。
指標名稱:一般是給監(jiān)測對像起一名字,例如http_requests_total這樣,它有一些命名規(guī)則,可以包字母數(shù)字之類的的。通常是以應用名稱開頭監(jiān)測對像數(shù)值類型單位這樣。例如:push_total、userlogin_mysql_duration_seconds、app_memory_usage_bytes。
標簽:就是對一條時間序列不同維度的識別了,例如一個http請求用的是POST還是GET,它的endpoint是什么,這時候就要用標簽去標記了。最終形成的標識便是這樣了:http_requests_total{method=”POST”,endpoint=”/api/tracks”}。
如果以傳統(tǒng)數(shù)據(jù)庫的理解來看這條語句,則可以考慮http_requests_total是表名,標簽是字段,而timestamp是主鍵,還有一個float64字段是值了。(Prometheus里面所有值都是按float64存儲)。
1.4 Prometheus四種數(shù)據(jù)類型
Counter
Counter用于累計值,例如記錄請求次數(shù)、任務完成數(shù)、錯誤發(fā)生次數(shù)。一直增加,不會減少。重啟進程后,會被重置。Gauge
Gauge常規(guī)數(shù)值,例如 溫度變化、內存使用變化??勺兇螅勺冃?。重啟進程后,會被重置。Histogram
Histogram(直方圖)可以理解為柱狀圖的意思,常用于跟蹤事件發(fā)生的規(guī)模,例如:請求耗時、響應大小。它特別之處是可以對記錄的內容進行分組,提供count和sum全部值的功能。Summary
Summary和Histogram十分相似,常用于跟蹤事件發(fā)生的規(guī)模,例如:請求耗時、響應大小。同樣提供 count 和 sum 全部值的功能。它提供一個quantiles的功能,可以按%比劃分跟蹤的結果。例如:quantile取值0.95,表示取采樣值里面的95%數(shù)據(jù)。
2.Grafana
grafana是用于可視化大型測量數(shù)據(jù)的開源程序,他提供了強大和優(yōu)雅的方式去創(chuàng)建、共享、瀏覽數(shù)據(jù)。dashboard中顯示了不同metric數(shù)據(jù)源中的數(shù)據(jù)。
grafana有熱插拔控制面板和可擴展的數(shù)據(jù)源,目前已經(jīng)支持Graphite、InfluxDB、OpenTSDB、Elasticsearch等。
3.監(jiān)控系統(tǒng)架構
使用開源時序數(shù)據(jù)庫 Prometheus 作為監(jiān)控和性能指標信息存儲方案,使用 Grafana 作為可視化組件進行展示。
Prometheus 是一個擁有多維度數(shù)據(jù)模型,靈活的查詢語句的時序數(shù)據(jù)庫。Prometheus 作為熱門的開源項目,擁有活躍的社區(qū)及眾多的成功案例。
Prometheus 提供了多個組件供用戶使用。目前,我們使用 Prometheus Server,來收集和存儲時間序列數(shù)據(jù)。Client 代碼庫,在程序中定制需要的 Metric 。Push GateWay 來接收 Client Push 上來的數(shù)據(jù),統(tǒng)一供 Prometheus 主服務器抓取。以及 AlertManager 來實現(xiàn)報警機制。其結構如下圖:

Grafana 是一個開源的 metric 分析及可視化系統(tǒng)。我們使用 Grafana 來展示系統(tǒng)的各項性能指標 。如下圖所示:
4.系統(tǒng)搭建
4.1搭建監(jiān)控系統(tǒng)
Prometheus Push Gateway 參考: https://github.com/prometheus/pushgateway
Prometheus Server 參考: https://github.com/prometheus/prometheus#install
Grafana 參考: http://docs.grafana.org
4.2配置
4.2.1 Prometheus 配置
vim 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).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# 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: ['192.168.1.115:9090']
- job_name: 'linux'
static_configs:
- targets: ['192.168.1.115:9100']
- job_name: 'pushgateway'
static_configs:
- targets: ['192.168.1.115:9091']
honor_labels: true
~
啟動成功以后我們可以通過Prometheus內置了web界面訪問,http://ip:9090
4.2.2 grafana 配置
編輯配置文件/etc/grafana/grafana.ini ,修改dashboards.json段落下兩個參數(shù)的值:
[dashboards.json]
enabled = true
path = /var/lib/grafana/dashboards
安裝儀表盤JSON模版:
git clone https://github.com/percona/grafana-dashboards.git
cp -r grafana-dashboards/dashboards /var/lib/grafana/