利用SpringBoot Actuator 来构造/health /info 等监控接口

2024-03-17 20:04

本文主要是介绍利用SpringBoot Actuator 来构造/health /info 等监控接口,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

当我们用K8S 部署微服务时, 很多时候需要调用 service的/health 等状态接口, 已确定container的运行状态是否健康。

而Spring boot Actuator 就是用来快速构造这些状态接口的工具




引入依赖

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




启用/health 和 /info 接口

management:endpoints:web:exposure:include: "info, health, loggers, env"base-path: /actuator

所有的接口介绍可以参考:
https://www.baeldung.com/spring-boot-actuators

/auditevents lists security audit-related events such as user login/logout. Also, we can filter by principal or type among other fields.
/beans returns all available beans in our BeanFactory. Unlike /auditevents, it doesn’t support filtering.
/conditions, formerly known as /autoconfig, builds a report of conditions around autoconfiguration.
/configprops allows us to fetch all @ConfigurationProperties beans.
/env returns the current environment properties. Additionally, we can retrieve single properties.
/flyway provides details about our Flyway database migrations.
/health summarizes the health status of our application.
/heapdump builds and returns a heap dump from the JVM used by our application.
/info returns general information. It might be custom data, build information or details about the latest commit.
/liquibase behaves like /flyway but for Liquibase.
/logfile returns ordinary application logs.
/loggers enables us to query and modify the logging level of our application.
/metrics details metrics of our application. This might include generic metrics as well as custom ones.
/prometheus returns metrics like the previous one, but formatted to work with a Prometheus server.
/scheduledtasks provides details about every scheduled task within our application.
/sessions lists HTTP sessions, given we are using Spring Session.
/shutdown performs a graceful shutdown of the application.
/threaddump dumps the thread information of the underlying JVM.




配置/health 接口的具体输出信息

默认/health 只会输出 status up or down, 如下

[gateman@manjaro-x13 ~]$ curl 127.0.0.1:8080/actuator/health
{"status":"UP"}

当我们在application.yml 加上下面配置后。

management:endpoint:health:show-details: always

会令到 /health 接口输出额外的components 信息:

{"status": "UP","components": {"diskSpace": {"status": "UP","details": {"total": 1038214316032,"free": 840063606784,"threshold": 10485760,"exists": true}},"ping": {"status": "UP"}}
}

这时, 我们可以额外 地从/health 接口知道ping 和 磁盘使用的信息。

其实 只要ping 和 diskSpace的状态任何1个status 为down, 这个/health的总status 就是down

但是通常来讲, 只考虑这两个子状态是不足够的。




增加BigQuery conneciton 状态

举个例子, 假如某个service 里面连接bigQuery, 我们需要在/health 接口加1个component , 去detect BQ 的connection 是否健康。 如果这个BQ connection 为Down, 则/health status 为down




增加1个类 for checking the BQ connection
@Component
@Slf4j
public class BigQueryHealthCheck {@Autowiredprivate BigQuery bigQuery;public boolean isBigQueryHealthy() {CompletableFuture<Boolean> future = CompletableFuture.supplyAsync(() -> {try {bigQuery.listDatasets();return true;} catch (Exception e) {log.error("Error in BigQueryHealthCheck...", e);return false;}});try {// set time out to 5 seconds,  to wait for the return of future object.return future.get(5, TimeUnit.SECONDS);} catch (InterruptedException | ExecutionException | TimeoutException e) {log.error("Timeout or error while checking BigQuery connection", e);return false;}}
}

这里使用了CompletableFuture 类来设置1个5秒 timeout, 只要5秒内连不上BQ, 则认为BQ connection down




再增加1个类 for 增加1个BQ connection component to /health 接口
@Component
public class BQHealthIndicator extends AbstractHealthIndicator {@Autowiredprivate BigQueryHealthCheck bigQueryHealthCheck;@Overrideprotected void doHealthCheck(Health.Builder builder) throws Exception {if (bigQueryHealthCheck.isBigQueryHealthy()) {//int i=1/0;builder.up();} else {builder.down();}}
}

注意这个类必须是1个bean, 而且类名的suffix 是 HealthIndicator

这样, 当我们再次测试/health 接口时, 就包括BQ connection的监测了!

{"status": "UP","components": {"BQ": {"status": "UP"},"diskSpace": {"status": "UP","details": {"total": 1038214316032,"free": 839953145856,"threshold": 10485760,"exists": true}},"ping": {"status": "UP"}}
}




配置/info 接口的具体输出信息

默认下 /info 接口是什么信息都没有输出的,只有1个空的对象{}

如果我们想把service name, version 等信息写进info 接口, 也不复杂。




把pom.xml 的version 写入application.yml

在spring boot 中, 获取pom.xml 里面的具体字段值没有那么简单。
相对地, 从application.yml 获取configuration item的值是很容易的。

幸运地, 有1个方法可以把pom.xml 的内容写入application.yml

pom:version: @project.version@

在application yml里加入上面两行即可




添加1个类for /info的信息输出
@Component
public class AppVersionInfo implements InfoContributor {@Autowiredprivate Environment environment;@Value("${pom.version}") // https://stackoverflow.com/questions/3697449/retrieve-version-from-maven-pom-xml-in-codeprivate String appVersion;@Overridepublic void contribute(Info.Builder builder) {builder.withDetail("app", "Sales API").withDetail("version", appVersion).withDetail("description", "This is a simple Spring Boot application to demonstrate the use of BigQuery in GCP.");}
}

效果:

{"app": "Sales API","version": "1.0-SNAPSHOT","description": "This is a simple Spring Boot application to demonstrate the use of BigQuery in GCP."
}

就是甘简单

这篇关于利用SpringBoot Actuator 来构造/health /info 等监控接口的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/820007

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖