最近公司在推Prometheus,记录下如何与SpringBoot项目做整合。
Prometheus
上图均取自于Prometheus官网,关于Prometheus是什么怎么用,官网都有很清晰的说明。在其特征描述中可以看到:以调用HTTP接口的形式,拉取已经被收集好的时序数据。
简单来讲,业务集成Prometheus这个事情分为两步
- 第一步业务方Prometheus tragets
收集好指标metrics
后,以接口的形式暴露出来。
- 第二步Prometheus Server会对业务方暴露的接口发起HTTP调用pull metrics
最后Prometheus拿到业务方收集好的指标后,以图形化界面展示出来Prometheus web UI
、Grafana
作为业务方,需要清楚如何收集自己服务的指标并以接口的形式暴露。初期接入Prometheus,考虑只收集一些系统级指标(业务级指标可根据官网文档自己实现)。而系统指标的收集(比如虚拟机线程、堆的使用情况),SpringBoot已经为我们提供了这个能力Spring Boot Actuator
。
Spring Boot Actuator
在Spring官网有对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的概念
上图为官网给出的endpoints。比如常用的健康检查接口,以/actuator/health
暴露,对应的endpoints为/health
。在2.3.0.RELEASE版本中暴露的接口路径统一前缀为/actuator
。由于这些endpoints都是服务内部敏感的接口,在2.3.0.RELEASE中默认只暴露/helath
和/info
接口,如果想暴露其他接口,需要在配置文件中开启。
开启暴露endpoints配置,例如/beans
和/metrics
management:
endpoints:
web:
exposure:
include:
- beans
- metrics
其中的endpoints metrics
暴露当前服务的指标,看起来很适合提供给Prometheus以获取指标。但是Prometheus对获取的指标数据格式是要求的,而metrics
暴露的指标数据格式是JSON,与要求的指标格式不匹配。
不过Spring Boot Actuator在2.3.0.RELEASE版本中已经为我们考虑到了这一点(至于是从哪个版本开始支持的 =。=)
只需要引入micrometer-registry-prometheus
的依赖即可,记得在配置文件中开启/prometheus
接口的暴露
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.5.1</version>
</dependency>
简单demo
启动服务后,访问/actuator/prometheus
接口,可以看到Micrometer替我们收集到的指标
2.3.0.RELEASE版本很顺利,但是问题来了,生产用的SpringBoot是1.5.4.RELEASE版本,而1.5.4.RELEASE版本文档没有提供对endpoints /prometheus
的支持。最后在Micrometer官网找到了解决的办法。
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
启动服务后,访问/prometheus
接口,可以看到Micrometer收集到的指标
现在2.3.0.RELEASE和1.5.4.RELEASE版本的服务,都可以成功暴露出一个给Prometheus拉取指标的接口,只需要在Prometheus上进行配置即可在Prometheus WEB UI上看到效果。但生产环境的真实情况,不可能只收集一个服务的指标,是否再需要一个代理服务,该服务用来收集所有微服务的指标后,再统一暴露接口给Prometheus,需要再根据生产环境使用情况考虑。