【Prometheus】一篇吃透|Docker部署Prometheus监控Java JVM完整实战(附全量代码+配置)

发布时间:2026/7/22 15:18:16
【Prometheus】一篇吃透|Docker部署Prometheus监控Java JVM完整实战(附全量代码+配置) CSDN 可选标题3组风格正文一篇吃透 DockerPrometheus 监控Java服务JVM全实战代码一、前言 微服务时代Java应用频繁出现OOM、GC卡顿、线程泄露、堆内存溢出等线上问题JVM监控是定位性能故障的核心抓手。Prometheus 搭配 Grafana 是当前云原生最主流的时序监控方案本文全程基于 Docker / Docker Compose 容器化部署覆盖SpringBoot 接入Micrometer暴露JVM指标Docker打包Java应用容器网络互通配置Prometheus容器抓取JVM指标完整yml配置Grafana可视化大盘导入常用JVM PromQLJVM内存/GC告警规则编写完整Mermaid架构流程图、可直接复制的源码配置整体架构流程图Mermaid可视化告警层监控采集层Java服务层暴露/actuator/prometheus JVM指标SpringBoot Java容器PrometheusJVM堆内存指标GC停顿/GC次数指标活跃线程/阻塞线程接口QPS、耗时存储时序指标数据告警规则引擎AlertGrafana可视化面板告警通知钉钉/邮件故障排查、性能优化流程简述Java应用内置Micrometer暴露标准化Prometheus指标 → Prometheus定时拉取采集存储 → Grafana可视化JVM大盘 → 内存过高/频繁GC自动触发告警。二、两种Java监控方案对比 方案1SpringBoot Micrometer推荐本文重点适用SpringBoot 2.x/3.x 微服务零额外agent原生集成开箱自动导出完整JVM指标堆、非堆、GC、线程、类加载、CPU方案2JMX Exporter JavaAgent适用老旧非SpringBoot Java项目Tomcat、普通Java Jar通过javaagent挂载采集JMX数据本文优先讲解Micrometer方案文末补充JMX Exporter容器适配方式。三、步骤1SpringBoot项目集成Prometheus暴露JVM指标 3.1 Maven pom.xml 引入依赖在父 pom.xml 的 中声明的依赖!-- SpringBoot监控端点核心 --!-- --!-- SpringBoot监控端点核心 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactIdversion${spring-boot.version}/version/dependency!-- Micrometer Prometheus注册表自动生成JVM指标 --dependencygroupIdio.micrometer/groupIdartifactIdmicrometer-registry-prometheus/artifactIdversion1.14.2/version/dependency!-- --在子模块 pom.xml 中应用!-- SpringBoot Actuator监控端点 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-actuator/artifactId/dependency!-- Micrometer Prometheus监控指标 --dependencygroupIdio.micrometer/groupIdartifactIdmicrometer-registry-prometheus/artifactId/dependency再在项目的拦截器放行路径不校验登录.........// Prometheus监控指标端点允许监控系统匿名访问// 用于Prometheus Server定期拉取应用的监控指标数据无需登录认证.requestMatchers(/actuator/**).permitAll()3.2 application.yml 监控配置完整可复制spring:application:name:java-jvm-demo# 应用唯一标识区分多服务监控指标# Actuator监控端点配置management:endpoints:web:exposure:# 开放健康检查、prometheus指标端点include:health,prometheus,info,metricsmetrics:export:prometheus:enabled:truetags:# 全局指标标签多实例、多环境区分env:devdistribution:percentiles-histogram:http.server.requests:true# 开启接口响应分位数统计95/99线endpoint:health:show-details:always# 展示完整健康详情配置完成后启动项目访问地址http://127.0.0.1:8080/actuator/prometheus页面会输出海量JVM原生指标核心指标示例jvm_memory_used_bytes堆/非堆内存占用jvm_gc_pause_secondsGC停顿耗时jvm_threads_live当前存活线程数jvm_classes_loaded_classes加载类数量3.3 自定义业务指标扩展实战代码除原生JVM指标可埋点业务计数器监控接口调用量importio.micrometer.core.instrument.Counter;importio.micrometer.core.instrument.MeterRegistry;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;importjavax.annotation.Resource;RestControllerpublicclassJvmDemoController{// 注入指标注册器ResourceprivateMeterRegistrymeterRegistry;privatefinalCounterapiVisitCounter;// 初始化业务计数器publicJvmDemoController(MeterRegistryregistry){this.apiVisitCounterregistry.counter(demo_api_visit_count,api,/hello);}GetMapping(/hello)publicStringhello(){apiVisitCounter.increment();// 每次访问计数器1returnJVM监控Demo服务运行正常;}}3.4 Java应用Dockerfile打包容器化部署# 基础JDK镜像 FROM openjdk:17-jdk-slim WORKDIR /app # 复制打包后的jar包 COPY target/jvm-monitor-demo-0.0.1-SNAPSHOT.jar app.jar # JVM启动参数优化监控日志 ENTRYPOINT [java,-jar,app.jar] # 暴露服务端口 EXPOSE 8080构建镜像命令dockerbuild-tjava-jvm-demo:1.0.# 启动Java容器映射8080端口dockerrun-d--namejava-app-p8080:8080 java-jvm-demo:1.0四、步骤2Docker Compose 部署PrometheusGrafana监控栈 4.1 目录结构monitor/ ├── docker-compose.yml # 编排文件 ├── prometheus/ │ └── prometheus.yml # Prometheus抓取配置核心 └── grafana-data/ # Grafana持久化数据自动生成4.2 prometheus/prometheus.yml 配置关键抓取Java容器JVM指标重点Docker容器互通Linux宿主机网关172.17.0.1Windows/Mac Docker Desktop使用host.docker.internalglobal:scrape_interval:10s# 每10秒采集一次指标evaluation_interval:10s# 告警规则检测间隔# JVM监控抓取任务scrape_configs:-job_name:jobName-java-jvm-monitormetrics_path:/actuator/prometheusstatic_configs:# 同一个docker网络就写服务名称不同compose就写内网ip-targets:[zgb-admin:7777]labels:service:labelsService-java-jvm-monitor4.3 docker-compose.yml 完整编排文件新的一个独立的配置version:3.8volumes:prom_data:# Prometheus时序数据持久化grafana_data:# Grafana面板配置持久化services:# Prometheus服务prometheus:image:prom/prometheus:latestcontainer_name:prometheusports:-9090:9090volumes:-./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml-prom_data:/prometheuscommand:---config.file/etc/prometheus/prometheus.yml---storage.tsdb.retention.time15d# 数据保存15天restart:unless-stopped# Grafana可视化面板grafana:image:grafana/grafana:latestcontainer_name:grafanaports:-4000:3000volumes:-grafana_data:/var/lib/grafanaenvironment:-GF_SECURITY_ADMIN_USERadmin-GF_SECURITY_ADMIN_PASSWORD123456depends_on:-prometheusrestart:unless-stopped如果已经有docker-compose 就加入配置version:3.8services:# MySQL 数据库 # mysql:# image: mysql:8.0# container_name: zgb-mysql# restart: always# environment:# MYSQL_ROOT_PASSWORD: zgb2026 # root 密码部署时请修改# MYSQL_DATABASE: zgb_sr # 自动创建的数据库# TZ: Asia/Shanghai# ports:# - 3306:3306# volumes:# - mysql-data:/var/lib/mysql # 数据持久化# - ./sql:/docker-entrypoint-initdb.d # 首次启动自动执行 sql 目录下的初始化脚本# command: --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_ci# networks:# - zgb-net# Redis 缓存 # redis:# image: redis:7-alpine# container_name: zgb-redis# restart: always# ports:# - 6379:6379# command: redis-server --requirepass zgb2026 # Redis 密码部署时请修改# volumes:# - redis-data:/data# networks:# - zgb-net# ZGB 应用服务 zgb-admin: image: crpi-2toxc20jd1dwczcw.cn-shenzhen.personal.cr.aliyuncs.com/zhuguanbo/zgb-admin:1.0.0 container_name: zgb-admin restart: always ports: -7777:7777# Spring Boot HTTP 端口-9999:9999# Netty GPS 数据接收端口environment: TZ: Asia/Shanghai JAVA_OPTS:-Xms512m -Xmx512m -Djava.security.egdfile:/dev/./urandom# 激活生产环境配置SPRING_PROFILES_ACTIVE: dev volumes: - app-logs:/app/logs# 日志持久化- app-upload:/app/uploadPath# 上传文件持久化networks: - zgb-net# Prometheus监控 prometheus: image: prom/prometheus:latest container_name: prometheus ports: -9090:9090volumes: - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - prom_data:/prometheus command: ---config.file/etc/prometheus/prometheus.yml---storage.tsdb.retention.time15drestart: unless-stopped networks: - zgb-net# Grafana可视化面板 grafana: image: grafana/grafana:latest container_name: grafana ports: -4000:3000volumes: - grafana_data:/var/lib/grafana environment: -GF_SECURITY_ADMIN_USERadmin -GF_SECURITY_ADMIN_PASSWORD123456depends_on: - prometheus restart: unless-stopped networks: - zgb-net volumes:# 原有业务持久卷mysql-data: redis-data: app-logs: app-upload:# 新增监控持久卷prom_data:# Prometheus时序数据持久化grafana_data:# Grafana面板配置持久化networks: zgb-net: driver: bridge4.4 一键启动监控栈# 进入monitor目录cdmonitor# 后台启动所有容器docker-composeup-d# 查看容器运行状态docker-composeps访问地址Prometheus控制台http://localhost:9090 → Status → Targets 查看Java服务是否UPGrafana面板http://localhost:4000 账号admin/123456五、步骤3Grafana配置JVM可视化大盘 Grafana添加数据源Configuration → Data sources → Add data source 选择Prometheus地址填写http://prometheus:9090容器互通域名保存测试连通。导入JVM标准大盘Grafana官方SpringBoot JVM模板ID4701直接Import即可自动生成完整监控视图包含堆/非堆内存实时曲线老年代/新生代GC频率、停顿时间线程总数、阻塞线程、死锁线程类加载数量、编译耗时HTTP接口QPS、99分位响应延迟如果4701不存在可以尝试19004SpringBoot3 专用最新12900通用 JVM Micrometer替代 470111946极简 JVM 大盘无依赖常用JVM核心PromQL查询语句直接复制到Grafana下次进来在哪里能查看到这样页面堆内存使用率(jvm_memory_used_bytes{areaheap} / jvm_memory_max_bytes{areaheap}) * 1005分钟GC平均次数rate(jvm_gc_pause_seconds_count[5m])活跃线程总数jvm_threads_live_threads接口99%响应耗时histogram_quantile(0.99, sum(rate(http_server_requests_seconds_bucket[1m])) by (le,uri))六、步骤4JVM高内存/频繁GC告警规则配置 ⚠️在prometheus.yml同级目录新建alert-rules.ymlgroups:-name:jvm-alert-rulesrules:# 规则1堆内存占用超过80%持续5分钟告警-alert:JvmHeapMemoryHighexpr:(jvm_memory_used_bytes{areaheap}/ jvm_memory_max_bytes{areaheap})0.8for:5mlabels:severity:warningannotations:summary:Java应用堆内存占用过高description:服务{{$labels.service}}堆内存使用率{{$value | humanizePercentage}}持续超过80%# 规则2每分钟GC次数超过10次频繁GC告警-alert:JvmGcFrequentexpr:rate(jvm_gc_pause_seconds_count[1m])10for:2mlabels:severity:criticalannotations:summary:Java服务GC频繁存在内存泄露风险修改prometheus.yml加载告警文件在global下新增rule_files:-alert-rules.yml重启Prometheus容器生效docker-compose restart prometheus七、常见踩坑避坑指南 Prometheus Targets显示DOWN检查extra_hosts配置Linux不能用host.docker.internal替换172.17.0.1Java容器防火墙未开放8080端口确认curl可访问/actuator/prometheusJVM指标缺失未开启micrometer-registry-prometheus依赖或端点未暴露prometheusGrafana无数据数据源地址写错不能填localhost:9090容器内使用prometheus服务名内存告警不触发scrape采集间隔过长for持续时间未满足九、总结 ✅本文完整覆盖容器化Prometheus监控Java JVM全链路SpringBoot Micrometer自动导出全套JVM指标附带自定义业务埋点代码Docker Compose一键编排PrometheusGrafana全量可复制yml配置Mermaid架构流程图清晰梳理数据流标准Grafana大盘导入、生产级JVM告警规则、通用PromQL兼容老旧Java项目JMX Exporter方案与线上踩坑解决方案整套方案零侵入、容器轻量化直接落地生产环境快速定位OOM、GC卡顿、线程泄露等JVM性能故障。