Spring Boot Actuator详解

news2024/9/27 17:36:08

Actuator简介

什么是Spring Boot Actuator?

  • Spring Boot Actuator 模块提供了生产级别的功能,比如健康检查审计指标收集HTTP跟踪等,帮助我们监控和管理Spring Boot应用。
  • 这个模块是一个采集应用内部信息暴露给外部的模块,上述的功能都可以通过HTTP和JMX访问。
  • 因为暴露内部信息的特性,Actuator也可以和一些外部的应用监控系统整合(Prometheus, Graphite, DataDog等)。这些监控系统提供了出色的仪表板,图形,分析和警报,可帮助你通过一个统一友好的界面,监视和管理你的应用程序。
  • Actuator使用Micrometer与这些外部应用程序监视系统集成。这样一来,只需很少的配置即可轻松集成外部的监控系统。

Micrometer为Java 平台上的性能数据收集提供了一个通用的API,应用程序只需要使用Micrometer的通用API来收集性能指标即可。Micrometer会负责完成与不同监控系统的适配工作,这就使得切换监控系统变得很容易。对比Slf4j之于Java Logger中的定位

Endpoints介绍

Endpoints简介

Spring Boot提供了所谓endpoints(下文翻译为端点)用于外部系统应用程序进行访问和交互。
例如,/health端点提供了关于应用健康情况的一些基础信息。/metrics端点提供了一些有用的应用程序指标(JVM 内存使用、系统CPU使用等)。

Endpoints类型

Actuator模块本来就有的端点我们称之为原生端点。根据端点的作用的话,我们大概可以分为三大类:

  • 应用配置类: 获取应用程序中加载的应用配置、环境变量、自动化配置报告等与Spring Boot应用密切相关的配置类信息。
  • 度量指标类: 获取应用程序运行过程中用于监控的度量指标,比如:内存信息、线程池信息、HTTP请求统计等。
  • 操作控制类: 提供了对应用的关闭等操作类功能。

需要注意的就是:

  • 每一个端点都可以通过配置来单独禁用或者启动
  • 不同于Actuator 1.x,Actuator 2.x 的大多数端点默认被禁掉。 Actuator 2.x中的默认端点增加了/actuator前缀。默认暴露的两个端点为/actuator/health/actuator/info

Endpoints清单

此处使用的是SpringBoot 2.2.8版本,详情请查看Spring官方文件

EndpointHTTP方法描述
/actuatorGET查看有哪些Actuator endpoint是开放的
/actuator/auditeventGET显示应用暴露的审计事件 (比如认证进入、订单失败),需要搭配Spring Security使用,示例代码
/actuator/beansGET查看当前上下文中配置的所有的Bean
/actuator/conditionsGET该端点用来获取应用的自动化配置报告,其中包括所有自动化配置的候选项。同时还列出了每个候选项自动化配置的各个先决条件是否满足。所以,该端点可以帮助我们方便的找到一些自动化配置为什么没有生效的具体原因。
/actuator/configpropsGET查看注入带有@ConfigurationProperties类的properties配置的属性和值,prefix代表前缀
/actuator/env (常用)GET该端点与/configprops不同,它用来获取应用所有可用的环境属性报告。包括:环境变量、JVM属性、应用的配置配置、命令行中的参数(但是会自动过滤掉带有key、password、secret等关键字的properties的值,保护信息安全)
/actuator/flywayGET显示已应用的所有Flyway数据库迁移
/actuator/health (常用)GET查看当前SpringBoot运行的健康指标,值由HealthIndicator的实现类提供(所以可以自定义一些健康指标信息)
/actuator/heapdumpGET会自动生成一个JVM的堆文件
/actuator/infoGET展示了关于应用的一般信息,这些信息从编译文件比如META-INF/build-info.properties或者Git文件比如git.properties或者任何环境的property中获取。
/actuator/mappingsGET查看全部的endpoint(包含 Actuator 的),即路径列表
/actuator/metrics(常用)GET查看有哪些指标可以看(ex: jvm.memory.max、system.cpu.usage),使用/actuator/metrics/{metric.name}可以查看各指标的详细信息
/actuator/scheduledtasksGET查看定時任务的信息
/actuator/shutdownPOST唯一一个需要POST请求的endpoint,使应用程序正常关闭

更多详细的EndPoint可以查看:Spring Boot Actuator [监控与管理]

集成 Actuator

创建示例项目

我们先创建一个demo应用,可以通过Spring Initializr创建:
在这里插入图片描述

引入依赖

Maven

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

Gradle

dependencies {
    compile("org.springframework.boot:spring-boot-starter-actuator")
}

端点配置

默认暴露端点

我们可以通过以下配置,来配置通过JMX 和 HTTP 暴露的端点。

PropertyDefault
management.endpoints.jmx.exposure.exclude
management.endpoints.jmx.exposure.include*
management.endpoints.web.exposure.exclude
management.endpoints.web.exposure.includeinfo, healt

考虑到安全因素,Actuator默认只开放了/actuator/health/actuator/info这两个endpoint,如果要开放其他endpoint,需要额外在application.properties中进行设置。

暴露配置

① 打开所有的监控点

management:
  endpoints:
    enabled-by-default: true #暴露所有端点信息
    web:
      exposure:
        include: '*'  #以web方式暴露(不包含shutdown)

② 开放指定的endpoint

management:
  endpoints:
    enabled-by-default: true #暴露所有端点信息
    web:
      exposure:
        include: beans,mappings  # 如果指定多个端点,用","分开

③ 关闭指定的endpoint

management:
  endpoints:
    web:
      exposure:
        exclude: beans# 如果指定多个端点,用","分开
        include: *

exclude通常会跟include一起用,就是先include了全部,然后再exclude/actuator/beans这个endpoint。
④ 开放shutdown,需额外配置

management:
  endpoints:
    shutdown:
      enabled: true

路径配置

① 默认情况下所有端点都暴露在/actuator路径下,也可以改变/actuator的路径,可以自定义:

management:
  endpoints:
    web:
      base-path: /monitor

设置完重启后,原本內建的/actuator/xxx路径,都会变成/monitor/xxx,可以用来防止被其他人猜到。
② 支持单个endpoint路径定义,比如将health修改成healthcheck

management:
  endpoints:
    web:
      path-mapping:
        health: healthcheck

管理端口调整

management:
  server:
    port: 11011

自定义端口,默认跟server.port一样,可以防止被其他人猜到

端点响应缓存

对于一些不带参数的端点请求会自动进行缓存,我们可以通过如下方式配置缓存时间,下面配置表示 beans端点的缓存时间为100s

management:
  endpoint:
    beans:
      cache:
        time-to-live: 100s

端点保护

如果开启了Actuator默认不开放的endpoints,建议一定要加上Spring Security用于endpoint保护,避免重要信息泄露,必须防止未经授权的外部访问。

这里我们使用Spring Security保护,首先添加相关依赖:

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

添加之后,我们需要定义安全校验规则,来覆盖Spring Security的默认配置。
这里给出两个版本的模板配置:

import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
import org.springframework.boot.actuate.context.ShutdownEndpoint;
import org.springframework.boot.autoconfigure.security.servlet.PathRequest;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;


@Configuration
public class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter {

    /*
     * version1:
     * 1. 限制 '/shutdown'端点的访问,只允许ACTUATOR访问
     * 2. 允许外部访问其他的端点
     * 3. 允许外部访问静态资源
     * 4. 允许外部访问 '/'
     * 5. 其他的访问需要被校验
     * version2:
     * 1. 限制所有端点的访问,只允许ACTUATOR访问
     * 2. 允许外部访问静态资源
     * 3. 允许外部访问 '/'
     * 4. 其他的访问需要被校验
     */

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // version1
//        http
//                .authorizeRequests()
//                    .requestMatchers(EndpointRequest.to(ShutdownEndpoint.class))
//                        .hasRole("ADMIN")
//                .requestMatchers(EndpointRequest.toAnyEndpoint())
//                    .permitAll()
//                .requestMatchers(PathRequest.toStaticResources().atCommonLocations())
//                    .permitAll()
//                .antMatchers("/")
//                    .permitAll()
//                .antMatchers("/**")
//                    .authenticated()
//                .and()
//                .httpBasic();

        // version2
        http
                .authorizeRequests()
                .requestMatchers(EndpointRequest.toAnyEndpoint())
                    .hasRole("ADMIN")
                .requestMatchers(PathRequest.toStaticResources().atCommonLocations())
                    .permitAll()
                .antMatchers("/")
                    .permitAll()
                .antMatchers("/**")
                    .authenticated()
                .and()
                .httpBasic();
    }
}

application.properties的相关配置如下:

# Spring Security Default user name and password
spring.security.user.name=actuator
spring.security.user.password=actuator
spring.security.user.roles=ADMIN

我们使用浏览器访问http://localhost:8080/actuator/health端点接口,会先弹出个登录框,只有登录后才能访问。

定制Endpoint

定制化health信息

① 配置Health显示情况,详细界面显示配置

management:
    health:
      enabled: true
      show-details: always #总是显示详细信息。可显示每个模块的状态信息

② 定制Health Endpoint
添加信息:
1)继承 AbstractHealthIndicator 类
2)定义参数 Health.Builder builder
3)向参数 builder 中添加状态及相关信息

@Component
//类名截去HealthIndicator后,为显示时的组件名
public class MyComHealthIndicator extends AbstractHealthIndicator {
 
    //真实的检查方法
    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        // 获取链接进行测试
        Map<String, Object> map = new HashMap<>();
 
        //检查完成
        if (1 == 1) {
            //健康
            builder.status(Status.UP);
            map.put("count", 1);
        } else {
            //不健康
            builder.status(Status.OUT_OF_SERVICE);
            map.put("err", "连接超时");
            map.put("time", 3000);
        }
 
        builder.withDetail("code", 100)
               .withDetails(map);
    }
}

定制info信息

编写InfoContributor
1)继承 public class ExampleInfoContributor implements InfoContributor
2)定义 Info.Builder builder 参数
3)向builder中添加参数信息

@Component
public class ExampleInfoContributor implements InfoContributor {
 
    @Override
    public void contribute(Info.Builder builder) {
        builder.withDetail("msg", "你好")
               .withDetail("hello", "uclass")
               .withDetails(Collections.singletonMap("key", "value"));
 
    }
}

定制Metrics信息

① 利用service层构造器,在注册中心中添加cityService.saveCity.count指标

@Service
public class CityServiceImpl implements CityServices {
 
    @Autowired
    CityMapper cityMapper;
 
    Counter counter;
 
    //利用构造器,在注册中心中添加cityService.saveCity.count指标
    public CityServiceImpl(MeterRegistry meterRegistry) {
        //指标中心注册新的指标项
        counter = meterRegistry.counter("cityService.saveCity.count");
    }
 
    public void saveCity(City city) {
        counter.increment();
        cityMapper.insertCity(city);
    }
}

② 在配置类中新建配置,添加指标

@ServletComponentScan(basePackages = "com.uclass.thymeleaf")
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
    @Bean
    MeterBinder queueSize(Queue queue) {
        return (registry) -> Gauge.builder("queueSize", queue::size).register(registry);
    }
}
    //利用构造器,在注册中心中添加cityService.saveCity.count指标
    public CityServiceImpl(MeterRegistry meterRegistry) {
        //指标中心注册新的指标项
        counter = meterRegistry.counter("cityService.saveCity.count");
    }

自定义新端点

利用 @Endpoint(id = “myservice”) 注解

  • id属性代表新增的端点名称
  • 利用@ReadOperation、@WritOperation注解,在端点中添加信息
@Component
@Endpoint(id = "myservice")
public class MyServiceEndPoint {
 
    @ReadOperation
    public Map getDockerInfo () {
        //端点的读操作
        return Collections.singletonMap("dockerInfo", "docker start...");
    }
 
    @WriteOperation
    private void restartDocker(){
        System.out.println("docker restarted....");
    }
}

参考资料

SpringBoot 指标监控——Actuator
Spring boot——Actuator 详解

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

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

相关文章

react知识点整理

1、react hooks是用来做什么的? 加入hooks,让react函数组件更加的灵活 hooks之前,React存在很多问题: 1、组件间服用状态逻辑难2、复杂组件变的难以理解,高阶组件和函数组件的嵌套过深3、class组件的this问题4、难以记忆的生命周期hooks有: useState()useEffects()useR…

从头开始创建一个OData SAP Gateway Service

可能用到的事务代码&#xff1a;/IWFND/IWF_ACTIVATE – Activate / Deactivate SAP GatewaySEGW – SAP Gateway Service Builder/IWFND/MAINT_SERVICE – Activate and Maintain Services/IWFND/EXPLORER – Service Explorer/IWFND/GW_CLIENT – SAP Gateway Client/IWFND/S…

Android | 输入系统(IMS)

前言 一般情况下很多同学对于点击事件的认识都只存在于从 Activity 开始的&#xff0c;然后从 Window 中进行分发&#xff0c;甚至有些人可能也只知道 onTouchEvent 和 dispatchTouchEvetn 这几个方法&#xff0c;对于 View 层的了解都不属性。 自从对于应用层面的分发过程了…

logging日志模块详解

说到日志&#xff0c;无论是写框架代码还是业务代码都离不开日志的记录&#xff0c;其能给我们定位问题带来极大的帮助。 记录日志最简单的方式是在你想要记录的地方加上一句print。我相信无论是新手还是老鸟都经常这么干&#xff0c;在简单的代码或者小型项目中这么干一点问题…

这样吃才能有效补脑

核桃长得像大脑&#xff0c;还含有Ω-3&#xff0c;一直被认为补脑效果很好。但是现代科学研究发现&#xff0c;Ω-3并不是核桃专有的&#xff0c;很多坚果都有&#xff0c;所以核桃在补脑这方面并没有什么特殊功效。补脑其实就是维持大脑的正常工作&#xff0c;还要延缓大脑认…

SAP ADM100-Unit4 数据库工作原理:监控数据库

概览 除了执行数据备份之外,还需要对数据库进行大量的周期性检查。 课程目标 对数据库计划额外的周期性检查。 1、数据库定期监控 除了日常监控数据库备份外,还有大量的其他检查不得不定期执行。有的检查可以通过DBA Cockpit Planning Calendar来计划。 例如: 当存取数…

Mac电脑使用:查看本机已连接Wi-Fi密码的方法

前言 在使用Mac电脑的时候&#xff0c;电脑自身所连接成功的Wi-Fi一般都不显示密码&#xff0c;这是苹果出于安全考量的保护措施&#xff0c;但是有时候遇到新的设备想要连接已经连过的Wi-Fi&#xff0c;由于时间太久忘记Wi-Fi密码&#xff0c;这就需要查看一下电脑连接的Wi-Fi…

点击化学标记1817735-33-3,Pyrene-PEG5-propargyl,芘甲酰胺五聚乙二醇丙炔

Pyrene-PEG5-propargyl&#xff0c;芘甲酰胺-五聚乙二醇-丙炔Product structure&#xff1a;Pyrene-PEG5-propargyl结构式Product specifications&#xff1a;1.CAS No&#xff1a;1817735-33-32.Molecular formula&#xff1a;C30H33NO63.Molecular weight&#xff1a;503.64.…

终于有多位大神联手把计算机基础知识与操作系统讲清楚了

操作系统的定义 指的是控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff0c;以提供给用户和其他软件方便的接口和环境&#xff0c;它是计算机系统中最基本的系统软件。 计算机系统的层级结构 1、用户 应用程序 2、操…

vue前端框架课程笔记(三)

目录条件渲染v-ifv-show列表渲染关于:key列表过滤watch属性实现computed属性列表排序表单数据收集input是否配置value属性过滤器本博客参考尚硅谷官方课程&#xff0c;详细请参考 【尚硅谷bilibili官方】 本博客以vue2作为学习目标&#xff08;请勿混淆v2与v3的代码规范&…

Azure 语音用人工智能改变游戏开发的三种方式

通过 Azure 认知服务的智能语音功能[1]&#xff0c;用户可以使用语音 SDK 开发工具包快速构建支持语音交互的各种应用。将语音转录为准确的文本 &#xff08;STT&#xff0c;或语音识别&#xff09;或者将文本转换成生动的语音 &#xff08;TTS&#xff0c;或语言合成&#xff…

大数据NiFi(十五):NiFi入门案例二

文章目录 NiFi入门案例二 一、配置“GenerateFlowFile”处理器 1、拖拽“Processor”在弹框中输入“GenerateFlowFile” <

如何解决缓存雪崩、击穿、穿透难题?

缓存雪崩、缓存击穿和缓存穿透这三个问题是我们在使用redis做缓存的时候要面临的&#xff0c;一旦发生这三个问题&#xff0c;就会导致大量的请求都积压到了数据库层&#xff0c;有可能导致数据库宕机&#xff0c;进入导致整个系统不可用。 下边&#xff0c;具体看一下这三个问…

Qt扫盲-Qt资源系统概述

Qt资源系统概述一、概述二、资源文件(.qrc)三、外部二进制资源四、内嵌资源五、压缩资源文件六、在应用中使用资源七、使用Library 库中的资源一、概述 Qt资源系统是一种独立于平台的机制&#xff0c;用于在应用程序的可执行文件中存储二进制文件。如果您的应用程序总是需要一…

Spring Boot学习之集成Dubbo+Zookeeper小案例

文章目录一 框架搭建1. [Dubbozookeeper下载和安装](https://blog.csdn.net/yang2330648064/article/details/128790320)二 项目创建2.1 服务者部分2.2 消费者部分2.3 注意点2.3.1 在service的实现类中配置服务注解&#xff0c;发布服务&#xff01;注意导包问2.3.2 服务接口的…

[Vulnhub] DC-8

下载链接&#xff1a;https://download.vulnhub.com/dc/DC-8.zip 知识点&#xff1a; sqlmap 注入出用户名密码msfvenom 生成脚本msf反弹shellsuid-exim 提权 目录 <1> 信息搜集 <2> 反弹shell (1) 利用kali自带webshell代码 (2) msfvenom制作反弹shell脚本…

SaaS平台数据表单组件设计技巧分享

SaaS平台数据表单组件设计技巧分享&#xff0c;数据表单方法&#xff1a;固定表头、固定侧栏、自定义栏、分页器、过滤器、数据排序、多选项同时操作、简单且简约、普通的字体样式、项目链接、鼠标悬停设计指南&#xff0c;为大家提供有关数据表单设计的实用性建议。在实际的数…

20克拉默法则、逆矩阵、体积

本节是关于行列式的最后一课&#xff0c;主要包括按各方面&#xff1a;求逆矩阵、克莱姆法则和体积 求逆矩阵 A-1 早在之前&#xff0c;就已经了解过求解逆矩阵的方法&#xff1a;高斯-若尔当求逆法。高斯-若尔当求逆法对于数值计算无懈可击&#xff0c;但很难想象这是如何做…

Hadoop基础之《(6)—Hadoop单机伪集群安装》

一、安装JDK yum install java-1.8* 二、关闭防火墙 systemctl status firewalld systemctl stop firewalld systemctl disable firewalld 三、配置ip地址和主机名映射 vi /etc/hosts 加入&#xff1a; 192.168.1.1 hadoop001 四、配置免密登录 1、生成公私钥 ssh-key…

设计模式第5式:装饰器模式

前言 当我们初学编程时&#xff0c;扩展程序功能一般习惯使用继承&#xff0c;使用继承有一些缺点&#xff0c;那就是容易造成类爆炸&#xff0c;并且容易继承一些不需要的特性。当我们学习完装饰器模式后&#xff0c;会发现善用组合会有比继承更好的效果。 正文 1、咖啡馆案…