SpringBoot Actuator指标收集:Micrometer与Prometheus集成

在这里插入图片描述

文章目录

    • 引言
    • 一、Spring Boot Actuator基础
    • 二、Micrometer简介与集成
    • 三、基本指标收集与配置
    • 四、自定义业务指标实现
    • 五、与Prometheus集成
    • 六、实战案例:API性能监控
    • 总结

引言

在现代微服务架构中,监控应用程序的健康状况和性能指标变得至关重要。Spring Boot Actuator为监控Spring Boot应用提供了强大的支持,而Micrometer作为应用程序指标门面,提供了与多种监控系统集成的能力。本文将深入探讨如何使用Spring Boot Actuator结合Micrometer与Prometheus实现高效的应用监控方案,包括配置、自定义指标以及最佳实践。

一、Spring Boot Actuator基础

Spring Boot Actuator是Spring Boot的一个子项目,它为应用程序提供了生产级别的监控和管理能力。Actuator暴露了一系列的HTTP端点,通过这些端点可以获取应用程序的健康状况、内存使用、环境变量等信息。要使用Actuator,需要在项目中添加相应的依赖。

// 在pom.xml中添加以下依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置文件中可以开启需要的端点,如下所示:

# application.yml
management:endpoints:web:exposure:include: health,info,metrics,prometheusendpoint:health:show-details: always

这段配置开启了health、info、metrics和prometheus端点,并设置health端点显示详细信息。通过这些基础配置,可以通过访问对应的URL获取应用程序的基本健康信息和指标数据。

二、Micrometer简介与集成

Micrometer是一个应用指标门面,类似于SLF4J对于日志的作用。它提供了一个通用的接口,使得应用程序可以与各种监控系统集成,如Prometheus、Graphite、JMX等。Spring Boot 2.x已经默认集成了Micrometer,所以无需额外添加Micrometer核心依赖。

要与Prometheus集成,需要添加Micrometer的Prometheus注册表依赖:

// 在pom.xml中添加以下依赖
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId>
</dependency>

添加这个依赖后,Spring Boot会自动配置一个PrometheusMeterRegistry,并注册到全局MeterRegistry中。这样,应用程序收集的所有指标数据都会自动通过/actuator/prometheus端点以Prometheus格式暴露出来。

三、基本指标收集与配置

Spring Boot应用默认会收集许多基本指标,如JVM内存使用、垃圾回收、线程状态、HTTP请求统计等。这些指标会自动通过Micrometer注册到Prometheus中。

下面的代码展示了如何配置和自定义这些基本指标。

import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.boot.actuate.autoconfigure.metrics.MeterRegistryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MetricsConfig {@Beanpublic MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {// 为所有指标添加通用标签,如应用名称、环境等return registry -> registry.config().commonTags("application", "my-service").commonTags("environment", "production");}
}

在这个配置类中,通过MeterRegistryCustomizer为所有的指标添加了通用标签,这对于在多服务环境中区分不同应用的指标非常有用。此外,还可以在application.yml中进一步配置指标收集:

# application.yml
management:metrics:export:prometheus:enabled: truedistribution:percentiles-histogram:http.server.requests: truesla:http.server.requests: 10ms, 100ms, 500mspercentiles:http.server.requests: 0.5, 0.75, 0.95, 0.99

这个配置启用了Prometheus指标导出,并为HTTP请求配置了直方图、SLA和百分位数统计,这对于监控API响应时间非常有用。

四、自定义业务指标实现

除了系统默认指标外,经常需要收集特定业务相关的指标。Micrometer提供了多种指标类型,如计数器(Counter)、仪表(Gauge)、计时器(Timer)等,下面通过代码示例说明如何使用这些类型创建自定义指标。

import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import org.springframework.stereotype.Service;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;@Service
public class OrderService {private final MeterRegistry meterRegistry;private final AtomicInteger activeOrders = new AtomicInteger(0);private final Map<String, AtomicInteger> ordersByRegion = new ConcurrentHashMap<>();private final Counter orderCounter;private final Timer orderProcessingTimer;public OrderService(MeterRegistry meterRegistry) {this.meterRegistry = meterRegistry;// 创建计数器,记录订单总数this.orderCounter = Counter.builder("orders.created").description("Total number of orders created").register(meterRegistry);// 创建仪表,监控活跃订单数量Gauge.builder("orders.active", activeOrders, AtomicInteger::get).description("Number of active orders").register(meterRegistry);// 创建计时器,记录订单处理时间this.orderProcessingTimer = Timer.builder("orders.processing.time").description("Order processing time").register(meterRegistry);}public void createOrder(String region) {// 增加计数器orderCounter.increment();// 增加活跃订单数activeOrders.incrementAndGet();// 按区域统计ordersByRegion.computeIfAbsent(region, r -> {AtomicInteger counter = new AtomicInteger(0);Gauge.builder("orders.by.region", counter, AtomicInteger::get).tag("region", r).description("Orders by region").register(meterRegistry);return counter;}).incrementAndGet();}public void processOrder(String orderId) {// 使用计时器记录处理时间orderProcessingTimer.record(() -> {// 订单处理逻辑try {Thread.sleep(100); // 模拟处理时间} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 减少活跃订单数activeOrders.decrementAndGet();});}
}

这个示例展示了如何使用不同类型的指标监控业务数据。Counter用于计数订单总数;Gauge用于监控活跃订单数和各区域订单数;Timer用于测量订单处理时间。

五、与Prometheus集成

配置好Micrometer和Actuator后,下一步是将Spring Boot应用与Prometheus集成。需要配置Prometheus抓取Spring Boot应用暴露的指标数据。

以下是一个基本的Prometheus配置示例:

# prometheus.yml
scrape_configs:- job_name: 'spring-boot-app'metrics_path: '/actuator/prometheus'scrape_interval: 5sstatic_configs:- targets: ['localhost:8080']

这个配置指示Prometheus每5秒抓取一次Spring Boot应用的/actuator/prometheus端点。要在Docker环境中运行Prometheus,可以使用以下命令:

# 运行Prometheus容器
docker run -d --name prometheus -p 9090:9090 -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

为了完善监控系统,通常还会配合Grafana使用,用于可视化Prometheus收集的指标数据。以下是启动Grafana的Docker命令:

# 运行Grafana容器
docker run -d --name grafana -p 3000:3000 grafana/grafana

六、实战案例:API性能监控

下面通过一个完整的实战案例,展示如何使用Micrometer和Prometheus监控REST API的性能。将创建一个简单的控制器,并使用自定义指标监控API调用情况。

import io.micrometer.core.annotation.Timed;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.TimeUnit;@RestController
@RequestMapping("/api")
public class ProductController {private final MeterRegistry meterRegistry;private final Map<String, Timer> categoryTimers = new ConcurrentHashMap<>();public ProductController(MeterRegistry meterRegistry) {this.meterRegistry = meterRegistry;}@GetMapping("/products")@Timed(value = "api.products.request", description = "Time taken to return products")public Map<String, Object> getProducts() {// 模拟业务逻辑try {Thread.sleep(50);} catch (InterruptedException e) {Thread.currentThread().interrupt();}return Map.of("status", "success", "count", 100);}@GetMapping("/products/category/{category}")public Map<String, Object> getProductsByCategory(@PathVariable String category) {// 获取或创建该分类的计时器Timer timer = categoryTimers.computeIfAbsent(category,c -> Timer.builder("api.products.category.request").tag("category", c).description("Time taken to return products by category").register(meterRegistry));// 记录执行时间long start = System.nanoTime();try {// 模拟不同分类的处理时间不同if ("electronics".equals(category)) {Thread.sleep(100);} else if ("clothing".equals(category)) {Thread.sleep(70);} else {Thread.sleep(30);}return Map.of("status", "success", "category", category, "count", 50);} catch (InterruptedException e) {Thread.currentThread().interrupt();return Map.of("status", "error", "message", "Operation interrupted");} finally {timer.record(System.nanoTime() - start, TimeUnit.NANOSECONDS);}}
}

这个控制器展示了两种方式来记录API性能指标:使用@Timed注解和手动计时。第一个接口使用了@Timed注解,Spring Boot会自动创建Timer并记录方法执行时间;第二个接口手动创建Timer并记录执行时间,这种方式更灵活,可以添加自定义标签,如产品分类。

总结

Spring Boot Actuator结合Micrometer和Prometheus为Java应用提供了强大而灵活的监控能力。通过本文的介绍,我们了解了如何配置Spring Boot Actuator,如何使用Micrometer创建和定制各种类型的指标,以及如何与Prometheus集成实现应用监控。在实际应用中,合理的监控指标设计对于及时发现性能瓶颈、优化系统表现、提高服务可用性具有重要意义。监控不应该是事后的补救措施,而应该是贯穿应用开发全生命周期的基础设施。通过结合自动化告警系统,可以构建一个完整的可观测性平台,为微服务架构下的应用稳定运行提供有力保障。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/79811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Android面试八股文】Android应用进程的启动流程【二】

应用进程 1.1 Android系统进程的启动过程&#xff1a; 1、init进程fork出Zygote进程后&#xff0c;Zygote进程会创建一个服务端socket&#xff0c;等待AMS发起socket请求。 同时&#xff0c;由Zygote进程fork出的SystemServer进程会启动各项系统服务&#xff0c;其中就包含了A…

基于Django的AI客服租车分析系统

基于Django的AI客服租车分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】AI智能客服与用户交互指导手册 【技术栈】 ①&#xff1a;系统环境&#xff1a;Python 3.8&#xff0c;Django 4.2框架 ②&#xff1a;开发环境&a…

全同态加密医疗数据分析集python实现

目录 摘要一、前言二、全同态加密与医疗数据分析概述2.1 全同态加密(FHE)简介2.2 医疗数据分析需求三、数据生成与预处理四、系统架构与流程4.1 系统架构图五、核心数学公式六、异步任务调度与(可选)GPU 加速七、PyQt6 GUI 设计八、完整代码实现九、自查测试与总结十、展望…

linux 搭建 dvwa 渗透测试环境

linux 安装 dvwa 1、分为4个部分&#xff0c;搭建dvwa渗透测试环境2、安装centos 7.63、安装apache http server4、安装mysql5、安装php6、运行dvwa 1、分为4个部分&#xff0c;搭建dvwa渗透测试环境 本文基于centos 7.6 搭建 dvwa 渗透测试环境 安装一个linux系统安装apache…

stm32(gpio的四种输出)

其实GPIO这个片上外设的功能&#xff1a; 用于控制IO引脚。 CPU就如同大脑&#xff0c;而这些片上外设就如同四肢一样的关系 如图 —————————————————————————————— OK类比了以上 其实GPIO是有 八种工作模式的 这八种工作模式 因为GPIO是面向IO…

Flask(3): 在Linux系统上部署项目

1 前言 说实话&#xff0c;我并不想接触linux系统&#xff0c;要记住太多的命令。我更习惯windows系统&#xff0c;鼠标点点&#xff0c;只要记住少量的命令就可以了。 但是我选择了python&#xff0c;就注定无法逃避linux系统。虽然python也能在windows上很好的运行&#xff0…

WIN10重启开机不用登录,直接进入桌面

我们个人机不需要登录。 步骤1 置&#xff0c;帐户&#xff0c;登录选项&#xff0c;密码。 输入当前密码后&#xff0c;直接下一步。 再次重启&#xff0c;就会发现不需要密码了。

idea中导入从GitHub上克隆下来的springboot项目解决找不到主类的问题

第一步&#xff1a;删除目录下的.idea和target&#xff0c;然后用idea打开 第二步&#xff1a;如果有需要&#xff0c;idea更换jdk版本 原文链接&#xff1a;https://blog.csdn.net/m0_74036731/article/details/146779040 解决方法&#xff08;idea中解决&#xff09;&#…

数字友好战略视域下数字安全核心要素的理论解构与实践路径

本论文聚焦数字友好战略框架下的数字安全核心要素&#xff0c;系统阐述数字安全的理论内涵、战略价值与实践路径。通过多维度分析数字安全在个人、企业与国家层面的作用机制&#xff0c;结合国际法规标准与前沿技术实践&#xff0c;揭示数字安全对构建可持续数字生态的关键支撑…

管理与维护samba服务器

允许 Linux、Unix 系统与 Windows 系统之间进行文件和打印机共享&#xff0c;使得不同操作系统的用户能够方便地访问和共享资源&#xff0c;就像在同一局域网中的 Windows 计算机之间共享资源一样。 server01安装Samba服务器 [rootserver ~]# rpm -qa | grep samba [rootserver…

前端面试每日三题 - Day 8

这是我为准备前端/全栈开发工程师面试整理的第八天每日三题练习&#xff0c;涵盖 JavaScript 闭包与执行上下文、React 性能优化与虚拟 DOM、以及高可用消息队列架构设计。 ✅ 题目 1&#xff1a;深入理解 JavaScript 中的闭包与执行上下文 &#x1f4d8; 解析&#xff1a; 闭…

996引擎-拓展变量:物品变量

996引擎-拓展变量:物品变量 测试代码参考资料对于Lua来说,只有能保存数据库的变量才有意义。 至于临时变量,不像TXT那么束手束脚,通常使用Lua变量就能完成。 测试代码 -- 存:物品拓展strfunction (player)local where =

现代Web应用中的高级模糊搜索实现:多条件组合查询与性能优化

搜索功能是现代Web应用中提升用户体验的核心组件。本文将深入探讨如何实现一个高效、灵活的前端模糊搜索解决方案&#xff0c;支持多条件组合查询、精确匹配、模糊匹配以及时间范围筛选。 需求分析与设计目标 核心需求场景 多字段模糊搜索&#xff1a;支持在多个字段中同时搜…

Selenium 实现自动化分页处理与信息提取

Selenium 实现自动化分页处理与信息提取 在 Web 自动化测试或数据抓取场景中&#xff0c;分页处理是一个常见的需求。通过 Selenium&#xff0c;我们可以实现对多页面内容的自动遍历&#xff0c;并从中提取所需的信息。本文将详细介绍如何利用 Selenium 进行自动化分页处理和信…

VS qt 联合开发环境下的多国语言翻译

添加Linguist 文件方法&#xff0c;如同添加类文件的方式&#xff0c;那样&#xff1a; 其他跟QT的一样的流程&#xff0c;另外在main函数里要注册一下&#xff0c; QTextCodec::setCodecForLocale(textCodec); QTranslator translator5; QString trans5 fi…

第十七节:高频开放题-React未来发展趋势

服务端组件&#xff08;RSC&#xff09;普及 React Compiler对开发模式的影响 React 未来发展趋势深度解析&#xff1a;服务端组件与编译器的革命性变革 一、服务端组件&#xff08;RSC&#xff09;的全面普及与生态重构 1. RSC 的核心理念与技术优势 React Server Component…

Python爬虫实战:获取B站查询数据

一、引言 1.1 研究背景 随着互联网的迅猛发展,视频分享平台积累了海量的数据资源。以 B 站为例,其丰富的视频内容和活跃的用户群体蕴含着巨大的价值。对 B 站搜索数据进行爬取和分析,有助于洞察用户兴趣、市场趋势以及内容创作方向,为市场调研、用户行为分析和内容推荐系…

【Rust 精进之路之第3篇-变量观】`let`, `mut` 与 Shadowing:理解 Rust 的变量绑定哲学

系列&#xff1a; Rust 精进之路&#xff1a;构建可靠、高效软件的底层逻辑 作者&#xff1a; 码觉客 发布日期&#xff1a; 2025-04-20 引言&#xff1a;为数据命名&#xff0c;Rust 的第一道“安全阀” 在上一篇文章中&#xff0c;我们成功搭建了 Rust 开发环境&#xff0c…

stm32(IO口的最高速度)

如果我们写入速度 快到一种程度 肯定就不能完全按理想的来了 当我们写01快起来 中间的保持时间就会越来越少 就逐渐往下面变化 所以其实 我们如果改变上升时间 和 下降时间 还是能将最后的波形 变成为正常的波形的。 不用追求高速 &#xff0c;满足要求下 选低速的即可。 因…

String +memset字符串类题型【C++】

tips&#xff1a; 1、寻找最大公共子串时&#xff0c;如果字符串可以旋转但是不能反转&#xff0c;考虑在每个字符串后重复一次自身&#xff0c;如 "abcd" 变为 "abcdabcd"&#xff0c;这样在用dp就可以了。 如何变环拆环为链&#xff1a; cin>>n&…