下面是一个 完整、可落地的 Spring Boot 项目监控方案,使用 Spring Boot Actuator + Prometheus + Grafana 实现生产级监控。包含代码、配置、部署和验证步骤。


🎯 目标

  • Spring Boot 应用暴露指标(Metrics)
  • Prometheus 定时拉取指标
  • Grafana 可视化 JVM、HTTP 请求、GC 等关键指标

✅ 第一步:Spring Boot 项目集成 Actuator + Prometheus

1. 添加 Maven 依赖(pom.xml

<dependencies>
    <!-- Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Actuator -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <!-- Micrometer for Prometheus -->
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-registry-prometheus</artifactId>
    </dependency>
</dependencies>

✅ Spring Boot 2.3+ 默认包含 Micrometer,无需额外版本。


2. 配置 application.yml

server:
  port: 8080

spring:
  application:
    name: demo-app

management:
  endpoints:
    web:
      exposure:
        include: health,info,metrics,prometheus  # 开放 prometheus 端点
  endpoint:
    health:
      show-details: always
  metrics:
    tags:
      application: ${spring.application.name}  # 为指标打标签,便于区分多服务

3. 验证指标端点

启动应用后,访问:

curl http://localhost:8080/actuator/prometheus

你会看到类似输出:

# HELP jvm_memory_used_bytes The amount of used memory
# TYPE jvm_memory_used_bytes gauge
jvm_memory_used_bytes{application="demo-app",area="heap",id="G1 Eden Space",} 1.23456E7
# HELP http_server_requests_seconds Timer of HTTP server requests
# TYPE http_server_requests_seconds summary
http_server_requests_seconds_count{application="demo-app",exception="None",method="GET",outcome="SUCCESS",status="200",uri="/api/hello",} 5.0
...

说明:指标已成功暴露!


✅ 第二步:部署 Prometheus

1. 创建 prometheus.yml

global:
  scrape_interval: 15s  # 每15秒抓取一次

scrape_configs:
  - job_name: 'springboot-app'
    metrics_path: '/actuator/prometheus'
    static_configs:
      - targets: ['host.docker.internal:8080']  # Docker 中访问宿主机
        labels:
          group: 'backend'

💡 注意

  • 如果 Spring Boot 运行在 本地,Prometheus 在 Docker 中 → 用 host.docker.internal
  • 如果都在 K8s → 用 Service 名称,如 myapp:8080
  • 如果都在 同一台服务器 → 用 localhost:8080

2. 启动 Prometheus(Docker)

# 创建目录
mkdir -p ~/prometheus
cp prometheus.yml ~/prometheus/

# 启动容器
docker run -d \
  --name=prometheus \
  -p 9090:9090 \
  -v ~/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

3. 验证 Prometheus 抓取

访问 http://localhost:9090

  • 点击 Status → Targets,确认状态为 UP
  • 在搜索框输入 jvm_memory_used_bytes,应有数据

说明:Prometheus 已成功采集指标!


✅ 第三步:部署 Grafana 并导入 Dashboard

1. 启动 Grafana(Docker)

docker run -d \
  --name=grafana \
  -p 3000:3000 \
  grafana/grafana-enterprise

2. 配置 Prometheus 数据源

  1. 浏览器打开 http://localhost:3000(默认账号/密码:admin/admin
  2. Add data source → Prometheus
  3. URL 填:http://host.docker.internal:9090(或 Prometheus 服务地址)
  4. 点击 Save & Test,显示 “Data source is working”

3. 导入官方 JVM Dashboard

  1. 点击 + → Import
  2. 输入 Dashboard ID: 4701JVM (Micrometer) Dashboard
  3. 选择刚创建的 Prometheus 数据源
  4. 点击 Import

🎉 你将看到完整的 JVM 监控面板:

  • Heap / Non-Heap 内存
  • GC 次数与耗时
  • 线程数
  • HTTP 请求 QPS、延迟、错误率

✅ 第四步:(可选)添加自定义业务指标

示例:统计订单创建次数

@RestController
public class OrderController {

    private final Counter orderCounter;

    public OrderController(MeterRegistry meterRegistry) {
        this.orderCounter = Counter.builder("order.created.total")
            .description("Total number of orders created")
            .register(meterRegistry);
    }

    @PostMapping("/orders")
    public String createOrder() {
        orderCounter.increment(); // 计数+1
        return "Order created";
    }
}

在 Grafana 中搜索 order_created_total 即可看到图表。


✅ 第五步:生产环境安全加固

1. 限制 Actuator 端点访问(Spring Security)

@Configuration
public class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.requestMatcher(EndpointRequest.toAnyEndpoint())
            .authorizeRequests()
            .anyRequest().hasRole("ACTUATOR")
            .and()
            .httpBasic(); // 或 OAuth2、IP 白名单
    }
}

2. Prometheus 配置 Basic Auth(如需要)

scrape_configs:
  - job_name: 'secure-app'
    metrics_path: '/actuator/prometheus'
    basic_auth:
      username: 'actuator'
      password: 'secret'
    static_configs:
      - targets: ['your-app:8080']

📊 最终效果

表格

组件 地址 作用
Spring Boot App http://localhost:8080/actuator/prometheus 暴露指标
Prometheus http://localhost:9090 存储 & 查询指标
Grafana http://localhost:3000 可视化监控大盘

🔧 故障排查

表格

问题 解决方案
Prometheus target DOWN 检查网络、防火墙、Spring Boot 是否运行
Grafana 无数据 检查数据源配置、指标名称是否匹配
指标缺失 确认 micrometer-registry-prometheus 依赖已引入
Docker 网络不通 使用 host.docker.internal(Mac/Windows)或 --network host

✅ 总结:完整流程图

Spring Boot App 
  └─ Actuator + Micrometer → /actuator/prometheus
        ↓ (HTTP pull every 15s)
Prometheus Server ← prometheus.yml
        ↓ (Query via API)
Grafana Dashboard ← Import ID 4701
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐