SpringBoot 2.0 + Actuator 应用健康监控管理

2024-05-26 19:38

本文主要是介绍SpringBoot 2.0 + Actuator 应用健康监控管理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

springboot的Actuator提供了运行状态监控的功能,可以通过REST、远程Shell和JMX方式来查看。

 

引入Actuator

添加jar包依赖

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

添加配置信息

# 访问: localhost:8081/monitor/{name}
management:# actuator端口server:port: 8081endpoints:web:# 修改访问路径,2.0之前默认是/,2.0默认是/actuatorbase-path: /monitor# 开放所有页面节点 ,默认只开启了health、info两个节点exposure:include: "*"endpoint:health:# 显示健康具体信息,默认不会显示详细信息show-details: always

访问: http://localhost:8081/monitor 获取所有的健康监控接口地址

 

自定义api的访问路径

management:endpoints:web:path-mapping:health: /sys-healthinfo: /sys-info

 

自定义info接口信息

info:name:'@project.name@'encoding:'@project.build.sourceEncoding@'description:'@project.description@'version:'@java.version@'

访问: http://localhost:8310/actuator/info

pom文件中需添加如下依赖, 否则application.yaml使用**@XXX@**是无法获取pom中变量值的

<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><version>2.6</version><configuration><delimiters><delimiter>@</delimiter></delimiters><useDefaultDelimiters>false</useDefaultDelimiters></configuration></plugin></plugins>
</build>

 

自定义端点

自定义健康监测的端点

在原来内置的端点进行添加,访问的路径还是内置的路径

// 这里的name 就是默认健康节点的名称了
@Component("jaemon")
public class CustomHealthIndicator extends AbstractHealthIndicator {@Overrideprotected void doHealthCheck(Health.Builder builder) throws Exception {builder// 设置健康信息.withDetail("name", "jaemon").withDetail("version", "1.0.0").up().build();}
}

访问: http://localhost:8310/actuator/health

自定义健康端点方式

  • 继承AbstractHealthIndicator类
  • 实现 HealthIndicator接口

自定义全新端点

@Endpoint(id = "custom-endpoint")
@Configuration
public class CustomEndpoint {/** 计算单位换算类型 */private static final Map<String, Long> UNIT_TYPE = Maps.newHashMap();static {UNIT_TYPE.put("K", 1024L);UNIT_TYPE.put("M", 1024 * 1024L);UNIT_TYPE.put("G", 1024 * 1024 * 1024L);}@ReadOperationpublic Map<String, Object> endpoint() {Map<String, Object> map = Maps.newHashMap();MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean();map.put("堆内存", memorymbean.getHeapMemoryUsage());map.put("方法区内存", memorymbean.getNonHeapMemoryUsage());List<String> inputArgs = ManagementFactory.getRuntimeMXBean().getInputArguments();map.put("运行时设置的JVM参数", inputArgs);// 总的内存量long totle = Runtime.getRuntime().totalMemory();// 空闲的内存量long free = Runtime.getRuntime().freeMemory();// 最大的内存量long max = Runtime.getRuntime().maxMemory();Map<String, Long> params = ImmutableMap.of("totalMemory", totle,"freeMemory", free,"maxMemory", max);map.put("运行时内存情况", params);return map;}/*** @Selector 会将路径上的参数作为变量传递给操作方法** init约等于xms的值,max约等于xmx的值。used是已经被使用的内存大小,committed是当前可使用的内存大小(包括已使用的),committed >= used。committed不足时jvm向系统申请,若超过max则发生OutOfMemoryError错误*/@ReadOperationpublic Map<String, Object> select(@Selector String unitType) {long conversion = UNIT_TYPE.getOrDefault(unitType.toUpperCase(), 1L);Map<String, Object> map = Maps.newHashMap();// 堆内存MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean();// 方法区内存MemoryUsage heapMemoryUsage = memorymbean.getHeapMemoryUsage();long heapInit = heapMemoryUsage.getInit() / conversion;long heapCommitted = heapMemoryUsage.getCommitted() / conversion;long heapUsed = heapMemoryUsage.getUsed() / conversion;long heapMax = heapMemoryUsage.getMax() / conversion;Map<String, Long> heapMap = Maps.newHashMap();heapMap.put("init", heapInit);heapMap.put("committed", heapCommitted);heapMap.put("used", heapUsed);heapMap.put("max", heapMax);map.put("堆内存", heapMap);MemoryUsage nonHeapMemoryUsage = memorymbean.getNonHeapMemoryUsage();long noHeapInit = nonHeapMemoryUsage.getInit() / conversion;long noHeapCommitted = nonHeapMemoryUsage.getCommitted() / conversion;long noHeapUsed = nonHeapMemoryUsage.getUsed() / conversion;long noHeapMax = nonHeapMemoryUsage.getMax() / conversion;Map<String, Long> noHeapMap = Maps.newHashMap();noHeapMap.put("init", noHeapInit);noHeapMap.put("committed", noHeapCommitted);noHeapMap.put("used", noHeapUsed);noHeapMap.put("max", noHeapMax);map.put("方法区内存", noHeapMap);List<String> inputArgs = ManagementFactory.getRuntimeMXBean().getInputArguments();map.put("运行时设置的JVM参数", inputArgs);// 总的内存量long totle = Runtime.getRuntime().totalMemory();// 空闲的内存量long free = Runtime.getRuntime().freeMemory();// 最大的内存量long max = Runtime.getRuntime().maxMemory();Map<String, Long> params = ImmutableMap.of("totalMemory", totle / conversion,"freeMemory", free / conversion,"maxMemory", max / conversion);map.put("运行时内存情况", params);return map;}
}

访问地址:

http://localhost:8310/actuator/custom-endpoint

http://localhost:8310/actuator/custom-endpoint/{unitType}

注意

  • @EndPoint中的id不能使用驼峰法,需要以-分割
  • @Spring Boot会去扫描@EndPoint注解下的@ReadOperation, @WriteOperation, @DeleteOperation注解,分别对应生成Get/Post/Delete的Mapping。注解中有个produces参数,可以指定media type, 如:application/json等

 

metrics接口指标说明

JVM指标

参数参数说明是否监控监控手段重要度
jvm.memory.maxJVM最大内存
jvm.memory.committedJVM可用内存展示并监控堆内存和Metaspace重要
jvm.memory.usedJVM已用内存展示并监控堆内存和Metaspace重要
jvm.buffer.memory.usedJVM缓冲区已用内存
jvm.buffer.count当前缓冲区数
jvm.threads.daemonJVM守护线程数显示在监控页面
jvm.threads.liveJVM当前活跃线程数显示在监控页面;监控达到阈值时报警重要
jvm.threads.peakJVM峰值线程数显示在监控页面
jvm.classes.loaded加载classes数
jvm.classes.unloaded未加载的classes数
jvm.gc.memory.allocatedGC时,年轻代分配的内存空间
jvm.gc.memory.promotedGC时,老年代分配的内存空间
jvm.gc.max.data.sizeGC时,老年代的最大内存空间
jvm.gc.live.data.sizeFullGC时,老年代的内存空间
jvm.gc.pauseGC耗时显示在监控页面

TOMCAT指标

参数参数说明是否监控监控手段重要度
tomcat.sessions.createdtomcat已创建session数
tomcat.sessions.expiredtomcat已过期session数
tomcat.sessions.active.currenttomcat活跃session数
tomcat.sessions.active.maxtomcat最多活跃session数显示在监控页面,超过阈值可报警或者进行动态扩容重要
tomcat.sessions.alive.max.secondtomcat最多活跃session数持续时间
tomcat.sessions.rejected超过session最大配置后,拒绝的session个数显示在监控页面,方便分析问题
tomcat.global.error错误总数显示在监控页面,方便分析问题
tomcat.global.sent发送的字节数
tomcat.global.request.maxrequest最长时间
tomcat.global.request全局request次数和时间
tomcat.global.received全局received次数和时间
tomcat.servlet.requestservlet的请求次数和时间
tomcat.servlet.errorservlet发生错误总数
tomcat.servlet.request.maxservlet请求最长时间
tomcat.threads.busytomcat繁忙线程显示在监控页面,据此检查是否有线程夯住
tomcat.threads.currenttomcat当前线程数(包括守护线程)显示在监控页面重要
tomcat.threads.config.maxtomcat配置的线程最大数显示在监控页面重要
tomcat.cache.accesstomcat读取缓存次数
tomcat.cache.hittomcat缓存命中次数

CPU指标

参数参数说明是否监控监控手段重要度
system.cpu.countCPU数量
system.load.average.1mload average超过阈值报警重要
system.cpu.usage系统CPU使用率
process.cpu.usage当前进程CPU使用率超过阈值报警
http.server.requestshttp请求调用情况显示10个请求量最大,耗时最长的URL;统计非200的请求量重要
process.uptime应用已运行时间显示在监控页面
process.files.max允许最大句柄数配合当前打开句柄数使用
process.start.time应用启动时间点显示在监控页面
process.files.open当前打开句柄数监控文件句柄使用率,超过阈值后报警重要

 

接口端点说明

ID描述
auditevents公开当前应用程序的审核事件信息。需要AuditEventRepository bean
beans显示应用程序中所有spring bean的完整列表
caches公开可用的缓存
conditions显示在配置和自动配置类上评估的条件,以及它们匹配或不匹配的原因
configprops显示所有@ConfigurationProperties的整理列表
env显示Spring的可配置环境中公开属性。 ConfigurableEnvironment
flyway显示已应用的所有Flyway数据库迁移。需要一个或多个Flyway beans
health显示应用程序运行状况信息
httptrace显示HTTP跟踪信息(默认情况下,最后100个HTTP请求-响应交换)。需要HttpTraceRepository bean
info显示任意应用程序信息
integrationgraph显示了Spring集成图。需要依赖于spring集成核心
loggers显示并修改应用程序中记录器的配置
liquibase显示已应用的任何Liquibase数据库迁移,至少需要一个 Liquibase bean
metrics显示当前应用程序的“指标”信息
mappings显示所有@RequestMapping路径的整理列表
scheduledtasks显示应用程序中的计划任务
sessions允许从支持Spring会话的会话存储中检索和删除用户会话。需要使用Spring Session对响应式Web应用程序的支持时不可用
shutdown允许应用程序正常关闭。默认情况下禁用
threaddump执行线程转储
# 开启或关闭指定接口端点: management.endpoint.<id>.enabled
management:endpoint:shutdown:enabled: true

开启后, 访问: http://localhost:8310/actuator/shutdown 进行关闭应用程序(POST请求)

如果您的应用程序是web应用程序(Spring MVC、Spring WebFlux或Jersey),则可以使用以下附加端点:

ID描述
heapdump返回hprof堆转储文件
jolokia通过HTTP公开jmxbean(当Jolokia位于类路径上时,WebFlux不可用)。需要依赖jolokia core
logfile返回日志文件的内容(如果logging.file.name日志或者logging.file.path属性已设置)。支持使用HTTP范围头来检索日志文件的部分内容
prometheus以Prometheus服务器可以擦除的格式公开度量。需要micrometer-registry-prometheus`依赖

 

Reference

  • Spring Boot Actuator: Production-ready Features
  • SpringBoot2.0 Actuator 监控参数说明

这篇关于SpringBoot 2.0 + Actuator 应用健康监控管理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

基于Python+PyQt5打造一个跨平台Emoji表情管理神器

《基于Python+PyQt5打造一个跨平台Emoji表情管理神器》在当今数字化社交时代,Emoji已成为全球通用的视觉语言,本文主要为大家详细介绍了如何使用Python和PyQt5开发一个功能全面的... 目录概述功能特性1. 全量Emoji集合2. 智能搜索系统3. 高效交互设计4. 现代化UI展示效果

SpringCloud中的@FeignClient注解使用详解

《SpringCloud中的@FeignClient注解使用详解》在SpringCloud中使用Feign进行服务间的调用时,通常会使用@FeignClient注解来标记Feign客户端接口,这篇文章... 在Spring Cloud中使用Feign进行服务间的调用时,通常会使用@FeignClient注解

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

Java Spring 中的监听器Listener详解与实战教程

《JavaSpring中的监听器Listener详解与实战教程》Spring提供了多种监听器机制,可以用于监听应用生命周期、会话生命周期和请求处理过程中的事件,:本文主要介绍JavaSprin... 目录一、监听器的作用1.1 应用生命周期管理1.2 会话管理1.3 请求处理监控二、创建监听器2.1 Ser

JVisualVM之Java性能监控与调优利器详解

《JVisualVM之Java性能监控与调优利器详解》本文将详细介绍JVisualVM的使用方法,并结合实际案例展示如何利用它进行性能调优,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全... 目录1. JVisualVM简介2. JVisualVM的安装与启动2.1 启动JVisualVM2

Java如何从Redis中批量读取数据

《Java如何从Redis中批量读取数据》:本文主要介绍Java如何从Redis中批量读取数据的情况,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一.背景概述二.分析与实现三.发现问题与屡次改进3.1.QPS过高而且波动很大3.2.程序中断,抛异常3.3.内存消

SpringBoot使用ffmpeg实现视频压缩

《SpringBoot使用ffmpeg实现视频压缩》FFmpeg是一个开源的跨平台多媒体处理工具集,用于录制,转换,编辑和流式传输音频和视频,本文将使用ffmpeg实现视频压缩功能,有需要的可以参考... 目录核心功能1.格式转换2.编解码3.音视频处理4.流媒体支持5.滤镜(Filter)安装配置linu

在Spring Boot中实现HTTPS加密通信及常见问题排查

《在SpringBoot中实现HTTPS加密通信及常见问题排查》HTTPS是HTTP的安全版本,通过SSL/TLS协议为通讯提供加密、身份验证和数据完整性保护,下面通过本文给大家介绍在SpringB... 目录一、HTTPS核心原理1.加密流程概述2.加密技术组合二、证书体系详解1、证书类型对比2. 证书获

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe