天天看點

Prometheus 作為大廠監控标配,一定要做到知根知底!(元件篇)

作者:每日程式設計

引言

目前各大廠監控方案首選(或參考)均是 Prometheus+Grafana ,作為時序資料庫的基準參考,一定要對Prometheus 知根知底。

雖然大廠把時序做到分布式,也是基于Prometheus的存儲引擎做的外層路由封裝。其中京東的baudtime就是基于Prometheus的存儲引擎作為分布式shard,上層添加的meta route(兩層時間路由)和proxy層做的封裝,一切都是圍繞Prometheus生态的附加而已。掌握了Prometheus也就熟悉了各司的監控系統,架構上大同小異。本篇将詳細介紹Prometheus的各元件及原理。

Prometheus 作為大廠監控标配,一定要做到知根知底!(元件篇)

監控樣圖

介紹

Prometheus(由go語言(golang)開發)是一套開源的監控&報警&時間序列資料庫的組合。

時間序列資料(TimeSeries Data) : 按照時間順序記錄系統、裝置狀态變化的資料被稱為時序資料。

Prometheus基本原理是通過HTTP協定周期性抓取被監控元件的狀态,這樣做的好處是任意元件隻要提供HTTP接口就可以接入監控系統,不需要任何SDK或者其他的內建過程。

這樣做非常适合虛拟化環境,比如VM或者Docker 。

Server

Prometheus server負責定時去目标上抓取metrics(名額) 資料,每個抓取目标需要暴露一個http服務的接口給它定時抓取。

以HTTP方式,通過pull模型拉去時間序列資料,也可以通過中間網關支援push模型;

時序樣本:

在時間序列中的每個點,稱為一個樣本(sample),樣本由以下三部分組成:

名額:名額名稱和描述目前樣本

時間戳:一個精确到毫秒的時間戳;

樣本值:一個float64的浮點型資料表示目前樣本的值。

Exporter

通過安裝node_exporter監控遠端linux;例如通過安裝mysqld_exporter監控遠端mysql資料庫。

node節點上暴露服務端口(9100)的client ;server端yaml配置上ip:port 後即可采集到監控資料;

prometheus基于HTTP call (http/https請求配置檔案中指定的網絡端點(endpoint/IP:端口)上周期性擷取名額資料;

知識點補充:

白盒監控:自省方式,被監控端内部,可以自己生成名額,隻要等待監控系統來采集時提供出去即可

黑盒監控:對于被監控系統沒有侵入性,對其沒有直接"影響",這種類似于基于探針機制進行監控

Prometheus支援通過三種類型的途徑從目标上“抓取(Scrape) "名額資料(基于白盒監控) :

Exporters 周期性的抓取資料

Instrumentation 監控對象内部

Pushgateway--專門對接資料儲存

Pull模型的優勢在于(常見面試題)

集中控制:有利于将配置集在Prometheus Server上完成,包括名額及采取速率等;

Prometheus的根本目标在于收集在Target上預先完成聚合的聚合型資料,而非一款由事件驅動的存儲系統;

一般來說可以将Exporter分為2類:

  • 直接采集:這一類Exporter直接内置了對Prometheus監控的支援,比如cAdvisor,Kubernetes,Etcd,Gokit等,都直接内置了用于向Prometheus暴露監控資料的端點。
  • 間接采集:間接采集,原有監控目标并不直接支援Prometheus,是以我們需要通過Prometheus提供的Client Library編寫該監控目标的監控采集程式。例如: Mysql Exporter,JMX Exporter,Consul Exporter等。

PushGateway

這個元件是支援Client主動推送metrics到PushGateway,而Prometheus隻是定時去Gateway上抓取資料。

解決不在同一網段的問題,pushgateway就相當于一個中間網關。相當于pushgateway要和target可以通同時和普羅米修斯也可以通。

由于Prometheus資料采集基于Pull模型進行設計,是以在網絡環境的配置上必須要讓Prometheus Server能夠直接與Exporter進行通信。 當這種網絡需求無法直接滿足時,就可以利用PushGateway來進行中轉。可以通過PushGateway将内部網絡的監控資料主動Push到Gateway當中。而Prometheus Server則可以采用同樣Pull的方式從PushGateway中擷取到監控資料。

補充說明:Prometheus抓取資料的兩種模式 (1) push 模式(2)pull模式

push 模式 :這種模式我們可以靈活的zai被監控端使用各種語言編寫資料采集腳本,通過PushGateway傳輸給Prometheus,傳輸方式為http

pull 模式 :我們直接使用采集資料用戶端xxx_exporters将資料傳輸給Prometheus,已經有很多xxx_exporters詳見官檔,同樣也是http

- job_name: 'pushgateway'

scrape_interval: 5s

static_configs:

- targets: ['192.168.100.6:9091']

honor_labels: true

[root@node1 ~]# echo " metric 3.6" | curl --data-binary @- http://192.168.100.6:9091/metrics/job/test_job

注:--data-binary 表示發送二進制資料,注意:它是使用POST方式發送的!

[root@node1 ~]# cat push.sh

node_memory_usages=$(free -m | grep Mem | awk '{print $3/$2*100}')

job_name="memory"

instance_name="192.168.100.6"

cat <<EOF | curl --data-binary @- http://192.168.100.6:9091/metrics/job/$job_name/instance/$instance_name

#TYPE node_memory_usages gauge

node_memory_usages $node_memory_usages

EOF

Service discovery

動态發現待監控的Targct,進而完成監控配置的重要元件,在容器化環境中尤為有用;該元件目前由Promctheus Server内建支援

Alertmanager

從prometheus Server接收到“告警通知"後,通過去重、分組、路由等預處理功能後以高效向使用者完成告警資訊發送:Data visualization: Prometheus web uI (Prometheus Server内建) ,及Grafana等;

prometheus的資料類型

Prometheus将所有采集到的樣本資料以時間序列(time-series)的方式儲存在記憶體資料庫中,并定時儲存在硬碟上。時間序列中的每一個樣本由以下三部分組成。

名額(metric): metric name和描述目前樣本特征的labelsets組成,參考格式如 {=, …};,其中metric name的命名規則為:應用名稱開頭_監測對像_數值類型_機關

時間截(timestamp):一個精确到毫秒的時間截;

樣本值(value):一個float64的浮點類型資料表示目前的樣本值。

Prometheus 作為大廠監控标配,一定要做到知根知底!(元件篇)

四種名額類型

Counter:遞增

Gauge: 随機波動

Histogram:對一段範圍資料采樣,統計,求和

Summary:跟蹤資料,請求時長

繼續閱讀