??最近公司在推Prometheus,記錄下如何與SpringBoot項目做整合。
Prometheus


??上圖均取自于Prometheus官網(wǎng),關(guān)于Prometheus是什么怎么用,官網(wǎng)都有很清晰的說明。在其特征描述中可以看到:以調(diào)用HTTP接口的形式,拉取已經(jīng)被收集好的時序數(shù)據(jù)。
??簡單來講,業(yè)務(wù)集成Prometheus這個事情分為兩步
???- 第一步業(yè)務(wù)方Prometheus tragets收集好指標metrics后,以接口的形式暴露出來。
???- 第二步Prometheus Server會對業(yè)務(wù)方暴露的接口發(fā)起HTTP調(diào)用pull metrics
??最后Prometheus拿到業(yè)務(wù)方收集好的指標后,以圖形化界面展示出來Prometheus web UI、Grafana
??作為業(yè)務(wù)方,需要清楚如何收集自己服務(wù)的指標并以接口的形式暴露。初期接入Prometheus,考慮只收集一些系統(tǒng)級指標(業(yè)務(wù)級指標可根據(jù)官網(wǎng)文檔自己實現(xiàn))。而系統(tǒng)指標的收集(比如虛擬機線程、堆的使用情況),SpringBoot已經(jīng)為我們提供了這個能力Spring Boot Actuator。
Spring Boot Actuator
??在Spring官網(wǎng)有對Spring Boot Actuator的說明,最新的2.3.0.RELEASE文檔。使用也很簡單,引入依賴即可
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
Spring Boot Actuator中存在Endpoints的概念

??上圖為官網(wǎng)給出的endpoints。比如常用的健康檢查接口,以/actuator/health暴露,對應(yīng)的endpoints為/health。在2.3.0.RELEASE版本中暴露的接口路徑統(tǒng)一前綴為/actuator。由于這些endpoints都是服務(wù)內(nèi)部敏感的接口,在2.3.0.RELEASE中默認只暴露/helath和/info接口,如果想暴露其他接口,需要在配置文件中開啟。
開啟暴露endpoints配置,例如/beans和/metrics
management:
endpoints:
web:
exposure:
include:
- beans
- metrics
??其中的endpoints metrics暴露當前服務(wù)的指標,看起來很適合提供給Prometheus以獲取指標。但是Prometheus對獲取的指標數(shù)據(jù)格式是要求的,而metrics暴露的指標數(shù)據(jù)格式是JSON,與要求的指標格式不匹配。
??不過Spring Boot Actuator在2.3.0.RELEASE版本中已經(jīng)為我們考慮到了這一點(至于是從哪個版本開始支持的 =。=)

??只需要引入micrometer-registry-prometheus的依賴即可,記得在配置文件中開啟/prometheus接口的暴露
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.5.1</version>
</dependency>
??簡單demo
??啟動服務(wù)后,訪問/actuator/prometheus接口,可以看到Micrometer替我們收集到的指標

??2.3.0.RELEASE版本很順利,但是問題來了,生產(chǎn)用的SpringBoot是1.5.4.RELEASE版本,而1.5.4.RELEASE版本文檔沒有提供對endpoints /prometheus的支持。最后在Micrometer官網(wǎng)找到了解決的辦法。
Micrometer
??Micrometer整合SpringBoot1.5.X版本的文檔
??文檔中有詳細描述SpringBoot1.5.X項目如何暴露Prometheus接口,只需要再引入Micrometer為低版本SpringBoot項目提供的適配依賴,注意版本一致
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-spring-legacy</artifactId>
<version>1.0.5</version>
</dependency>
??簡單demo
??啟動服務(wù)后,訪問/prometheus接口,可以看到Micrometer收集到的指標

??現(xiàn)在2.3.0.RELEASE和1.5.4.RELEASE版本的服務(wù),都可以成功暴露出一個給Prometheus拉取指標的接口,只需要在Prometheus上進行配置即可在Prometheus WEB UI上看到效果。但生產(chǎn)環(huán)境的真實情況,不可能只收集一個服務(wù)的指標,是否再需要一個代理服務(wù),該服務(wù)用來收集所有微服務(wù)的指標后,再統(tǒng)一暴露接口給Prometheus,需要再根據(jù)生產(chǎn)環(huán)境使用情況考慮。