Prometheus受啓發於Google的Brogmon監控系統(類似的Kubernetes是從Google的Brog系統演變而來),從2012年開始由前Google工程師在Soundcloud以開源軟件的形式進行研發,而且於2015年早期對外發布早期版本。2016年5月繼Kubernetes以後成爲第二個正式加入CNCF基金會的項目,同年6月正式發佈1.0版本。2017年末發佈了基於全新存儲層的2.0版本,能更好地與容器平臺、雲平臺配合。前端
在《SRE: Google運維解密》一書中指出,監控系統須要可以有效的支持白盒監控和黑盒監控。經過白盒可以瞭解其內部的實際運行狀態,經過對監控指標的觀察可以預判可能出現的問題,從而對潛在的不肯定因素進行優化。而黑盒監控,常見的如HTTP探針,TCP探針等,能夠在系統或者服務在發生故障時可以快速通知相關的人員進行處理。經過創建完善的監控體系,從而達到如下目的:node
1 . 長期趨勢分析:經過對監控樣本數據的持續收集和統計,對監控指標進行長期趨勢分析。例如,經過對磁盤空間增加率的判斷,咱們能夠提早預測在將來什麼時間節點上須要對資源進行擴容。python
2 . 對照分析:兩個版本的系統運行資源使用狀況的差別如何?在不一樣容量狀況下系統的併發和負載變化如何?經過監控可以方便的對系統進行跟蹤和比較。mysql
3 . 告警:當系統出現或者即將出現故障時,監控系統須要迅速反應並通知管理員,從而可以對問題進行快速的處理或者提早預防問題的發生,避免出現對業務的影響。linux
4 . 故障分析與定位:當問題發生後,須要對問題進行調查和處理。經過對不一樣監控監控以及歷史數據的分析,可以找到並解決根源問題。ios
5 . 數據可視化:經過可視化儀表盤可以直接獲取系統的運行狀態、資源使用狀況、以及服務運行狀態等直觀的信息。nginx
OpenTSDB是基於Hadoop/HBase的,擴展性不錯,但太重,且對於Ops的要求比較高.git
InfluxDB至關不錯,但其殺手鐗功能相似於集羣化之類的,都是付費版本纔有的,且其維護基於單一的商業公司(言下之意,若是你不用商業版,其實InfluxDB也沒有什麼特別大的優點,並且仍是單一公司維護有風險,)github
Graphite和Prometheus比起來,Prometheus功能更豐富強大.web
Prometheus是一個開源的完整監控解決方案,其對傳統監控系統的測試和告警模型進行了完全的顛覆,造成了基於中央化的規則計算、統一分析和告警的新模型。 相比於傳統監控系統Prometheus具備如下優勢以下:
缺點
# 1. 總體的集羣龐大到必定程度以後(全局的監控需求) # 2. 單個服務的集羣擴展到必定程度(單服務的監控需求) # 3. 跨機房監控需求(單個機房單個Prometheus服務器,但須要有一個跳脫實例機房的節點進行overview)
在這些狀況下,單個節點的Prometheus可能就沒法勝任了,這時候必然就須要進行水平擴展或者引入分佈式集羣概念:
聯邦集羣
# 1. 聯邦集羣中的Prometheus節點是分層級的 # 2. 下級的Prometheus節點採集應用數據 # 3. 上級的Prometheus節點從下級的Prometheus節點上採集數據.
Prometheus並不存在高可用的解決方案
官方如今的設計是將單節點的Prometheus作好,並提供聯邦集羣這個解決方案讓用戶本身去組件本身的監控拓撲網絡,這在規模比較小的時候還能對付,規模一大就容易出錯了,維護者必須很清楚聯邦集羣每個節點負責的業務是什麼,而後各層級節點如何對應聚集數據,這很是考驗整個拓撲結構的搭建者的功力,以及維護的流程和工具
Prometheus核心部分只有一個單獨的二進制文件,不存在任何的第三方依賴(數據庫,緩存等等)。惟一須要的就是本地磁盤,所以不會有潛在級聯故障的風險。
Prometheus基於Pull模型的架構方式,能夠在任何地方(本地電腦,開發環境,測試環境)搭建咱們的監控系統。對於一些複雜的狀況,還可使用 Prometheus服務發現(Service Discovery)的能力動態管理監控目標。
好比在 Kubernetes 的 Pod 中的 docker 實例,多是內部 IP 地址,對外可見 IP 地址是 Pod 地址;
另外一方面,docker 容器應用生命週期可能會比較短,VM 上的應用是重部署,docker 則是銷燬重建,對監控系統可能會有一些新的影響。
以下所示:
http_request_status{code='200',content_path='/api/path', environment='produment'} => [value1@timestamp1,value2@timestamp2...]
http_request_status{code='200',content_path='/api/path2', environment='produment'} => [value1@timestamp1,value2@timestamp2...]
Prometheus是一個時序數據庫,(全部保存在Proetheus裏的數據都是按時間戳和值的序列順序存放的,稱爲Vector(向量)),由於是NoSQL,相比關係型數據庫Mysql能很好支持大量數據寫入.
從最新測試結果看,在硬件資源知足狀況下,Prometheus單實例每秒採集10萬條
# 每一次數據採集或獲得的即一個Sample(樣本),其由三部分組成: # Metrics(指標): 包含了Metrics name以及Labels. # Timestamp(時間戳): 當前採樣的時間,精確到毫秒. # Value(採樣值): 其類型爲float64浮點數. # 經過PromQL能夠實現對監控數據的查詢、聚合。同時PromQL也被應用於數據可視化(如Grafana)以及告警當中。 # 經過PromQL能夠輕鬆回答相似於如下問題: # 在過去一段時間中95%應用延遲時間的分佈範圍? # 預測在4小時後,磁盤空間佔用大體會是什麼狀況? # CPU佔用率前5位的服務有哪些?(過濾)
* 數以百萬的監控指標 * 每秒處理數十萬的數據點。
相比關係型數據庫它使用了時間序列數據庫
# 時序數據庫特色: # 1.大部分時間都是寫入操做。 # 2.寫入操做幾乎是順序添加,大多數時候數據到達後都以時間排序。 # 3.寫操做不多寫入好久以前的數據,也不多更新數據。大多數狀況在數據被採集到數秒或者數分鐘後就會被寫入數據庫。 # 4.刪除操做通常爲區塊刪除,選定開始的歷史時間並指定後續的區塊。不多單獨刪除某個時間或者分開的隨機時間的數據。 # 5.基本數據大,通常超過內存大小。通常選取的只是其一小部分且沒有規律,緩存幾乎不起任何做用。 # 6.讀操做是十分典型的升序或者降序的順序讀。 # 7.高併發的讀操做十分常見。 # InfluxDB,OpenTSDB使用的也是時序數據庫.
Prometheus Daemon負責定時去目標上抓取metrics(指標)數據,每一個抓取目標須要暴露一個http服務的接口給它定時抓取。Prometheus支持經過配置文件、文本文件、Zookeeper、Consul、DNS SRV Lookup等方式指定抓取目標。Prometheus採用PULL的方式進行監控,即服務器能夠直接經過目標PULL數據或者間接地經過中間網關來Push數據。
Prometheus在本地存儲抓取的全部數據,並經過必定規則進行清理和整理數據,並把獲得的結果存儲到新的時間序列中。
Prometheus經過PromQL和其餘API可視化地展現收集的數據。Prometheus支持不少方式的圖表可視化,例如Grafana、自帶的Promdash以及自身提供的模版引擎等等。Prometheus還提供HTTP API的查詢方式,自定義所須要的輸出。
PushGateway支持Client主動推送metrics到PushGateway,而Prometheus只是定時去Gateway上抓取數據。
Alertmanager是獨立於Prometheus的一個組件,能夠支持Prometheus的查詢語句,提供十分靈活的報警方式。
Prometheus在記錄純數字時間序列方面表現很是好。它既適用於面向服務器等硬件指標的監控,也適用於高動態的面向服務架構的監控。對於如今流行的微服務,Prometheus的多維度數據收集和數據篩選查詢語言也是很是的強大。Prometheus是爲服務的可靠性而設計的,當服務出現故障時,它可使你快速定位和診斷問題。它的搭建過程對硬件和服務沒有很強的依賴關係。
Prometheus它的價值在於可靠性,甚至在很惡劣的環境下,你均可以隨時訪問它和查看系統服務各類指標的統計信息。 若是你對統計數據須要100%的精確,它並不適用,例如:它不適用於實時計費系統。
Exporter將監控數據採集的端點經過HTTP服務的形式暴露給Prometheus Server,Prometheus Server經過訪問該Exporter提供的Endpoint端點,便可獲取到須要採集的監控數據。
通常來講能夠將Exporter分爲2類:
在Prometheus Server中支持基於PromQL建立告警規則,若是知足PromQL定義的規則,則會產生一條告警,而告警的後續處理流程則由AlertManager進行管理。在AlertManager中咱們能夠與郵件,Slack等等內置的通知方式進行集成,也能夠經過Webhook自定義告警處理方式。AlertManager即Prometheus體系中的告警處理中心。
因爲Prometheus數據採集基於Pull模型進行設計,所以在網絡環境的配置上必需要讓Prometheus Server可以直接與Exporter進行通訊。 當這種網絡需求沒法直接知足時,就能夠利用PushGateway來進行中轉。能夠經過PushGateway將內部網絡的監控數據主動Push到Gateway當中。而Prometheus Server則能夠採用一樣Pull的方式從PushGateway中獲取到監控數據。
安裝Prometheus並配置Grafana
Prometheus基於Golang編寫,編譯後的軟件包,不須要依賴第三方依賴,用戶只須要下載對應平臺的二進制包,解壓而且添加基本的配置便可正常啓動Prometeus Server。
wget https://github.com/prometheus/prometheus/releases/download/v2.13.0/prometheus-2.13.0.linux-amd64.tar.gz
tar xvf prometheus-2.13.0.linux-amd64.tar.gz -C /usr/local/ cd /usr/local/ ln -s prometheus-2.13.0.linux-amd64/ prometheus
vim prometheus.yml # 全局配置global: scrape_interval: 15s # 設置抓取間隔,每15s採集一次數據,默認爲1分鐘 evaluation_interval: 15s # 估算規則的默認週期,每15秒計算一次規則。默認1分鐘 # scrape_timeout # 默認抓取超時,默認爲10s # Alertmanager相關配置 alerting: alertmanagers: - static_configs: - targets: # - alertmanager:9093 # 規則文件列表,使用'evaluation_interval' 參數去抓取 rule_files: # rule_files指定加載的告警規則文件.通常在單獨的文件定義, # 在prometheus.yml中引用.這個規則文件格式請看後面報警示例. # - "first_rules.yml" # - "second_rules.yml" # 抓取配置列表 scrape_configs: # 指定prometheus要監控的目標.在scrape_config中每一個監控目標是一個job,但job類型有不少種, # 能夠是最簡單的static_config,即靜態地指定每個目標 - job_name: 'prometheus' # static_configs: - targets: ['localhost:9090'] # 這裏定義了一個job的名稱: job_name:'prometheus',而後定義監控節點 # 下面的內容不用寫到配置文件裏面,不然影響後面服務的啓動,只是作一個示例: static_config: - targets: ['server01:9100','IP:9100','nginxserver:9100','web006:9100','redis:9100',\ 'logserver:9100','redis1:9100'] # 能夠看到target能夠並列寫入多個節點,用逗號隔開,機器名+端口號,端口號主要是exporters的端口, # 這裏9100實際上是node_exporter的默認端口,配置完成後,prometheus就能夠經過配置文件識別監控的節點, # 持續開始採集數據,prometheus基礎配置也就搭建好了. # cat first_rules.yml groups: - name: example rules: - alert: InstanceDown expr: up == 0 for: 1m labels: severity: critical annotations: summary: Instance has been down for more than 5 minutes
# 爲了安全,咱們使用普通用戶來啓動prometheus服務, # 做爲一個時序型數據庫產品,prometheus的數據默認會存放在應用目錄下,咱們需修改成/data/prometheus下 useradd -s /sbin/nologin -M prometheus mkdir -p /data/prometheus chown -R prometheus:prometheus /usr/local/prometheus chown -R prometheus:prometheus /data/prometheus/
# prometheus的啓動很簡單,只須要從新啓動解壓目錄的二進制文件prometheus便可, # 可是爲了更加方便的對prometheus進行管理,這裏使用systemd來啓停prometheus。 vim /usr/lib/systemd/system/prometheus.service [Unit] Description=Prometheus Documentation=https://prometheus.io/ After=network.target [Service] Type=simple User=prometheus ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/data/prometheus Restart=on-failure [Install] WantedBy=multi-user.target # 在此配置文件裏面,定義了啓動的命令,定義了數據存儲在/data/prometheus路徑下, # 不然默認會在prometheus二進制目錄的data下. systemctl start prometheus systemctl status prometheus systemctl enable prometheus
對於Docker用戶,直接使用Prometheus的鏡像便可啓動Prometheus Server:
docker run -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus
爲了方便看出效果,咱們到另一臺機器安裝node exporter
與傳統的監控zabbix來對比的話,prometheus-server就像是mysql,負責存儲數據。只不過這是時序數據庫而不是關係型的數據庫。數據的收集還須要其餘的客戶端,在prometheus中叫作exporter。針對不一樣的服務,有各類各樣的exporter,就比如zabbix的zabbix-agent同樣。
這裏爲了可以採集到主機的運行指標如CPU, 內存,磁盤等信息。咱們可使用Node Exporter。Node Exporter一樣採用Golang編寫,而且不存在任何的第三方依賴,只須要下載,解壓便可運行。
下載地址:
wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.linux-amd64.tar.gz
tar xvf node_exporter-0.18.1.linux-amd64.tar.gz -C /usr/local/ # 新建一個目錄專門安裝各類exporter mkdir -p /usr/local/prometheus_exporter cd /usr/local mv node_exporter-0.18.1.linux-amd64/ /usr/local/prometheus_exporter/ cd /usr/local/prometheus_exporter/ ln -s node_exporter-0.18.1.linux-amd64/ node_exporter
#直接打開node_exporter的可執行文件便可啓動 node export,默認會啓動9100端口。建議使用nohup來啓動 /usr/local/prometheus_exporter/node_exporter/node_exporter #建議使用nohup nohup /usr/local/prometheus_exporter/node_exporter/node_exporter >/dev/null 2>&1 & # 或者直接 cp /usr/local/prometheus_exporter/node_exporter-0.18.1.linux-amd64/node_exporter /usr/local/bin/ node_exporter # 可是這些侷限性都很強,咱們能夠跟prometheus同樣,加入到系統服務,使用systemd管理
vim /usr/lib/systemd/system/node_exporter.service [Unit] Description=node_exporter Documentation=https://prometheus.io/ After=network.target [Service] Type=simple ExecStart=/usr/local/prometheus_export/node_exporter-0.18.1.linux-amd64/node_exporter Restart=on-failure [Install] WantedBy=multi-user.target # 啓動服務 systemctl start node_exporter systemctl daemon-reload systemctl status node_exporter
在 /etc/rc.local 加入上面的啓動命令便可
# 配置Prometheus,收集node exporter的數據 # 能夠看到node exporter啓動後也就是暴露了9100端口,並無把數據傳到prometheus, # 咱們還須要在prometheus中配置,讓prometheus去pull這個接口的數據。 # 咱們去監控主機編輯prometheus.yml文件,修改最後幾行,而後重啓服務 vim /usr/local/prometheus/prometheus.yml scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'node' static_configs: - targets: ['172.19.0.51:9100'] # node節點的targets處的IP填寫你要監控的node的IP. systemctl restart prometheus # 咱們登陸到Prometheus主機,看下這個節點是否是up狀態
# HELP用於解釋當前指標的含義 # TYPE則說明當前指標的數據類型
從上面的例子中node_cpu的註釋代表當前指標是cpu0上idle進程佔用CPU的總時間,CPU佔用時間是一個只增不減的度量指標,從類型中也能夠看出node_cpu的數據類型是計數器(counter),與該指標的實際含義一致,又例如node_locad1該指標反映了當前主機再一分鐘之內的負載狀況,系統的負載狀況會隨着系統的資源使用而變化,所以node_load1反映的是當前狀態,數據可能增多也可能減小,從註釋中能夠看出當前指標類型爲儀表盤(gauge),與指標反映的實際含義一致.
# 除了這些之外,在當前頁面中根據物理主機系統的不一樣,你還可能看到以下監控指標: * node_boot_time:系統啓動時間 * node_cpu:系統CPU使用量 * node_disk_*:磁盤IO * node_filesystem_*:文件系統用量 * node_load1:系統負載 * node_memeory_*:內存使用量 * node_network_*:網絡帶寬 * node_time:當前系統時間 * go_*:node exporter中go相關指標 * process_*:node exporter自身進程相關運行指標
node_load1
能夠查詢出Prometheus採集到的主機負載的樣本數據,這些樣本數據按照時間前後順序展現,造成了主機負載隨時間變化的趨勢圖表:wget https://dl.grafana.com/oss/release/grafana-6.4.2.linux-amd64.tar.gz tar xvf grafana-6.4.2.linux-amd64.tar.gz -C /usr/local/ ln -s /usr/local/grafana-6.4.2/ /usr/local/grafana
useradd -s /sbin/nologin -M grafana mkdir /data/grafana mkdir /data/grafana/plugins mkdir /data/grafana/provisioning mkdir /data/grafana/data mkdir /data/grafana/log chown -R grafana:grafana /usr/local/grafana/ chown -R grafana:grafana /data/grafana/
vim /usr/local/grafana/conf/defaults.ini data = /data/grafana/data logs = /data/grafana/log plugins = /data/grafana/plugins provisioning = /data/grafana/conf/provisioning
vim /usr/lib/systemd/system/grafana-server.service [Unit] Description=Grafana After=network.target [Service] User=grafana Group=grafana Type=notify ExecStart=/usr/local/grafana/bin/grafana-server -homepath /usr/local/grafana Restart=on-failure [Install] WantedBy=multi-user.target # systemctl start grafana-server && systemctl enable graana-server
啓動服務,並用web訪問http://IP:3000,默認3000端口,admin/admin
* grafana雖然已經安裝好了,可是這個時候尚未數據,沒辦法做圖。 * 下面咱們把grafana和prometheus關聯起來,也就是在grafana中添加添加數據源。 * 在配置頁面點擊添加數據源,而後選擇prometheus,輸入prometheus服務的參數便可。
接下來咱們到grafana中添加對應的模板,能夠將以前那個模板刪掉,咱們去尋找適應的模板
若是有須要,咱們能夠安裝餅形插件
# 使用新的grafana-cli工具從命令行安裝piechart-panel: grafana-cli plugins install grafana-piechart-panel 該插件將安裝到您的grafana插件目錄中; 若是安裝了grafana軟件包,則默認在/var/lib/grafana/plugins cd /var/lib/grafana/plugins/ 可是由於咱們以前自定義了目錄,因此要將插件放到配置文件中定義的插件目錄位置 mv /var/lib/grafana/plugins/* /data/grafana/plugins/ #重啓grafana systemctl restart grafana-server 這樣dashboard中的餅圖就能夠正常展現出來了,可能須要一點時間緩衝