Springboot 使用 Micrometer 集成 Prometheus 监控 Java 应用性能
Micrometer
Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,它提供了多种度量指标类型(Timers、Guauges、Counters等),同时支持接入不同的监控系统,例如 Influxdb、Graphite、Prometheus 等。我们可以通过 Micrometer 收集 Java 性能数据,配合 Prometheus 监控系统实时获取数据,并最终在 Grafana 上展示出来,从而很容易实现应用的监控。
Micrometer 中有两个最核心的概念,分别是计量器(Meter)和计量器注册表(MeterRegistry)。计量器用来收集不同类型的性能指标信息,Micrometer 提供了如下几种不同类型的计量器:
- 计数器(Counter): 表示收集的数据是按照某个趋势(增加/减少)一直变化的,也是最常用的一种计量器,例如接口请求总数、请求错误总数、队列数量变化等。
- 计量仪(Gauge): 表示搜集的瞬时的数据,可以任意变化的,例如常用的 CPU Load、Mem 使用量、Network 使用量、实时在线人数统计等,
- 计时器(Timer): 用来记录事件的持续时间,这个用的比较少。
- 分布概要(Distribution summary): 用来记录事件的分布情况,表示一段时间范围内对数据进行采样,可以用于统计网络请求平均延迟、请求延迟占比等。
Springboot 工程集成 Micrometer
pom.xml里面添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
<version>1.1.4</version>
</dependency>
这里引入了 io.micrometer 的 micrometer-registry-prometheus 依赖以及 spring-boot-starter-actuator 依赖,因为该包对 Prometheus 进行了封装,可以很方便的集成到 Springboot 工程中。
其次在 application.properties 中配置如下:
server.port=8089
spring.application.name=springboot2-prometheus
management.endpoints.web.exposure.include=*
management.metrics.tags.application=${spring.application.name}
然后在工程启动主类中添加 Bean 如下来监控 JVM 性能指标信息:
@SpringBootApplication
public class Springboot2PrometheusApplication {
public static void main(String[] args) {
SpringApplication.run(Springboot2PrometheusApplication.class, args);
}
@Bean
MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") String applicationName){
return registry -> registry.config().commonTags("application", applicationName);
}
}
其实做成一个组件更好,只要维护一个组件即可,其他业务引入JAR就好了,还可以支持拆卸。启动服务,浏览器访问 http://127.0.0.1:8089/actuator/prometheus 就可以看到应用的 一系列不同类型 metrics 信息。
配置 Prometheus 监控应用指标
Prometheus 的安装配置,修改 prometheus.yml 配置,添加上边启动的服务地址来执行监控。
配置 Grafana Dashboard 展示监控项
自定义监控指标并展示到 Grafana
监控某几个 API 请求次数
监控所有 API 请求次数
上边针对某个或某几个接口请求次数做了监控,如果我们想针对整个应用监控所有接口请求总次数,这个该如何实现呢?监控请求次数可以继续使用 Counter 计数器,整个应用所有请求,可以使用 Spring AOP,通过切面注入可以做到统计所有请求记录。
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.12</version>
</dependency>
添加 AspectAop切面到工程里面。
其他定制
(完)