本系列着重介紹Prometheus
以及如何用它和其周邊的生態來搭建一套屬於本身的實時監控告警平臺。java
本系列受衆對象爲初次接觸Prometheus
的用戶,大神勿噴,偏重於操做和實戰,可是重要的概念也會精煉出說起下。系列主要分爲如下幾塊linux
Prometheus
各個概念介紹和搭建,如何抓取數據(一步步教你用Prometheus搭建實時監控系統系列(一)——上帝之火,普羅米修斯的崛起)Prometheus
,推送和拉取分別用於什麼樣的場景(本次分享內容)Prometheus
數據的結構以及查詢語言PromQL
的使用Prometheus
集成,如何啓用服務發現,若是自定義業務指標Prometheus
如何和Grafana
可視化套件進行集成和設置告警拉取模式:nginx
Prometheus
獲取數據的方式只有拉取(PULL),即Prometheus
會以固定頻率去請求每一個target
所提供的http url
來獲取數據。這就須要每一個服務端點提供http
的接口來獲取實時的數據。git
推送模式:github
Prometheus
也變相的實現了推送數據的方式。docker
爲何說是變相呢。由於Prometheus
獲取數據的方式一直是拉取方式,官方並無提供推送數據的功能。可是官方爲了兼容推送這種方式,增長了一個PushGateway
組件。segmentfault
這個組件至關於一個代理服務,獨立部署。它沒有數據抓取功能,只能被動的等待數據推送。應用把數據推送到PushGateway
後,Prometheus
再從PushGateway
抓取。瀏覽器
即使客戶端推了全量的數據到了PushGateway
,Prometheus
也不是每次拉取這個期間用戶推上來的全部數據。服務器
事實上Prometheus
只拉取用戶最後一次push上來的數據。微信
在這個系列一的時候,曾經提到過Prometheus
其實並不須要每個精確的數據,長期保存的是中等或者低精度的數據。它每次只抓取一個數據,在固定的頻率下。也能造成某種數據的趨勢。
若是客戶端一直沒有推送新的指標到PushGateway
,那麼Prometheus
將始終拉取最後推送上的數據,直到指標消失,默認是5分鐘。
Pushgateway
本意是不會存儲指標的,可是爲了讓pushgateway
意外重啓一類的故障以後可以從新讀取到原來的指標,添加了一個將指標暫時存儲到本地的功能,參數--persistence.interval=5m
就是默認保持5分鐘,5分鐘後,本地存儲的指標會刪除。能夠經過調節這個值來修正發現異常的時間。
經過單個Pushgateway
監控多個實例時,Pushgateway
有可能成爲單點故障和潛在瓶頸
若是要用Pushgateway
的話,建議多點部署。而後前面經過nginx
進行反向代理多個節點,進行負載均衡。
Prometheus
採用定時拉取模式,可能因爲子網絡或者防火牆的緣由,不能直接拉取各個Target
的指標數據,此時能夠採用各個Target
往PushGateway
上推送數據,而後Prometheus
去PushGateway
上定時拉取PushGateway
來統一收集,而後Prometheus
來統一拉取Pushgateway
分docker
安裝和普通安裝兩種,這裏才用普通安裝
先上prometheus
的github release主頁
https://github.com/prometheus...
按照須要下載對應的包,我這裏是須要部署在linux服務器上,因此下載這個
下載好,解壓。運行:
nohup ./pushgateway &
啓動起來後,默認端口爲9091
在瀏覽器上根據ip+port能夠訪問到以下頁面,就算啓動成功了:
除此以外還要在Prometheus
的配置文件裏設置Target
:
- job_name: 'pushgateway' scrape_interval: 10s # 每過10秒拉取一次 honor_labels: true static_configs: - targets: ['localhost:9091'] labels: instance: pushgateway
設置完畢後重啓Prometheus
,而後會在Target
選項卡里看到狀態爲UP
的Pushgateway
。
設置階段就完成了。
我這裏用postman
軟件進行推送測試,推送url
的格式爲:/metrics/job/<JOBNAME>{/<LABEL_NAME>/<LABEL_VALUE>}
這個測試用例爲意思是,推送一個指標aaa,標籤爲bbb=BBB,ccc=CCC
,值爲111.1到一個組上,這個組爲job=pushgateway,instance=demo
。
其實你能夠簡單的理解爲這個指標aaa帶有4個標籤:job,instance,bbb,ccc。只是job和instance是屬於組上的標籤。
同一個組裏的相同的指標,Prometheus
每次只取最新的,不一樣組內能夠有相同的指標。
關於數據結構和標籤結構系列的下一篇文章會詳細介紹。
總之,你提交這個POST
請求後,能夠在http://ip:9091
上看到以下數據:
能夠看到,aaa這個標籤已經成功的被提交到Pushgateway
裏了。
接下來,咱們在Prometheus
裏查詢這個指標:
能夠看到,Prometheus
也成功的拉取到了這個指標。
雖然咱們在java服務端也能利用httpclient
等工具進行提交,可是須要自行組裝不少請求體。Prometheus
官方提供了一個SDK。
首先在Maven
中引入依賴包:
<dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient_pushgateway</artifactId> <version>0.9.0</version> </dependency>
對Gauge
,Timer
,Counter
,Summary
四種常見的指標進行推送示例:
public void run(String... args) throws Exception { Gauge guage = Gauge.build("my_custom_metric", "This is my custom metric.") .labelNames("aaa","bbb").register(); Gauge.Child child = guage.labels("AAA","BBB"); child.set(334.5); Gauge timerGauge = Gauge.build("my_timer_metric","this is my timer metric.").register(); Gauge.Timer timer = timerGauge.startTimer(); Thread.sleep(3000L); Counter counter = Counter.build("my_count_metric","this is my count metric.").register(); counter.inc(); counter.inc(); Summary summary = Summary.build("my_summary_metric","this is my summary metric.").register(); summary.observe(45.6); summary.observe(54.5); String url = "xxx.xxx.xxx.xxx:9091"; PushGateway pg = new PushGateway(url); Map<String, String> groupingKey = new HashMap<>(); groupingKey.put("instance", "my_instance"); pg.pushAdd(CollectorRegistry.defaultRegistry, "my_job", groupingKey); }
這段代碼演示了4個指標批量提交的場景。經過註冊到CollectorRegistry.defaultRegistry
裏,最後一塊兒pushAdd
。
咱們能夠在Pushgateway
裏查詢到提交的指標:
一樣在Prometheus
裏也能查詢到這4個指標,具體圖示就不貼了。能夠本身嘗試下。
這個系列旨在利用實戰操做教你一步步搭建本身系統和業務監控大盤。後面會繼續更新。下一個章節將分析:Prometheus
中的數據格式分析以及PromQL
的使用。
若是你喜歡做者的文章,歡迎微信公衆號關注 「元人部落」,一個只作原創的技術科技分享號
關注後回覆「資料」獲取50G的技術資料