Spring boot Actuator监控的使用

一、引入springboot依赖包

项目用maven构建,依赖包:

<!-- actuator监控 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
   <version>1.5.3.RELEASE</version>
</dependency>
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
   <version>1.5.3.RELEASE</version>
</dependency>
二、使用Actuator原生的EndPoints

在引入这两个依赖包时,重启项目可以在启动日志里看到如下信息:


这边就可以看到Actuator已经帮我建立了这些映射,我们可以直接通过http的方式去访问这些端点,比如:


这个/health端点就是Actuator原生提供的,具体有哪些端点,可以参见官方文档:

https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#production-ready

具体说一下这个环节:

1、Actuator可以有自己专属的端口,可以和项目服务端口区分开来,如果不指定,默认的就是我们的服务端口。

management.port=8081
2、一般来说安全权限要放开,否则所有需要鉴权的端点就无法访问

management.security.enabled=false

3、访问地址

这里可以指定Actuator端点的统一前缀,比如/security/health:

management.context-path=/security

三、自定义Health端点

这里我们需要自定义一个实现类去实现Health端点的HealthIndicator接口,实现其中的health方法,如下:

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;

@Component
public class CustomHealth implements HealthIndicator {

    @Override
    public Health health() {
        return Health.up()
                .withDetail("client", "100")
                .withDetail("HttpCode","200")
                .withDetail("service","503")
                .build();
    }
}
解释一下:

这里的自定义实现类首先要加上@Component注解,这样就可以让spring自动扫描到,也可以通过其它方式。health方法中,最终返回的是一个Health对象,每一个Health对象中都有一个status属性,文中就是用up()方法去指定它的status是up状态,查看了一下源码,如下:


一共有四种状态可以使用,unknown、up、down、out_of_service。指定完status后,就可以使用withDetail方法去添加一些想要的信息,是以一种key-value的形式呈现,它返回的是Health类里的内部类Builder对象,最终通过build方法返回一个属性为当前Builder对象的Health对象。最终效果:


这个“customHealth”就是刚刚我们自定义的health节点,原生的信息可以继续保留。

四、使用自定义的endpoint

首先自定义一个实现类去实现Endpoint接口,如下:

public class CustomEndpoint implements Endpoint<TestEndpointModel>{


    /**
     * id是自定义endpoint唯一标识,也是映射名称
     * @return
     */
    @Override
    public String getId() {
        return "test";
    }

    /**
     * 设置此endpoint能否使用
     * @return
     */
    @Override
    public boolean isEnabled() {
        return true;
    }

    /**
     * 设置此endpoint是否需要安全保证,一般为false
     * @return
     */
    @Override
    public boolean isSensitive() {
        return false;
    }

    /**
     * 处理方法,
     * 最终返回的信息,
     * Endpoint接口支持范型,范型的类型就是invoke返回的类型,不指定就是Object类型
     * @return
     */
    @Override
    public TestEndpointModel invoke() {
        TestEndpointModel m = new TestEndpointModel();
        m.setName("ye");
        m.setTime(new Date());
        return m;
    }
}

自定义实现类所用到的实体类:

public class TestEndpointModel {

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date time;

    private String name;

    public Date getTime() {
        return time;
    }

    public void setTime(Date time) {
        this.time = time;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "TestEndpointModel{" +
                "time=" + time +
                ", name='" + name + '\'' +
                '}';
    }
}

各个实现方法的作用参见文中注释。还需要一个配置类,在配置类中指定自定义的端点,如下:

/**
 * 自定义endpoint配置类
 */
@Configuration
public class EndPointAutoConfig {

    @Bean
    public CustomEndpoint customEndpoint() {
        return new CustomEndpoint();
    }
}
首先配置类EndPointAutoConfig要加上@Configuration注解, @Configuration注解 相当于传统的xml 配置文件,可以替代xml的配置。然后再定义一个customEndpoint方法,方法的返回就是我们上面定义的自定义端点,这个方法需要加上@Bean注解,用@Bean注解等价于xml中配置的bean,最终效果如下:


访问的地址就是上面自定义端点类的id属性,返回了自定义的model。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值