Prometheus元件架構
- Prometheus Server: 採用
PULL
模式收集和儲存時間序列資料。 - Client Library: 客戶端庫,生成 metrics。當 Prometheus server 來 pull 時,直接返回實時狀態的 metrics。
- Push Gateway: 提供
PUSH
模式。主要用於短期的 jobs。由於這類 jobs 存在時間較短,可能在 Prometheus 來 pull 之前就消失了。為此,jobs 可以直接向 Push Gateway metrics。 - Exporters: 用於暴露已有的第三方服務的 metrics 給 Prometheus。如 node-exporter
- Alertmanager: 提供告警。從 Prometheus server 端接收到 alerts 後,會進行去除重複資料,分組,並路由到對收的接受方式,發出報警。常見的接收方式有:電子郵件,pagerduty,OpsGenie, webhook 等。
Prometheus元件安裝
1. docker映象包下載
docker pull prom/node-exporter
docker pull prom/prometheus
複製程式碼
2. 啟動node-exporter,用於機器系統資料收集
docker run -d -p 9100:9100 \
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
--net="host" \
prom/node-exporter
複製程式碼
啟動成功即可訪問:http://localhost:9100/metrics 頁面展示的即是收集到的資料指標
3. 啟動 pushgateway
docker pull prom/pushgateway
docker run -d -p 9091:9091 prom/pushgateway
複製程式碼
4. 啟動 alertmanager
配置 alertmanager.yml 配置檔案
global:
resolve_timeout: 5m #處理超時時間,預設為5min
smtp_smarthost: 'xxxxxx' # 郵箱smtp伺服器代理
smtp_from: 'xxxxxx' # 傳送郵箱名稱
smtp_auth_username: 'xxxxxx' # 郵箱名稱
smtp_auth_password: 'xxxxxx' #郵箱密碼
# 定義模板信心
templates:
- '/etc/alertmanager/templates/*.html'
route:
receiver: 'email' # 傳送警報的接收者的名稱,以下receivers name的名稱
group_wait: 10s
group_interval: 1m
repeat_interval: 1m
group_by: ['alertname']
receivers:
- name: 'email' # 警報
email_configs: # 郵箱配置
- to: 'xxxxx@163.com' # 接收警報的email配置
html: '{{ template "test.html" . }}' # 設定郵箱的內容模板
headers: { Subject: "[WARN] 報警郵件"} # 接收郵件的標題
複製程式碼
dockerfile如下:
FROM prom/alertmanager
ADD test.html /etc/alertmanager/templates/
ADD alertmanager.yml /etc/alertmanager/
複製程式碼
啟動 alertmanager:
docker run -d -p 9093:9093 my-alerts
複製程式碼
5. 啟動prometheus
新建 prometheus.yml 檔案,配置 告警服務 和 告警規則,監聽 pushgateway 的 scrape
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# 告警服務配置
alerting:
alertmanagers:
- static_configs:
- targets: ['test.host.com:9093'] # alertmanager部署地址
# 告警規則配置
rule_files:
- "alertmanager_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: prometheus
static_configs:
- targets: ['localhost:9090']
labels:
instance: prometheus
# 新增 pushgateway 的 scrape
- job_name: pushgateway
static_configs:
- targets: ['test.host.com:9091'] # pushgateway部署地址
labels:
instance: pushgateway
複製程式碼
⚠ 注意yaml檔案格式,各種縮緊必須格式化!
配置 alertmanager_rules.yml 規則檔案:
此處監控 flink 可用的task slot個數,小於 10個則告警
groups:
- name: test-rules
rules:
- alert: LowAvailableSlot # 告警名稱
expr: flink_jobmanager_taskSlotsAvailable{job="pushgateway"} < 10 # 告警的判定條件,參考Prometheus高階查詢來設定
for: 10s # 滿足告警條件持續時間多久後,才會傳送告警
labels: #標籤項
team: flink
annotations: # 解析項,詳細解釋告警資訊
summary: "{{$labels.instance}}: 資源告警"
description: "{{$labels.instance}}: job {{$labels.job}} 可用 slot 不足10個 "
複製程式碼
dockerfile如下:
FROM prom/prometheus
ADD prometheus.yml /etc/prometheus/
ADD alertmanager_rules.yml /etc/prometheus/
複製程式碼
啟動 prometheus :
docker run -d -p 9090:9090 my-prometheus
複製程式碼