2、Grafana-Prometheus學習筆記
一(yi)、時序數據庫(ku):
時序數據庫(Time Series Database, TSDB)是專門為處理和存儲時序數據而設計的數據庫。時(shi)序(xu)數據(ju)是(shi)帶有時(shi)間戳的(de)數據(ju),通(tong)常用于表示隨時(shi)間變(bian)化的(de)測(ce)量值。時序數(shu)據庫(ku)在許(xu)多應(ying)用(yong)領域中具(ju)有關鍵作用(yong),包括(kuo)物聯網(IoT)、應(ying)用(yong)性能監控(APM)、金(jin)融(rong)市場分析、環(huan)境監測、工業(ye)自動化(hua)等。
當前主流的時序數據庫:

二、InfluxDB、Prometheus與Graphite:
|
|
InfluxDB |
Prometheus |
Graphite |
|
官方文檔 |
|||
|
簡介 |
一個開源的時序數據庫,專門用于存儲(chu)和查(cha)詢時序數據(metrics)。 |
一個開源的系統監控和報警工具,專注于時序數據收集、存儲和查詢。 |
一個開源的監控系統和圖表展示工具,專注于時序數據存儲和可視化。 |
|
主要特點 |
- 高(gao)效存儲時序數據 - 支持復(fu)雜的查詢(xun)和聚合(he) - 提供內置的存儲引擎(qing)(TSI, TSI2) - 支持標簽(qian)查詢(xun)和數據索引(yin) - 內置圖形化儀(yi)表盤工具(Chronograf) |
- 自動(dong)發現和抓(zhua)取目標 - 支持多(duo)維度數據(ju)模型(標簽) - 高效(xiao)的拉取式數據(ju)收集模型 - 提(ti)供豐富的報(bao)警(jing)機(ji)制 - 強大的查詢語言PromQL |
- 采用推(tui)送模式來收集數(shu)據 - 數據(ju)(ju)存儲使用時間序列數據(ju)(ju)庫 - 基于Cassandra或其他數據(ju)庫存儲(chu) - 主(zhu)要使(shi)用 Graphite-web 展示數(shu)據(ju) |
|
性能特點 |
高(gao)寫入吞吐量、低延遲查(cha)詢,支持高(gao)效(xiao)的數據(ju)壓縮(suo) |
高效的時間序列數(shu)(shu)據存儲,適合(he)高頻率數(shu)(shu)據收集 |
存儲性(xing)能(neng)較為有(you)限,適合(he)小(xiao)規(gui)模和低頻(pin)率的(de)數據存儲 |
|
查詢語言 |
InfluxQL(類似SQL)或(huo)Flux |
PromQL(Prometheus Query Language) |
使用(yong)簡單(dan)的查詢(xun)語(yu)言(通(tong)過Graphite-web展示) |
|
數據存儲 |
時(shi)序數據專(zhuan)用(yong)存儲(chu)引(yin)擎(qing),支持壓縮和高效查(cha)詢(xun) |
存(cun)儲(chu)為 TSDB 格式,支持自定義(yi)存(cun)儲(chu)后端 |
使用基(ji)于(yu) Whisper 的文件系統存儲(或者 Cassandra) |
|
數據收集方式 |
推送或拉取(qu),支(zhi)持客戶端庫以(yi)及HTTP API |
主要(yao)為拉取方式(shi),支持自定義的(de)抓取方式(shi) |
推(tui)送模式(shi),使(shi)用(yong)Carbon收集數據(ju) |
|
數據模型 |
時序數據(時間戳、測量、標簽、字段、值) |
時序(xu)數據(ju)(時間戳、指標、標簽) |
時(shi)序(xu)數據(時(shi)間戳(chuo)、指標、值) |
|
擴展性 |
支持集(ji)群擴展(Enterprise版本),單實例(li)有一定(ding)限(xian)制 |
支(zhi)持水平擴(kuo)展和分布式(shi)架構,適合大規模(mo)數據存儲和查(cha)詢(xun) |
擴展性有(you)限,基于(yu)單一節點(dian)或分布(bu)式(shi)的配置方式(shi) |
|
報警與告警 |
內(nei)置告(gao)警機制(Kapacitor),支持定義復雜的告(gao)警規(gui)則 |
強大的告警(jing)功能,支持多種告警(jing)接(jie)收方式 |
通過(guo)第三方工具(如 Nagios、Alertmanager)實(shi)現告警(jing)功能 |
|
社區與支持 |
活躍的開源社區,有付費(fei)版本的支持 |
強大(da)的(de)開源社(she)區,有豐富的(de)文檔和支持(chi) |
較(jiao)為成(cheng)熟(shu)的(de)社(she)區(qu),使用(yong)歷(li)史(shi)較(jiao)長,但社(she)區(qu)活躍度(du)相對(dui)較(jiao)低 |
|
應用場景 |
- IoT 數據監(jian)控 - 企(qi)業級時序(xu)數據分(fen)析(xi) - 日志分析與度(du)量收集 |
- 容器和微服務監控 - 集群和(he)系統(tong)資源(yuan)監控 - 高(gao)頻數據收集和(he)報(bao)警 |
- 基礎設施監控 - 網絡性能監控 - 存儲和(he)服務器狀態監控 |
|
優點 |
- 高效存儲與查詢 - 豐富的(de)查(cha)詢(xun)語言(yan)(InfluxQL 和 Flux) - 內置的(de)可視化和報警支持 |
- 強大的(de)自動發現與抓取機制 - 強大的查(cha)詢(xun)語(yu)言 PromQL - 與 Grafana 深度集成 |
- 簡單易(yi)用,安裝配置容易(yi) - 適用(yong)于較小規模的監控項目 |
|
缺點 |
- 大規模(mo)集群和高可用性(xing)配置相對復雜 - 依賴(lai)企業版本的某些高級功(gong)能 |
- 存儲層無(wu)內建高可用(yong)特性,主(zhu)要依賴于外部存儲 - 缺少內建的(de)可視化工具,Prometheus Web UI,僅適用基礎(chu)的(de)查詢和展示 |
- 可擴(kuo)展(zhan)性差,不適合大(da)規模部署 - 存儲性能不(bu)足,不(bu)能處理非常高頻的(de)數(shu)據 |
1、InfluxDB 是一個高效的(de)時序數(shu)據庫,適合于存儲大(da)規(gui)模時序數(shu)據,提供了強大(da)的(de)查詢語(yu)言(yan)和內置的(de)可視(shi)化工具。
2、Prometheus 適合(he)于動(dong)態環境(jing)和微(wei)服務架構,提供強大的(de)數據抓(zhua)取和報(bao)警能(neng)力(li),常與 Grafana 配合(he)使(shi)用來進行可視化展示(shi)。
3、Graphite 是一(yi)個(ge)較為成(cheng)熟的(de)監控(kong)工具,適合(he)(he)小規模的(de)時(shi)序數據存(cun)儲和展(zhan)示(shi),通常與 Grafana 配合(he)(he)使用來(lai)進行數據可視化。
三、Prometheus相關架構:

Prometheus 通(tong)過 Pushgateway 或 Job/exporters 的(de)(de)方(fang)式(shi),定期從被監控的(de)(de)服務中(zhong)拉取指標(biao)數(shu)據(ju)。這些服務通(tong)常通(tong)過 HTTP 暴露一個 /metrics 端點(dian),Prometheus 通(tong)過該端點(dian)收集指標(biao)數(shu)據(ju)并(bing)存(cun)儲在本地磁盤(pan)中(zhong)。用戶可以通(tong)過 PromQL 查(cha)詢存(cun)儲在 Prometheus 中(zhong)的(de)(de)時(shi)序數(shu)據(ju)。Prometheus 還可以根據(ju)設定的(de)(de)告(gao)警(jing)規則(ze),自動檢查(cha)采集的(de)(de)數(shu)據(ju),生成告(gao)警(jing)并(bing)觸發相(xiang)應操(cao)作。如果某個指標(biao)超出閾值或不符合特定條件,Prometheus 會發送告(gao)警(jing)到(dao) Alertmanager,進行處理(li)和轉(zhuan)發。
1、Prometheus Server:
Prometheus Server 是 Prometheus 的(de)核(he)心組件,負責從被監控的(de)目標(biao)(targets)收(shou)集(scrape)數據、存儲數據、并(bing)提(ti)供(gong)查詢和(he)告警功(gong)能。
2、Pushgateway:
Pushgateway 是 Prometheus 的一個組件,用(yong)于接(jie)收從臨時任務(wu)(如(ru)批處(chu)理任務(wu))推送(song)過來(lai)的指(zhi)標(biao)數據(ju)。與 Prometheus 通常(chang)的拉(la)取模式不同,Pushgateway 采用(yong)推送(song)(push)方式將數據(ju)發送(song)給 Prometheus。
由于Prometheus的拉取(pull)模(mo)式要(yao)求目標服務(wu)必須始終(zhong)在線并持續暴(bao)露指標接口(kou)。然而,一(yi)些服務(wu)可(ke)能只(zhi)存(cun)在一(yi)段很短的時間(例(li)如批處理作業、定時任務(wu)或(huo)一(yi)次性任務(wu)),在它們執行完(wan)后,服務(wu)就會終(zhong)止(zhi)并且不再提(ti)供 HTTP 服務(wu)。這(zhe)時候,Prometheus就無(wu)法(fa)拉取到數據(ju)。因此,當網絡情(qing)況無(wu)法(fa)直接滿足時,可(ke)以使(shi)用 pushgateway 來進行中轉,將此類數據(ju)主動push到pushgateway里面去,而 prometheus 采(cai)用pull方式拉取 pushgateway 中數據(ju)。
3、Job/Exporters:
Job,即標(biao)(biao)(biao)簽,通常是(shi)用來(lai)定義一(yi)組被監控(kong)目(mu)(mu)標(biao)(biao)(biao)的名(ming)稱和配(pei)置(zhi)。Job是(shi) Prometheus配(pei)置(zhi)文件(jian)(prometheus.yml)中(zhong)的一(yi)個(ge)重(zhong)要概念,每個(ge) Job對(dui)應(ying)一(yi)個(ge)或多個(ge)監控(kong)目(mu)(mu)標(biao)(biao)(biao)(Exporter),這(zhe)些目(mu)(mu)標(biao)(biao)(biao)會定期暴(bao)露(lu)其性能指標(biao)(biao)(biao),Prometheus通過拉取這(zhe)些指標(biao)(biao)(biao)來(lai)進行(xing)監控(kong)。
Exporter是一個(ge)暴露 Prometheus可抓取(qu)的指標數據的程序或(huo)服務(wu)(wu)。Exporter 通(tong)常負責從(cong)應用程序或(huo)系統收集(ji)性能指標,并將這些數據以HTTP服務(wu)(wu)的形式暴露給 Prometheus。
|
Exporter |
備注 |
|
Node_Exporter |
用于(yu)暴露系統級別的指標數據(如 CPU、內存、磁盤(pan)使用情況(kuang)) |
|
MySQL_Exporter |
用于暴露數據庫指標 |
4、Metrics:
Metrics,即指標(biao),是 Prometheus 用來描(miao)述(shu)和衡量系(xi)統(tong)狀態或性能的數(shu)字數(shu)據載體,通常以時(shi)間序列的形式存儲(chu)。每個指標(biao)表示(shi)系(xi)統(tong)的某個度量值,比(bi)如(ru)請求數(shu)、內存使用量、響應時(shi)間等。
|
Metrics類型 |
定義 |
|
Counter |
計數器類型的指標,值只(zhi)能遞增,用于記(ji)錄事件發生的(de)次(ci)數 |
|
Gauge |
可以增加也可以減少的指標,通常用來記錄(lu)當(dang)前(qian)值(zhi)(如內存使用、溫度等) |
|
Histogram |
記錄觀察值的分布情(qing)況,通(tong)過將觀察值劃分為不同的桶進行計數 |
|
Summary |
與 Histogram 類似,但可以預(yu)計(ji)算一些分位數(shu),如 50%、95% 等 |
|
Untyped |
沒有明確類型的指標,適用于用戶自定義的特殊指標 |
5、PromQL:
PromQL 是 Prometheus 的查詢語言,用于(yu)從 Prometheus 中(zhong)存儲的時序數據中(zhong)查詢、分析和(he)操(cao)作(zuo)數據。通過(guo)PromQL可以(yi)根(gen)據需求對 Metrics數據進行過(guo)濾、聚(ju)合、轉換等操(cao)作(zuo)。
6、Alertmanager:
Alertmanager 是 Prometheus 的(de)組件(jian)之一,負責(ze)管理(li)、分發告(gao)(gao)警(jing)。它接收 Prometheus 生成的(de)告(gao)(gao)警(jing)信(xin)息,并根據(ju)配置將(jiang)告(gao)(gao)警(jing)通知發送(song)到用戶指定的(de)通知渠道(如郵(you)件(jian)、Slack、Webhook 等)。
四、Docker-Prometheus安裝:
1、Node Exporter:
用于從主機收(shou)集硬(ying)件(jian)和系統級別的(de)指標(biao)
|
# 拉取Node_Exporter鏡(jing)像: |
|
docker pull prom/node-exporter |
|
# 啟動容器: |
|
docker run -d --name node-exporter \ -p 9100:9100 \ -v /proc:/host/proc:ro \ -v /sys:/host/sys:ro \ -v /:/rootfs:ro \ prom/node-exporter |
|
# 備注: |
|
1、-p 9100:9100 將(jiang)宿主機的 9100 端口映射到容(rong)器的 9100(node-exporter 默認)端口。node-exporter默認會(hui)在該端口上暴露(lu)監控指(zhi)標。 2、-v /proc:/host/proc:ro 掛(gua)載(zai)宿(su)主機的 /proc 目錄到容(rong)器中的 /host/proc。/proc 目錄包含了(le)操作系統內核(he)和進程的信(xin)息(xi),node-exporter 需(xu)要訪問這(zhe)些信(xin)息(xi)來收(shou)集系統級別的性能指標。掛(gua)載(zai)時使用了(le) ro(只(zhi)讀)權限,確(que)保容(rong)器無法(fa)修改宿(su)主機的文(wen)件。 3、-v /sys:/host/sys:ro 類似地,掛(gua)載宿主機的(de) /sys 目(mu)錄(lu)到容器中的(de) /host/sys。/sys 目(mu)錄(lu)包含(han)了與(yu)系統硬件相關(guan)的(de)信息,node-exporter 也需要這些信息來收集指(zhi)標。 4、-v /:/rootfs:ro 掛載宿主機的(de)(de)根文(wen)件系(xi)統到(dao)容器(qi)中的(de)(de) /rootfs。node-exporter 需要訪(fang)問宿主機的(de)(de)文(wen)件系(xi)統以收集一些額外的(de)(de)指標(如磁盤、文(wen)件系(xi)統的(de)(de)相關信息(xi))。同樣(yang)使用了只(zhi)讀權限(xian)。 |
|
# Metrics數(shu)據訪(fang)問: |

2、Pushgateway:
允許短期任(ren)務將其指(zhi)標推送到 Prometheus
|
# 拉取(qu)Pushgateway鏡像(xiang): |
|
docker pull prom/pushgateway |
|
# 自定義數據(ju)存儲文件夾: |
|
/opt/install/data/pushgateway-data |
|
# 修改文件夾權限(xian): |
|
chmod 777 -R /opt/install/data/pushgateway-data |
|
# 啟動容器: |
|
docker run -d --name=pushgateway \ -p 9091:9091 \ -v /opt/install/data/pushgateway-data:/pushgateway_data \ prom/pushgateway |
|
# Pushgateway管(guan)理訪問: |
|
# PUSH推送(song)自定義測試Metric指(zhi)標數(shu)據(不指(zhi)定,默(mo)認(ren)untyped 類(lei)型): echo "# TYPE <指(zhi)標> <Metric類型>\n<指(zhi)標{標簽(qian)}> <值>" | curl --data-binary @- |
|
# 案例一 echo "example_metric 1" | curl --data-binary @- //localhost:9091/metrics/job/test_job # 案例二 echo "example_metric{status=\"success\"} 1" | curl --data-binary @- //localhost:9091/metrics/job/test2_job # 案例三 echo -e "# TYPE test_metric counter\ntest_metric 2" | curl --data-binary @- //localhost:9091/metrics/job/test3_job |
|
# 清理指定Job數據: curl -X DELETE |
|
curl -X DELETE //localhost:9091/metrics/job/test_job |

3、Alertmanager:
處(chu)理(li)并(bing)路由(you) Prometheus 發出的(de)告警通(tong)知(zhi)
|
# 拉取Alertmanager鏡像: |
|
docker pull prom/alertmanager |
|
# 自定義數據存儲文件夾: |
|
/opt/install/data/alertmanager-data/config /opt/install/data/alertmanager-data/template |
|
# 修改文(wen)件夾權限: |
|
chmod 777 -R /opt/install/data/alertmanager-data/config chmod 777 -R /opt/install/data/alertmanager-data/template |
|
# 編輯告(gao)警配置文件alertmanager.yml: |
|
cat > /opt/install/data/alertmanager-data/config/alertmanager.yml << \EOF # 全局配置 global: # 設置報警(jing)解(jie)決超時時間,單位(wei):分鐘 resolve_timeout: 5m # 發件人郵(you)箱配置(zhi) smtp_from: 'xx@xx.com' # 郵箱(xiang)服務(wu)器的主機配置(zhi),smtp.qq.com,端口為 465 或 587 smtp_smarthost: 'smtp.qq.com:465' # 郵箱賬戶名 smtp_auth_username: 'xx' # 郵箱授權(quan)碼(ma)(不是(shi)密碼(ma)) smtp_auth_password: '授權碼(ma)' # 是否啟(qi)用 TLS(此處不啟(qi)用) smtp_require_tls: false # SMTP 主機的 HELO 域名 smtp_hello: 'qq.com'
# 告警模板配置 templates: - '/opt/install/data/alertmanager-data/template/email.tmpl'
# 抑制規則配置 # 當存在 severity 為(wei) critical 的告(gao)警時(shi),抑(yi)制 severity 為(wei) warning 的告(gao)警 # 源告警(jing)和目(mu)標告警(jing)必(bi)須(xu)在(zai) alertname、dev 和 instance 標簽(qian)上相等 inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']
# 路由配置 route: # 根(gen)據告警(jing)名稱分組 group_by: ['alertname'] # 等待(dai)時(shi)間,用于(yu)等待(dai)同一組內的其他(ta)告警 group_wait: 5s # 分組(zu)后發送告警(jing)的時(shi)間間隔 group_interval: 5m # 發送(song)告警間(jian)隔(ge)時間(jian) s/m/h,如(ru)果指定時間(jian)內沒有修復,則重(zhong)新(xin)發送(song)告警 repeat_interval: 1h # 默認(ren)接收(shou)器,自定義接收(shou)器名default-receiver,用于處(chu)理沒(mei)有(you)匹配(pei)到其他(ta)路由(you)規則的告警 receiver: 'default-receiver' routes: # 使用正(zheng)則表(biao)達式匹配 alarmClassify 標簽(qian)為 critical 的告警 - match_re: alarmClassify: '^critical$' # 自(zi)定義(yi)critical-alerts 接收(shou)器名,接收(shou) critical 的告(gao)警(jing) receiver: 'critical-alerts' # 使(shi)用正則(ze)表(biao)達式(shi)匹(pi)配 alarmClassify 標(biao)簽為 warning 的告(gao)警 - match_re: alarmClassify: '^warning$' # 自(zi)定義warning-alerts 接收(shou)器名,接收(shou) warning 的告警(jing) receiver: 'warning-alerts'
# 接收器配置 receivers: # 默(mo)認接收器 - name: 'default-receiver' email_configs: # 默認接收(shou)器的收(shou)件人,多個(ge)人就以(yi) ',' 做分割 - to: 'default-receiver@example.com' # 發(fa)送已(yi)解決的告警(jing)通知(zhi) send_resolved: true # 接(jie)收郵件(jian)的標(biao)題 headers: {Subject: "alertmanager默認告警郵(you)件"} # 嚴重告警接收器 - name: 'critical-alerts' email_configs: - to: 'critical-alerts@example.com' send_resolved: true # 接收郵件的標題 headers: {Subject: "alertmanager嚴(yan)重告警郵(you)件"} # 警告(gao)告(gao)警接收(shou)器 - name: 'warning-alerts' email_configs: - to: 'warning-alerts@example.com' send_resolved: true # 接(jie)收郵件的標題 headers: {Subject: "alertmanager警(jing)告告警(jing)郵件(jian)"} EOF |
|
# 編輯(ji)告警模板配置文件email.tmpl: |
|
cat > /opt/install/data/alertmanager-data/template/email.tmpl << \EOF {{ define "email.html" }} <table border="1"> <tr> <td>報警項</td> <td>實例(li)</td> <td>報警閥值</td> <td>開始時間(jian)</td> <td>告警信息</td> </tr> {{ range $i, $alert := .Alerts }} <tr> <td>{{ index $alert.Labels "alertname" }}</td> <td>{{ index $alert.Labels "instance" }}</td> <td>{{ index $alert.Annotations "value" }}</td> <td>{{ $alert.StartsAt }}</td> <td>{{ index $alert.Annotations "description" }}</td> </tr> {{ end }} </table> {{ end }} EOF |
|
# 啟動容器: |
|
docker run -d --name=alertmanager \ -p 9093:9093 \ -v /etc/localtime:/etc/localtime:ro \ -v /opt/install/data/alertmanager-data/config/alertmanager.yml:/etc/alertmanager/alertmanager.yml \ -v /opt/install/data/alertmanager-data/template:/etc/alertmanager/template \ prom/alertmanager |
|
# Alertmanager管(guan)理(li)訪問: |

4、Prometheus Server:
核心組件,負責采集、存儲指(zhi)標數據,并生成告警
|
# 拉取Prometheus鏡像: |
|
docker pull prom/prometheus |
|
# 自(zi)定(ding)義數據存儲文(wen)件夾: |
|
/opt/install/data/prometheus-data |
|
# 修(xiu)改文件(jian)夾(jia)權限: |
|
chmod 777 -R /opt/install/data/prometheus-data |
|
# 編輯(ji)prometheus.yml配置信(xin)息: |
|
cat > /opt/install/data/prometheus-data/prometheus.yml << \EOF # prometheus.yml global: # 設(she)置(zhi)抓取目標間隔為(wei) 60 秒 scrape_interval: 60s # 設置評估規則(ze)(如報警規則(ze)等)間隔為 60 秒 evaluation_interval: 60s
# job_name: 自定(ding)義抓取目標(biao)的名(ming)稱 scrape_configs: # 配置 Prometheus 作(zuo)為數據源(yuan) - job_name: 'prometheus' static_configs: # Prometheus 本身 - targets: ['localhost:9090']
# 配置 Node Exporter - job_name: 'node_exporter' static_configs: # 指(zhi)定(ding) Node Exporter 的目標(可以(yi)是(shi)多(duo)個(ge)節點(dian)),修改localhost - targets: ['localhost:9100']
# 配(pei)置 Pushgateway - job_name: 'pushgateway' static_configs: # Pushgateway 的(de)目(mu)標,修改localhost - targets: ['localhost:9091']
# 配(pei)置 Alertmanager - job_name: 'alertmanager' static_configs: # Alertmanager 的目(mu)標,修(xiu)改localhost - targets: ['localhost:9093'] EOF |
|
# 啟動容器: |
|
docker run -d --name prometheus \ -p 9090:9090 \ -v /opt/install/data/prometheus-data/prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus |
|
# Prometheus管理(li)訪問: |
查看啟動信息:

查詢監控指標數據:
Metric指標{標簽}

五、Grafana-Prometheus可(ke)視化配置:
1、Prometheus數據源導入:


2、添加新的儀表板:



六、PromQL數(shu)據查詢:
Prometheus 通過指(zhi)標(biao)名(ming)稱(metrics name)以(yi)及對(dui)應的(de)一組標(biao)簽(qian)(labelset)唯一定義一條時間序(xu)列。指(zhi)標(biao)名(ming)稱反映了監控樣(yang)本的(de)基(ji)本標(biao)識(shi),而 label 則在這個基(ji)本特(te)(te)征(zheng)上為采集到的(de)數據提供了多種特(te)(te)征(zheng)維(wei)度。用戶可以(yi)基(ji)于這些特(te)(te)征(zheng)維(wei)度過濾(lv),聚合,統計從而產生新(xin)的(de)計算后的(de)一條時間序(xu)列。
PromQL是(shi) Prometheus內(nei)置的(de)數(shu)據(ju)(ju)查(cha)(cha)詢(xun)語言,用(yong)于從Prometheus中存儲(chu)的(de)時序(xu)數(shu)據(ju)(ju)中查(cha)(cha)詢(xun)、分析(xi)和操(cao)作數(shu)據(ju)(ju)。通(tong)過(guo)PromQL可以(yi)根據(ju)(ju)需求對 Metrics指標數(shu)據(ju)(ju)進行過(guo)濾(lv)、聚(ju)合(he)、轉(zhuan)換(huan)等(deng)操(cao)作。

1、匹配方式:
|
功能 |
示例 |
說明 |
|
完全匹配模式 |
label=value |
根(gen)據(ju)標簽匹(pi)配滿(man)足表達(da)式的時間序列 |
|
label!=value |
根(gen)據標簽(qian)匹(pi)配排除時間(jian)序列 |
|
|
正則匹配模式 |
label=~value1|value2 |
根據標簽匹(pi)配滿足value1或(huo)value2的時間序列(lie) |
|
label!~value1|value2 |
根(gen)據標(biao)簽(qian)匹配排(pai)除滿足value1或(huo)value2的時間序列 |
2、基礎查詢:
|
功能 |
示例 |
說明 |
|
查詢單個指標 |
up |
表(biao)示(shi)(shi)實(shi)例(li)是否在(zai)正常運行(1表(biao)示(shi)(shi)正常,0表(biao)示(shi)(shi)異常) |
|
查詢指(zhi)定實例的指(zhi)標值 |
up{instance="localhost:9090"} |
表(biao)示(shi)指定實例是否在正常(chang)運行(1表(biao)示(shi)正常(chang),0表(biao)示(shi)異常(chang)) |
|
獲取時間序列 |
指標名 |
獲取指(zhi)定指(zhi)標的所有時間(jian)序列數據(ju) |
|
使用標簽篩選 |
指標{標簽(qian)=”值”} |
獲取帶有指定(ding)標簽值的(de)時間序列數據 |
3、聚合操作:
|
功能 |
示例 |
說明 |
|
求和 |
sum(指標) |
對指定指標進行求和 |
|
計算平均值 |
avg(指標) |
對指(zhi)定指(zhi)標計算平均值 |
|
計算最大值 |
max(指標) |
獲取指(zhi)定指(zhi)標的最大值 |
|
計算最小值 |
min(指標) |
獲取(qu)指定指標的最(zui)小值 |
|
計數 |
count(指標) |
計(ji)算指(zhi)(zhi)定指(zhi)(zhi)標的時(shi)間序列數目(mu) |
|
按標簽聚合 |
sum(指標) by (標簽code) |
按(an)照指(zhi)定code標簽(qian)進行(xing)聚合,計算每個(ge)job 的總(zong)請求數。 |
|
排除某些標簽 |
sum(指標(biao)) without (標(biao)簽code) |
對指(zhi)標按標簽聚合,但排除指(zhi)定code標簽。 |
4、時間范圍操作:
|
功能 |
示例 |
說明 |
|
最近值 |
指標[5m] |
獲取過去(qu) 5 分(fen)鐘(zhong)內(nei)的(de)時間序列(lie)數據 |
|
過去平均值 |
avg_over_time(指標[1h]) |
計算過去 1 小時(shi)的平均值 |
|
過去最大值 |
max_over_time(指(zhi)標(biao)[1d]) |
計算(suan)過去 1 天的(de)最大值(zhi) |
|
過去最小值 |
min_over_time(指標[1d]) |
計算過去 1 天的最小值 |
5、數學和函數操作:
|
功能 |
示例 |
說明 |
|
加法 |
指標 + 10 |
對指(zhi)定(ding)指(zhi)標加上一個常數 |
|
乘法 |
指標 * 2 |
對(dui)指定指標乘以一個(ge)常數 |
|
取對數 |
log2(指標) |
對指定指標取對數 |
6、變化率計算:
|
功能 |
示例 |
說明 |
|
增量計算 |
rate(指標[5m]) |
計算(suan)過去 5 分鐘內(nei)指(zhi)標的(de)增(zeng)量(liang) |
|
速率計算 |
irate(指標[5m]) |
計算每秒的增量速率 |
|
變化率 |
increase(指標[1h]) |
計算過去(qu) 1 小時(shi)內的(de)指標總變化量 |
7、條件判斷:
|
功能 |
示例 |
說明 |
|
判斷條件 |
指標 > 100 |
過濾出(chu)指標值大于 100 的時間序列數(shu)據 |
|
和條件結合 |
指標{標簽="值"} > 100 |
過濾出指定指標(biao)且值大于 100 的(de)時間序列數據(ju) |
8、排序與限制:
|
功能 |
示例 |
說明 |
|
排序 |
topk(5, 指標) |
獲取值(zhi)前 5 名的時(shi)間序列 |
|
排序 |
bottomk(5, 指標(biao)) |
獲取(qu)值后 5 名的時間序(xu)列(lie) |
七、SpringBoot-Prometheus監(jian)控埋(mai)點:
Micrometer 是 Spring Boot 的(de)度量系統(tong)(tong),它用(yong)于收(shou)集應(ying)用(yong)程序運(yun)行時(shi)的(de)各種指標數據,并(bing)將這些數據發(fa)送(song)(song)到(dao)外部監(jian)控系統(tong)(tong)(例如 Prometheus、Graphite、Datadog 等(deng))。它為Spring應(ying)用(yong)提(ti)供了(le)統(tong)(tong)一的(de)API來定義(yi)、收(shou)集和發(fa)送(song)(song)這些指標。
Spring Boot 中的(de)(de) spring-boot-starter-actuator 依賴已(yi)經集成了對 Micrometer 的(de)(de)支持,通過暴(bao)露 Prometheus 監控端(duan)點(如(ru) /actuator/prometheus),使得(de)Spring Boot應用作(zuo)為(wei) Prometheus 的(de)(de)客戶(hu)端(duan),允許 Prometheus(作(zuo)為(wei)服務端(duan))定期(qi)抓取(qu)該(gai)端(duan)點提供(gong)的(de)(de) Micrometer 指標(biao)數據,并將其存儲在時間序列(lie)數據庫中,最終(zhong)通過 Grafana 從 Prometheus 獲取(qu)數據并進(jin)行可視化展示。

1、添加依賴:
<!--SpringBoot監控系統-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--用于導出prometheus系統類型的指標數據-->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
2、YML配置:
# actuator服務監控端點配置 management: endpoints.web.exposure.include: "*" # actuator 服務監控 應包含的端點ID或所有的“*”, 默認只開放了info、health endpoint: health.show-details: ALWAYS # 健康信息顯示詳情(qing). shutdown.enabled: false # 允許應用以優(you)雅(ya)的方式關閉(默認情況下(xia)不啟用) # Actuator端(duan)點將通(tong)過(guo) http://localhost:18081/actuator/prometheus 訪問Metrics信息 server: port: 18081
3、指標配置管理:
import io.prometheus.client.CollectorRegistry; import io.prometheus.client.Counter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; /** * @description: 普羅米修斯監控配置 */ @Component public class PromConfig { /** * CollectorRegistry容器:負責(ze)收集和(he)管(guan)理所(suo)有注冊到其中的指標 */ @Autowired private CollectorRegistry collectorRegistry; /** * Metrics類型(xing): Counter * 設置(zhi)指標名稱: http_requests_total * 設置(zhi)添(tian)加(jia)兩個標簽(qian):functionName、status * 設置(zhi)指標描(miao)述性(xing)幫助信息(xi):Counter測試監(jian)控 * @return */ @Bean(name = "prometheusMetricsCounter") public Counter prometheusMetricsCounter(){ return Counter.build() .name("http_requests_total") .labelNames("functionName","status") .help("Counter測試監控") .register(collectorRegistry); } }
4、監控埋點:
@Resource(name = "prometheusMetricsCounter") private Counter prometheusMetricsCounter; @PostMapping(value = "/demo") public String monitorPointTest() { String status = "success"; if("success".equals(status)) { //監控埋點:inc()方法增加(jia) Counter 指(zhi)標(biao)的值(zhi) prometheusMetricsCounter.labels("monitorPointTest", status).inc(); } return status; }
5、Prometheus-Grafana管理:
(1)、查看Actuator端點的Metrics信息:

(2)、配置Prometheus抓取Spring Boot應(ying)用的指標:
Prometheus.yml配置文(wen)件聲明:
scrape_configs: # 配置 SpringBoot監控埋點 - job_name: 'springboot_actuator_to_prometheus_demo' metrics_path: '/actuator/prometheus' static_configs: # springboot監控的目標 - targets: ['localhost:18081']

(3)、Prometheus查(cha)看http_requests_total指標信息:

(4)、Grafana可視(shi)化管理:
