2、Grafana-Prometheus學習筆記
一、時序數據庫:
時序數據庫(Time Series Database, TSDB)是專門為處理和存儲時序數據而設計的數據庫。時序數據是帶有時間戳的數據,通常用于表示隨時間變化的測量值。時序數據庫在許多應用領域中具有關鍵作用,包括物聯網(IoT)、應用性能監控(APM)、金融市場分析、環境監測、工業自動化等。
當前主流的時序數據庫:https://db-engines.com

二、InfluxDB、Prometheus與Graphite:
|
|
InfluxDB |
Prometheus |
Graphite |
|
官方文檔 |
|||
|
簡介 |
一個開源的時序數據庫,專門用于存儲和查詢時序數據(metrics)。 |
一個開源的系統監控和報警工具,專注于時序數據收集、存儲和查詢。 |
一個開源的監控系統和圖表展示工具,專注于時序數據存儲和可視化。 |
|
主要特點 |
- 高效存儲時序數據 - 支持復雜的查詢和聚合 - 提供內置的存儲引擎(TSI, TSI2) - 支持標簽查詢和數據索引 - 內置圖形化儀表盤工具(Chronograf) |
- 自動發現和抓取目標 - 支持多維度數據模型(標簽) - 高效的拉取式數據收集模型 - 提供豐富的報警機制 - 強大的查詢語言PromQL |
- 采用推送模式來收集數據 - 數據存儲使用時間序列數據庫 - 基于Cassandra或其他數據庫存儲 - 主要使用 Graphite-web 展示數據 |
|
性能特點 |
高寫入吞吐量、低延遲查詢,支持高效的數據壓縮 |
高效的時間序列數據存儲,適合高頻率數據收集 |
存儲性能較為有限,適合小規模和低頻率的數據存儲 |
|
查詢語言 |
InfluxQL(類似SQL)或Flux |
PromQL(Prometheus Query Language) |
使用簡單的查詢語言(通過Graphite-web展示) |
|
數據存儲 |
時序數據專用存儲引擎,支持壓縮和高效查詢 |
存儲為 TSDB 格式,支持自定義存儲后端 |
使用基于 Whisper 的文件系統存儲(或者 Cassandra) |
|
數據收集方式 |
推送或拉取,支持客戶端庫以及HTTP API |
主要為拉取方式,支持自定義的抓取方式 |
推送模式,使用Carbon收集數據 |
|
數據模型 |
時序數據(時間戳、測量、標簽、字段、值) |
時序數據(時間戳、指標、標簽) |
時序數據(時間戳、指標、值) |
|
擴展性 |
支持集群擴展(Enterprise版本),單實例有一定限制 |
支持水平擴展和分布式架構,適合大規模數據存儲和查詢 |
擴展性有限,基于單一節點或分布式的配置方式 |
|
報警與告警 |
內置告警機制(Kapacitor),支持定義復雜的告警規則 |
強大的告警功能,支持多種告警接收方式 |
通過第三方工具(如 Nagios、Alertmanager)實現告警功能 |
|
社區與支持 |
活躍的開源社區,有付費版本的支持 |
強大的開源社區,有豐富的文檔和支持 |
較為成熟的社區,使用歷史較長,但社區活躍度相對較低 |
|
應用場景 |
- IoT 數據監控 - 企業級時序數據分析 - 日志分析與度量收集 |
- 容器和微服務監控 - 集群和系統資源監控 - 高頻數據收集和報警 |
- 基礎設施監控 - 網絡性能監控 - 存儲和服務器狀態監控 |
|
優點 |
- 高效存儲與查詢 - 豐富的查詢語言(InfluxQL 和 Flux) - 內置的可視化和報警支持 |
- 強大的自動發現與抓取機制 - 強大的查詢語言 PromQL - 與 Grafana 深度集成 |
- 簡單易用,安裝配置容易 - 適用于較小規模的監控項目 |
|
缺點 |
- 大規模集群和高可用性配置相對復雜 - 依賴企業版本的某些高級功能 |
- 存儲層無內建高可用特性,主要依賴于外部存儲 - 缺少內建的可視化工具,Prometheus Web UI,僅適用基礎的查詢和展示 |
- 可擴展性差,不適合大規模部署 - 存儲性能不足,不能處理非常高頻的數據 |
1、InfluxDB 是一個高效的時序數據庫,適合于存儲大規模時序數據,提供了強大的查詢語言和內置的可視化工具。
2、Prometheus 適合于動態環境和微服務架構,提供強大的數據抓取和報警能力,常與 Grafana 配合使用來進行可視化展示。
3、Graphite 是一個較為成熟的監控工具,適合小規模的時序數據存儲和展示,通常與 Grafana 配合使用來進行數據可視化。
三、Prometheus相關架構:

Prometheus 通過 Pushgateway 或 Job/exporters 的方式,定期從被監控的服務中拉取指標數據。這些服務通常通過 HTTP 暴露一個 /metrics 端點,Prometheus 通過該端點收集指標數據并存儲在本地磁盤中。用戶可以通過 PromQL 查詢存儲在 Prometheus 中的時序數據。Prometheus 還可以根據設定的告警規則,自動檢查采集的數據,生成告警并觸發相應操作。如果某個指標超出閾值或不符合特定條件,Prometheus 會發送告警到 Alertmanager,進行處理和轉發。
1、Prometheus Server:
Prometheus Server 是 Prometheus 的核心組件,負責從被監控的目標(targets)收集(scrape)數據、存儲數據、并提供查詢和告警功能。
2、Pushgateway:
Pushgateway 是 Prometheus 的一個組件,用于接收從臨時任務(如批處理任務)推送過來的指標數據。與 Prometheus 通常的拉取模式不同,Pushgateway 采用推送(push)方式將數據發送給 Prometheus。
由于Prometheus的拉取(pull)模式要求目標服務必須始終在線并持續暴露指標接口。然而,一些服務可能只存在一段很短的時間(例如批處理作業、定時任務或一次性任務),在它們執行完后,服務就會終止并且不再提供 HTTP 服務。這時候,Prometheus就無法拉取到數據。因此,當網絡情況無法直接滿足時,可以使用 pushgateway 來進行中轉,將此類數據主動push到pushgateway里面去,而 prometheus 采用pull方式拉取 pushgateway 中數據。
3、Job/Exporters:
Job,即標簽,通常是用來定義一組被監控目標的名稱和配置。Job是 Prometheus配置文件(prometheus.yml)中的一個重要概念,每個 Job對應一個或多個監控目標(Exporter),這些目標會定期暴露其性能指標,Prometheus通過拉取這些指標來進行監控。
Exporter是一個暴露 Prometheus可抓取的指標數據的程序或服務。Exporter 通常負責從應用程序或系統收集性能指標,并將這些數據以HTTP服務的形式暴露給 Prometheus。
|
Exporter |
備注 |
|
Node_Exporter |
用于暴露系統級別的指標數據(如 CPU、內存、磁盤使用情況) |
|
MySQL_Exporter |
用于暴露數據庫指標 |
4、Metrics:
Metrics,即指標,是 Prometheus 用來描述和衡量系統狀態或性能的數字數據載體,通常以時間序列的形式存儲。每個指標表示系統的某個度量值,比如請求數、內存使用量、響應時間等。
|
Metrics類型 |
定義 |
|
Counter |
計數器類型的指標,值只能遞增,用于記錄事件發生的次數 |
|
Gauge |
可以增加也可以減少的指標,通常用來記錄當前值(如內存使用、溫度等) |
|
Histogram |
記錄觀察值的分布情況,通過將觀察值劃分為不同的桶進行計數 |
|
Summary |
與 Histogram 類似,但可以預計算一些分位數,如 50%、95% 等 |
|
Untyped |
沒有明確類型的指標,適用于用戶自定義的特殊指標 |
5、PromQL:
PromQL 是 Prometheus 的查詢語言,用于從 Prometheus 中存儲的時序數據中查詢、分析和操作數據。通過PromQL可以根據需求對 Metrics數據進行過濾、聚合、轉換等操作。
6、Alertmanager:
Alertmanager 是 Prometheus 的組件之一,負責管理、分發告警。它接收 Prometheus 生成的告警信息,并根據配置將告警通知發送到用戶指定的通知渠道(如郵件、Slack、Webhook 等)。
四、Docker-Prometheus安裝:
1、Node Exporter:
用于從主機收集硬件和系統級別的指標
|
# 拉取Node_Exporter鏡像: |
|
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 將宿主機的 9100 端口映射到容器的 9100(node-exporter 默認)端口。node-exporter默認會在該端口上暴露監控指標。 2、-v /proc:/host/proc:ro 掛載宿主機的 /proc 目錄到容器中的 /host/proc。/proc 目錄包含了操作系統內核和進程的信息,node-exporter 需要訪問這些信息來收集系統級別的性能指標。掛載時使用了 ro(只讀)權限,確保容器無法修改宿主機的文件。 3、-v /sys:/host/sys:ro 類似地,掛載宿主機的 /sys 目錄到容器中的 /host/sys。/sys 目錄包含了與系統硬件相關的信息,node-exporter 也需要這些信息來收集指標。 4、-v /:/rootfs:ro 掛載宿主機的根文件系統到容器中的 /rootfs。node-exporter 需要訪問宿主機的文件系統以收集一些額外的指標(如磁盤、文件系統的相關信息)。同樣使用了只讀權限。 |
|
# Metrics數據訪問: |

2、Pushgateway:
允許短期任務將其指標推送到 Prometheus
|
# 拉取Pushgateway鏡像: |
|
docker pull prom/pushgateway |
|
# 自定義數據存儲文件夾: |
|
/opt/install/data/pushgateway-data |
|
# 修改文件夾權限: |
|
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管理訪問: |
|
# PUSH推送自定義測試Metric指標數據(不指定,默認untyped 類型): echo "# TYPE <指標> <Metric類型>\n<指標{標簽}> <值>" | curl --data-binary @- http://<ip:port>/metrics/job/<Job名> |
|
# 案例一 echo "example_metric 1" | curl --data-binary @- http://localhost:9091/metrics/job/test_job # 案例二 echo "example_metric{status=\"success\"} 1" | curl --data-binary @- http://localhost:9091/metrics/job/test2_job # 案例三 echo -e "# TYPE test_metric counter\ntest_metric 2" | curl --data-binary @- http://localhost:9091/metrics/job/test3_job |
|
# 清理指定Job數據: curl -X DELETE http://ip:port/metrics/job/<Job名> |
|
curl -X DELETE http://localhost:9091/metrics/job/test_job |

3、Alertmanager:
處理并路由 Prometheus 發出的告警通知
|
# 拉取Alertmanager鏡像: |
|
docker pull prom/alertmanager |
|
# 自定義數據存儲文件夾: |
|
/opt/install/data/alertmanager-data/config /opt/install/data/alertmanager-data/template |
|
# 修改文件夾權限: |
|
chmod 777 -R /opt/install/data/alertmanager-data/config chmod 777 -R /opt/install/data/alertmanager-data/template |
|
# 編輯告警配置文件alertmanager.yml: |
|
cat > /opt/install/data/alertmanager-data/config/alertmanager.yml << \EOF # 全局配置 global: # 設置報警解決超時時間,單位:分鐘 resolve_timeout: 5m # 發件人郵箱配置 smtp_from: 'xx@xx.com' # 郵箱服務器的主機配置,smtp.qq.com,端口為 465 或 587 smtp_smarthost: 'smtp.qq.com:465' # 郵箱賬戶名 smtp_auth_username: 'xx' # 郵箱授權碼(不是密碼) smtp_auth_password: '授權碼' # 是否啟用 TLS(此處不啟用) smtp_require_tls: false # SMTP 主機的 HELO 域名 smtp_hello: 'qq.com'
# 告警模板配置 templates: - '/opt/install/data/alertmanager-data/template/email.tmpl'
# 抑制規則配置 # 當存在 severity 為 critical 的告警時,抑制 severity 為 warning 的告警 # 源告警和目標告警必須在 alertname、dev 和 instance 標簽上相等 inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']
# 路由配置 route: # 根據告警名稱分組 group_by: ['alertname'] # 等待時間,用于等待同一組內的其他告警 group_wait: 5s # 分組后發送告警的時間間隔 group_interval: 5m # 發送告警間隔時間 s/m/h,如果指定時間內沒有修復,則重新發送告警 repeat_interval: 1h # 默認接收器,自定義接收器名default-receiver,用于處理沒有匹配到其他路由規則的告警 receiver: 'default-receiver' routes: # 使用正則表達式匹配 alarmClassify 標簽為 critical 的告警 - match_re: alarmClassify: '^critical$' # 自定義critical-alerts 接收器名,接收 critical 的告警 receiver: 'critical-alerts' # 使用正則表達式匹配 alarmClassify 標簽為 warning 的告警 - match_re: alarmClassify: '^warning$' # 自定義warning-alerts 接收器名,接收 warning 的告警 receiver: 'warning-alerts'
# 接收器配置 receivers: # 默認接收器 - name: 'default-receiver' email_configs: # 默認接收器的收件人,多個人就以 ',' 做分割 - to: 'default-receiver@example.com' # 發送已解決的告警通知 send_resolved: true # 接收郵件的標題 headers: {Subject: "alertmanager默認告警郵件"} # 嚴重告警接收器 - name: 'critical-alerts' email_configs: - to: 'critical-alerts@example.com' send_resolved: true # 接收郵件的標題 headers: {Subject: "alertmanager嚴重告警郵件"} # 警告告警接收器 - name: 'warning-alerts' email_configs: - to: 'warning-alerts@example.com' send_resolved: true # 接收郵件的標題 headers: {Subject: "alertmanager警告告警郵件"} EOF |
|
# 編輯告警模板配置文件email.tmpl: |
|
cat > /opt/install/data/alertmanager-data/template/email.tmpl << \EOF {{ define "email.html" }} <table border="1"> <tr> <td>報警項</td> <td>實例</td> <td>報警閥值</td> <td>開始時間</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管理訪問: |

4、Prometheus Server:
核心組件,負責采集、存儲指標數據,并生成告警
|
# 拉取Prometheus鏡像: |
|
docker pull prom/prometheus |
|
# 自定義數據存儲文件夾: |
|
/opt/install/data/prometheus-data |
|
# 修改文件夾權限: |
|
chmod 777 -R /opt/install/data/prometheus-data |
|
# 編輯prometheus.yml配置信息: |
|
cat > /opt/install/data/prometheus-data/prometheus.yml << \EOF # prometheus.yml global: # 設置抓取目標間隔為 60 秒 scrape_interval: 60s # 設置評估規則(如報警規則等)間隔為 60 秒 evaluation_interval: 60s
# job_name: 自定義抓取目標的名稱 scrape_configs: # 配置 Prometheus 作為數據源 - job_name: 'prometheus' static_configs: # Prometheus 本身 - targets: ['localhost:9090']
# 配置 Node Exporter - job_name: 'node_exporter' static_configs: # 指定 Node Exporter 的目標(可以是多個節點),修改localhost - targets: ['localhost:9100']
# 配置 Pushgateway - job_name: 'pushgateway' static_configs: # Pushgateway 的目標,修改localhost - targets: ['localhost:9091']
# 配置 Alertmanager - job_name: 'alertmanager' static_configs: # Alertmanager 的目標,修改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管理訪問: |
查看啟動信息:

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

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


2、添加新的儀表板:



六、PromQL數據查詢:
Prometheus 通過指標名稱(metrics name)以及對應的一組標簽(labelset)唯一定義一條時間序列。指標名稱反映了監控樣本的基本標識,而 label 則在這個基本特征上為采集到的數據提供了多種特征維度。用戶可以基于這些特征維度過濾,聚合,統計從而產生新的計算后的一條時間序列。
PromQL是 Prometheus內置的數據查詢語言,用于從Prometheus中存儲的時序數據中查詢、分析和操作數據。通過PromQL可以根據需求對 Metrics指標數據進行過濾、聚合、轉換等操作。

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

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 # 健康信息顯示詳情. shutdown.enabled: false # 允許應用以優雅的方式關閉(默認情況下不啟用) # Actuator端點將通過 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容器:負責收集和管理所有注冊到其中的指標 */ @Autowired private CollectorRegistry collectorRegistry; /** * Metrics類型: Counter * 設置指標名稱: http_requests_total * 設置添加兩個標簽:functionName、status * 設置指標描述性幫助信息:Counter測試監控 * @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()方法增加 Counter 指標的值 prometheusMetricsCounter.labels("monitorPointTest", status).inc(); } return status; }
5、Prometheus-Grafana管理:
(1)、查看Actuator端點的Metrics信息:
http://localhost:18081/actuator/prometheus

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

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

(4)、Grafana可視化管理:

浙公網安備 33010602011771號