云计算百科
云计算领域专业知识百科平台

Micrometer 系列【36】Spring Boot Actuator | 集成 Prometheus + Grafana 可视化

文章目录

  • 1. 整体架构
    • 1.1 业务服务|Micrometer 采集层
    • 1.2 Prometheus|时序存储 & 计算 & 告警层
    • 1.3 Grafana|可视化观测层
  • 2. 部署 Prometheus + Grafana
  • 3. Spring Boot 项目集成
    • 3.1 引入依赖
    • 3.2 应用配置
    • 3.3 自定义业务指标
      • 3.3.1 业务类
      • 3.3.2 实现 MeterBinder 接口
      • 3.3.3 Spring 配置类
    • 3.4 启动应用
  • 4. Prometheus 中查看数据
    • 4.1 查看任务状态
    • 4.2 基础 PromQL 查询
  • 4. 集成 Grafana 监控大盘
    • 4.1 数据源配置
    • 4.2 官方仪表盘
    • 4.3 自定义监控盘

1. 整体架构

指标流转链路:

  • Spring Boot 服务通过 Actuator 暴露 /actuator/prometheus 端点,以 OpenMetrics 格式实时输出全量指标(JVM、HTTP、业务自定义指标);
  • Prometheus 通过 HTTP 定时拉取(Pull 模式)采集指标、持久化时序数据;
  • Grafana 对接 Prometheus 数据源,实现指标可视化、趋势分析、分层观测与异常定位。

在这里插入图片描述

1.1 业务服务|Micrometer 采集层

埋点来源:

  • 内置埋点:http.server.requests、JVM、线程、GC、数据库连接池等
  • 业务自定义埋点:Counter / Timer / Gauge / DistributionSummary

数据输出:暴露 /actuator/prometheus 端点,Prometheus拉取指标

1.2 Prometheus|时序存储 & 计算 & 告警层

  • 数据获取:Pull 模式定时拉取业务服务 /actuator/prometheus
  • 时序存储:保存指标 + 标签 + 时间戳原始时序数据
  • 聚合计算:PromQL 做聚合、过滤、速率计算(rate()/irate()/sum()/avg())
  • 告警能力:Rules 配置告警规则,触发后推送 AlertManager,输出钉钉/邮件/短信

1.3 Grafana|可视化观测层

  • 数据源对接 Prometheus ,执行 PromQL 查询
  • 分层观测大盘:
    • 业务层:QPS、错误率、业务耗时
    • 应用层:JVM 内存、GC、线程、连接池
    • 系统层:CPU、内存、磁盘、网络
    • 请求链路:P95/P99 耗时、活跃请求数
  • 告警视图、阈值告警、多实例对比、面板模板复用

2. 部署 Prometheus + Grafana

统一端口与路径规范:

  • 服务指标接口:http://{服务IP}:{端口}/actuator/prometheus
  • Prometheus 默认端口:9090
  • Grafana 默认端口:3000
  • 统一采集周期:15s(生产标准,兼顾精度与存储成本)

目录结构:

prom-stack/
├── docker-compose.yml
├── prometheus/
│ └── prometheus.yml
└── .env(可选)

prometheus/prometheus.yml 配置文件:

# Prometheus 全局配置 – 适配Micrometer 4.1.0 微服务体系
global:
scrape_interval: 15s # 全局采集周期 15s 生产标准
evaluation_interval: 15s # 告警规则计算周期
scrape_timeout: 10s # 采集超时时间
# 采集任务配置
scrape_configs:
# 微服务统一采集任务(适配所有SpringBoot+Micrometer服务)
job_name: 'spring-micrometer-service'
metrics_path: '/actuator/prometheus'
static_configs:
targets:
127.0.0.1:8080

docker-compose.yml 完整文件:

version: '3.8'

services:
prometheus:
image: prom/prometheus:v2.53.0
container_name: prometheus
restart: always
ports:
"9090:9090"
volumes:
./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
prom_data:/prometheus
command:
'–config.file=/etc/prometheus/prometheus.yml'
'–storage.tsdb.path=/prometheus'
'–storage.tsdb.retention.time=15d'
'–web.enable-lifecycle'
networks:
monitornet
grafana:
image: grafana/grafana:11.1.0
container_name: grafana
restart: always
ports:
"3000:3000"
volumes:
grafana_data:/var/lib/grafana
environment:
GF_SECURITY_ADMIN_PASSWORD=admin123456
networks:
monitornet

networks:
monitor-net:
driver: bridge

volumes:
prom_data:
grafana_data:

启动服务:

docker compose up -d

访问地址

  • Prometheus: http://ip:9090
  • Grafana: http://ip:3000 账号 admin /admin123456

在 Prometheus 控制台可以看到配置的采集任务:

在这里插入图片描述

3. Spring Boot 项目集成

3.1 引入依赖

Pom 引入核心依赖

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>4.1.0</version>
<type>pom</type>
<scope>import</scope>
</dependencies>
</dependencyManagement>

<dependencies>
<!– SpringMVC 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>
<!– prometheus 指标导出 –>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
</dependencies>

3.2 应用配置

重点是配置应用名称、开发 metrics,prometheus 端点

spring:
application:
name: springmicrometerservice
management:
endpoints:
web:
exposure:
include: metrics,prometheus

可以这样配置关闭一些指标:

management:
metrics:
enable:
jvm: false
http.server.requests: true
all: true

3.3 自定义业务指标

Spring Boot自定义业务指标的多种方式:

  • MeterRegistry 注入到组件中手动进行注册
  • 通过 MeterBinder Bean 自动注入 MeterRegistry 完成绑定
  • 通过注解 AOP

MeterBinder 是 Spring Boot Actuator 官方推荐模式,所有容器内 MeterBinder Bean,Spring 会自动注入 MeterRegistry 完成绑定,无需手动操作。

3.3.1 业务类

模拟业务组件,本地内存消息队列,提供消息入队、出队能力,对外暴露队列长度查询方法,供监控指标读取实时数据。

MessageQueueManager:

@Component
public class MessageQueueManager {

private final BlockingQueue<String> messageQueue = new LinkedBlockingQueue<>(1000);

public boolean addMessage(String msg) {
return messageQueue.offer(msg);
}

public String takeMessage() {
return messageQueue.poll();
}

/**
* 供给Gauge读取实时队列长度
*/

public int getQueueSize() {
return messageQueue.size();
}
}

3.3.2 实现 MeterBinder 接口

独立实现 MeterBinder,专门负责注册队列相关监控指标:

public class MessageQueueMeterBinder implements MeterBinder {

private final MessageQueueManager queueManager;

// 构造注入业务对象
public MessageQueueMeterBinder(MessageQueueManager queueManager) {
this.queueManager = queueManager;
}

@Override
public void bindTo(io.micrometer.core.instrument.MeterRegistry registry) {
// 指标1:队列长度
Gauge.builder("business.message.queue.size", queueManager, MessageQueueManager::getQueueSize)
.description("消息队列堆积数量")
.register(registry);

// 可以继续添加同模块多个指标
// Gauge.builder(…).register(registry);
}
}

带 Tags 多维度指标示例:

@Bean
public MeterBinder messageQueueSizeBinder(MessageQueueManager queueManager) {
return registry -> Gauge.builder("business.message.queue.size", queueManager, MessageQueueManager::getQueueSize)
.tag("queue_name", "order_queue")
.tag("env", "${spring.profiles.active}") // 配合占位符
.description("订单消息队列堆积长度")
.register(registry);
}

3.3.3 Spring 配置类

把 MessageQueueMeterBinder 注册为 Bean:

@Configuration
public class MetricBinderConfig {
@Bean
public MeterBinder messageQueueMeterBinder(MessageQueueManager queueManager) {
return new MessageQueueMeterBinder(queueManager);
}
}

3.4 启动应用

启动应用,先查看 /actuator/prometheus :

在这里插入图片描述

4. Prometheus 中查看数据

4.1 查看任务状态

在 Prometheus 控制台查看采集任务健康状态:

在这里插入图片描述

4.2 基础 PromQL 查询

PromQL(Prometheus Query Language)是 Prometheus 查询语言,专门用来从 Prometheus 时序数据库里查询、过滤、运算监控指标。

我们先在 /actuator/prometheus 端点查看下指标应用启动完成耗时(单位:秒)指标 application_ready_time_seconds ,的数据:

# HELP application_ready_time_seconds Time taken for the application to be ready to service requests
# TYPE application_ready_time_seconds gauge
application_ready_time_seconds{main_application_class="com.yovis.example.micrometer.boot.demo.MicrometerBootDemoApplication"} 2.224

结构解析:

  • 类型是 gauge
  • 只有一个 application_ready_time_seconds 标签
  • 指标值 2.224 秒

在 Prometheus 中查询全部时序:

{__name__=~".+"}

在这里插入图片描述

application_ready_time_seconds 时序数据:

application_ready_time_seconds{instance="192.168.7.84:8080", job="spring-micrometer-service", main_application_class="com.yovis.example.micrometer.boot.demo.MicrometerBootDemoApplication"}

Prometheus 采集后,会加上任务标签 Label :

  • instance:Prometheus 配置里定义的目标地址,代表这台实例的 ip + 端口。
  • job:Prometheus 配置里定义任务名称,,用来归类同一组服务。

通过 instance 和 job 标签就可以定位到某个具体的服务实例:

{instance="192.168.7.84:8080", job="spring-micrometer-service"}

再加上指标名、业务标签、聚合函数等,就可以实现复杂的查询了,具体请参考官方说明,比如 JVM 堆内存使用:

jvm_memory_used_bytes{instance="192.168.7.84:8080", job="spring-micrometer-service"}

在这里插入图片描述

4. 集成 Grafana 监控大盘

4.1 数据源配置

  • 登录 Grafana 后台,进入 Connections- Add new Data sources
  • 在这里插入图片描述

  • 选择添加 Prometheus 数据源

  • URL 填写:http://Prometheus服务IP:9090

  • Scrape interval 填写:15s

  • 关闭 Proxy 异常缓存,点击 Save & test,显示成功即可

  • 关键适配点:数据源必须与 Prometheus 采集周期一致,否则大盘数据断层、延迟失真。

    4.2 官方仪表盘

    在官方搜索 Spring Boot 、Micrometer :

    在这里插入图片描述

    Grafana 中新建仪表盘 (Home – Dashboards – new – Import dashboard):

    在这里插入图片描述

    通过 ID 或 Json 数据导入:

    在这里插入图片描述

    导入成功后:

    在这里插入图片描述

    4.3 自定义监控盘

    对于没有官方仪表盘的场景下,比如自定义的业务指标,可以把 /actuator/prometheus 中的指标发给 AI 写一个 Json 文件,直接导入到 Grafana 中就可以了 !!!

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Micrometer 系列【36】Spring Boot Actuator | 集成 Prometheus + Grafana 可视化
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!