一步步教你用Prometheus搭建實時監控系統系列(二)——詳細分析拉取和推送兩種不同模式
阿新 • • 發佈:2020-07-28
## 前言
本系列著重介紹`Prometheus`以及如何用它和其周邊的生態來搭建一套屬於自己的實時監控告警平臺。
本系列受眾物件為初次接觸`Prometheus`的使用者,大神勿噴,偏重於操作和實戰,但是重要的概念也會精煉出提及下。系列主要分為以下幾塊
* `Prometheus`各個概念介紹和搭建,如何抓取資料([一步步教你用Prometheus搭建實時監控系統系列(一)——上帝之火,普羅米修斯的崛起](https://www.cnblogs.com/bryan31/p/13362617.html))
* **如何推送資料至`Prometheus`,推送和拉取分別用於什麼樣的場景(本次分享內容)**
* `Prometheus`資料的結構以及查詢語言`PromQL`的使用
* Java應用如何和`Prometheus`整合,如何啟用服務發現,如果自定義業務指標
* `Prometheus`如何和`Grafana`視覺化套件進行整合和設定告警
* 教你如何手寫一個集成了監控Dubbo各個指標的java套件
* 實際案例分享,如何做各個業務端和系統端的監控大盤
## 抓取和推送
**拉取模式:**
`Prometheus`獲取資料的方式只有拉取(PULL),即`Prometheus`會以固定頻率去請求每個`target`所提供的`http url`來獲取資料。這就需要每個服務端點提供`http`的介面來獲取實時的資料。
![file](https://img2020.cnblogs.com/other/268224/202007/268224-20200728120257214-233011775.jpg)
**推送模式:**
`Prometheus`也變相的實現了推送資料的方式。
為什麼說是變相呢。因為`Prometheus`獲取資料的方式一直是拉取方式,官方並沒有提供推送資料的功能。但是官方為了相容推送這種方式,增加了一個`PushGateway`元件。
這個元件相當於一個代理服務,獨立部署。它沒有資料抓取功能,只能被動的等待資料推送。應用把資料推送到`PushGateway`後,`Prometheus`再從`PushGateway`抓取。
![file](https://img2020.cnblogs.com/other/268224/202007/268224-20200728120257922-957212696.jpg)
## 推送模式要注意的點
**即便客戶端推了全量的資料到了`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/pushgateway/releases
按照需要下載對應的包,我這裡是需要部署在linux伺服器上,所以下載這個
![file](https://img2020.cnblogs.com/other/268224/202007/268224-20200728120258191-166281738.jpg)
下載好,解壓。執行:
```
nohup ./pushgateway &
```
啟動起來後,預設埠為9091
在瀏覽器上根據ip+port可以訪問到如下頁面,就算啟動成功了:
![file](https://img2020.cnblogs.com/other/268224/202007/268224-20200728120258418-357589417.jpg)
除此之外還要在`Prometheus`的配置檔案裡設定`Target`:
```yml
- job_name: 'pushgateway'
scrape_interval: 10s # 每過10秒拉取一次
honor_labels: true
static_configs:
- targets: ['localhost:9091']
labels:
instance: pushgateway
```
設定完畢後重啟`Prometheus`,然後會在`Target`選項卡里看到狀態為`UP`的`Pushgateway`。
設定階段就完成了。
## URL推送測試
我這裡用`postman`軟體進行推送測試,推送`url`的格式為:**`/metr