Spring Boot监控实战:Micrometer与JVM指标解读及Prometheus接入

Spring BootMicrometerJVM指标
于 2026-10-01 03:42:43 修改
·本内容遵循CC 4.0 BY-SA版权协议

最近在把一个老项目从 Spring Boot 2.3 升级到 2.7,又顺带整理监控体系时,发现团队里不少人对 Micrometer 和 JVM 指标的理解还停留在“能 ping 通、能看内存条”的水平。做后端时间久了就会明白,应用监控这件事,绝不是上线后装个 Agent 就完事。真正靠谱的监控,是从 JVM 内存、GC 行为、线程状态这些底层指标一路追到业务接口的调用量、错误率、响应耗时。这篇主要围绕 Spring Boot 应用监控里的两个核心角色——Micrometer 和 JVM 指标——讲清楚它们是怎么配合工作的、关键指标该怎么解读、以及实际接入 Prometheus 时我会怎么落配置。适合刚接触 Spring Boot Actuator 的开发者,也想给在集成监控但被各种指标名绕晕的同学一份“指路图”。

1. 为什么做应用监控:从“能跑”到“跑得稳”

1.1 监控到底解决什么问题

很多人以为监控就是出问题时看一眼日志。其实日志和指标是两个维度的东西。日志描述的是“某时刻发生了什么”,指标描述的是“系统整体处于什么状态”。Spring Boot 应用跑得好不好,不能用“进程还在”来定义。进程活着但线程池打满、接口超时、GC 停顿导致请求阻塞,这些靠日志很难提前发现。指标监控的意义,是把 JVM 内部状态和业务吞吐量量化,让你在故障发生前就看出趋势。比如 jvm.threads.live 持续上涨,说明线程没释放;jvm.gc.pause 秒级飙升,说明堆压力大。这些数字比一句“最近系统有点卡”要精确得多。

1.2 监控体系的分层

监控体系我习惯分成三层。最底下是基础设施监控,也就是 CPU、内存、磁盘、网络,这层用云监控或者 Prometheus + node_exporter 就能覆盖。中间层是 JVM 和应用框架监控,包括堆内存用量、GC 次数、线程数量、HTTP 连接池、数据库连接池等。最上层是业务指标,比如订单量、支付成功率、消息队列积压量。Spring Boot 应用监控同时覆盖中间层和上层:Actuator 提供端点,Micrometer 负责把 JVM 指标和自定义业务指标统一采集,再通过注册表推送到监控系统。这三层缺一不可,但很多团队只做了第一层,导致应用被流量打死时,CPU 和内存看着还正常,非常尴尬。

2. Micrometer:指标采集的门面与桥接层

2.1 Micrometer 是什么,为什么 Spring Boot 选它

Micrometer 是一个指标门面库,作用有点像日志界的 SLF4J。应用代码里只面向 Micrometer 的 API 写指标,不关心最终打到 Prometheus、InfluxDB、Graphite 还是 Datadog。Spring Boot 从 2.0 开始把 Micrometer 深度集成进 Actuator,默认的 JVM 指标、Tomcat 指标、数据源指标都是通过它暴露的。选它的理由很实在:一套 API,多端输出,避免你在业务代码里硬编码某个监控系统的客户端。而且 Spring Boot 自动配置帮我们做了大部分事,引入 spring-boot-starter-actuator 后,Micrometer 核心就自动进来了,大部分 JVM 指标是开箱即用的。

2.2 Meter 类型:Counter、Gauge、Timer、DistributionSummary

Micrometer 里有四种最常用的 Meter 类型,选错类型会导致指标含义混乱。

Counter 是单调递增计数器,适合统计累计值,比如请求总数、错误总数。它只增不减,哪怕重启也会从上次的存储值或从 0 重新开始计数。Gauge 表示瞬时值,适合线程数、内存用量、队列长度这种“当前多少”的指标。Timer 用来测量短耗时操作的次数和总耗时,既能统计请求次数又能算平均耗时、P95、P99。DistributionSummary 用来分析事件分布,适合记录响应体大小、订单金额这类可分布的值,和 Timer 的差别在于它只记录分布,不自动算时间。

我踩过的一个典型坑:有人用 Counter 存线程数,结果线程数下降时计数不会降,因为 Counter 不可减,导致监控图上线程数只涨不跌。线程数必须用 Gauge。所以初学 Micrometer,先弄清楚 Meter 类型,再写指标,比直接抄代码重要得多。

2.3 如何在 Spring Boot 中引入 Micrometer

如果只做 JVM 监控,引入 spring-boot-starter-actuator 就够了。要输出为 Prometheus 格式,再加一个 micrometer-registry-prometheus。Maven 的坐标大致是:

XML
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

然后配置暴露端点:

PROPERTIES
management.endpoints.web.exposure.include=health,info,metrics,prometheus
management.endpoints.web.exposure.exclude=env,beans

这里有个关键点:Spring Boot 2.x 默认只暴露 health 端点,其他端点需要手动指定 include。Spring Boot 3.x 也一样。很多新人以为引了包就能访问 /actuator/prometheus,实际上没配置直接 404。另外 exposer 配置里别把 prometheus 漏了,否则数据出不来。

3. JVM 指标解读:内存、GC、线程、类加载

3.1 JVM 内存模型快速回顾

JVM 内存不是一块,而是分区域管理。堆内存主要存对象实例和数组,里面又分新生代、老年代,新生代再分 Eden、Survivor From、Survivor To。非堆内存里,Metaspace 存类元数据,Code Cache 存 JIT 编译产物,还有线程栈、直接内存。这些区域在监控里的表现完全不同。比如 Metaspace 上涨通常和动态生成类有关,比如 CGLIB 代理、反射生成类;线程栈上涨和线程数相关,可能导致 native memory 耗尽。理解内存模型,才能在看到 jvm.memory.used.bytes 时知道是哪个区域在涨,而不是一味调大堆内存。

3.2 关键 JVM 指标与含义

在 /actuator/metrics 里,Spring Boot 自动注册了一组以 jvm. 开头的指标。我整理一份最常用的参考表:

指标 含义 常见异常信号
jvm.memory.used.bytes 已用内存,标签 area=heap/nonheap,id=区域名 接近最大值
jvm.memory.max.bytes 区域最大内存 与配置有关
jvm.memory.committed.bytes JVM 已向 OS 申请的内存 committed 过高说明扩容
jvm.gc.pause GC 停顿时间和次数 平均/最大耗时突增
jvm.gc.live.data.size GC 后老年代存活对象大小 持续上涨说明有内存泄漏
jvm.threads.live 活跃线程数 持续上涨形成“锯齿”
jvm.classes.loaded 加载类数量 异常上涨考虑类加载泄漏

实际用 Prometheus 查询时,特别关注这两条:jvm_gc_pause_seconds_sum 和 jvm_gc_pause_seconds_count。注意 Micrometer 输出到 Prometheus 后,时间单位会转换为秒,所以指标名和原始字节数不同。别拿着文档里的 jvm.gc.pause 去 Prometheus 搜,搜不到很正常的,Prometheus 底下会变成 jvm_gc_pause_seconds_sum。

3.3 如何通过 Actuator 查看 JVM 指标

不用任何可视化工具,直接访问 /actuator/metrics 就能看到当前应用有哪些指标。想看某个指标的具体维度,比如 jvm.memory.used.bytes,可以访问:

TEXT
/actuator/metrics/jvm.memory.used.bytes

返回 JSON 会带 availableTags,里面有 area、id、name。想过滤某个区域,还可以继续加 tag:

TEXT
/actuator/metrics/jvm.memory.used.bytes?tag=area:heap

这一步排查时特别有用。比如怀疑堆内存泄漏,只过滤 heap 区域看数据;怀疑元空间问题,过滤 nonheap。直接看完整 JSON 会被几十个序列刷屏。

4. 把指标接出去:Registry 与 Prometheus 示例

4.1 为什么需要一个注册表(Registry)

老手看代码会发现,Micrometer 的 API 都挂在 MeterRegistry 上。Registry 是 Meter 的容器与生命周期管理器。它负责创建、缓存、聚合 Meter,并定期把数据上报到后端。Spring Boot 默认会注入一个复合注册表,把多个后端注册表集合在一起。你写代码时只要注入 MeterRegistry,不用关心当前后端是 Prometheus 还是 InfluxDB。这也是门面模式的精髓。理解这一点,就不会在自定义指标时去手动 new Counter,而是优先从注册表里拿 Meter。

4.2 以 Prometheus 为例配置指标暴露

接 Prometheus 时,除了加 micrometer-registry-prometheus 依赖,还要在最外层配置 management.endpoints.web.exposure.include 时带上 prometheus。然后 Prometheus 的配置里抓取路径写:

YAML
scrape_configs:
- job_name: 'spring-boot-app'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['localhost:8080']

这里要注意,/actuator/prometheus 输出的不是 JSON,而是 Prometheus 文本格式,Prometheus 原封不动抓走即可。接着用 PromQL 查 jvm_memory_used_bytes{area="heap"},能看到堆内存趋势。如果希望请求路径包含应用名,可以通过 management.metrics.tags.application 加公共标签:

PROPERTIES
management.metrics.tags.application=${spring.application.name}

这样每行指标都会带 application="xxx",多应用接入时好区分。

4.3 对接 Grafana 看板的基本思路

数据进了 Prometheus,后面接 Grafana 就是画图问题。我在实践中通常建三个面板:JVM 总览、GC 面板、线程与类加载。JVM 总览放堆、非堆、Metaspace 用量,计算堆使用率可以用:

PROMQL
jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"}

GC 面板放 jvm_gc_pause_seconds_sum 的增量,可以用 rate(jvm_gc_pause_seconds_sum[5m]) 看每秒 GC 停顿时间。如果结果有接近 1 秒甚至几秒的尖峰,说明应用出现了长时间停顿,要关注 GC 参数或堆大小。线程面板用 jvm_threads_live_threads 和 jvm_threads_daemon_threads,两者差距过大会有底层线程泄漏的风险。

5. 实战:构建一个带监控的最小 Spring Boot 项目

5.1 项目依赖与配置

我一般用 Spring Initializr 生成项目,只勾选 Spring Web、Actuator、Prometheus 三个依赖。版本用当前稳定版,比如 Spring Boot 3.2.x,Java 17。生成后再手动加一个 Prometheus 依赖的坐标,其实 Initializr 里“Observability”分类下也有 Micrometer Prometheus。配置 application.yml:

YAML
management:
endpoints:
web:
exposure:
include: health,metrics,prometheus
metrics:
tags:
application: demo-app

启动后先访问 /actuator/health 确认启动正常,再访问 /actuator/prometheus,看到一个长文本输出,name 以 jvm_ 开头,说明 JVM 指标已经出来了。到这步,项目本身的 JVM 指标监控就通了,全程没写一行业务代码。

5.2 自定义业务指标:计数器和响应时间

监控不能只靠 JVM 自带指标,业务指标才是连接“用户体验”和“系统状态”的桥梁。我第一次做自定义指标时写了一个订单服务,统计查询接口调用次数和耗时。代码大致这样:

JAVA
@RestController
public class OrderController {
private final Counter orderQueryCounter;
private final Timer orderQueryTimer;
 
public OrderController(MeterRegistry registry) {
this.orderQueryCounter = Counter.builder("order.query.count")
.description("订单查询次数")
.register(registry);
this.orderQueryTimer = Timer.builder("order.query.duration")
.publishPercentileHistogram()
.register(registry);
}
 
@GetMapping("/order/{id}")
public Order queryOrder(@PathVariable Long id) {
orderQueryCounter.increment();
return orderQueryTimer.record(() -> doQuery(id));
}
}

用 Counter.builder 和 Timer.builder 创建指标,注册进 MeterRegistry,再在请求路径里调用。这里我建议不要在业务代码里每秒都 new 指标,而是在构造器里一次性注册好,避免重复注册导致指标覆盖或报错。

5.3 验证指标端点与 Prometheus 抓取

刷新几次 /order/123 接口后,访问 /actuator/prometheus,搜索 order_query_count,会看到类似:

TEXT
order_query_count_total{application="demo-app",} 5.0

Prometheus 抓取时自动加了 _total 后缀,查询要用 order_query_count_total。Timer 的耗时指标会输出 order_query_duration_seconds_sum、order_query_duration_seconds_count,还有基于百分位直方图的 bucket。用 Grafana 画响应时间,我习惯直接画:

PROMQL
rate(order_query_duration_seconds_sum[5m]) / rate(order_query_duration_seconds_count[5m])

这个就是近 5 分钟的平均响应时间。注意 rate 一定要加,否则累计值会只涨不降,看不出削峰趋势。

6. 常见问题与排障实录

6.1 actuator 端点不显示 metrics

最常遇到的问题:访问 /actuator/metrics 返回 404。原因几乎都是没配置 exposure.include。Spring Boot 默认只暴露 health,必须显式把 metrics、prometheus 加进去。还有个情况是 Spring Security 拦截了 /actuator/**,此时要么放行,要么给监控端点加权限。我做多项目接入时会把 /actuator/prometheus 放行给内网 Prometheus 抓取,其他端点仍做权限保护,别把 beans、env 这类敏感端点点通到外网。

6.2 指标不生效 / 注解无效

有人喜欢用 @Timed 给接口加监控,省得手写 Timer。这个注解不是自动生效的,需要注册 TimedAspect。方法是在配置类里加一个 Bean:

JAVA
@Bean
public TimedAspect timedAspect(MeterRegistry registry) {
return new TimedAspect(registry);
}

没有这个 Bean,注解只会静默忽略,接口跑很多次也看不到指标。这个是 Micrometer 使用里最容易踩的坑。我更推荐手写 MeterRegistry 代码,逻辑更直白,也方便加 tag 区分维度。

6.3 指标过多导致存储成本高

指标标签用多了会产生基数爆炸。典型错误是给业务指标加用户 ID、订单 ID 这种高基数的 tag,每次请求都生成一个新序列,Prometheus 存储和查询都会变慢。我一般只加应用名、接口名、状态码、区域这类枚举值可控的标签。如果确实需要按用户维度分析,建议用日志或者单独的表,不要全塞进监控系统。

6.4 时区与命名规范问题

Grafana 面板时间默认用浏览器时区,而 Prometheus 存的是 UTC。查数据时感觉“少了 8 小时”,其实不是数据丢了,是时区显示问题。调整 Grafana 面板的 timezone 即可。命名规范方面,Micrometer 建议用点号分隔,Prometheus 会自动把命名转成下划线,原有点号变成下划线,查找指标时心里要有数。比如 jvm.gc.live.data.size 到了 Prometheus 会变成 jvm_gc_live_data_size_bytes,不带 bytes 不会想到它是字节单位。

6.5 可视化看板指标对不上的排查方法

看板里某个指标查不到,先确认 /actuator/prometheus 里有没有这个指标名,确认后检查 Prometheus target 状态是否 UP。接着看指标里是否带了过滤条件能匹配上的标签。我用 Grafana 变量做下拉筛选时,常因为变量值名称和实际标签值不一致导致图表空白。一个更快的排查技巧:在 Prometheus 的查询框里输入指标名,点“Execute”,然后看返回的标签列表,再回到 Grafana 的查询里对齐标签名,基本能解决九成问题。

最后说点实操体会

这几套组合拳打下来,我最大的感受是:Spring Boot 应用监控的核心不在配置多花哨,而在于把 JVM 状态和业务指标放在同一张时间轴上看。JVM 内存涨得快,就去看 GC 面板和代码分配;GC 停顿多了,再结合线程面板看是否有锁竞争或者频繁创建大对象。Micrometer 的好处是它能把 JVM 指标和业务指标统一成同一套 API,你不需要为了看一个线程数去写 JVM 工具脚本,也不用为了业务指标单独搭一套上传链路。我个人习惯是把 /actuator/prometheus 作为标准出口,先埋好 JVM 指标,再逐步把核心接口的调用量、耗时和错误数补上,等数据攒够了,再回过头优化阈值和告警规则,这时候监控才是真正能落地的东西。

基于Grafana与Prometheus实现K8s集群中Java应用的JVM深度监控
本文详述基于Prometheus与Grafana实现Kubernetes集群内Java应用的JVM深度监控方案,涵盖Spring Boot Actuator/Micrometer指标暴露、K8s Service/Pod标签策略、Prometheus两种抓取配置(ConfigMap与Operator)、Grafana JVM面板定制、JVM内存/GC/线程等核心指标解读、告警规则设计及高基数陷阱等典型问题规避。强调从黑盒到白盒的可观测性落地。
键盘侠预备役979
814
Prometheus 监控 Spring Boot 实战宝典:Micrometer 打通应用层可观测性的最后一公里
本文详解如何通过 Micrometer 将 Spring Boot 应用指标接入 Prometheus,涵盖依赖集成、/actuator/prometheus 端点配置、核心 JVM/HTTP/业务指标采集、自定义 Counter/Gauge/Timer、Grafana 仪表盘推荐(ID 10254/4701/12900)、Prometheus 抓取与告警规则配置,以及 Kubernetes 环境发现、安全防护和高基数标签规避等最佳实践。
深山技术宅
605
企业级Spring Boot 3.x监控体系搭建:Prometheus + Grafana + Micrometer完整落地方案
本文详细介绍了如何在企业级环境中搭建基于Prometheus、Grafana和Micrometer的监控体系。涵盖了Spring Boot 3.x内置监控的支持、Micrometer度量模型解析、自定义指标注册、Prometheus集成配置及Grafana可视化展示等内容,并提供了安全暴露端点、告警规则设计等实用建议。
DeepNest
628
性能监控体系搭建:从Prometheus部署到Spring Boot指标采集实战
本文系统讲解基于Prometheus与Spring Boot构建端到端性能监控体系的全过程,涵盖核心指标分类(资源、应用、业务)、Prometheus服务端及Exporter部署、Spring Boot Actuator集成与自定义指标暴露、Grafana可视化与Alertmanager告警配置,并结合JVM调优、数据库优化等典型场景分析性能瓶颈识别与优化方法,强调生产环境高可用、安全控制与数据生命周期管理。
weixin_33946605
554
Spring Boot Actuator + Prometheus:从指标采集到自定义埋点的完整监控链路
本文系统讲解Spring Boot Actuator与Prometheus集成的完整监控链路,涵盖指标分层设计、Actuator端点安全配置、/actuator/prometheus核心指标解读(JVM/Tomcat/HTTP)、Prometheus抓取与告警规则配置、Micrometer自定义业务指标(Timer/Gauge)、Pushgateway短任务监控方案,以及高基数、时区、版本兼容性等典型踩坑问题。强调指标即代码、根因告警优先、分层采集等工程实践原则。
阿丁的猫
280
SpringBoot监控体系深度解读:Actuator与Prometheus可视化
本文深入探讨Spring Boot应用的监控与管理,介绍了Spring Boot Actuator和Prometheus这两个强大工具。Actuator可提供应用运行时信息,Prometheus能收集和存储指标数据。文中还阐述了二者的集成方法,以及如何用Grafana实现数据可视化,同时介绍了自定义监控指标的方式。
fanxbl957
1257
K8s Prometheus,针对Java的完美监控方案
本文围绕Kubernetes环境下Java应用的JVM监控展开,重点介绍通过Micrometer和JMX Exporter将JVM指标(如堆内存、GC耗时、线程数)暴露给Prometheus,并结合ServiceMonitor自动采集与Grafana可视化展示的完整方案。涵盖Spring Boot接入步骤、关键监控图解读、告警规则配置及老项目无侵入改造方法,解决K8s中Java应用监控盲区问题。
小马不敲代码
581
Docker - 容器化部署的监控体系搭建,Prometheus+Grafana
本文详解基于Docker的容器化监控体系搭建,聚焦Prometheus指标采集与存储、Grafana可视化及Alertmanager告警闭环。涵盖Spring Boot应用埋点(Micrometer/Actuator)、cAdvisor与Node Exporter容器/主机指标采集、Docker Compose编排、服务发现配置、PromQL多维查询、JVM内存诊断、自动化仪表盘Provisioning及生产级告警配置,所有组件均容器化部署,无需Kubernetes依赖。
知远漫谈
4344
Spring Boot Admin:微服务监控与管理的实战指南
本文系统讲解Spring Boot Admin在微服务监控中的核心应用,涵盖其基于Actuator的架构原理、Server/Client搭建流程、安全加固、高可用部署、与Prometheus+Grafana集成、告警通知及自定义健康检查等生产级实践要点,强调其作为Spring Boot应用统一可观测性管理平台的关键作用。
weixin_33892359
411
Spring Boot Actuator 生产环境监控与安全加固实战
本文深入解析 Spring Boot Actuator 在生产环境中的核心应用:健康检查机制(HealthIndicator 聚合逻辑、自定义实现与探活配置)、指标监控体系(基于 Micrometer 对接 Prometheus、内置指标解读及业务指标埋点)、端点安全加固(三层防线:网络隔离、Spring Security 认证鉴权、最小化暴露策略)以及独立管理端口等实战方案,强调默认安全设计原则与常见安全误区。
哗啦啦的小流弊
254
Spring Boot 生产级监控实战:Actuator + Prometheus + Grafana 三件套详解
本文详解Spring Boot生产级监控方案:Actuator暴露应用指标,Prometheus拉取存储时序数据,Grafana可视化展示。涵盖端点安全配置、PromQL核心函数(rate/irate/histogram_quantile)、JVM与线程池关键指标解读、多实例服务发现、黄金信号(QPS/错误率/P99延迟)面板构建、自定义业务指标埋点、告警规则设计与Alertmanager治理,以及高基数、内存暴涨、Target DOWN等典型问题排查。
张瑞15129378030
189
Spring Boot + Vue 3 构建实时监控看板:线上技术演示实战指南
本文详解如何使用Spring Boot 2.7.x与Vue 3构建轻量级实时系统性能监控看板,涵盖Micrometer指标采集、Actuator集成、WebSocket实时推送及ECharts可视化实现。重点包括环境预演、15分钟结构化演示脚本、线上故障排查清单,以及版本锁定、流程剧本化等工程化演示最佳实践。
weixin_30873847
686
Spring Boot Actuator生产实战:健康检查、监控与排障指南
本文系统讲解Spring Boot Actuator在生产环境中的核心应用:健康检查(含自定义指示器、分组配置与K8s探针最佳实践)、基于Micrometer的指标监控(JVM、线程、连接池、HTTP等关键指标解读及Prometheus对接)、内部状态端点(beans、env、threaddump等排障用法),并强调安全配置(管理端口隔离、端点暴露控制、认证保护)与典型故障排查案例。
投研帮
201
Spring Boot Admin实战:从零搭建微服务监控体系与生产级配置指南
本文系统讲解Spring Boot Admin在微服务监控中的落地实践,涵盖服务端与客户端架构、与Spring Boot Actuator的深度集成、安全加固(Spring Security/HTTPS)、服务发现(Nacos/Eureka)集成、告警通知(邮件/钉钉/Webhook)、自定义健康检查与指标扩展,以及生产级部署、高可用配置和性能调优策略,聚焦于构建稳定、安全、可扩展的集中式监控体系。
CGGAO
416
从零搭建Prometheus+Grafana性能监控平台:原理、部署与实战指南
本文系统讲解如何从零构建基于Prometheus与Grafana的性能监控平台,涵盖核心原理(拉取模型、多维时序数据、PromQL)、组件部署(Prometheus Server、Node Exporter、Grafana)、集成配置(数据源对接、Linux主机仪表盘导入)、关键指标解读(CPU、内存、磁盘I/O、网络、负载)及进阶能力(告警规则、Alertmanager集成、应用层自定义指标监控)。内容聚焦信息技术领域监控实践,强调实时性、可定制性与生产可用性。
weixin_33694172
669
Spring Boot Actuator监控机制与微服务实践
本文深入解析Spring Boot Actuator的监控体系,涵盖健康检查、度量指标(Micrometer集成)、端点安全配置、自定义端点开发及云原生集成(Kubernetes探针、Prometheus)。重点剖析核心源码结构、内置与自定义HealthIndicator实现、性能优化技巧及生产排错方法,适用于微服务架构下的可观测性建设。
香香甜甜圈
280
老王,快给你的 Spring Boot 做个埋点监控吧!
本文详细解读了Java应用度量框架Micrometer中的Counter、Timer、Gauge等核心度量类型,介绍了如何命名和使用Tag进行多维度统计,并结合Spring Boot、Prometheus和Grafana实战集成,帮助开发者避免滥用Counter功能,提升监控数据质量。
Java基基
161
Spring Boot Actuator实战:健康检查、指标监控与端点安全
本文深入解析Spring Boot Actuator在生产环境中的核心应用:健康检查(含自定义HealthIndicator)、指标监控(Metrics分层结构、JVM指标解读、Micrometer与Prometheus对接)以及端点安全防护(Spring Security集成、独立管理端口、细粒度访问控制)。强调端点最小化暴露、敏感信息防护、指标维度设计与告警阈值设定等关键实践,覆盖从接入配置到根因分析的完整监控链路。
张云雷宝宝
135
Spring Boot Admin实战:5分钟搭建微服务统一监控中心
本文详解Spring Boot Admin(SBA)在微服务监控中的落地实践,涵盖Server与Client架构原理、5分钟快速搭建、Actuator端点配置、生产级加固(安全认证、JDBC持久化、高可用集群)、动态日志管理、线程/堆转储分析、环境配置查看及告警集成。强调SBA作为Spring Boot生态可视化聚合器的核心价值,依托Actuator实现轻量级、解耦式统一监控,是构建可观测性体系的关键起点。
weixin_33716941
309
GettingRestartedWithJava-2021:在业界工作多年后,重新开始面试准备。 2021版
Java作为一门历经二十余载依然屹立不倒的工业级编程语言,其生态之庞大、应用之广泛、面试考察之深入,使其成为资深开发者重返技术求职赛道时不可回避的核心战场。《Getting RestartedWithJava-2021:在业界工作多年后,重新开始面试准备。2021版》这一标题绝非泛泛而谈的入门指南,而是面向拥有多年企业级开发经验(如3–10年+)、曾深度参与系统设计与交付、但可能因长期专注业务迭代、技术栈固化(如仅用Spring MVC+MyBatis维护老旧单体)、或转向管理/架构岗而疏于底层原理与算法训练的中高级工程师所定制的“认知重启计划”。它直指一个现实痛点:经验丰富的Java工程师在面对2021年一线互联网大厂(如阿里、字节、腾讯、美团)及头部外企(如Amazon、LinkedIn、Netflix)的校招/社招联合评估体系时,常遭遇“高阶能力被低估、基础漏洞被放大、新兴范式不熟悉”的三重断层——即所谓“会写代码,但不会解题;能搭系统,但讲不清JVM;熟用Spring,却答不出Bean生命周期本质;做过分布式项目,却无法在45分钟内完成可扩展的短链系统设计”。该资料以“2021版”为标识,意味着其内容严格对标当年技术演进水位:JVM层面覆盖JDK 11–15的新特性(如ZGC低延迟垃圾收集器原理、JEP 330单文件源代码执行、Records不可变数据类与Pattern Matching预览特性对函数式编程的影响);多线程模块不再停留于synchronized与ReentrantLock的表层对比,而是深入剖析VarHandle内存语义、ForkJoinPool工作窃取机制与CompletableFuture异步编排的线程上下文传递陷阱;数据结构与算法部分摒弃“背题思维”,强调在LeetCode高频真题(如23. Merge k Sorted Lists需结合最小堆与链表归并思想、42. Trapping Rain Water引入单调栈与双指针的空间换时间策略)中还原真实工程建模过程——例如将缓存淘汰策略映射为LRU缓存实现,将消息队列积压处理转化为优先队列调度问题。尤为关键的是,它将“系统设计”从抽象概念落地为可演练的方法论:以电商秒杀系统为例,贯穿分层拆解(接入层限流→服务层库存扣减幂等→存储层分库分表+热点Key穿透防护)、技术选型依据(Redis Cluster vs Codis一致性哈希权衡、Seata AT模式与TCC模式在事务隔离性与开发成本间的取舍)、以及可观测性嵌入(通过Micrometer+Prometheus监控QPS突增时线程池拒绝率飙升的根本原因)。在框架层面,“Spring”标签远超@Autowired注入与@Transaction注解的使用记忆,直击Spring Framework 5.x响应式编程模型(WebFlux+Reactor)与传统Servlet容器的本质冲突,解析Spring Boot 2.4+配置加载机制变更(如application.properties优先级重构对多环境部署的影响),并结合Spring Cloud Alibaba 2021.1版本剖析Nacos服务发现心跳机制优化与Sentinel热点参数限流的滑动时间窗实现细节。设计模式的教学则彻底脱离GoF教科书式案例,转而分析MyBatis中MapperProxy动态代理如何融合代理模式与责任链模式、Spring AOP中AnnotationAwareAspectJAutoProxyCreator如何运用工厂模式+模板方法构建可扩展的切面注册流程。而“JVM”作为Java工程师的分水岭能力,资料中必然包含MAT内存快照实战(识别ThreadLocal引发的内存泄漏链)、JIT编译日志(-XX:+PrintCompilation)解读(观察C1/C2编译阈值触发条件)、以及G1垃圾收集器Region划分与Remembered Set更新开销的量化分析——这些内容共同构成判断候选人是否具备生产环境问题根因定位能力的黄金标尺。值得注意的是,该资料虽名为“入门”,实为一场高强度的“认知升维训练”:它要求学习者主动打破多年形成的“API调用思维”,重建“机制理解思维”(如理解HashMap扩容时为何采用2次幂位运算而非取模)、“权衡决策思维”(如选择ConcurrentHashMap而非Collections.synchronizedMap不仅因性能,更因后者全局锁导致的吞吐量瓶颈与死锁风险)、以及“系统关联思维”(如将JMM内存模型中的happens-before规则与Spring事务传播行为、RocketMQ消息顺序性保障、Kafka消费者组Rebalance过程中的可见性问题进行跨栈映射)。所有知识点均以“可验证、可调试、可压测”为设计原则——每一个JVM参数调整都附带jstat/jstack输出对比,每一段多线程代码都提供JMH基准测试报告,每一个系统设计方案都预留了压力测试指标(如秒杀场景下目标P99延迟<200ms,错误率<0.01%)。这种将理论深度、工程精度与面试实效性熔铸一体的内容架构,正是资深开发者穿越技术代际鸿沟、在2021年激烈竞争中重获核心竞争力的关键支点。
Yuan Andy
Springboot添加jvm监控实现数据可视化
### 利用Springboot实现jvm监控为了实现对Springboot应用程序的jvm监控,首先要做的就是集成Spring-boot-actuator模块。
weixin_38523618
2212
prometheus-spring-boot-starter:用于启用Prometheus执行器端点的Spring Boot Starter
Prometheus-Spring-Boot-Starter 是一个高度集成、轻量级且开箱即用的 Spring Boot 自动配置模块,其核心目标是为基于 Spring Boot 构建的微服务或单体应用快速启用符合 Prometheus 数据采集规范的指标暴露端点(/prometheus),从而无缝对接 Prometheus 监控生态体系。该 Starter 并非官方 Spring Boot 或 Prometheus 项目出品,而是由社区开发者 Moelholm 维护的第三方增强型依赖,它巧妙地绕过了 Spring Boot 2.0+ 原生 Actuator 中 /actuator/prometheus 端点需手动配置 Micrometer + PrometheusRegistry 的复杂流程,通过极简依赖即可自动注册并暴露标准 Prometheus 文本格式(text/plain; version=0.0.4)的指标数据,极大降低了 JVM 应用接入可观测性基础设施的技术门槛。从技术实现角度看,该 Starter 本质上是对 Spring Boot Actuator 框架的一次深度定制化扩展。它在 Spring Boot 启动阶段通过 @EnableAutoConfiguration 触发自动装配逻辑,注册一个名为 PrometheusEndpoint 的自定义 Actuator Endpoint 类型,并将其映射至 /prometheus 路径;该端点内部不直接采集指标,而是桥接 Micrometer 的 MeterRegistry(默认为 SimpleMeterRegistry 或与之兼容的 CompositeMeterRegistry),并将所有已注册的 Meter(包括 Gauge、Counter、Timer、DistributionSummary 等)按 Prometheus 数据模型进行语义转换:例如将 Spring Boot 内置的 JVM MemoryUsage Gauge 映射为 # HELP jvm_memory_used_bytes Used memory in bytes;# TYPE jvm_memory_used_bytes gauge;jvm_memory_used_bytes{area="heap",id="PS Eden Space"} 1.23456789E8,严格遵循 Prometheus 的 HELP 注释、TYPE 声明、指标名称、标签键值对(label pairs)、浮点数值及换行分隔格式。尤为关键的是,它确保了所有指标名称符合 Prometheus 命名规范(小写字母、下划线分隔、无空格与特殊字符),标签维度完整保留(如 memory area、thread state、http method 等),且时间序列数据具备单调递增性(Counter 类型)或瞬时快照性(Gauge 类型),完全满足 Prometheus Server 的 scrape 协议解析要求。该 Starter 所依赖的底层基石是 Micrometer —— 当前 Spring Boot 2.x 及以上版本事实上的指标抽象层。Micrometer 提供了面向不同监控后端(Prometheus、Graphite、Datadog、InfluxDB 等)统一的 Meter 接口与注册中心抽象,而 prometheus-spring-boot-starter 则专精于将 Micrometer 的通用指标实例“翻译”成 Prometheus 可消费的文本协议。它隐式引入了 micrometer-registry-prometheus 依赖,并在容器启动时自动构建 PrometheusMeterRegistry 实例,同时将 Spring Boot Actuator 默认启用的 JVM、内存、线程、类加载、HTTP 请求计数器(如 http.server.requests)等内置指标全部绑定至该 Registry。开发者无需编写任何 @Bean 定义或配置类,仅需添加 Maven/Gradle 依赖,即可获得完整的 JVM 运行时健康画像:包括但不限于堆内存使用量(heap_used)、非堆内存使用量(non_heap_used)、GC 次数与耗时(jvm_gc_pause_seconds_count)、线程活跃数(jvm_threads_live_threads)、HTTP 接口响应延迟分布(http_server_requests_seconds_bucket)、异常发生率(jvm_threads_states_threads)等数十项高价值监控信号。此外,该 Starter 具备良好的可扩展性与可定制性。开发者可通过 application.yml 配置项(如 management.endpoint.prometheus.show-details、management.endpoints.web.exposure.include=prometheus)精细控制端点可见性、认证权限与敏感信息暴露策略;亦可自行注册自定义 Gauge,例如监控数据库连接池活跃连接数:Gauge.builder("datasource.hikari.active.connections", hikariDataSource, ds -> ds.getHikariPoolMXBean().getActiveConnections()),该指标将自动出现在 /prometheus 输出中;还可结合 @Timed、@Counted 等 Micrometer 注解对业务方法进行埋点,实现全链路性能指标覆盖。值得注意的是,由于其设计初衷是简化而非替代原生方案,因此与 Spring Boot 2.4+ 引入的 management.endpoints.web.base-path、server.servlet.context-path 等上下文路径配置完全兼容,支持反向代理(Nginx/Apache)下的路径重写与 Basic Auth 鉴权集成,亦可配合 Prometheus 的 service discovery 机制(如 Consul、Kubernetes SD)实现动态目标发现,真正构建起企业级云原生监控闭环。综上所述,prometheus-spring-boot-starter 不仅是一个工具库,更是贯通 Spring 生态与 CNCF 监控标准的关键适配器,是现代 Java 应用实现 SRE 实践、落实黄金指标(延迟、流量、错误、饱和度)观测能力不可或缺的基础设施组件。
可爱的小树懒
Spring Boot 应用怎么用 Micrometer 监控 JVM 指标并对接 Prometheus?
weixin_45367792
监控 ---- Spring Boot + JVM + Druid + Prometheus + Grafana完整的Spring Boot 项目怎么创建的
本文详细介绍了如何创建一个包含JVM监控、Druid数据库连接池、Prometheus和Grafana的Spring Boot项目。从创建项目、添加依赖、配置数据源和监控,到运行和验证监控系统的步骤都有涉及。
开山
如果无数据:确认应用集成了 JMX Exporter(添加依赖如 io.prometheus.jmx:jmx_prometheus_javaagent)或 Micrometer(添加 Spring Boot Actuator + Micrometer-Prometheus)。这是什么含义,怎么操作
本文详细介绍了如何确认应用是否集成了JMX Exporter或Micrometer,并提供了正确配置以供Prometheus查询jvm_memory_used_bytes指标的步骤。内容包括检查应用启动命令、依赖、配置文件,以及如何在Prometheus中验证配置成功。
喵呜Jun
Java性能计数:Micrometer与Prometheus的联合监控.pdf
资源摘要信息:"Java性能计数:Micrometer与Prometheus的联合监控.pdf"是一份面向中高级Java开发者、SRE(站点可靠性工程师)及云原生架构师的深度技术实践文档,系统性地阐述了在现代Java应用(尤其是基于Spring Boot的微服务架构)中构建高可用、可扩展、可观测的性能监控体系的核心方法论与工程落地路径。文档标题直指两大关键开源组件——Micrometer与Prometheus——的协同机制,其本质是构建一套标准化、解耦化、生产就绪的指标采集—传输—存储—查询—告警—可视化全链路可观测性基础设施。Micrometer作为JVM生态的事实标准“指标门面”(Metrics Facade),屏蔽了底层监控后端(如Prometheus、Graphite、Datadog、New Relic等)的差异,为Java应用提供统一的编程模型;而Prometheus则作为专为云原生环境设计的时序数据库与监控系统,凭借其拉取式(Pull-based)采集模型、多维数据模型、强大的PromQL查询语言、内置服务发现与轻量级部署特性,成为Kubernetes生态中监控事实标准。二者结合,实现了“应用层指标定义与业务语义解耦”与“监控基础设施专业化、可运维化”的完美平衡。文档开篇即从企业级运维视角切入,强调Java性能监控绝非仅限于GC日志或线程堆栈的被动排查,而是贯穿系统生命周期的关键能力:在稳定性层面,实时指标(如JVM内存使用率、线程池活跃线程数、HTTP请求延迟P95/P99、数据库连接池等待数)可提前预警OOM、线程阻塞、慢SQL等故障苗头;在用户体验维度,通过端到端追踪(结合Micrometer Tracing与OpenTelemetry)与业务指标(如订单创建成功率、支付转化率)关联分析,实现SLI/SLO量化管理;在资源优化方面,基于CPU/内存/IO指标的历史趋势建模,支撑弹性伸缩策略与容器资源请求(requests/limits)精准配置;在容量规划上,长期指标存储与同比环比分析可识别业务增长拐点,驱动基础设施扩容决策。文档第三、四章对Micrometer与Prometheus分别展开纵深剖析:Micrometer不仅支持Counter(计数器)、Gauge(瞬时值)、Timer(计时器)、DistributionSummary(分布摘要)四大核心指标类型,更通过Tag(标签)实现指标的多维切片(如`http.server.requests{method="POST",status="200",uri="/api/order"}`),且原生集成Spring Boot Actuator,仅需添加`micrometer-registry-prometheus`依赖并启用`/actuator/prometheus`端点,即可自动暴露符合Prometheus文本格式的指标;Prometheus Server则通过配置`scrape_configs`定期向该端点发起HTTP GET请求拉取指标,经TSDB持久化后,供PromQL实时聚合(如`rate(http_server_requests_seconds_count{application="order-service"}[5m])`计算每秒请求数)、下钻分析(`histogram_quantile(0.95, rate(http_server_requests_seconds_bucket{job="order-service"}[5m]))`计算95分位响应延迟)及告警规则触发(如`ALERT HighErrorRate IF rate(http_server_requests_seconds_count{status=~"5.."}[5m]) / rate(http_server_requests_seconds_count[5m]) > 0.05`)。此外,文档还隐含覆盖Exporter模式(如JMX Exporter用于传统Java应用)、Alertmanager的静默/抑制/路由策略、Grafana仪表盘定制、指标生命周期管理(采样率控制、Cardinality爆炸防护)、安全加固(Basic Auth、TLS、指标过滤)等生产级要点,构成一套从代码埋点、指标暴露、远程采集、时序存储、智能告警到交互可视化的完整Java可观测性技术栈知识图谱。
fanxbl957
Grafana-JVM-Dashboard模板
"Grafana-JVM-Dashboard模板是一个专为监控使用Micrometer进行度量的Java应用程序(如Spring Boot和Micronaut)设计的仪表板。它包含了丰富的图形和指标
雲等風來
1025
Prometheus监控java模板
本文介绍了如何通过Prometheus监控Java应用程序。首先,通过在Spring Boot应用中集成Micrometer来暴露指标数据给Prometheus。其次,调整Prometheus配置文件以正确抓取这些指标。最后,使用Grafana进行可视化展示,以提高监控效果。
弥鸿
vertx-micrometer-metrics:Micrometer.io的Vert.x指标实现
Vert.x 是一个基于事件驱动、非阻塞 I/O 的高性能 Java(及 Kotlin、Groovy 等 JVM 语言)异步应用框架,广泛用于构建高并发、低延迟的微服务与响应式后端系统。其核心设计理念强调轻量、模块化、无共享状态和天然支持分布式扩展,因此在云原生架构中占据重要地位。然而,随着 Vert.x 应用规模扩大、服务实例增多、调用链路复杂化,传统的日志排查方式已难以满足现代可观测性(Observability)需求——即对系统运行状态进行可理解、可推断、可预测的能力。此时,结构化、标准化、可聚合、可告警的指标(Metrics)采集与暴露机制成为关键基础设施能力。而 vertx-micrometer-metrics 正是为解决这一痛点而生的核心桥梁组件:它实现了 Vert.x 运行时与 Micrometer.io 生态之间的深度集成,使 Vert.x 应用原生具备工业级指标监控能力。Micrometer 是目前 JVM 生态事实上的指标抽象标准库,被誉为“JVM 的 Prometheus 客户端之上的统一门面”。它不直接采集或存储指标,而是提供一套统一的 MeterRegistry 接口与丰富的 Meter 类型(如 Counter、Gauge、Timer、DistributionSummary、LongTaskTimer 等),屏蔽底层监控后端(如 Prometheus、Datadog、New Relic、Graphite、InfluxDB、Wavefront、Elasticsearch 等)的差异。开发者只需面向 Micrometer 编程,即可通过配置切换后端,实现监控栈的灵活解耦与迁移。vertx-micrometer-metrics 项目正是将 Vert.x 内置的各类运行时指标(包括但不限于:Event Loop 线程池活跃/排队/执行耗时、HTTP Server/Client 请求计数与延迟分布、NetServer/Client 连接数与错误率、Verticle 部署/失败统计、消息总线(Event Bus)投递成功率与积压量、Context 切换频率、Worker Pool 使用率等)自动注册到 Micrometer 的全局 MeterRegistry 中,并支持按标签(Tag)维度进行多维打点(例如按 host、instance、path、method、status、scheme 等动态添加 Tag),从而为后续的多维下钻分析、服务健康画像、容量规划与 SLO 达成度评估奠定数据基础。该组件不仅覆盖 Vert.x Core 层指标,还深度适配 Vert.x Web 模块,可自动织入 HTTP 请求生命周期钩子,在请求进入、响应写出、异常抛出等关键节点自动记录 Timer(含 P50/P90/P95/P99 延迟分位数)、Counter(成功/失败/重定向次数)、Gauge(当前活跃请求数)等复合指标;同时支持与 Vert.x Service Proxy、Vert.x Kafka Client、Vert.x Redis Client 等常用扩展模块联动,实现业务协议层指标的自动埋点。更进一步,它兼容 Spring Boot Actuator 生态:当 Vert.x 应用以嵌入模式(如 Vert.x + Spring Boot WebFlux 混合部署)运行时,可通过 spring-boot-starter-actuator + micrometer-registry-prometheus 自动暴露 /actuator/prometheus 端点,无缝接入 Prometheus 抓取体系;亦可结合 Grafana 构建全链路性能看板,涵盖 JVM 内存/GC、线程池、Vert.x 事件循环吞吐、API 路由 SLI、依赖服务调用稳定性等数十项核心观测维度。在云原生可观测性演进背景下,vertx-micrometer-metrics 还积极拥抱 OpenTelemetry 标准——通过 Micrometer 1.10+ 版本提供的 OpenTelemetryMeterRegistry,可将 Vert.x 指标无缝桥接到 OTLP 协议,进而对接 Jaeger、Zipkin、Lightstep、Honeycomb 或阿里云 ARMS、腾讯云 TEM 等新一代可观测平台,实现 Metrics、Traces、Logs 三者的语义关联与上下文穿透。此外,其设计高度可扩展:开发者可通过自定义 MeterBinder 实现任意 Vert.x 组件(如自研 Protocol Handler、Custom EventBus Codec、Stateful Verticle 状态机)的指标注入;支持运行时动态启用/禁用指标采集以降低性能开销;提供细粒度的采样控制(如仅对 error 状态码路径开启高精度 Timer);并严格遵循 Semantic Conventions 规范,确保指标命名(如 http.server.request.duration)与单位(seconds)、标签键(http.method、http.status_code)与值格式完全符合 CNCF 可观测性工作组标准,极大提升跨团队、跨系统、跨厂商的数据互操作性与治理效率。综上,vertx-micrometer-metrics 不仅是一个技术插件,更是 Vert.x 微服务体系迈向生产就绪(Production-Ready)、SRE 实践落地与 AIOps 能力建设的关键基石。
邱笑晨