Spring Boot进阶(94):从入门到精通:Spring Boot和Prometheus监控系统的完美结合

📣前言

随着云原生技术的发展,监控和度量也成为了不可或缺的一部分。Prometheus 是一款最近比较流行的开源时间序列数据库,同时也是一种监控方案。它具有极其灵活的查询语言、自身的数据采集和存储机制以及易于集成的特点。而 Spring Boot 是一款快速构建应用的框架,其提供了大量自动化的配置和功能,使得开发者可以更加专注于业务逻辑的开发,而不必关心大量的配置和环境搭建。

本文将介绍 Spring Boot 如何集成 Prometheus 进行应用监控,并结合实际应用场景,给出一些使用 Prometheus 监控应用的案例,以及优缺点分析和测试用例。

那么,具体如何实现呢?这将又会是干货满满的一期,全程无尿点不废话只抓重点教,具有非常好的学习效果,拿好小板凳准备就坐!希望学习的过程中大家认真听好好学,学习的途中有任何不清楚或疑问的地方皆可评论区留言或私信,bug菌将第一时间给予解惑,那么废话不多说,直接开整!Fighting!!

🌊环境说明

开发工具:IDEA 2021.3

JDK版本: JDK 1.8

Spring Boot版本:2.3.1 RELEASE

Maven版本:3.8.2


🏆本文收录于《Spring Boot从入门到精通》,专门攻坚指数提升,2023 年国内最系统+最强(更新中)。

本专栏致力打造最硬核 Spring Boot 从零基础到进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中...欢迎大家订阅持续学习。 如果想快速定位学习,可以看这篇【SpringBoot教程导航帖】,你想学习的都被收集在内,快速投入学习!!两不误。


🌊摘要

本文主要介绍如何在 Spring Boot 中集成 Prometheus 进行应用监控,重点讲解以下内容:

  • Prometheus 的概述和优缺点分析
  • Spring Boot 集成 Prometheus 的教学
  • 应用场景案例
  • 实战教学
  • 测试用例
  • 全文小结和结尾

🌊正文


Prometheus 是什么?

Prometheus 是一个开源的系统监控和警报工具包。它实现了完整的数据采集、存储和查询功能,可以帮助开发者对应用的性能和状态进行监控,并提供丰富的查询语言和可视化界面。

Prometheus 具有以下特点:

  • 支持多种数据采集方式,包括 HTTP、JMX、Redis、MySQL、RabbitMQ 等。
  • 灵活的数据查询和展现方式。
  • 方便的告警功能。
  • 模块化的设计,易于扩展和集成。

Spring Boot 是什么?

Spring Boot 是一个快速构建应用程序的框架,它基于 Spring 框架,简化了 Spring 应用的搭建和开发。Spring Boot 提供了自动化的配置和功能,减少了开发者在配置上花费的时间和精力,使得开发人员可以专注于业务逻辑的实现。

Spring Boot 具有以下特点:

  • 快速构建应用。
  • 提供了自动化配置,最大限度减少了配置的工作量。
  • 开发者友好,提供了灵活的扩展和集成方式。

搭建Spring Boot应用

首先,我们先创建个基础的Spring Boot项目,如果还不会点这里,此处就不详细赘述啦。

Spring Boot 集成 Prometheus

导入 Prometheus 相关依赖

在 Spring Boot 中使用 Prometheus,需要导入以下两个依赖:

xml 复制代码
<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_spring_boot</artifactId>
    <version>0.5.0</version>
</dependency>
<dependency>
    <groupId>io.prometheus</groupId>
    <artifactId>simpleclient_pushgateway</artifactId>
    <version>0.5.0</version>
</dependency>

simpleclient_spring_boot 是 Prometheus 提供的 Spring Boot 集成包,用于集成 Spring Boot 应用。simpleclient_pushgateway 是用于将采集到的数据推送到 Pushgateway。

配置 Prometheus

在 application.properties 中添加 Prometheus 的配置:

properties 复制代码
# 启用 Prometheus 进行监控
management.endpoint.metrics.enabled=true
# 设置采集间隔时间,单位为秒,这里设置为 10 秒
management.metrics.export.prometheus.step=10s

这里设置了采集数据的间隔时间为 10 秒。

定义 Controller

在 Controller 中添加用于测试的接口,用于生成一些测试数据:

java 复制代码
@RestController
public class TestController {

    private static final Random random = new Random();

    @GetMapping("/test")
    public String test() {
        // 模拟一些业务逻辑,比如查询数据库、计算等。
        try {
            Thread.sleep(random.nextInt(1000));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 返回一些测试数据
        return "Hello World!";
    }

}

监控应用

启动 Spring Boot 应用后,访问 http://localhost:8080/actuator/prometheus 即可查看采集到的数据。

例如,可以查看应用的请求数、请求处理时间、内存使用情况等。

应用场景案例

监控数据库连接池

数据库连接池是应用中非常重要的资源,过多的连接池占用会导致应用的性能下降,因此需要对其进行监控。在 Spring Boot 应用中可以通过以下方式对数据库连接池进行监控:

  1. 定义一个 health indicator,用于检测连接池的健康状况。
java 复制代码
@Component
public class DataSourceHealthIndicator implements HealthIndicator {

    @Autowired
    private DataSource dataSource;

    @Override
    public Health health() {
        try (Connection connection = dataSource.getConnection()) {
            // 如果可以获取到连接,则认为连接池正常
            return Health.up().build();
        } catch (Exception e) {
            // 如果出现异常,则表示连接池不正常
            return Health.down().withException(e).build();
        }
    }

}
  1. 配置 Prometheus 进行监控

在 application.properties 中添加以下配置:

properties 复制代码
# 启用 Prometheus 进行监控
management.endpoint.metrics.enabled=true
# 设置采集间隔时间,单位为秒,这里设置为 10 秒
management.metrics.export.prometheus.step=10s

监控应用日志

应用的日志是了解应用运行情况的重要依据,现在有一些日志组件可以与 Prometheus 进行集成,例如 logback-prometheus-appender,其可以将日志输出到 Prometheus 的指标中,方便进行监控。

在 Spring Boot 应用中可以使用以下方式与 logback-prometheus-appender 集成:

  1. 导入 logback-prometheus-appender 依赖:
xml 复制代码
<dependency>
    <groupId>io.github.microutils</groupId>
    <artifactId>logback-prometheus-appender</artifactId>
    <version>1.1.0</version>
</dependency>
  1. 在 logback.xml 中添加 appender 和 logger:
xml 复制代码
<appender name="PROMETHEUS" class="io.github.microutils.vertx.prometheus.LogbackPrometheusAppender">
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n%rEx</pattern>
    </encoder>
</appender>

<logger name="io.github.microutils.vertx.prometheus" level="INFO">
    <appender-ref ref="PROMETHEUS"/>
</logger>

这里定义了一个名为 PROMETHEUS 的 appender,并配置了 encoder 和 logger,将日志输出到 Prometheus 的指标中。

实战教学

项目结构

本例中,我们将构建一个简单的 Spring Boot 项目,用于演示如何集成 Prometheus 进行应用监控。项目结构如下:

复制代码
├── pom.xml
└── src
    └── main
        ├── java
        │   └── io
        │       └── github
        │           └── example
        │               ├── ExampleApplication.java
        │               └── TestController.java
        └── resources
            └── application.properties
  • ExampleApplication:Spring Boot 应用的启动类。
  • TestController:用于生成一些测试数据的 Controller。
  • application.properties:用于配置 Prometheus 和 Spring Boot 应用的属性。

导入依赖

我们需要在 pom.xml 中添加以下依赖:

xml 复制代码
<dependencies>
    <!-- Spring Boot Web Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.5.6</version>
    </dependency>
    <!-- Prometheus Simple Client for Spring Boot -->
    <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_spring_boot</artifactId>
        <version>0.10.0</version>
    </dependency>
</dependencies>

这里我们引入了 Spring Boot Web Starter 和 Prometheus Simple Client for Spring Boot 两个依赖。

配置 Prometheus

在 application.properties 中添加以下内容:

properties 复制代码
# Prometheus 监控端口
management.server.port=8081
# Prometheus 监控路径
management.endpoints.web.base-path=/actuator/prometheus
# 开启 Micrometer 的 Prometheus 支持
management.metrics.export.prometheus.enabled=true

这里,我们将 management.server.port 设置为 8081,代表 Prometheus 监控的端口号。management.endpoints.web.base-path 是管理端点的基础路径,用于提供 Prometheus 监控 API。最后,我们开启了 Micrometer 的 Prometheus 支持,这是实现 Spring Boot 应用监控的必要配置。

编写代码

ExampleApplication.java 中添加以下代码:

java 复制代码
@SpringBootApplication
public class ExampleApplication {
    public static void main(String[] args) {
        SpringApplication.run(ExampleApplication.class, args);
    }

    @Bean
    public CollectorRegistry collectorRegistry() {
        return CollectorRegistry.defaultRegistry;
    }
}

这里,我们启用了 Spring Boot 应用,并创建了一个 CollectorRegistry bean。这个 bean 将与 Prometheus 一起使用,以暴露应用程序的度量指标。

接下来,在 TestController.java 中添加以下代码:

java 复制代码
@RestController
public class TestController {
    private final Random random = new Random();

    @Autowired
    private CollectorRegistry collectorRegistry;

    @RequestMapping("/test")
    public String test() throws InterruptedException {
        // 模拟请求处理
        Thread.sleep(random.nextInt(500));
        // 增加指标值
        Counter.builder("example_requests_total").register(collectorRegistry).inc();
        return "Test completed";
    }
}

这里,我们创建了一个 REST 控制器,包含 /test 端点。在这个端点中,我们模拟了请求处理,并增加了 example_requests_total 计数器的值。

运行和测试

现在,我们可以运行应用程序并进行测试了。

首先,启动应用程序:

复制代码
mvn spring-boot:run

然后在浏览器中访问 http://localhost:8080/test 。每次访问 /test 端点时,计数器 example_requests_total 将增加一个值。

接下来,我们使用 Prometheus 来收集应用程序度量指标。在 Prometheus 的配置文件中,添加以下内容:

yaml 复制代码
scrape_configs:
  - job_name: 'example-app'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['localhost:8081']

最后,访问 http://localhost:9090/graph ,在 Query 输入框中输入 example_requests_total,即可看到计数器的值。

小结

本文介绍了如何在 Spring Boot 应用中集成 Prometheus 进行应用监控,重点讲解了 Prometheus 的概述、Spring Boot 集成 Prometheus 的教学、应用场景案例、实战教学和测试用例。在实践中,我们可以使用 Prometheus 监控数据库连接池、应用日志、文件上传、定时任务等多种场景,通过灵活配置和扩展,帮助我们更好地了解应用的性能和状态。

总结

Prometheus 是一款开源的系统监控和警报工具包,其具有可扩展性、灵活的数据查询和展现方式、方便的告警功能和模块化的设计等优点。Spring Boot 是一款快速构建应用程序的框架,其提供了自动化的配置和功能,减少了开发者在配置上花费的时间和精力。

在 Spring Boot 应用中集成 Prometheus,需要导入 Prometheus 相关依赖,配置 Prometheus 和定义 Controller,以便实现数据采集和监控。同时,我们可以根据具体的应用场景,使用不同的方法和工具,对应用的性能和状态进行监控和调优。

通过本文的介绍和实践,相信大家已经掌握了如何在 Spring Boot 应用中集成 Prometheus 进行应用监控的方法和技巧。希望大家能够灵活运用这些知识,提升应用的性能和稳定性,为业务发展提供有力的保障。

... ...

ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看如下的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬。

「赠人玫瑰,手留余香」,咱们下期拜拜~~

🌊热文推荐

滴~如下推荐【Spring Boot 进阶篇】的学习大纲,请小伙伴们注意查收。

Spring Boot进阶(01):Spring Boot 集成 Redis,实现缓存自由

Spring Boot进阶(02):使用Validation进行参数校验

Spring Boot进阶(03):如何使用MyBatis-Plus实现字段的自动填充

Spring Boot进阶(04):如何使用MyBatis-Plus快速实现自定义sql分页

Spring Boot进阶(05):Spring Boot 整合RabbitMq,实现消息队列服务

Spring Boot进阶(06):Windows10系统搭建 RabbitMq Server 服务端

Spring Boot进阶(07):集成EasyPoi,实现Excel/Word的导入导出

Spring Boot进阶(08):集成EasyPoi,实现Excel/Word携带图片导出

Spring Boot进阶(09):集成EasyPoi,实现Excel文件多sheet导入导出

Spring Boot进阶(10):集成EasyPoi,实现Excel模板导出成PDF文件

Spring Boot进阶(11):Spring Boot 如何实现纯文本转成.csv格式文件?

Spring Boot进阶(12):Spring Boot 如何获取Excel sheet页的数量?

Spring Boot进阶(13):Spring Boot 如何获取@ApiModelProperty(value = "序列号", name = "uuid")中的value值name值?

Spring Boot进阶(14):Spring Boot 如何手动连接库并获取指定表结构?一文教会你

Spring Boot进阶(15):根据数据库连接信息指定分页查询表结构信息

Spring Boot进阶(16):Spring Boot 如何通过Redis实现手机号验证码功能?

Spring Boot进阶(17):Spring Boot如何在swagger2中配置header请求头等参数信息

Spring Boot进阶(18):SpringBoot如何使用@Scheduled创建定时任务?

Spring Boot进阶(19):Spring Boot 整合ElasticSearch

Spring Boot进阶(20):配置Jetty容器

Spring Boot进阶(21):配置Undertow容器

Spring Boot进阶(22):Tomcat与Undertow容器性能对比分析

Spring Boot进阶(23):实现文件上传

Spring Boot进阶(24):如何快速实现多文件上传?

Spring Boot进阶(25):文件上传的单元测试怎么写?

Spring Boot进阶(26):Mybatis 中 resultType、resultMap详解及实战教学

Spring Boot进阶(27):Spring Boot 整合 kafka(环境搭建+演示)

Spring Boot进阶(28):Jar包Linux后台启动部署及滚动日志查看,日志输出至实体文件保存

Spring Boot进阶(29):如何正确使用@PathVariable,@RequestParam、@RequestBody等注解?不会我教你,结合Postman演示

Spring Boot进阶(30):@RestController和@Controller 注解使用区别,实战演示

... ...

若想系统完整的从0到1的学习,可以参考这篇专栏总结《2023最新首发,全网最全 Spring Boot 学习宝典(附思维导图)》本专栏致力打造最硬核 Spring Boot 进阶系列学习内容,🚀均为全网独家首发,打造精品专栏,专栏持续更新中。欢迎大家订阅持续学习。

如果想快速定位学习,可以看这篇【教程导航帖】导航目录,你想学习的都被收集在内,快速投入学习!!两不误。

在入门及进阶之途,我必助你一臂之力,系统性学习,从入门到精通,带你不走弯路,直奔终点;投资自己,永远性价比最高,都这么说了,你还不赶紧来学??

本文涉及所有源代码,均已上传至GitHub开源,供同学们一对一参考 GitHub传送门,同时,原创开源不易,欢迎给个star🌟,想体验下被🌟的感jio,非常感谢❗

📣文末

我是bug菌,CSDN | 阿里云 | 华为云 | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,掘金 | InfoQ | 51CTO等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。

相关推荐
smileNicky8 小时前
SpringBoot系列之从繁琐配置到一键启动之旅
java·spring boot·后端
柏油11 小时前
Spring @TransactionalEventListener 解读
spring boot·后端·spring
小小工匠12 小时前
Maven - Spring Boot 项目打包本地 jar 的 3 种方法
spring boot·maven·jar·system scope
板板正13 小时前
Spring Boot 整合MongoDB
spring boot·后端·mongodb
泉城老铁14 小时前
在高并发场景下,如何优化线程池参数配置
spring boot·后端·架构
泉城老铁14 小时前
Spring Boot中实现多线程6种方式,提高架构性能
spring boot·后端·spring cloud
hrrrrb15 小时前
【Java Web 快速入门】九、事务管理
java·spring boot·后端
布朗克16817 小时前
Spring Boot项目通过RestTemplate调用三方接口详细教程
java·spring boot·后端·resttemplate
IT毕设实战小研18 小时前
基于Spring Boot校园二手交易平台系统设计与实现 二手交易系统 交易平台小程序
java·数据库·vue.js·spring boot·后端·小程序·课程设计
孤狼程序员19 小时前
【Spring Cloud 微服务】1.Hystrix断路器
java·spring boot·spring·微服务