基于Grafana和Prometheus的監視系統
1. Prometheus
1.1 Prometheus 介紹
Prometheus(普羅米修斯)是一套開源的監控&報警&時間序列數據庫的組合.由SoundCloud公司開發。
Prometheus基本原理是通過HTTP協議周期性抓取被監控組件的狀態,這樣做的好處是任意組件只要提供HTTP接口就可以接入監控系統,不需要任何SDK或者其他的集成過程。這樣做非常適合虛擬化環境比如VM或者Docker 。
Prometheus應該是為數不多的適合Docker、Mesos、Kubernetes環境的監控系統之一。
輸出被監控組件信息的HTTP接口被叫做exporter 。目前互聯網公司常用的組件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux 系統信息 (包括磁盤、內存、CPU、網絡等等),具體支持的源看:https://github.com/prometheus。
與其他監控系統相比,Prometheus的主要特點是:
- 一個多維數據模型(時間序列由指標名稱定義和設置鍵/值尺寸)。
- 非常高效的存儲,平均一個采樣數據占~3.5bytes左右,320萬的時間序列,每30秒采樣,保持60天,消耗磁盤大概228G。
- 一種靈活的查詢語言。
- 不依賴分布式存儲,單個服務器節點。
- 時間集合通過HTTP上的PULL模型進行。
- 通過中間網關支持推送時間。
- 通過服務發現或靜態配置發現目標。
- 多種模式的圖形和儀表板支持。
1.2 架構
它的服務過程是這樣的Prometheus daemon負責定時去目標上抓取metrics(指標) 數據,每個抓取目標需要暴露一個http服務的接口給它定時抓取。
Prometheus
:支持通過配置文件、文本文件、zookeeper、Consul、DNS SRV lookup等方式指定抓取目標。支持很多方式的圖表可視化,例如十分精美的Grafana,自帶的Promdash,以及自身提供的模版引擎等等,還提供HTTP API的查詢方式,自定義所需要的輸出。
Alertmanager
:是獨立于Prometheus的一個組件,可以支持Prometheus的查詢語句,提供十分靈活的報警方式。
PushGateway
:這個組件是支持Client主動推送metrics到PushGateway,而Prometheus只是定時去Gateway上抓取數據。
大多數Prometheus組件都是用Go編寫的,它們可以輕松地構建和部署為靜態二進制文件。訪問https://prometheus.io以獲取完整的文檔,示例和指南。
1.3 Prometheus的數據模型
Prometheus從根本上所有的存儲都是按時間序列去實現的,相同的metrics(指標名稱) 和label(一個或多個標簽) 組成一條時間序列,不同的label表示不同的時間序列。為了支持一些查詢,有時還會臨時產生一些時間序列存儲。
metrics name&label指標名稱和標簽
每條時間序列是由唯一的”指標名稱”和一組”標簽(key=value)”的形式組成。
指標名稱:一般是給監測對像起一名字,例如http_requests_total這樣,它有一些命名規則,可以包字母數字之類的的。通常是以應用名稱開頭監測對像數值類型單位這樣。例如:push_total、userlogin_mysql_duration_seconds、app_memory_usage_bytes。
標簽:就是對一條時間序列不同維度的識別了,例如一個http請求用的是POST還是GET,它的endpoint是什么,這時候就要用標簽去標記了。最終形成的標識便是這樣了:http_requests_total{method=”POST”,endpoint=”/api/tracks”}。
如果以傳統數據庫的理解來看這條語句,則可以考慮http_requests_total是表名,標簽是字段,而timestamp是主鍵,還有一個float64字段是值了。(Prometheus里面所有值都是按float64存儲)。
1.4 Prometheus四種數據類型
Counter
Counter用于累計值,例如記錄請求次數、任務完成數、錯誤發生次數。一直增加,不會減少。重啟進程后,會被重置。Gauge
Gauge常規數值,例如 溫度變化、內存使用變化。可變大,可變小。重啟進程后,會被重置。Histogram
Histogram(直方圖)可以理解為柱狀圖的意思,常用于跟蹤事件發生的規模,例如:請求耗時、響應大小。它特別之處是可以對記錄的內容進行分組,提供count和sum全部值的功能。Summary
Summary和Histogram十分相似,常用于跟蹤事件發生的規模,例如:請求耗時、響應大小。同樣提供 count 和 sum 全部值的功能。它提供一個quantiles的功能,可以按%比劃分跟蹤的結果。例如:quantile取值0.95,表示取采樣值里面的95%數據。
2.Grafana
grafana是用于可視化大型測量數據的開源程序,他提供了強大和優雅的方式去創建、共享、瀏覽數據。dashboard中顯示了不同metric數據源中的數據。
grafana有熱插拔控制面板和可擴展的數據源,目前已經支持Graphite、InfluxDB、OpenTSDB、Elasticsearch等。
3.監控系統架構
使用開源時序數據庫 Prometheus 作為監控和性能指標信息存儲方案,使用 Grafana 作為可視化組件進行展示。
Prometheus 是一個擁有多維度數據模型,靈活的查詢語句的時序數據庫。Prometheus 作為熱門的開源項目,擁有活躍的社區及眾多的成功案例。
Prometheus 提供了多個組件供用戶使用。目前,我們使用 Prometheus Server,來收集和存儲時間序列數據。Client 代碼庫,在程序中定制需要的 Metric 。Push GateWay 來接收 Client Push 上來的數據,統一供 Prometheus 主服務器抓取。以及 AlertManager 來實現報警機制。其結構如下圖:
Grafana 是一個開源的 metric 分析及可視化系統。我們使用 Grafana 來展示系統的各項性能指標 。如下圖所示:
4.系統搭建
4.1搭建監控系統
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段落下兩個參數的值:
[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/