当前位置: 首页 > article >正文

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;
    }

    @Override
    public 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 {

    @Override
    public 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() {
        // 每次调用该方法时,计数器加 1
        customCounter.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 {

    @Autowired
    private 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 {

    @Bean
    public 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 {

    @ReadOperation
    public 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<>();

    @ReadOperation
    public Map<String, String> getData() {
        return data;
    }

    @WriteOperation
    @RequestMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
    public void addData(String key, String value) {
        data.put(key, value);
    }

    @DeleteOperation
    public void deleteData(String key) {
        data.remove(key);
    }
}

使用jconsole发送写请求

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


http://www.kler.cn/a/573218.html

相关文章:

  • 4. Prometheus监控数据持久化
  • Spring Boot中对接Twilio以实现发送验证码和验证短信码
  • Redis 篇
  • flask 安装后不能识别
  • C# 类型转换
  • 2025中企出海解决方案:工博科技联合SAP构建AI赋能的全球化管理平台
  • vscode远程ssh链接服务器
  • 迷你世界脚本背包接口:Backpack
  • [内网安全] Windows 网络认证 — 基于挑战响应认证的 NTLM 协议
  • Python Pandas实现GROUP BY WITH CUBE和WITH ROLLUP的分类汇总功能
  • 【极客时间】浏览器工作原理与实践-2 宏观视角下的浏览器 (6讲) - 2.5 渲染流程(上):HTML、CSS和JavaScript,是如何变成页面的?
  • 辉视融合服务器方案:为小酒店行业铺垫未来智能化布局
  • 极限入门题解析
  • oracle服务器通过进程查找对应的sql语句
  • 软件工程----软件可靠性建模与管理
  • 代码随想录算法训练营 | 图论 | 孤岛总面积、沉没孤岛
  • ⭐算法OJ⭐跳跃游戏【动态规划 + 单调队列】(C++实现)Jump Game 系列 VI
  • 全栈(Java+vue)实习面试题(含答案)
  • 记Android12上一个原生bug引起的system_server crash
  • VS Code(Cursor)远程开发调试教程(超详细)