第一章 Prometheus入門
1.1 Prometheus的特點
- Prometheus是一個開源的完整監控解決方案,其對傳統監控系統的測試和告警模型進行了徹底的顛覆,形成了基於中央紅的規則計算、統一分析和告警的新模型,相比於傳統監控系統,Prometheus具有以下特點
1.1.1 易於管理
- Prometheus核心部分只有一個單獨的二進制文件,不存在任何的第三方依賴庫,唯一需要的就是本地磁盤,因此不會有潛在級聯故障的風險
- Prometheus基於pull模型的架構方式,可以在任何地方(本地電腦,開發環境,測試環境)搭建我們的監控系統
- 對於一些復雜的情況,還可以使用Prometheus服務發現(Service Discovery)的能力動態管理監控指標
1.1.2 監控服務的內部運行狀態
- Prometheus鼓勵用戶監控服務的內部狀態,基於Prometheus豐富的Client庫,用戶可以輕松的在應用程序中添加對Prometheus的支持,從而讓用戶獲取服務和應用內部真正的運行狀態
1.1.3 強大的數據模型
- 所有采集的監控數據均以指標(metric)的形式保存在內置的時間序列數據庫當中(TSDB)。所有的樣本除了基本的指標名稱以外,還包含一組用於描述該樣本特征的標簽。
- 每一條時間序列由指標名稱以及一組標簽唯一標識,每條時間序列按照時間的先后順序存儲一系列的樣本值
1.1.4 強大的查詢語言PromQL
- Prometheus內置了一個強大的數據查詢語言PromQL。通過PromQL可以實現對監控數據的查詢、聚合。同時PromQL也被應用於數據可視化(如Grafana)以及告警當中。
- 通過PromQL可以輕松回答類似於以下問題
- 在過去一段時間中95%應用延遲時間的分布范圍?
- 預測在4小時后,磁盤空間占用大致會是什么情況?
- CPU占用率前5位服務有哪些(過濾)
1.1.5 高效
- 對於監控系統而言,大量的監控任務必然導致有大量的數據產生。而Prometheus可以高效地處理這些數據,對於單一Prometheus Server實例而言它可以處理
- 數以百萬的監控指標
- 每秒處理數十萬的數據點
1.1.6 可擴展
- 可以在每個數據中心、每個團隊運行獨立的Prometheus Server。Prometheus對於聯邦集群的支持,可以讓多個Prometheus實例產生一個邏輯集群,當單實例Prometheus Server處理的任務量過大時,通過使用功能分區+聯邦集群可以對其進行擴展
1.1.7 易於集成
- 使用Prometheus可以快速搭建監控服務,並且可以非常方便地在應用程序中進行集成
- Prometheus還可以與其他的監控系統進行集成
1.1.8 可視化
- Prometheus Server中自帶的UI,可以方便地直接對數據進行查詢,並且支持直接以圖形化的形式展示數據
- 最新的Grafana可視化工具也已經提供了完整的Prometheus的支持,基於Grafana可以創建更加精美的監控圖標
1.1.9 開放性
- 通常來說當我們需要監控一個應用程序時,一般需要該應用程序提供對相應監控系統協議的支持,因此應用程序會與所選擇的監控系統進行綁定,為了減少這種綁定所帶來的限制,對於決策者而言要么你就直接在應用中集成該監控指標的支持,要么就在外部創建單獨的服務來適配不同的監控系統
- Prometheus的client library的輸出格式不止支持Prometheus的格式化數據,也可以輸出支持其他監控系統的格式化數據,比如Graphite。因此你甚至可以在不使用Prometheus的情況下 ,采用Prometheus的client library來讓你的應用程序支持監控數據采集。
1.2 Prometheus的架構
1.2.1 Prometheus的生態圈組件
1.2.2 架構理解
- 存儲計算層
- Prometheus Server里面包含了存儲引擎和計算引擎
- Retrieval組件為取數組件,它會主動從Pushgateway或者Exporter拉取指標數據
- Server Discovery,可以動態發現要監控的目標
- TSDB,數據核心存儲與查詢
- HTTP server 對外提供HTTP服務
- 采集層
- 采集層分兩類,一類是生命周期較短的作業,還有一類是生命周期較長的作業
- 短作業:直接通過API,在退出時間指標推送給Pushgateway
- 長作業:Retrieval組件直接從Job或者exporter拉取數據
- 采集層分兩類,一類是生命周期較短的作業,還有一類是生命周期較長的作業
- 應用層
- 應用層主要分為兩種,一種是AlertManager,另一種是數據可視化
- AlertManager
- 對接Pagerduty,是一套付費的監控報警系統,可實現短信告警,五分鍾無人ack打電話通知,仍然無人ack,通知值班人員Manager、發郵件......
- 數據可視化
- Prometheus web UI
- Grafana
- API Clients
- AlertManager
- 應用層主要分為兩種,一種是AlertManager,另一種是數據可視化
第二章 Prometheus的安裝
2.1 安裝Prometheus Server
2.1.1 上傳安裝包
[root@VM-32-18-centos ~]# cd /opt/src/
[root@VM-32-18-centos src]# ls
alertmanager-0.23.0.linux-amd64.tar.gz prometheus-2.30.1.linux-amd64.tar.gz
grafana-5.4.2-1.x86_64.rpm pushgateway-1.4.1.linux-amd64.tar.gz
node_exporter-1.2.2.linux-amd64.tar.gz
2.1.2 解壓安裝包
[root@VM-32-18-centos src]# tar -xvf prometheus-2.30.1.linux-amd64.tar.gz -C /opt/
[root@VM-32-18-centos opt]# mv prometheus-2.30.1.linux-amd64 prometheus-2.30.1
2.1.3 修改配置文件
[root@VM-32-18-centos prometheus]# vim prometheus.yml
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["172.16.32.18:9090"]
#添加pushgateway配置
- job_name: 'pushgateway'
static_configs:
- targets: ['172.16.32.18:9091']
labels:
instance: pushgateway
#添加node_exporter配置
- job_name: 'node_exporter'
static_configs:
- targets: ['172.16.32.18:9100']
#配置說明
1、global配置塊:控制Prometheus服務器的全局配置
scrape_interval:配置拉取數據的時間間隔,默認為1分鍾
evaluation_interval:規則驗證(生成alert)的時間間隔,默認為1分鍾
2、rule_files配置塊:規則配置文件
3、scrape_configs配置塊:配置采集目標相關,Prometheus監視的目標。Prometheus自身的運行信息可以通過HTTP訪問,所有Prometheus可以監控自己的運行數據
job_name:監控作業的名稱
static_configs:表示靜態目標配置,就是固定從某個target拉取數據
targets:指定監控的目標,其實就是從哪兒拉取數據,Prometheus會從http://172.16.32.18:9090/metrics上拉取數據
Prometheus是可以在運行時自動加載配置的,啟動時需要添加:--web.enable-lifecycle
2.2 安裝Pushgateway
- Prometheus在正常情況下是采用拉取模式從產生metric的作業或者exporter(比如專門監控主機的NodeExporter)拉取監控數據。但是我們要監控的是Flink on Yarn作業,想要讓Prometheus自動發現作業的提交、結束以及自動拉取數據顯然是比較困難的。Pushgateway就是一個中轉組件,通過配置Flink on yarn作業將metric推到Pushgateway,Prometheus再從Pushgateway拉取就可以啦
2.2.1 解壓安裝包
[root@VM-32-18-centos src]# tar -xvf pushgateway-1.4.1.linux-amd64.tar.gz -C /opt/
[root@VM-32-18-centos opt]# mv pushgateway-1.4.1.linux-amd64 pushgateway
2.3 安裝AlertManager
2.3.1 解壓安裝包
[root@VM-32-18-centos src]# tar -xvf alertmanager-0.23.0.linux-amd64.tar.gz -C /opt/
[root@VM-32-18-centos opt]# mv alertmanager-0.23.0.linux-amd64/ alertmanager
2.4 安裝Node Exporter
- 在Prometheus的架構設計中,Prometheus Server主要負責數據的收集,存儲並且對外提供數據查詢支持,而實際的監控樣本數據的收集則是由exporter完成,因此為了能夠監控某些東西,如主機的CPU利用率,我們需要使用到exporter。Prometheus周期性的從exporter暴露的HTTP服務地址(通常是/metrics)拉取監控樣本數據
- exporter可以是一個相對開發的概念,其可以是一個獨立運行的程序獨立於監控目標以外,也可以是直接內置在監控目標中。只要能夠向Prometheus提供標准格式的監控樣本數據即可。
- 為了能夠采集到主機的運行指標如CPU、內存、硬盤等信息,我們可以用Node exporter,只需要下載解壓即可運行。
2.4.1 解壓安裝包
[root@VM-32-18-centos src]# tar -xvf node_exporter-1.2.2.linux-amd64.tar.gz -C /opt/
[root@VM-32-18-centos opt]# mv node_exporter-1.2.2.linux-amd64/ node_exporter
#啟動服務
[root@VM-32-18-centos node_exporter]# pwd
/opt/node_exporter
[root@VM-32-18-centos node_exporter]# ./node_exporter
#通過地址加9100端口訪問,可以看到node_exporter獲取到當前主機的所有監控數據
#設置服務開機自啟
[Unit]
Description=node_exporter
Documentation=https://github.com/prometheus/node_exporter
After=network.target
[Service]
Type=simple
ExecStart=/opt/node_exporter/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
[root@VM-32-18-centos ~]# systemctl restart node_exporter.service
[root@VM-32-18-centos ~]# systemctl enable node_exporter
2.5 啟動服務
#啟動Prometheus,在后台運行
[root@VM-32-18-centos prometheus]# nohup ./prometheus --config.file=prometheus.yml >./prometheus.log 2>&1 &
#啟動pushgateway
nohup ./pushgateway --web.listen-address :9091 > ./pushgateway.log 2>&1 &
第三章 PromQL介紹
- Prometheus通過指標名稱以及對應的一組標簽唯一定義一條時間序列。指標名稱反映了監控樣本的基本標識,而label則在這個基本特征上為采集到的數據提供了多種特征維度。用戶可以基於這些特征維度過濾、聚合、統計從而產生新的計算后的一條時間序列。promQL是Prometheus內置的數據查詢語言,其提供對時間序列數據豐富的查詢,聚合以及邏輯運算能力的支持,並且被廣泛應用在Prometheus的日常應用當中,包括對數據查詢、可視化、告警處理當中。可以這么說,promQL是Prometheus所有應用場景的基礎,理解和掌握promQL是Prometheus入門的第一課。
3.1 基本用法
3.1.1 查詢時間序列
-
當Prometheus通過exporter采集到相應的監控指標樣本數據后,我們就可以通過promQL對監控樣本數據進行查詢
-
當我們直接使用監控指標名稱查詢時,可以查詢該指標下的所有時間序列
#查詢Prometheus中所有http請求 prometheus_http_requests_total prometheus_http_requests_total{} #該表達式會返回指標名稱的所有時間序列 prometheus_http_requests_total{code="200", handler="/-/ready", instance="119.91.130.53:9090", job="prometheus"} 2 #promQL還支持用戶根據時間序列的標簽匹配模式來對時間序列進行過濾,目前主要支持兩種匹配模式:完全匹配和正則匹配 #完全匹配模式:支持使用 = 和 != 兩種 prometheus_http_requests_total{handler="/api/v1/metadata"} #正則匹配模式:多個表達式之間使用|進行分離 prometheus_http_requests_total{code=~"200|302",handler="/api/v1/rules"}
3.1.2 范圍查詢
-
直接通過類似於promQL表達式查詢時間序列時,返回值中只會包含該時間序列中的最新的一個樣本值,這樣的返回結果我們稱之為瞬時向量。而對應的這樣的表達式稱之為_瞬時向量表達式
-
而如果我們想過去一段時間范圍內的樣本數據時,我們則需要使用區間向量表達式。區間向量表達式和瞬時向量表達式之間的差異在於區間向量表達式中我們需要定義時間選擇范圍,時間范圍通過時間范圍選擇器【】進行定義。
#查詢最近5分鍾內的樣本數據 prometheus_http_requests_total{}[5m] #區間向量表達式
3.1.3 時間位移操作
-
在瞬時向量表達式或區間向量表達式中,都是以當前時間為基准
-
使用位移操作。位移操作的關鍵字是offset
#查詢5分鍾前的樣本數據 prometheus_http_requests_total{} offset 5m #查詢昨天一天的區間數據 prometheus_http_requests_total{}[1d] offset 1d
3.1.4 使用聚合操作
-
一般來說,如果描述樣本特征的標簽在並非唯一的情況下,通過promQL查詢數據,會返回多條滿足這些特征維度的時間序列。而promQL提供的聚合操作可以用來對這些時間序列進行處理,形成一條新的時間序列
#查詢系統所有http請求的總量 sum(prometheus_http_requests_total) #按照mode計算主機CPU的平均使用時間 avg(node_cpu_seconds_total) by (mode) #按照主機查詢各個主機的CPU使用率 sum(sum(irate(node_cpu_seconds_total{mode!='idle'}[5m])) / sum(irate(node_arp_entries[5m]))) by (instance)
3.1.5 標量和字符串
- 標量(Scalar):一個浮點型的數字值
- 標量只有一個數字,沒有時序
- 用戶可以通過內置函數scalar()將單個瞬時向量轉換為標量
- 字符串:一個簡單的字符串值
- 直接使用字符串,作為promQL的表達式,則會直接返回字符串
3.1.6 合法的PromQL表達式
- 所有的promQL表達式必須至少包含一個指標名稱,或者一個不會匹配到的空字符串的標簽過濾器
3.2 PromQL操作符
- 使用PromQL除了能夠方便的按照查詢和過濾時間序列外,PromQL還支持豐富的操作符,用戶可以使用這些操作符對進一步的對事件序列進行第二次加工,這些操作符包括:數學運算符、邏輯運算符、布爾值運算符等
第四章 Prometheus和Flink集成
- Flink提供的metrics可以在Flink內部收集一些指標,通過這些指標讓開發人員更好地理解作業或集群的狀態
4.1 拷貝jar包
#將plugns下的jar包復制到lib目錄下
[root@VM-32-18-centos metrics-prometheus]# cp flink-metrics-prometheus-1.12.0.jar /opt/flink-prometheus/lib/
4.2 修改Flink配置
#在配置文件中添加下面配置
#### 與Prometheus集成配置 ####
metric.reporter.prometheus.class: org.apache.flink.metrics.promethus.PrometheusPushGatewayReporter
# pushgateway的主機名與端口信息
metrics.reporter.promgateway.host: 119.91.130.53
metrics.reporter.prometheus.port: 9091
# Flink metric在前端展示的標簽(前綴)與隨機后綴
metrics.reporter.promgateway.jobName: flink-metrics-ppg
metrics.reporter.promgateway.randomJobNameSuffix: true
metrics.reporter.promgateway.deleteOnShtdown: false
metrics.reporter.promgateway.interval: 30 SECONDS
4.3 啟動Flink
#需要有hadoop環境
[root@VM-32-18-centos bin]# ./start-cluster.sh
4.4 查看Prometheus監控指標
#登錄prometheus控制台界面,查看Prometheus是否有flink的監控指標
第五章 Prometheus和Grafana集成
- grafana是一款采用go語言編寫的開源應用,主要用於大規模指標數據的可視化展現,是網絡架構和應用分析中最流行的時序數據展示工具,目前已經支持絕大部分常用的時序數據庫。
- 下載地址:https://grafana.com/grafana/download
5.1 上傳並解壓
[root@VM-32-18-centos src]# wget https://dl.grafana.com/enterprise/release/grafana-enterprise-8.2.0.linux-amd64.tar.gz
[root@VM-32-18-centos src]# tar -zxvf grafana-enterprise-8.2.0.linux-amd64.tar.gz -C /opt/
5.2 啟動Grafana
[root@VM-32-18-centos src]# cd /opt/grafana-8.2.0/bin/
[root@VM-32-18-centos bin]# nohup ./grafana-server web > ./grafana.log 2>&1 &
#打開web:http://119.91.53.130:3000 默認用戶名和密碼:admin
5.3 添加數據源Prometheus
1、點擊配置,點擊Data Sources
2、add data source
3、添加Prometheus的地址加端口
4、保存配置
5.4 手動創建儀表盤Dashboard
1、點擊左上角+號,創建儀表盤
2、修改標題名稱
3、選擇data source
4、添加監控指標
5、ctrl+enter應用監控指標
6、保存配置
5.5 添加Node Exporter模板
- 登錄https://grafana.com/grafana/dashboards
- 搜索node_exporter模板
- 下載json文件
- 點擊左上角+號,選擇import
- 導入json文件
- 選擇Prometheus監控
第六章 集成第三方告警平台睿象雲
- 郵件通知常會出現接收不及時的問題,為確保通知信息被及時接收,可通過配置Prometheus或者Grafana與第三方平台告警平台(睿象雲)集成,進而通過第三方平台提供的多種告警媒介(例如電話,短信)等發送告警信息
6.1 注冊睿象雲賬號
-
#登錄官方網站注冊賬號信息
6.2 集成Grafana
- 在睿象雲網站點擊集成Grafana工具
- 配置應用名稱,保存並獲取應用key
6.2.1 Grafana配置Webhook URL
1、在Grafana中創建Notification channel,選擇類型為Webhook;
2、推薦選中Send on all alerts和Include image,Cloud Alert體驗更佳;
3、將第一步中生成的Webhook URL填入Webhook settings Url;
URL格式:
http://api.aiops.com/alert/api/event/grafana/v1/71245665f21047b38527fb3bf127c9fb/
4、Http Method選擇POST;
5、Send Test&Save;
6.2.2 將配置的Webhook Notification Channel添加到Grafana Alert中
6.3 配置分配策略
- 登錄睿象雲界面,選擇配置,配置分派策略
6.4 配置通知策略
- 登錄睿象雲界面,選擇配置,配置通知策略
6.5 測試電話、短信和郵件通知
- 通過Prometheus監控指標到Grafana展示,最后由睿象雲發送告警通知