SpringBoot Actuator

SpringBoot Actuator

    • 一、简介
    • 二、入门
      • 1、依赖
      • 2、默认监控指标
      • 3、查询监控指标
      • 4、全量监控指标
    • 三、Spring Boot Admin
      • 1、主要功能
      • 2、Admin
      • 3、Client
      • 4、应用墙
      • 5、其他
    • 四、定制化
      • 1、定制Health端点
      • 2、定制Info端点
      • 3、定制Metrics端点
      • 4、定制Endpoint端点


一、简介

SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变 量、日志信息、线程信息等




二、入门

1、依赖

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

2、默认监控指标

需要启动应用项目

访问方式一:HTTP形式

访问方式二:jconsole形式

在默认配置情况下,使用jconsole访问会显示暴露出来的其他接口


3、查询监控指标

直接访问对应的href地址即可

jconsole直接点击可视化界面即可


4、全量监控指标

修改配置文件

management.endpoints.web.exposure.include=*

常用指标说明:

  • beans:Spring容器中的Bean信息
  • caches:应用中的缓存
  • health:现实健康检查信息
  • info:显示设置好的应用信息
  • conditions:Spring Boot的条件逐渐
  • configprops:Spring的配置类
  • env:返回当前环境属性(Environment Properties)
  • loggers:能够查询和修改应用的日志级别。
  • heapdump:会构建并返回应用所用 JVM 的 Heap Dump。
  • threaddump:会 Dump 底层 JVM 的线程信息
  • metrics:详细介绍了应用的指标。这可能包括通用指标和自定义指标。
  • scheduledtasks:提供了应用中每个计划(定时)任务的详细信息。
  • prometheus:返回可供Prometheus抓取的信息



三、Spring Boot Admin

Spring Boot Admin 是一个用于管理和监控 Spring Boot 应用程序的开源项目。它提供了一个简单易用的 Web 界面,让开发者可以方便地查看和管理多个 Spring Boot 应用实例的运行状态、健康状况、配置信息等。

1、主要功能

  1. 应用程序发现与注册:Spring Boot Admin 支持通过 Spring Cloud Discovery(如 Eureka、Consul 等)自动发现注册的 Spring Boot 应用程序,也可以通过 HTTP 进行手动注册。
  2. 健康监控:实时显示应用程序的健康状态,包括磁盘空间、数据库连接、缓存状态等。可以通过 /actuator/health 端点获取详细的健康信息。
  3. 指标监控:收集和展示应用程序的各种指标,如内存使用情况、线程池状态、HTTP 请求统计等。这些指标通过 /actuator/metrics 端点暴露。
  4. 日志管理:允许查看和管理应用程序的日志文件,支持实时日志查看和日志级别调整。可以通过 /actuator/logfile/actuator/loggers 端点进行操作。
  5. 环境与配置信息:显示应用程序的环境变量、系统属性和配置信息,方便开发者查看和调试。
  6. 事件与通知:当应用程序的状态发生变化(如上线、下线、健康状态改变等)时,Spring Boot Admin 可以发送通知,支持多种通知方式,如邮件、Slack、HipChat 等。

2、Admin

注意版本需要和项目的Spring Boot版本对齐,否则无法正常访问

1)添加依赖

<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>2.6.6</version>
</dependency>

2)启动类添加@EnableAdminServer

3)访问


3、Client

1)引入依赖

<dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-client</artifactId><version>3.3.4</version>
</dependency>

2)配置注册地址

## 地址是admin的访问地址
spring.boot.admin.client.url=http://localhost:8088
management.endpoints.web.exposure.include=*

3)启动项目

admin端会出现注册者,这个注册者就是我们的client端


4、应用墙

此时就可以查看到我们client端的数据指标了

当client端下线后,对应的应用块会有颜色警示


5、其他

我们每个Client端都需要去这么配置会十分繁琐,我们的admin端可以直接监控注册中心,遍历注册中心所有的项目,获取对应的监控数据。

而对应的client端只需要暴露对应的端点即可,即引入依赖&配置暴露端点

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
</dependencies>
management.endpoints.web.exposure.include=*



四、定制化

1、定制Health端点

  • CustomHealthIndicator 类实现了 HealthIndicator 接口。
  • health() 方法根据 isHealthy 变量的值返回不同的健康状态。如果 isHealthy 为 true,则返回 Health.up() 表示健康;否则返回 Health.down() 表示不健康。
  • withDetail() 方法用于添加自定义的详细信息到健康检查结果中。
package pers.mobian.springbootactuatordemo.indicator;import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;@Component
public class CustomHealthIndicator implements HealthIndicator {private static final String CUSTOM_STATUS_KEY = "customStatus";private boolean isHealthy = false;// 模拟切换健康状态的方法public void setHealthy(boolean healthy) {isHealthy = healthy;}@Overridepublic Health health() {if (isHealthy) {return Health.up().withDetail(CUSTOM_STATUS_KEY, "Everything is running smoothly.").build();} else {return Health.down().withDetail(CUSTOM_STATUS_KEY, "There is an issue with the custom service.").build();}}
}

此时访问health接口,就会因为CustomHealthIndicator这个端点校验不通过,而返回DOWN


2、定制Info端点

  • CustomInfoContributor 类实现了 InfoContributor 接口。
  • contribute 方法用于向 Info.Builder 中添加自定义信息,这里添加了当前时间和一个随机事实。
package pers.mobian.springbootactuatordemo.indicator;import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;@Component
public class CustomInfoContributor implements InfoContributor {@Overridepublic void contribute(Info.Builder builder) {String currentTime = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);builder.withDetail("currentTime", currentTime).withDetail("randomFact", "Spring Boot is awesome!");}
}

访问info接口,就会出现我们添加的信息


3、定制Metrics端点

1)引入依赖

<!-- Micrometer 是 Spring Boot Actuator 底层的指标收集库 -->
<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-core</artifactId>
</dependency>

2)自定义端点

  • CustomMetricsService 类借助 MeterRegistry 创建了一个名为 custom.operation.count 的计数器。
  • incrementCustomCounter 方法用于增加计数器的值。
package pers.mobian.springbootactuatordemo.indicator;import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Service;@Service
public class CustomMetricsService {private final MeterRegistry meterRegistry;private Counter customCounter;public CustomMetricsService(MeterRegistry meterRegistry) {this.meterRegistry = meterRegistry;customCounter = meterRegistry.counter("custom.operation.count");}public void incrementCustomCounter() {// 每次调用该方法时,计数器加 1customCounter.increment();}
}

3)计数器累加接口

创建一个控制器来触发自定义指标的更新

package pers.mobian.springbootactuatordemo.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import pers.mobian.springbootactuatordemo.indicator.CustomMetricsService;@RestController
public class CustomMetricsController {@Autowiredprivate CustomMetricsService customMetricsService;@GetMapping("/perform-operation")public String performOperation() {// 执行操作时,调用计数器增加方法customMetricsService.incrementCustomCounter();return "Operation performed and counter incremented.";}
}

4)浏览器访问

增加计数器:http://127.0.0.1:8080/perform-operation

查询计数指标::http://127.0.0.1:8080/actuator/metrics/custom.operation.count

5)定制指标过滤器

可以通过配置 MeterFilter`来过滤不需要的指标或者对指标进行重命名等操作。它会拒绝所有以 jvm. 开头的指标,这样这些指标就不会出现在 metrics 端点的响应中。

import io.micrometer.core.instrument.config.MeterFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MetricsConfig {@Beanpublic MeterFilter ignoreMetricsFilter() {return MeterFilter.denyNameStartsWith("jvm.");}
}

4、定制Endpoint端点

1)只读customEndpoint

  • @Component:将该类注册为 Spring Bean。
  • @Endpoint(id = “customEndpoint”):标记该类为一个 Actuator 端点,id 是端点的唯一标识符。
  • @ReadOperation:表示该方法是一个只读操作,用于返回端点的数据
package pers.mobian.springbootactuatordemo.indicator;import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.Map;@Component
@Endpoint(id = "customEndpoint")
public class CustomEndpoint {@ReadOperationpublic Map<String, String> customInfo() {Map<String, String> info = new HashMap<>();info.put("message", "This is a custom endpoint in Spring Boot 3.x.");info.put("version", "1.0");return info;}
}

2)读写端点advancedCustomEndpoint

package pers.mobian.springbootactuatordemo.indicator;import org.springframework.boot.actuate.endpoint.annotation.DeleteOperation;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestMapping;import java.util.HashMap;
import java.util.Map;@Component
@Endpoint(id = "advancedCustomEndpoint")
public class AdvancedCustomEndpoint {private final Map<String, String> data = new HashMap<>();@ReadOperationpublic Map<String, String> getData() {return data;}@WriteOperation@RequestMapping(consumes = MediaType.APPLICATION_JSON_VALUE)public void addData(String key, String value) {data.put(key, value);}@DeleteOperationpublic void deleteData(String key) {data.remove(key);}
}

使用jconsole发送写请求

浏览器访问,查询写入的数据

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

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

相关文章

python标识符

在 Python 中&#xff0c;标识符&#xff08;Identifier&#xff09;是指用来标识变量、函数、类、模块等的名称。标识符的命名规则如下&#xff1a; 1. 标识符的命名规则 字母、数字和下划线&#xff1a;标识符可以由字母&#xff08;a-z, A-Z&#xff09;、数字&#xff08;…

06 HarmonyOS Next性能优化之LazyForEach 列表渲染基础与实现详解 (一)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 目录 一、代码结构概览二、详细代码解析1. 数据源管理实现2. 数据结构定义3. 优化的列表项组件4. 主列表组件实现 一、代码结构概览 本文将详细解…

vscode 查看3d

目录 1. vscode-3d-preview obj查看ok 2. vscode-obj-viewer 没找到这个插件&#xff1a; 3. 3D Viewer for Vscode 查看obj失败 1. vscode-3d-preview obj查看ok 可以查看obj 显示过程&#xff1a;开始是绿屏&#xff0c;过了1到2秒&#xff0c;后来就正常看了。 2. vsc…

excel 斜向拆分单元格

右键-合并单元格 右键-设置单元格格式-边框 在设置好分割线后&#xff0c;你可以开始输入文字。 需要注意的是&#xff0c;文字并不会自动分成上下两行。 为了达到你期望的效果&#xff0c;你可以通过 同过左对齐、上对齐 空格键或使用【AltEnter】组合键来调整单元格中内容的…

家政保洁维修行业有没有必要做小程序?

【家政创业必看】家政行业小程序值得做吗&#xff1f;4大核心优势告诉你&#xff01; 随时随地下单&#xff1a;客户手机一键预约&#xff0c;告别找电话/翻页面的麻烦 品牌专业升级&#xff1a;精美界面服务详情用户评价&#xff0c;打造可信赖形象 营销神器&#xff1…

利用Python爬虫按图搜索1688商品(拍立淘)

在电商领域&#xff0c;按图搜索商品&#xff08;拍立淘&#xff09;已成为一种重要的功能&#xff0c;尤其适合用户通过图片快速查找相似商品。1688开放平台提供了按图搜索商品的API接口&#xff0c;允许开发者通过图片获取相关的商品信息。本文将详细介绍如何使用Python爬虫技…

20250305随笔 HTML2Canvas 详解与使用指南

1. 简介 html2canvas 是一个用于将 HTML 页面或特定 DOM 元素转换为 Canvas 画布的 JavaScript 库。它通过解析 HTML 和 CSS&#xff0c;生成等效的 Canvas 图像&#xff0c;从而实现网页截图功能。 2. 安装 可以使用 npm 或 yarn 安装 html2canvas&#xff0c;也可以通过 C…

【初探数据结构】链表OJ算法——哨兵位(合并两个有序链表详解)

文章目录 哨兵位&#xff08;Sentinel Node&#xff09;的作用实战演练思路讲解详细步骤1. **处理特殊情况&#xff08;边界条件&#xff09;**2. **创建哨兵节点**3. **初始化两个指针&#xff0c;遍历两个链表**4. **合并两个链表**5. **处理剩余节点**6. **返回合并后的链表…

libcoap在Ubuntu下的编译(基于CMake)

引言 libcoap 是一个开源的轻量级 C 语言库&#xff0c;用于实现 CoAP&#xff08;Constrained Application Protocol&#xff0c;受限应用协议&#xff09;。CoAP 是一种专为资源受限设备设计的轻量级通信协议&#xff0c;适用于物联网&#xff08;IoT&#xff09;和嵌入式系…

命名管道实现传递数据到二进制文件

一 前言&#xff1a; 在做项目的过程中&#xff0c;一般来说我们的信息输入是有固定的端口/来源的&#xff0c;但是在当前的越来越快的开发节奏下&#xff0c;往往会出现输入源还未完全确定的情况下需要我们先实现功能逻辑&#xff0c;信号接受端后面再对接。或者数据接受端和功…

VSCode知名主题带毒 安装量900万次

目前微软已经从 Visual Studio Marketplace 中删除非常流行的主题扩展 Material Theme Free 和 Material Theme Icons&#xff0c;微软称这些主题扩展包含恶意代码。 统计显示这些扩展程序的安装总次数近 900 万次&#xff0c;在微软实施删除后现在已安装这些扩展的开发者也会…

如何快速的解除oracle dataguard

有些时候&#xff0c;我们为了使oracle dg的standby库另做他用&#xff0c;需要解除oracle dataguard数据同步。我本地因为standby库存储出现故障&#xff0c;导致dg存在问题&#xff0c;故需要解除。今天&#xff0c;我们通过使用部分命令&#xff0c;实现dg的快速解除。 1&a…

Windows系统编程(七)HotFixHook

InoolineHook需要读写两次内存&#xff08;先HOOK&#xff0c;再还原&#xff09;&#xff0c;这种Hook方式&#xff0c;性能比较低&#xff0c;具有局限性。今天所讲的HotFixHOOK&#xff08;热补丁&#xff09;是InlineHook的升级版 Win32 API特殊性 Win32API的实现代码有这…

Python Web应用开发之Flask框架——基础

一、前言 在即将开启的 Flask 学习之旅中,为了能够顺利掌握并运用 Flask 进行 Web 开发,您需要具备一定的基础知识,同时了解相应的运行环境。 需要你具备的知识:Python 编程语言、HTML、CSS、HTTP协议、数据库(如:MySQL、MongoDB) 本文所使用的环境:操作系统Windows…

TCP通讯与基于C#TCP通讯,跨窗收发消息Demo

TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。它广泛应用于互联网中的数据通信&#xff0c;如网页浏览、文件传输、电子邮件等。以下是TCP通信的基本概念和工作原理&#xff1a; 1. TCP的特点 面向连接&#xff1a;通信前…

【有源码】仿DeepSeek问答网站+SpringBoot+VUE3+对接DeepSeek API

今天带来一款优秀的项目&#xff1a;仿DeepSeek问答网站。 功能和官网差不多&#xff0c;也有历史上下文&#xff0c;流失对话等。 本文介绍了系统功能与部署安装步骤&#xff0c;如果您有任何问题&#xff0c;也请联系学姐&#xff0c;偶现在是经验丰富的程序员&#xff01; …

Ubuntu20.04双系统安装及软件安装(七):Anaconda3

Ubuntu20.04双系统安装及软件安装&#xff08;七&#xff09;&#xff1a;Anaconda3 打开Anaconda官网&#xff0c;在右侧处填写邮箱&#xff08;要真实有效&#xff01;&#xff09;&#xff0c;然后Submit。会出现如图示的Success界面。 进入填写的邮箱&#xff0c;有一封Ana…

洛谷 P2142 高精度减法(详解)c++

题目链接&#xff1a;P2142 高精度减法 - 洛谷 1.题目 2.算法原理 解法:模拟列竖式计算的过程 先用字符串读入&#xff0c;然后拆分每一位&#xff0c;逆序放进数组中利用数组&#xff0c;模拟列竖式减法的过程 在这两步之前要多加一步&#xff0c;在模拟解法的过程&#…

在 MyBatis 中,若数据库字段名与 SQL 保留字冲突解决办法

在 MyBatis 中&#xff0c;若数据库字段名与 SQL 保留字冲突&#xff0c;可通过以下方法解决&#xff1a; 目录 一、使用转义符号包裹字段名二、通过别名映射三、借助 MyBatis-Plus 注解四、全局配置策略&#xff08;辅助方案&#xff09;最佳实践与注意事项 一、使用转义符号…

ThreadLocal解析

1. ThreadLocal的定义与核心作用 ThreadLocal是Java中用于实现线程局部变量的工具类。它为每个线程提供独立的变量副本&#xff0c;使得每个线程访问的是自己的数据&#xff0c;从而避免多线程环境下的资源共享问题&#xff0c;实现线程隔离。 例如&#xff0c;解决SimpleDate…