SpringBoot整合Prometheus监控指南
从现在开始,努力学习吧!本文《Spring Boot整合Prometheus监控教程》主要讲解了等等相关知识点,我会在golang学习网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!
Spring Boot整合Prometheus监控的解决方案包括:1. 引入Micrometer Prometheus注册表依赖;2. 在配置文件中开启Prometheus端点;3. 配置Prometheus抓取任务。首先,在pom.xml中添加micrometer-registry-prometheus依赖,使应用具备暴露指标的能力;接着,在application.properties或yml中设置management.endpoints.web.exposure.include=prometheus以暴露监控接口;然后,在prometheus.yml中配置scrape_configs,指定job名称、指标路径和目标地址,使Prometheus能定期抓取数据。为保障安全,可通过Spring Security对/actuator/**路径进行认证授权,例如配置HTTP Basic认证,并在Prometheus配置中提供对应用户名密码;同时可结合防火墙限制访问IP,增强安全性。此外,还可通过自定义Metrics实现更细粒度的业务监控,如使用Counter统计事件次数、Gauge测量瞬时值、Timer记录操作耗时。对于高效采集,建议合理设置scrape_interval和scrape_timeout,利用relabel_configs统一标签管理,并结合Kubernetes、Consul等服务发现机制实现动态目标识别,从而构建稳定高效的监控体系。
Spring Boot整合Prometheus监控,说白了,就是给你的应用装上一个“仪表盘”,让Prometheus这个“数据收集员”能随时来读走你应用的健康状况和性能指标。这事儿做起来并不复杂,核心就是几步:引入依赖,暴露接口,然后让Prometheus去抓取数据。在我看来,这是现代微服务架构里,一个几乎不可或缺的环节,没有好的监控,就等于在黑暗中摸索,出问题了都不知道为啥。

解决方案
要让你的Spring Boot应用能被Prometheus监控,你需要做以下几件事。

首先,在你的pom.xml
里添加Micrometer Prometheus注册表的依赖。Micrometer是Spring Boot用来抽象各种监控系统的库,Prometheus只是它支持的一种。
<dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <scope>runtime</scope> </dependency>
接着,在你的application.properties
或application.yml
中,你需要显式地开启Actuator的Prometheus端点。Spring Boot Actuator默认会暴露一些健康检查、信息等端点,但Prometheus的需要单独开启。

management.endpoints.web.exposure.include=health,info,prometheus
就这么简单配置完,启动你的Spring Boot应用,然后访问http://localhost:8080/actuator/prometheus
(如果你的应用端口是8080),你就能看到一大堆文本格式的metrics数据了。这些数据是Prometheus能直接理解和抓取的格式。
下一步,你需要在Prometheus的配置文件(通常是prometheus.yml
)中,添加一个抓取任务(scrape job),告诉Prometheus去哪里找你的应用metrics。
scrape_configs: - job_name: 'my-spring-boot-app' metrics_path: '/actuator/prometheus' static_configs: - targets: ['localhost:8080'] # 替换为你的Spring Boot应用地址和端口
配置好Prometheus后,重启Prometheus服务,它就会按照你设定的间隔去抓取Spring Boot应用的metrics数据了。这些数据就能在Prometheus的UI或者通过Grafana进行可视化展示。
如何确保Spring Boot应用Metrics数据安全暴露?
暴露应用的内部指标,听起来就有点让人紧张,对吧?毕竟这些数据可能包含一些敏感信息,或者至少是不希望被所有人随意访问的。在我看来,确保这些监控数据的安全暴露,和确保任何API接口的安全一样重要,甚至更甚。你肯定不希望你的系统运行状态被恶意利用。
一种直接且常用的方法是利用Spring Security对Actuator端点进行保护。你可以为/actuator/**
路径配置认证和授权。这意味着只有经过认证且拥有特定角色的用户或服务才能访问这些监控数据。比如,你可以要求Prometheus在抓取时提供一个API Key或者用户名密码。
在Spring Security的配置中,你可以这样设置:
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/actuator/health", "/actuator/info").permitAll() // 健康和信息可以公开 .antMatchers("/actuator/**").hasRole("ADMIN") // 其他Actuator端点需要ADMIN角色 .and() .httpBasic(); // 启用HTTP Basic认证,Prometheus可以配置这个 } @Bean @Override public UserDetailsService userDetailsService() { UserDetails user = User.withDefaultPasswordEncoder() .username("prometheus") .password("your_secret_password") // 生产环境请使用更安全的密码编码方式 .roles("ADMIN") .build(); return new InMemoryUserDetailsManager(user); } }
在Prometheus的prometheus.yml
中,你可以这样配置HTTP Basic认证:
scrape_configs: - job_name: 'my-spring-boot-app' metrics_path: '/actuator/prometheus' static_configs: - targets: ['localhost:8080'] basic_auth: username: prometheus password: your_secret_password
除了认证授权,你还可以通过网络层面的限制来增加安全性。比如,只允许特定的IP地址段(Prometheus服务器的IP)访问你的应用的Actuator端口。这通常通过防火墙规则或者云服务商的安全组来实现。这种方式虽然不直接在应用层面解决,但作为一道额外的防线,效果还是很不错的。有时候我会想,多一道防线总没错,尤其是在涉及到核心监控数据的时候。
自定义Spring Boot应用中的Prometheus Metrics有哪些常见场景?
虽然Spring Boot Actuator和Micrometer已经为我们提供了大量的开箱即用的指标,比如JVM内存使用、HTTP请求计数、数据库连接池状态等等,但很多时候,这些通用指标并不能满足我们对业务层面的洞察需求。在我看来,自定义Metrics才是真正能让监控体系发挥最大价值的地方。这就像你有了汽车的通用仪表盘,但你可能还需要一个专门显示“今天拉了多少货”或者“跑了多少趟”的个性化仪表。
常见的自定义Metrics场景包括:
业务流程计数器 (Counters): 统计某个特定业务事件发生的次数。比如,用户注册成功数、订单创建数、支付失败数。
import io.micrometer.core.instrument.Counter; import io.micrometer.core.instrument.MeterRegistry; import org.springframework.stereotype.Service; @Service public class UserService { private final Counter userRegistrationCounter; public UserService(MeterRegistry meterRegistry) { this.userRegistrationCounter = Counter.builder("app.user.registrations.total") .description("Total number of user registrations") .tag("status", "success") // 可以添加标签来细分数据 .register(meterRegistry); } public void registerUser(String username) { // ... 用户注册逻辑 userRegistrationCounter.increment(); // 每次成功注册就增加计数 System.out.println("User " + username + " registered."); } }
当前状态值 (Gauges): 测量某个瞬时值,比如当前在线用户数、队列中的消息数量、缓存中的元素数量。Gauge通常反映的是一个“点”上的值。
import io.micrometer.core.instrument.Gauge; import io.micrometer.core.instrument.MeterRegistry; import org.springframework.stereotype.Service; import java.util.concurrent.atomic.AtomicInteger; @Service public class OrderService { private final AtomicInteger pendingOrders = new AtomicInteger(0); public OrderService(MeterRegistry meterRegistry) { Gauge.builder("app.orders.pending", pendingOrders, AtomicInteger::get) .description("Current number of pending orders") .register(meterRegistry); } public void createOrder() { pendingOrders.incrementAndGet(); // ... 创建订单逻辑 // pendingOrders.decrementAndGet(); // 订单处理完成后减少 } }
操作耗时 (Timers): 测量某个操作的执行时间,比如API响应时间、数据库查询耗时、消息处理耗时。Timer会同时记录操作的次数、总耗时、最大耗时以及分布情况。
import io.micrometer.core.instrument.Timer; import io.micrometer.core.instrument.MeterRegistry; import org.springframework.stereotype.Service; @Service public class ProductService { private final Timer productSearchTimer; public ProductService(MeterRegistry meterRegistry) { this.productSearchTimer = Timer.builder("app.product.search.duration") .description("Time taken for product search operations") .register(meterRegistry); } public void searchProducts(String query) { productSearchTimer.record(() -> { // ... 实际的产品搜索逻辑 try { Thread.sleep(100 + (long) (Math.random() * 200)); // 模拟耗时 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }); System.out.println("Product search for '" + query + "' completed."); } }
通过这些自定义指标,你可以更精确地监控到业务的关键环节,及时发现并解决潜在问题。这不仅仅是技术层面的监控,更是对业务健康度的直接反映。
Prometheus服务器如何配置以高效采集Spring Boot应用Metrics?
配置Prometheus服务器来高效采集Spring Boot应用的Metrics,不仅仅是把scrape_configs
写对那么简单。这里面涉及到一些细节和考量,直接影响到你监控的实时性、准确性以及Prometheus自身的资源消耗。
首先,最基础的prometheus.yml
配置我已经提过了,但还有一些参数值得注意:
scrape_interval
: 这是Prometheus抓取目标数据的间隔时间。默认是15秒。对于大多数Spring Boot应用,这个默认值通常是足够的。但如果你的应用对实时性要求极高,或者某些指标变化非常快,你可能需要调低这个值,比如到5秒。但要注意,降低间隔会增加Prometheus的资源消耗和被监控应用的负载。scrape_timeout
: 这是Prometheus等待目标响应的超时时间。默认是10秒。如果你的Spring Boot应用响应慢,或者网络状况不佳,可能会导致抓取超时,从而丢失数据。适当调高这个值可以避免这个问题,但也要警惕,过高的超时时间可能掩盖应用本身性能问题。metrics_path
: 确保这个路径和Spring Boot应用中暴露的Actuator Prometheus端点路径完全一致。通常是/actuator/prometheus
。relabel_configs
: 这是一个非常强大的功能,允许你在抓取之前或之后,对标签(labels)进行重写、删除或添加。这对于规范化指标名称、添加环境信息、或者基于服务发现动态添加标签非常有用。比如,你可能想给所有来自特定环境(如生产环境)的指标都加上env="prod"
的标签。
scrape_configs: - job_name: 'my-spring-boot-app' metrics_path: '/actuator/prometheus' scrape_interval: 10s # 缩短抓取间隔 scrape_timeout: 5s # 确保响应快 static_configs: - targets: ['localhost:8080'] relabel_configs: - source_labels: [__address__] regex: 'localhost:8080' target_label: instance_name replacement: 'backend-service-01' # 赋予一个更友好的实例名 - source_labels: [] # 空的source_labels表示添加一个静态标签 target_label: environment replacement: 'development' # 添加环境标签
当你有多个Spring Boot应用实例,或者应用部署在动态变化的云环境中时,手动配置static_configs
就显得力不从心了。这时候,服务发现(Service Discovery)就变得至关重要。Prometheus支持多种服务发现机制,比如:
- Kubernetes Service Discovery: 如果你的应用部署在Kubernetes集群中,Prometheus可以直接通过K8s API发现服务。这是最推荐的方式之一,配置起来也相对简单。
- Consul/Eureka Service Discovery: 如果你使用Consul或Eureka作为服务注册中心,Prometheus也能集成它们来发现目标。
- File-based Service Discovery: 你可以维护一个包含目标列表的JSON或YAML文件,Prometheus会定期读取这个文件来更新抓取目标。这对于一些非云环境或者混合部署场景很有用。
通过合理配置scrape_interval
、scrape_timeout
,并利用relabel_configs
进行标签管理,结合服务发现机制,你可以构建一个既高效又健壮的Prometheus采集体系,确保你的Spring Boot应用数据能够被及时、准确地收集,为后续的告警和可视化提供坚实基础。这整个过程,说实话,挺考验你对系统架构的理解和对细节的把控。
以上就是《SpringBoot整合Prometheus监控指南》的详细内容,更多关于的资料请关注golang学习网公众号!

- 上一篇
- 特朗普拟推行政令,AI供电再升级

- 下一篇
- HTMLdisplay属性详解及8种取值说明
-
- 文章 · java教程 | 6分钟前 |
- SpringBoot安全头配置详解
- 122浏览 收藏
-
- 文章 · java教程 | 24分钟前 |
- Java模块化系统应用全解析
- 192浏览 收藏
-
- 文章 · java教程 | 57分钟前 |
- Java注解开发与自定义实现教程
- 105浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Redis缓存与Java集成实战教程
- 423浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- SpringBoot参数校验技巧全解析
- 177浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java深拷贝实现方式全解析
- 181浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- SpringBoot接口限流算法全解析
- 141浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java线程池类型及使用场景解析
- 140浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- Java实现Excel导入导出实用教程
- 467浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- JavaDatabaseMetaData用法详解
- 296浏览 收藏
-
- 文章 · java教程 | 1小时前 |
- JavaKafka接收图像数据:反序列化与处理方法
- 344浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 边界AI平台
- 探索AI边界平台,领先的智能AI对话、写作与画图生成工具。高效便捷,满足多样化需求。立即体验!
- 417次使用
-
- 免费AI认证证书
- 科大讯飞AI大学堂推出免费大模型工程师认证,助力您掌握AI技能,提升职场竞争力。体系化学习,实战项目,权威认证,助您成为企业级大模型应用人才。
- 424次使用
-
- 茅茅虫AIGC检测
- 茅茅虫AIGC检测,湖南茅茅虫科技有限公司倾力打造,运用NLP技术精准识别AI生成文本,提供论文、专著等学术文本的AIGC检测服务。支持多种格式,生成可视化报告,保障您的学术诚信和内容质量。
- 560次使用
-
- 赛林匹克平台(Challympics)
- 探索赛林匹克平台Challympics,一个聚焦人工智能、算力算法、量子计算等前沿技术的赛事聚合平台。连接产学研用,助力科技创新与产业升级。
- 662次使用
-
- 笔格AIPPT
- SEO 笔格AIPPT是135编辑器推出的AI智能PPT制作平台,依托DeepSeek大模型,实现智能大纲生成、一键PPT生成、AI文字优化、图像生成等功能。免费试用,提升PPT制作效率,适用于商务演示、教育培训等多种场景。
- 569次使用
-
- 提升Java功能开发效率的有力工具:微服务架构
- 2023-10-06 501浏览
-
- 掌握Java海康SDK二次开发的必备技巧
- 2023-10-01 501浏览
-
- 如何使用java实现桶排序算法
- 2023-10-03 501浏览
-
- Java开发实战经验:如何优化开发逻辑
- 2023-10-31 501浏览
-
- 如何使用Java中的Math.max()方法比较两个数的大小?
- 2023-11-18 501浏览