1. 简介

Spring Boot 的一大亮点就是内置了强大的 Actuator 模块。这些 Actuator 提供了一套简单直接的方式,用于监控和管理应用的几乎所有运行时状态。

本文将聚焦于使用 Metrics Actuator,搭建一套完全自托管的 Spring Boot 应用监控系统。

核心思路是:把应用产生的监控指标(metrics)持久化到外部存储,并通过可视化工具展示,避免指标随应用重启而丢失。

2. 指标数据库选型

构建自托管监控的第一步,是选择一个独立于应用进程的指标数据库。

Spring Boot 默认集成了 Micrometer,并使用内存作为指标注册中心。这意味着它能自动收集内存、CPU、HTTP 请求等基础指标,但⚠️这些数据仅存在于内存中,一旦应用重启就全部清零。

要实现持久化监控,我们必须引入一个外部的时序数据库。Spring Boot 通过 Micrometer 支持多种主流选项,以下介绍三种常见的自托管方案。

✅ 提示:只要在项目 classpath 中引入了特定数据库的 Micrometer 依赖,Spring Boot 就会自动禁用内存注册中心,转而使用你指定的外部存储。

2.1. InfluxDB

InfluxDB 是一个开源的时序数据库,非常适合存储监控指标这类时间序列数据。

最简单的启动方式是使用 Docker:

docker run -p 8086:8086 -v /tmp:/var/lib/influxdb influxdb

⚠️ 注意:此命令将数据存储在宿主机的 /tmp 目录下,仅适合开发测试。生产环境务必挂载持久化卷。

启动 InfluxDB 后,只需两步即可让 Spring Boot 接入:

  1. 引入依赖:添加 micrometer-registry-influx
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-influx</artifactId>
</dependency>
  1. 配置连接:在 application.properties 中指定 InfluxDB 地址
management.metrics.export.influx.uri=http://localhost:8086

默认情况下,数据库名为 mydb,用户名和密码为空。生产环境建议显式配置:

management.metrics.export.influx.db=myapp_metrics
management.metrics.export.influx.user-name=admin
management.metrics.export.influx.password=securePass123!

⚠️ InfluxDB 本身不提供强大的可视化界面,但它有配套的 Chronograf 工具,专用于数据展示。

2.2. Prometheus

Prometheus 是 SoundCloud 开源的监控告警系统,其工作模式与 InfluxDB 不同:它采用主动“拉取”(scrape)的方式收集指标,而不是由应用主动推送。

接入步骤如下:

  1. 暴露指标接口:引入 micrometer-registry-prometheus 依赖
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

该依赖会自动创建一个 /actuator/prometheus 接口,以 Prometheus 能识别的格式输出所有指标。

  1. 配置 Prometheus 服务:编写 prometheus.yml 配置文件,告诉 Prometheus 去哪里拉取数据。
scrape_configs:
  - job_name: 'spring-boot-app'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ['192.168.1.100:8080']  # 替换为你的应用实际IP和端口
  1. 启动 Prometheus:使用 Docker 运行
docker run -d \
  --name=prometheus \
  -p 9090:9090 \
  -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus \
  --config.file=/etc/prometheus/prometheus.yml

启动后,访问 http://localhost:9090/ 即可使用 Prometheus 内置的查询和图表功能。

self hosted monitoring spring boot prometheus dashboard

2.3. Graphite

Graphite 是另一个老牌的开源时序数据库和监控工具。

使用 Docker 快速启动一个包含 StatsD 的 Graphite 实例:

docker run -d \
 --name graphite \
 --restart=always \
 -p 80:80 \
 -p 2003-2004:2003-2004 \
 -p 2023-2024:2023-2024 \
 -p 8125:8125/udp \
 -p 8126:8126 \
 graphiteapp/graphite-statsd

Spring Boot 接入配置:

  1. 添加依赖
<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-graphite</artifactId>
</dependency>
  1. 配置主机和端口
management.metrics.export.graphite.host=127.0.0.1
management.metrics.export.graphite.port=2004

Graphite 自带一个 Web 界面,可通过 http://localhost/ 访问进行数据查看。

self hosted monitoring spring boot graphite dashboard

3. 可视化工具

虽然 InfluxDB、Prometheus、Graphite 都自带可视化功能,但它们的配置灵活性和美观度通常不如专业的 BI 工具。

3.1. Grafana

Grafana 是目前最流行的开源监控和数据分析平台。

它的强大之处在于:

统一数据源:能无缝对接 InfluxDB、Prometheus、Graphite 等几乎所有主流时序数据库。

强大的可视化:提供丰富的图表类型(折线图、柱状图、热力图、仪表盘等)和灵活的布局。

开箱即用的仪表盘:社区有大量高质量的预设仪表盘模板,可一键导入。

告警系统:支持基于指标设置复杂的告警规则,并集成邮件、钉钉、Slack 等通知渠道。

使用 Docker 快速部署:

docker run -d -p 3000:3000 grafana/grafana

访问 http://localhost:3000/,初始账号密码通常是 admin/admin

接下来的关键步骤是:

  1. 添加数据源:在 Grafana 中配置你的指标数据库(如 Prometheus 的 http://host.docker.internal:9090)。
  2. 创建或导入仪表盘:可以新建,也可以从 Grafana 官方仪表盘库 搜索并导入适合 Spring Boot 应用的模板。

self hosted monitoring spring boot grafana dashboard

4. 总结

本文介绍了如何为 Spring Boot 应用搭建一套完整的自托管监控体系。

核心要点:

  • 脱离内存存储:使用 InfluxDB、Prometheus 或 Graphite 将指标持久化。
  • Micrometer 是关键:它是 Spring Boot 与各种监控后端之间的桥梁。
  • Prometheus 模式更主流:其“拉取”模型在微服务架构中更易管理。
  • Grafana 是首选可视化:功能强大,社区支持好,是打造专业监控大屏的不二之选。

这套方案简单粗暴,能快速落地,帮你彻底告别“应用健康状况全靠猜”的踩坑时代。


原始标题:Self-Hosted Monitoring for Spring Boot Applications