您的位置:首页 > 编程语言 > Java开发

Spring boot Actuator监控的使用

2018-02-07 17:17 253 查看
一、引入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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: