SpringBoot整合Prometheus如何實現(xiàn)資源監(jiān)控
引言
在微服務(wù)架構(gòu)流行的今天,服務(wù)的監(jiān)控和管理變得尤為重要。Prometheus 作為一個開源的監(jiān)控和告警工具,以其強大的數(shù)據(jù)采集、存儲和查詢能力,受到了眾多開發(fā)者的青睞。
Spring Boot 作為 Java 領(lǐng)域快速構(gòu)建微服務(wù)的框架,與 Prometheus 的結(jié)合可以實現(xiàn)對 Spring Boot 應(yīng)用的實時監(jiān)控。本文將介紹如何使用 Prometheus 監(jiān)控 Spring Boot 應(yīng)用。
Prometheus 簡介
Prometheus 是一個開源的系統(tǒng)監(jiān)控和警報工具包,它通過采集和存儲指標(biāo)(metrics),提供了強大的數(shù)據(jù)查詢語言,可以幫助我們分析和理解應(yīng)用程序的行為。
Prometheus 的核心組件是 Prometheus Server,它負(fù)責(zé)采集監(jiān)控指標(biāo)并提供查詢接口。
Spring Boot Actuator
Spring Boot Actuator 是 Spring Boot 提供的一系列用于監(jiān)控和管理 Spring Boot 應(yīng)用的工具。
它提供了許多端點(endpoints),例如 /health、/info、/metrics 等,這些端點可以公開應(yīng)用的內(nèi)部信息,如健康狀態(tài)、配置信息和度量指標(biāo)。
集成 Prometheus 和 Spring Boot
要將 Prometheus 與 Spring Boot 應(yīng)用集成,
我們需要執(zhí)行以下步驟:
添加依賴
首先,將 Spring Boot Actuator 和 Micrometer Prometheus Registry 添加到項目的依賴中。
Actuator 提供了一系列內(nèi)置端點,用于顯示運行應(yīng)用的性能信息,如健康狀況、指標(biāo)等。
Micrometer Prometheus registry 會將這些指標(biāo)格式化為 Prometheus 可讀格式。
- xml
<dependencies> <!-- Spring Boot Actuator --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> <version>2.7.15</version> </dependency> <!-- Micrometer Prometheus Registry --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <version>1.9.14</version> </dependency> </dependencies>
配置 Actuator
在 application.yml 或 application.properties 文件中配置 Actuator 以暴露 Prometheus 端點。
例如,在 application.yml 中:
- yaml
management: endpoints: web: exposure: include: '*' metrics: export: prometheus: enabled: true endpoints: web: base-path: "/status" # 將/actuator/xxx修改為/status/xxx,防止被猜到 server: request: metric-name: "application:request" # 自定義接口指標(biāo)名 client: request: metric-name: "application:client_request" # 自定義http客戶端指標(biāo)名 server: port: 10111 # 指定端口,默認(rèn)跟server.port一樣,可以防止被猜到
配置 Prometheus
下載并運行 Prometheus Server,然后從 Prometheus 官網(wǎng)或 GitHub 倉庫獲取適用于您操作系統(tǒng)的版本。
啟動 Prometheus Server 后,需要修改其配置文件 prometheus.yml,以便添加 Spring Boot 應(yīng)用作為監(jiān)控目標(biāo)。
- yaml
global: scrape_interval: 15s scrape_configs: - job_name: "prometheus" static_configs: - targets: ["localhost:9090"] - job_name: 'prometheusapp' metrics_path: '/actuator/prometheus' static_configs: - targets: ['localhost:8080']
監(jiān)控落地
基于 Prometheus + Grafana 的監(jiān)控落地,包括安裝 Prometheus + Grafana、導(dǎo)入依賴、配置 Prometheus 拉取數(shù)據(jù)以及配置 Grafana 監(jiān)控面板。
通過上述步驟,我們可以成功地將 Prometheus 與 Spring Boot 應(yīng)用集成,實現(xiàn)對應(yīng)用的實時監(jiān)控。
監(jiān)控結(jié)果與可觀察的指標(biāo)
在Spring Boot應(yīng)用中整合Prometheus后,我們可以監(jiān)控到一系列關(guān)鍵的性能指標(biāo),這些指標(biāo)對于理解應(yīng)用的行為和健康狀況至關(guān)重要。
以下是一些主要的監(jiān)控結(jié)果和可觀察的指標(biāo):
系統(tǒng)和JVM指標(biāo)
- CPU使用率:監(jiān)控系統(tǒng)CPU的使用情況,可以通過PromQL查詢rate(process_cpu_seconds_total[5m])來獲取。
- 內(nèi)存使用情況:包括堆內(nèi)存和非堆內(nèi)存的使用情況,可以通過jvm_memory_used_bytes等指標(biāo)來監(jiān)控。
- 垃圾回收(GC):監(jiān)控JVM的垃圾回收情況,包括GC次數(shù)和耗時,可以通過jvm_gc_collection_seconds_sum等指標(biāo)來監(jiān)控。
應(yīng)用性能指標(biāo)
- 請求處理時間:監(jiān)控接口的響應(yīng)時間,可以通過http_server_requests_seconds等指標(biāo)來獲取。
- 請求量:監(jiān)控接口的請求次數(shù),可以通過http_server_requests_total等指標(biāo)來監(jiān)控。
- 錯誤率:監(jiān)控接口的錯誤請求次數(shù),可以通過http_server_requests_seconds_count等指標(biāo)來監(jiān)控。
業(yè)務(wù)指標(biāo)
- 訂單總額:模擬訂單系統(tǒng)的實時訂單總額,可以通過自定義指標(biāo)order_amount_sum來監(jiān)控。
- 下單失敗率:監(jiān)控10分鐘內(nèi)的下單失敗率,可以通過自定義指標(biāo)來實現(xiàn)監(jiān)控。
- 請求失敗數(shù):監(jiān)控請求失敗的次數(shù),可以通過自定義指標(biāo)來實現(xiàn)監(jiān)控。
容器和部署指標(biāo)
- 容器啟動時間:監(jiān)控容器的啟動時間,可以通過自定義腳本和Prometheus的pushgateway來實現(xiàn)。
- 容器運行時指標(biāo):監(jiān)控容器的運行時指標(biāo),如資源使用情況等。
自定義指標(biāo)
- 接口調(diào)用次數(shù)和耗時:通過自定義指標(biāo)來監(jiān)控特定接口的調(diào)用次數(shù)和耗時,可以通過method_rt等指標(biāo)來監(jiān)控。
- 訂單請求次數(shù):通過自定義指標(biāo)metrics_request_count來監(jiān)控訂單請求的次數(shù)。
通過這些指標(biāo),我們可以對Spring Boot應(yīng)用的性能和健康狀況有一個全面的了解。
這些數(shù)據(jù)不僅可以幫助我們及時發(fā)現(xiàn)和解決問題,還可以用于性能優(yōu)化和故障排查。
通過Grafana等可視化工具,我們可以將這些指標(biāo)以圖表的形式展示出來,使得監(jiān)控結(jié)果更加直觀和易于理解。
如何通過Prometheus監(jiān)控分布式系統(tǒng)的指標(biāo)?
要通過Prometheus監(jiān)控分布式系統(tǒng)的指標(biāo),可以遵循以下步驟和最佳實踐:
選擇合適的監(jiān)控指標(biāo)
根據(jù)Google的分布式監(jiān)控經(jīng)驗,推薦的四個黃金指標(biāo)包括[1]:
- 延遲:服務(wù)請求的時間,反映用戶體驗和系統(tǒng)核心性能。
- 通訊量:監(jiān)控當(dāng)前系統(tǒng)的流量,用于衡量服務(wù)的容量需求。
- 錯誤:監(jiān)控當(dāng)前系統(tǒng)所有發(fā)生的錯誤請求,衡量當(dāng)前系統(tǒng)錯誤發(fā)生的速率。
- 飽和度:衡量當(dāng)前服務(wù)的飽和度,主要強調(diào)最能影響服務(wù)狀態(tài)的受限制的資源,如內(nèi)存狀態(tài)。
使用Exporter收集數(shù)據(jù)
Prometheus通過Exporter來收集分布式系統(tǒng)中的數(shù)據(jù)。常見的Exporter包括[11]:
- NodeExporter:收集主機的CPU、內(nèi)存、磁盤等信息。
- 其他Exporter:根據(jù)需要監(jiān)控的具體服務(wù)或組件,可能需要使用特定的Exporter。
配置Prometheus
配置Prometheus的prometheus.yml文件,定義如何拉取不同Exporter的數(shù)據(jù)[11]:
- yaml
scrape_configs: - job_name: 'node' static_configs: - targets: ['localhost:8080']
這將配置Prometheus從NodeExporter的:8080端口拉取數(shù)據(jù)。
多集群監(jiān)控方案
在分布式云場景下,可以采用TMP+TDCC方案,通過在中心賬號下創(chuàng)建TMP監(jiān)控實例,并在該賬號下開啟TDCC HUB集群,將其他賬號下的集群統(tǒng)一注冊到TDCC HUB集群中,實現(xiàn)一套監(jiān)控系統(tǒng)采集所有集群的指標(biāo)[9]。
聚合查詢與指標(biāo)數(shù)據(jù)量
對于多集群數(shù)據(jù)存放在一起的情況,可以進(jìn)行預(yù)聚合以減少查詢時Prometheus的壓力和反饋耗時[9]。同時,需要注意監(jiān)控數(shù)據(jù)的總量,建議所有集群總的數(shù)據(jù)量不超過450w。
可視化與告警
使用Grafana與Prometheus結(jié)合,實現(xiàn)數(shù)據(jù)的可視化展示[12]。同時,可以設(shè)置告警規(guī)則,當(dāng)特定指標(biāo)超過閾值時觸發(fā)告警。
監(jiān)控指標(biāo)的類型
Prometheus主要有四種類型的監(jiān)控指標(biāo)[10]:
- Counter:只增不減的計數(shù)器,如HTTP訪問量。
- Gauge:反映系統(tǒng)的當(dāng)前狀態(tài),可增可減,如CPU使用率。
- Histogram:用于統(tǒng)計和分析樣本的分布情況。
- Summary:與Histogram類似,但提供了分位數(shù)統(tǒng)計。
通過上述步驟和實踐,可以有效地通過Prometheus監(jiān)控分布式系統(tǒng)的指標(biāo),確保系統(tǒng)的穩(wěn)定性和性能。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解JAVA生成將圖片存入數(shù)據(jù)庫的sql語句實現(xiàn)方法
這篇文章主要介紹了詳解JAVA生成將圖片存入數(shù)據(jù)庫的sql語句實現(xiàn)方法的相關(guān)資料,這里就是實現(xiàn)java生成圖片并存入數(shù)據(jù)庫的實例,需要的朋友可以參考下2017-08-08synchronized背后的monitor鎖實現(xiàn)詳解
這篇文章主要為大家介紹了synchronized背后的monitor鎖實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09MP(MyBatis-Plus)實現(xiàn)樂觀鎖更新功能的示例代碼
這篇文章主要介紹了MP(MyBatis-Plus)實現(xiàn)樂觀鎖更新功能的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Netty源碼解析NioEventLoop創(chuàng)建的構(gòu)造方法
這篇文章主要介紹了Netty源碼解析NioEventLoopGroup之NioEventLoop創(chuàng)建的構(gòu)造方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03