SpringBoot整合Prometheus構建高效、靈活的監控系統
對于任何一個應用系統來說,監控都是至關重要的一個組成部分。如果應用系統在運行過程當中出現故障(如網絡中斷、內存溢出、磁盤空間不足、軟件自身Bug),任何一個方面出現問題都有可能影響到整個系統的正常運行,甚至給企業帶來資損,因此監控必不可少。那么SpringBoot項目如何實現一套完整、成熟的監控系統呢?
首先,SpringBoot是一個可以快速創建獨立、可運行的、生產級別的Spring應用的項目框架,Prometheus是一個開源的監控和告警工具,廣泛應用于微服務架構的監控。將SpringBoot應用與Prometheus整合,可以實現應用的實時監控和性能分析,幫助開發人員快速定位和解決問題。下面我們來實現SpringBoot整合prometheus。
1、SpringBoot項目添加相關的依賴
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--prometheus-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
</dependencies>
2、SpringBoot項目添加yml配置
server:
port: 8081
spring:
application:
name: prometheus-demo
#prometheus
management:
endpoints:
web:
exposure:
include: '*'
在Springboot整合Prometheus的時候,項目啟動后會開啟Actuator服務,SpringBoot Actuator會自動配置一個URL為 /actuator/Pprometheus的http服務來供prometheus抓取數據。
3、添加測試controller
@RestController
@RequestMapping("/test")
public class OrderController {
@GetMapping("/test1")
public String test1(){
return "success";
}
@GetMapping("/test2")
public String test2(){
List<byte[]> byteList = new ArrayList<>();
while (true){
byteList.add(new byte[1024*1024*2]);
try {
Thread.sleep(2000);
} catch (InterruptedException e){
}
}
}
}
4、啟動Prometheus后檢查springBoot項目是否正常
在SpringBoot配置好Prometheus配置文件后,啟動SpringBoot項目,我們需要檢查項目在Prometheus上的狀態是否正常,如下圖Springboot項目的啟動圖:
待Springboot項目啟動完成后,在Prometheus中查詢Springboot項目的監控狀態,如下圖所示的正常監控狀態:
圖片
項目在Prometheus上的狀態是綠色表示是正常的狀態。
5、prometheus的配置文件中添加SpringBoot監控任務
圖片
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["Prometheus_ip:9090"]
- job_name: 'springboot-prometheus'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ["springboot項目的ip:8081"]
6、Grafana配置prometheus數據源
6.1 添加prometheus
圖片
6.2 配置prometheus
圖片
點擊Save&Test可以看到如下的提示就是表示添加Prometheus數據源成功:
圖片
6.3 挑選可視化的dashborad
通過訪問https://grafana.com/grafana/dashboards這個鏈接去挑選可視化的dashborad,下圖是一個典型的SpringBoot項目的監控可視化的dashborad:
圖片
然后獲取dashborad的編號:
圖片
圖片
6.4 添加dashborad到Grafana中
在Grafana中添加dashborad,如下圖所示:
圖片
輸入dashborad編號
圖片
然后選擇prometheus數據源
圖片
配置好之后可以就看到Granafa的監控面板
圖片
7、測試監控
圖片
請求執行死循環的代碼,我們可以發現請求正在被執行,如下圖所示:
圖片
執行一段時間后,再觀察Granafa監控面板的效果:
圖片
通過監控我們發現內消耗一直不斷增加,代碼出現問題我們可以第一時間快速的發現,然后定位解決。
總結:
(1)SpringBoot整合Prometheus的原理是SpringBoot應用將metrics數據上報給Prometheus,數據上報有基于Pushgateway方式和直接上報方式。
(2)基于Pushgateway方式適用于短期運行的應用,將metrics數據推送到Pushgateway中,由Pushgateway統一推送至Prometheus。
(3)直接上報方式適用于長期運行的應用,將metrics數據直接上報給Prometheus中。直接上報方式是通過配置文件的配置,將SpringBoot應用會把metrics數據暴露在/actuator/prometheus路徑下,Prometheus通過抓取該路徑的數據即可獲取應用的metrics數據。