Prometheus 介紹
Prometheus 是一套開源監控系統,使用Go語言開發,是 Google BorgMon 監控系統的類似實現。
Prometheus 的基本原理是通過HTTP協議週期性抓取被監控元件的狀態,任意元件只要提供對應的HTTP介面就可以接入監控,是比較適合 Docker,Kubernetes 等環境的監控系統之一。輸出監控資訊的HTTP介面被稱作 exporter。
Prometheus 架構
Prometheus 使用的是 Pull
模型,Prometheus Server 通過 HTTP 的 pull 方式到各個目標拉取監控資料。
- Retrieval:中定義了 Prometheus Server 需要從哪些地方拉取資料
- Jobs / Exporters:Prometheus 可以從 Jobs 或 Exporters 中拉取監控資料。Exporter 以 Web API 的形式對外暴露資料採集介面。
- Prometheus Server:Prometheus 還可以從其他的 Prometheus Server 中拉取資料。
- Pushgateway:對於一些以臨時性 Job 執行的元件,Prometheus 可能還沒有來得及從中 pull 監控資料的情況下,這些 Job 已經結束了,Job 執行時可以在執行時將監控資料推送到 Pushgateway 中,Prometheus 從 Pushgateway 中拉取資料,防止監控資料丟失。
- Service:是指 Prometheus 可以動態的發現一些服務,拉取資料進行監控,如從DNS,Kubernetes,Consul 中發現。
- Storage:即 Prometheus 的儲存,利用 Prometheus Server 的本地儲存。
- PromQL:是 Prometheus 的查詢語句,利用 PromQL 可以和一些 WEBUI (如 Grafana )整合
- AlertManager:是一個獨立於 Prometheus 的外部元件,用於監控系統的告警,通過配置檔案可以配置一些告警規則,Prometheus 會把告警推送到 AlertManager。
Prometheus的特點
- 多維度資料模型,一個時間序列由一個度量指標和多個標籤鍵值對確定;
- 靈活的查詢語言,對收集的時序資料進行重組;
- 強大的資料視覺化功能,除了內建的瀏覽器,也支援跟 Grafana 整合;
- 高效的儲存,記憶體加本地磁碟,可通過功能分片和聯盟來擴充套件效能;
- 運維簡單,只依賴本地磁碟,Go 二進位制安裝包沒有任何其他庫包依賴;
- 精確告警;
- 非常多的客戶端庫;
- 提供了許多匯出器來收集常見系統指標;
- 可以通過中間閘道器進行時序列資料推送;
- 通過服務發現或者靜態配置來發現目標服務物件。
核心概念
資料模型
Prometheus 從根本上儲存的所有資料都是時間序列資料
(Time Serie Data,簡稱時序資料)。時序資料是具有時間戳的資料流,該資料流屬於某個度量指標(Metric)和該度量指標下的多個標籤(Label)。
- 度量指標(Metric):描述了被監控的某個測量特徵。度量指標名稱由ASCII字母、數字、下劃線和冒號組成,須匹配正規表示式
[a-zA-Z_:][a-zA-Z0-9_:]*
。 - 標籤(Tag):對於同一個度量指標,不同標籤值組合會形成特定維度的時序。標籤開啟了 Prometheus 的多維資料模型。Prometheus 的查詢語言可以通過度量指標和標籤對時序資料進行過濾和聚合。標籤名稱可以包含 ASCII 字母、數字和下劃線,須匹配正規表示式
[a-zA-Z_][a-zA-Z0-9_]*
,帶有 _ 下劃線的標籤名稱保留為內部使用。標籤值可以包含任意 Unicode 字元,包括中文。 - 取樣值(Sample):時序資料其實就是一系列的取樣值。每個取樣值包括:
- 一個64位的浮點資料
- 一個精確到毫秒的時間戳
- 註解(Annotation):一個註解由一個度量指標和一組標籤鍵值對構成。
度量指標
Prometheus 裡的度量指標有以下幾種型別:
- 計數器(Counter):一種累計型的度量指標,它是一個只能遞增的數值。計數器主要用於統計類似於伺服器請求數、任務完成數和錯誤出現次數這樣的資料。
- 計量器(Gauge):表示一個既可以增加,又可以減少的度量指標。計量器主要用於測量類似於溫度、記憶體使用量這樣的瞬時資料。
- 直方圖(Histogram):對觀察結果進行取樣(通常是請求持續時間或者響應大小這樣的資料),並在可配置的桶中進行統計。有以下幾種方式來產生直方圖(假設度量指標為
<basename>
):- 按桶計數,相當於
<basename>_bucket{le="<upper inclusive bound>"}
- 取樣值總和,相當於
<basename>_sum
- 取樣值總數,相當於
<basename>_count
,也等同於把所有采樣值放到一個桶裡來計數<basename>_bucket{le="+Inf"}
- 按桶計數,相當於
- 彙總(Summary):對觀察結果進行取樣。除了可以統計取樣值總和和總數,還能按照分位數統計。有以下幾種方式來產生彙總(假設度量指標為
<basename>
):- 分位數,也就是取樣值小於該分位數的個數佔總數的比例小於
φ
,相當於<basename>{quantile="<φ>"}
- 取樣值總和,相當於
<basename>_sum
- 取樣值總數,相當於
<basename>_count
- 分位數,也就是取樣值小於該分位數的個數佔總數的比例小於
任務和例項
在 Prometheus 裡,可以從中抓取取樣值的端點稱為例項,為了效能擴充套件而複製出來的多個這樣的例項形成了一個任務。
- 任務(Job):抓取所屬任務。
- 例項(Instance):抓取來源例項。
Prometheus 監控實戰
Prometheus 安裝部署
# 1. 下載
wget https://github.com/prometheus/prometheus/releases/download/v2.10.0/prometheus-2.10.0.linux-amd64.tar.gz
# 2. 解壓
tar zxvf prometheus-2.10.0.linux-amd64.tar.gz
# 3. 啟動
cd prometheus-2.10.0.linux-amd64
./prometheus --config.file=prometheus.yml
複製程式碼
exporter 安裝部署
node_exporter
# 1. 下載
wget https://github.com/prometheus/node_exporter/releases/download/v0.18.1/node_exporter-0.18.1.darwin-amd64.tar.gz
# 2. 解壓
tar zxvf node_exporter-0.18.1.darwin-amd64.tar.gz
# 3. 啟動
cd node_exporter-0.18.1.darwin-amd64
./node_exporter
複製程式碼
nginx-vts-exporter
這裡我使用的是 openresty,如果是使用 nginx 也是一樣
下載依賴的包
cd /usr/local/src/openresty-1.15.8.1/bundle
# openssl
wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz
# ngx_cache_purge
wget http://github.com/FRiCKLE/ngx_cache_purge/archive/2.3.zip -O ngx_cache_purge.zip
# nginx-module-vts
wget http://github.com/vozlt/nginx-module-vts/archive/v0.1.18.zip -O nginx-module-vts.zip
# upstream 健康檢查
wget https://github.com/yaoweibin/nginx_upstream_check_module/archive/master.zip -O nginx_upstream_check_module.zip
unzip nginx_upstream_check_module.zip
cd nginx-1.15.8
patch -p1 < ../nginx_upstream_check_module-master/check_1.14.0+.patch
複製程式碼
nginx 編譯安裝
./configure --prefix=/opt/openresty \
--with-http_auth_request_module \
--with-http_realip_module \
--with-http_v2_module \
--with-debug \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_gunzip_module \
--with-http_random_index_module \
--with-threads \
--with-pcre \
--with-luajit \
--with-mail \
--with-file-aio \
--with-http_v2_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_dav_module \
--with-http_sub_module \
--with-http_addition_module \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-http_secure_link_module \
--with-stream_ssl_preread_module \
--with-openssl=./bundle/openssl-1.1.1c \
--add-module=./bundle/ngx_cache_purge-2.3 \
--add-module=./bundle/nginx-module-vts-0.1.18 \
--add-module=./bundle/nginx_upstream_check_module-master \
-j2
gmake && gmake install
複製程式碼
nginx 配置
http {
vhost_traffic_status_zone;
vhost_traffic_status_filter_by_host on; #開啟此功能,會根據不同的server_name進行流量的統計,否則預設會把流量全部計算到第一個上。
...
server {
...
location /status {
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
}
# vhost_traffic_status off;
}
}
複製程式碼
如果不想要監控這個域名,這需要在
server
模組中配置vhost_traffic_status off;
nginx-vts-exporter 安裝
# 1. 下載
wget https://github.com/hnlq715/nginx-vts-exporter/releases/download/v0.10.0/nginx-vts-exporter-0.10.0.linux-amd64.tar.gz
# 2. 解壓
tar zxvf nginx-vts-exporter-0.10.0.linux-amd64.tar.gz
# 3. 啟動
cd nginx-vts-exporter-0.10.0.linux-amd64
複製程式碼
redis_exporter
# 1. 下載
wget https://github.com/oliver006/redis_exporter/releases/download/v1.0.3/redis_exporter-v1.0.3.linux-amd64.tar.gz
# 2. 解壓
tar zxvf redis_exporter-v1.0.3.linux-amd64.tar.gz
# 3. 啟動
cd redis_exporter-v1.0.3.linux-amd64
./redis_exporter -redis.addr 192.168.102.55:7000 -redis.password test --web.listen-address 0.0.0.0:9121
複製程式碼
Prometheus 新增 Exporter 配置
安裝完了 exporter 之後,需要將 exporter 新增到 prometheus 的配置中,簡單配置如下:
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: ['localhost:9090']
- job_name: "node"
static_configs:
- targets:
- '192.168.26.18:9100'
- '192.168.102.51:9100'
- '192.168.102.58:9100'
- '192.168.102.59:9100'
#labels:
# instance: "192.168.26.18:9100"
# env: "pro"
# name: "192.168.26.18"
- job_name: 'nginx'
static_configs:
- targets:
- '192.168.102.51:9913'
- '192.168.102.58:9913'
- '192.168.102.59:9913'
- job_name: 'redis-exporter'
file_sd_configs:
- files: ['./redis.json']
複製程式碼
redis.json 配置檔案如下:
[{
"targets": [
"192.168.102.53:9121",
"192.168.102.53:9122",
"192.168.102.54:9121",
"192.168.102.54:9122",
"192.168.102.55:9121",
"192.168.102.55:9122",
"192.168.102.70:9121",
"192.168.102.70:9122",
"192.168.102.71:9121",
"192.168.102.71:9122",
"192.168.102.72:9121",
"192.168.102.72:9122"
],
"labels": {
"service": "redis"
}
}
]
複製程式碼
重啟 prometheus 即可。最後就是配置 Grafana 視覺化了。
Grafana 安裝配置
Grafana 是一個跨平臺的開源的度量分析和視覺化工具,可以通過將採集的資料查詢然後視覺化的展示,並及時通知。
效果圖:
- Nginx 監控
- Redis 監控
- Node 監控
推薦閱讀: