• SpringBoot3 Actuator使用如何以及自定义端点


    参考: https://www.yuque.com/leifengyang/springboot3/wsx0br0dalot1pqn

    作用: 对线上应用进行观测、监控、预警…
    比如:
    ● 健康状况【组件状态、存活状态】Health
    ● 运行指标【cpu、内存、垃圾回收、吞吐量、响应成功率…】Metrics
    ● 链路追踪

    1.使用

    1.场景引入

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-actuatorartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    2.暴露指标
    在application.properties里面进行设置

    #暴露所有端点信息  
    management.endpoints.web.exposure.include=*
    #以web方式暴露  
    management.endpoint.health.enabled=true
    
    • 1
    • 2
    • 3
    • 4

    3.访问数据
    ● 访问 http://localhost:8080/actuator;展示出所有可以用的监控端点
    ● http://localhost:8080/actuator/beans
    ● http://localhost:8080/actuator/configprops
    ● http://localhost:8080/actuator/metrics
    ● http://localhost:8080/actuator/metrics/jvm.gc.pause
    ● http://localhost:8080/actuator/endpointName/detailPath

    2.Endpoint

    常用端点: 默认提供了各种端点,来展示应用的详细信息
    包括看有多少线程及线程运行情况,生成堆dump等各种端点
    参考:
    https://www.yuque.com/leifengyang/springboot3/wsx0br0dalot1pqn?inner=u8Ebe

    3.如何自定义端点

    自定义HealthEndpoint和MetricsEndpoint

    3.1 HealthEndpoint

    1.自定义健康端点
    例如监控一个组件的状态,存活还是死亡
    方法: 实现HealthIndicator接口或者继承AbstractHealthIndicator来实现
    1)实现HealthIndicator接口–>类名必须以HealthIndicator结尾,并且实现HealthIndicator接口,spring boot就能够确定这个组件是用来监控的

    一句话总结下面的代码: 实现HealthIndicator接口的health方法,返回Health对象

    import org.springframework.boot.actuate.health.Health;
    import org.springframework.boot.actuate.health.HealthIndicator;
    import org.springframework.stereotype.Component;
    
    @Component
    public class MyHealthIndicator implements HealthIndicator {
    
        @Override
        public Health health() {
            int errorCode = check(); // perform some specific health check
            if (errorCode != 0) {
                return Health.down().withDetail("Error Code", errorCode).build();
            }
            return Health.up().build();
        }
    
    }
    
    //构建Health
    Health build = Health.down()
                    .withDetail("msg", "error service")
                    .withDetail("code", "500")
                    .withException(new RuntimeException())
                    .build();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    需要下面的配置来开启健康管理以及展示详细信息: application.properties里面进行配置:

    management.endpoint.health.show-details=always
    
    • 1

    2)继承AbstractHealthIndicator来实现

    例子: 自定义一个健康监控的端点来监控某个组件的健康状态
    一句话总结下面的代码: 继承AbstractHealthIndicator,实现里面的doHealthCheck方法,通过builder创建好Health对象

    /**
     * @author lfy
     * @Description
     * @create 2023-05-08 22:59
     *
     * 1、实现 HealthIndicator 接口来定制组件的健康状态对象(Health) 返回
     * 2、
     */
    @Component
    public class MyHahaHealthIndicator extends AbstractHealthIndicator {
    
        @Autowired
        MyHahaComponent myHahaComponent; // 要检查的组件,会从容器中找,自动注入进来
        /**
         * 健康检查
         * @param builder
         * @throws Exception
         */
        @Override
        protected void doHealthCheck(Health.Builder builder) throws Exception {
            //调用组件自定义的检查方法,来检查应用的状态
            int check = myHahaComponent.check();
            if(check == 1){
                //存活
                builder.up()
                        .withDetail("code","1000")
                        .withDetail("msg","活的很健康")
                        .withDetail("data","我的名字叫haha")
                        .build();
            }else {
                //下线
                builder.down()
                        .withDetail("code","1001")
                        .withDetail("msg","死的很健康")
                        .withDetail("data","我的名字叫haha完蛋")
                        .build();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    同样需要下面的配置来开启健康管理以及展示详细信息: application.properties里面进行配置:

    management.endpoint.health.show-details=always
    
    • 1

    3.2 MetricsEndpoint

    例子:自定义一个metric,来监控某个方法被调用了多少次?
    总结:自定义metric是通过注入的MeterRegistry实现,实现一个有参构造方法,参数是MeterRegistry,然后通过MeterRegistry里面提供的方法来实现,比如计数器counter

    @Component
    public class MyHahaComponent {
        Counter counter = null;
    
        /**
         * 注入 meterRegistry 来保存和统计所有指标
         * @param meterRegistry
         */
        public MyHahaComponent(MeterRegistry meterRegistry){ // 只有一个有参构造方法,参数自动从容器中找然后注入meterRegistry
            //得到一个名叫 myhaha.hello 的计数器
            //这个myhaha.hello会被展示在metrics中,通过这个指标就能得到hello方法被访问了多少次
            counter = meterRegistry.counter("myhaha.hello");
        }
        public  int check(){
            //业务代码判断这个组件是否该是存活状态
            return 1;
        }
    
        // hello被调用一次,就记一次数
        public void hello(){
            System.out.println("hello");
            // 调用一次就记一次数
            counter.increment();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    4.还可以整合Prometheus + Grafana来展示这些端点提供的数据

    大概得步骤是: 引入Prometheus 和 Grafana的场景,分别做一些配置,设置Prometheus数据源,配置Grafana监控面板
    https://www.yuque.com/leifengyang/springboot3/wsx0br0dalot1pqn

  • 相关阅读:
    【vtk学习笔记1】编译安装vtk9.2.6,运行官方例子
    链路预算仿真要求
    IE11 使用的 DOM API (MutationObserver)
    【C语言】模拟实现字符串库函数
    【中国知名企业高管团队】系列25:360
    极客打板——训练&测试
    2023转行要趁早!盘点网络安全的岗位汇总
    迷你高尔夫球场:伦敦休闲旅游好去处
    STM32CubeMX教程28 SDIO - 使用FatFs文件系统读写SD卡
    AIGC Midjourney 指令生成高清图像及参数提示词
  • 原文地址:https://blog.csdn.net/u011069294/article/details/134511441