prometheus基本概念用法記錄
Prometheus
-
基本概念
promethues是一套開源的系統監控報警框架。
Prometheus 所有采集的監控資料均以指標(metric)的形式儲存在內建的時間序列資料庫當中(TSDB):屬於同一指標名稱,同一標籤集合的、有時間戳標記的資料流。除了儲存的時間序列,Prometheus 還可以根據查詢請求產生臨時的、衍生的時間序列作為返回結果。
特點:
- 強大的多為資料模型
- 靈活的查詢語言
- 易於管理
- 高效
- 使用pull模式採集時間序列資料
- 多種視覺化圖形介面
- 易於伸縮
-
prometheus組成和架構:
- prometheus server: 主要負責資料採集和儲存,提供promQL查詢語言支援。prometheus是一個時序資料庫,將採集到的監控資料按照時間序列的方式儲存到本地磁碟。
- Push Gateway: 支援臨時性job主動推送指標的中間閘道器。
- PromDash: 使用rails開發的dashboard,用於視覺化指標資料。
- Exporters: 負責監控機器執行狀態,提供被監控元件資訊的 HTTP 介面被叫做 exporter。
- 直接採集: exporter內建了prometheus支援,直接向prometheus暴露資料端點。
- 間接採集:原不支援prometheus。通過prometheus提供的clien library編寫的目標監控採集程式。
- Altermanager: 從 Prometheus server 端接收到 alerts 後,會進行去除重複資料,分組,並路由到對收的接受方式,發出報警。常見的接收方式有:電子郵件,pagerduty,OpsGenie, webhook 等。
- WebUI:9090提供圖形化介面功能。
-
基本工作原理
- Prometheus server 定期從配置好的 jobs 或者 exporters 中拉 metrics,或者接收來自 Pushgateway 發過來的 metrics,或者從其他的 Prometheus server 中拉 metrics。
- Prometheus server 在本地儲存收集到的 metrics,並執行已定義好的 alert.rules,記錄新的時間序列或者向 Alertmanager 推送警報。
- Alertmanager 根據配置檔案,對接收到的警報進行處理,發出告警。
- 在圖形介面中,視覺化採集資料。
-
基本概念:
資料模型:prometheus中儲存的資料為時間序列,是由Metric的名字和一系列的標籤(鍵值對)唯一標識的,不同的標籤代表不同的時間序列。
樣本:實際時間序列,每個序列包括一個float64的值和一個毫秒級的時間戳。(指標+時間戳+樣本值)
metric名字: 具有語義,表示功能:例如:http_requeststotal, 表示 http 請求的總數。其中,metric 名字由 ASCII 字元,數字,下劃線,以及冒號組成,且必須滿足正則表示式 [a-zA-Z:][a-zA-Z0-9_:]*。
標籤:使一個時間序列有不同未讀的識別。例如 http_requeststotal{method="Get"} 表示所有 http 請求中的 Get 請求。當 method="post" 時,則為新的一個 metric。標籤中的鍵由 ASCII 字元,數字,以及下劃線組成,且必須滿足正則表示式 [a-zA-Z:][a-zA-Z0-9_:]*。
格式:<metric name>{<label name>=<label value>, …},例如:http_requests_total{method="POST",endpoint="/api/tracks"}。
Metric型別
counter: 累加性metirc。
Gauge:可增減性metric
Histogram:樹狀圖
summary: 彙總
-
PromQL查詢
-
資料型別
瞬時向量(instant vector):一組時間序列,每個時間序列包含單個樣本。 區間向量(range vector):一組時間序列,每個時間序列包含一段時間範圍內的樣本資料。 標量(scalar): 一個浮點型資料值。 字串(string): 一個簡單的字串值。
-
時間序列過濾器
瞬時向量過濾器: eg: http_requests_total ,通過{}裡附件一組標籤過濾時間序列。 標籤匹配雲算符: = : 選擇與提供的字串完全相同的標籤。 != : 選擇與提供的字串不相同的標籤。 =~ : 選擇正則表示式與提供的字串(或子字串)相匹配的標籤。 !~ : 選擇正則表示式與提供的字串(或子字串)不匹配的標籤。 區間向量過濾器: eg:http_requests_total{job="prometheus"}[5m],通過[]指定區間提取數值。 時間單位: s - 秒 m - 分鐘 h - 小時 d - 天 w - 周 y - 年 時間位移操作: 在瞬時向量表示式或者區間向量表示式中,都是以當前時間為基準. eg:http_requests_total offset 5m "offset 關鍵字需要緊跟在選擇器({})後面"
-
操作符
算數二次元運算子 eg:加減乘除 布林運算子: eg:= ,!= ,< , > ,<= ,>= 集合運算子: and,or,unless 匹配模式
-
聚合操作
語法:<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)] 只有count_values, quantile, topk, bottomk支援引數(parameter) sum (求和);min (最小值);max (最大值);avg (平均值);stddev (標準差);stdvar (標準差異);count (計數);count_values (對 value 進行計數);bottomk (樣本值最小的 k 個元素);topk (樣本值最大的k個元素);quantile (分佈統計) eg:<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)] without 用於從計算結果中移除列舉的標籤,而保留其它標籤。by 則正好相反,結果向量中只保留列出的標籤,其餘標籤則移除。通過 without 和 by 可以按照樣本的問題對資料進行聚合。
-
任務和例項
採集不同的監控指標,我們需要執行相應的監控採集程式,並且讓prometheus server知道這些export例項的訪問地址。每一個監控樣本的http服務稱之為一個例項。node exporter可以稱之為一個例項。
一組用於相同採集目的的例項,或者一個採集程序的多個副本則通過一個一個任務管理。
* job: node * instance 2: 1.2.3.4:9100 * instance 4: 5.6.7.8:9100
-
HTTP API中響應格式
瞬時資料查詢: url請求引數: eg:'http://localhost:9090/api/v1/query?query=up&time=2015-07-01T20:10:51.781Z' query=:PromQL表示式。 time=<rfc3339 | unix_timestamp>:用於指定用於計算PromQL的時間戳。可選引數,預設情況下使用當前系統時間。 timeout=:超時設定。可選引數,預設情況下使用-query,timeout的全域性設定 區間資料查詢: url請求引數: eg:'http://localhost:9090/api/v1/query_range?query=up&start=2015-07-01T20:10:30.781Z&end=2015-07-01T20:11:00.781Z&step=15s' query=: PromQL表示式。 start=<rfc3339 | unix_timestamp>: 起始時間。 end=<rfc3339 | unix_timestamp>: 結束時間。 step=: 查詢步長。 timeout=: 超時設定。可選引數,預設情況下使用-query,timeout的全域性設定。
-
-
Prometheus告警
-
告警規則定義(Alertrule difinition)
告警名稱: 自定義名稱.
告警規則:基於PromQL表示式定義告警觸發條件.定義在配置檔案中
groups: - name: example rules: - alert: HighErrorRate expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5 for: 10m labels: severity: page annotations: summary: High request latency description: description info #group:定義一組相關規則 #alert:告警規則名稱 #expr:基於PromQL的觸發條件 #for 等待評估時間 #label 自定義標籤 #annotation: 指定一組附加資訊Alertmanger特性
-
Altermanager特性
分組:可以將詳細的告警機制合併成一個通知 抑制:當發出一個警告時,可以停止重複傳送此告警的引發的其他告警機制 靜默:將告警進行靜默處理
-
安裝啟動Altermanger
wget https://github.com/prometheus/alertmanager/releases/download/v0.15.3/alertmanager-0.15.3.linux-amd64.tar.gz cd alertmanager-0.15.3.linux-amd64/ ./alertmanager
-
altermanager.yml配置檔案介紹
global: resolve_timeout: 5m route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 1h receiver: 'web.hook' receivers: - name: 'web.hook' webhook_configs: - url: 'http://127.0.0.1:5001/' inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance'] 路由(route)以及接收器(receivers)。所有的告警資訊都會從配置中的頂級路由(route)進入路由樹,根據路由規則將告警資訊傳送給相應的接收器。 全域性配置(global):用於定義一些全域性的公共引數,如全域性的SMTP配置,Slack配置等內容; 模板(templates):用於定義告警通知時的模板,如HTML模板,郵件模板等; 告警路由(route):根據標籤匹配,確定當前告警應該如何處理; 接收人(receivers):接收人是一個抽象的概念,它可以是一個郵箱也可以是微信,Slack或者Webhook等,接收人一般配合告警路由使用; 抑制規則(inhibit_rules):合理設定抑制規則可以減少垃圾告警的產生
-
重啟prometheus
killall -9 prometheus nohup prometheus &
-
-
prometheus 安裝
-
安裝prometheus server
wget https://github.com/prometheus/prometheus/releases/download/v2.6.0/prometheus-2.6.0.linux-amd64.tar.gz tar -zxvf prometheus-2.6.0.linux-amd64.tar.gz cd prometheus-2.6.0.linux-amd64 ./prometheus & ln -s /root/prometheus/prometheus-2.6.0.linux-amd64/prometheus /usr/local/bin/prometheus nohup prometheus &
-
安裝Node Exporter 採集主機執行資料(採集主機執行指標比如cpu,記憶體和磁碟等資訊)
wget https://github.com/prometheus/node_exporter/releases/download/v0.17.0/node_exporter-0.17.0.linux-amd64.tar.gz tar -zxvf node_exporter-0.17.0.linux-amd64.tar.gz cd node_exporter-0.17.0.linux-amd64/ mv node_exporter /usr/local/bin/ nohup node_exporter & curl -l -H "Content-type: application/json" -X POST -d '{"msgtype": "markdown","markdown": {"title":"Prometheus告警資訊","text": "#### 監控指標\n> 監控描述資訊\n\n> ###### 告警時間 \n"},"at": {"isAtAll": false}}' https://oapi.dingtalk.com/robot/send?access_token=51345145d106753486bd71614bf881283f91e2124535276b257f99327e41dc87 {"errcode":0,"errmsg":"ok"}
-
Prometheus中新增收集的監控資料,修改prometheus.yml檔案,並在scrape_configs新增一下內容。
scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] # 採集node exporter監控資料 - job_name: 'node' static_configs: - targets: ['localhost:9100']
-
使用Grafana建立視覺化Dashboard
docker run -d -p 3000:3000 grafana/grafana #訪問http://localhost:3000 預設使用者名稱admin 密碼admin
-
先記錄,後補充。
參考文章如下: