SpringBoot Actuator监控组件笔记

目录

自定义EndPoint

/beans

/health

/loggers 

/info

/threaddump 


Actuator模块可以采集应用内部运行信息暴露给外部,帮助我们监控和管理Spring Boot 应用,功能例如健康检查,运行指标收集,HTTP 跟踪,日志级别等


#开放所有端点

management.endpoints.web.exposure.include=*


#开放指定端点

management.endpoints.web.exposure.include=beans

或者

management.endpoint.beans.enabled=true



#开放所有  &&  关闭某个

management.endpoints.web.exposure.exclude=beans

management.endpoints.web.exposure.include=*



默认情况下所有端点都暴露在“/actuator”路径下,可以自定义

#/actuator/xxx路徑,都变成/manage/xxx

management.endpoints.web.base-path=/manage


#管理端口调整

management.server.port=9999

今天记录我涉及的常用EndPoint,以后有用到其他的随时再记

GET/actuator查看有哪些 Actuator endpoint 是开放的,和对应的路径
GET/actuator/beans查看容器中的 bean
GET/actuator/health 查看当前应用指标情况,实现HealthIndicator可以自定义指标项
GET/actuator/loggers查看当前应用日志级别情况,可以运行时调整
GET/actuator/info

应用信息展示

GET/actuator/threaddump当前应用线程栈dump,同 jstack

自定义EndPoint

如下代码

@Endpoint注解 定义一个监控端点类,id就是路径(/actuator/myendpoint)

@Component 扫描并交给容器管理

@ReadOperation 代表GET请求处理方法 ,@WriteOperation代表POST请求处理方法

@Endpoint(id = "myendpoint")
@Component
public class MyEndPoint implements ApplicationContextAware {

    private ApplicationContext app;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.app = applicationContext;
    }

    @ReadOperation
    public Map<String, String> invokeGet() {
        Map<String, String> ret = new HashMap<>();

        // 自定义监控逻辑
        ret.put("type", "get");
        ret.put("status", "okk");
        ret.put("details", "nothing to do");
        return ret;
    }

    @WriteOperation
    public Map<String, String> invokePost() {
        Map<String, String> ret = new HashMap<>();

        // 自定义监控逻辑
        ret.put("type", "post");
        ret.put("status", "okk");
        ret.put("details", "nothing to do");
        return ret;
    }
}

加载所有EndPoint并由DispatcherServlet路由的源码位置:org.springframework.boot.actuate.autoconfigure.endpoint.web.servlet.WebMvcEndpointManagementContextConfiguration#webEndpointServletHandlerMapping

	@Bean
	@ConditionalOnMissingBean
	public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier,
			ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier,
			EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties,
			WebEndpointProperties webEndpointProperties, Environment environment) {
		List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();

        // 这里查询bean容器中所有注解了@Endpoint的类
		Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
		allEndpoints.addAll(webEndpoints);
		allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
		allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
		String basePath = webEndpointProperties.getBasePath();
		EndpointMapping endpointMapping = new EndpointMapping(basePath);
		boolean shouldRegisterLinksMapping = StringUtils.hasText(basePath)
				|| ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT);

        // WebMvcEndpointHandlerMapping继承了AbstractHandlerMethodMapping
        // 将每个Endpoint和其中的get/post方法封装为handlermethod,由springmvc在请求时路由
		return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes,
				corsProperties.toCorsConfiguration(), new EndpointLinksResolver(allEndpoints, basePath),
				shouldRegisterLinksMapping);
	}

/beans

返回当前应用所有父子容器中的bean信息,如下图

源码实现类为 org.springframework.boot.actuate.beans.BeansEndpoint,比较简单就是从ApplicationContext挨个取出BeanDefinition,把部分信息封装到Map返回

@Endpoint(id = "beans")
public class BeansEndpoint {

	private final ConfigurableApplicationContext context;

	public BeansEndpoint(ConfigurableApplicationContext context) {
		this.context = context;
	}

	@ReadOperation
	public ApplicationBeans beans() {
        // 循环把父子容器的bean信息放到map中返回
		Map<String, ContextBeans> contexts = new HashMap<>();
		ConfigurableApplicationContext context = this.context;
		while (context != null) {
			contexts.put(context.getId(), ContextBeans.describing(context));
			context = getConfigurableParent(context);
		}
		return new ApplicationBeans(contexts);
	}

	    private static Map<String, BeanDescriptor> describeBeans(ConfigurableListableBeanFactory beanFactory) {
			Map<String, BeanDescriptor> beans = new HashMap<>();
			for (String beanName : beanFactory.getBeanDefinitionNames()) {
				BeanDefinition definition = beanFactory.getBeanDefinition(beanName);
				if (isBeanEligible(beanName, definition, beanFactory)) {
					beans.put(beanName, describeBean(beanName, definition, beanFactory));
				}
			}
			return beans;
	    }
}

 

/health

各个组件的运行状况

内置了很多组件的检测器如下,

 也可以自定义实现其他组件的健康检测类

@Component
public class RocketMQHealthIndicator extends AbstractHealthIndicator {

    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        // 自定义逻辑

        // 展示信息
        builder.status(Status.UP);
        builder.withDetail("aaaa", "aaaa");
        builder.withDetail("bbbb", "bbbb");
        builder.withDetail("cccc", "cccc");
    }
}

/loggers 

查看当前应用日志级别情况,可以动态改变

如下应用层代码:

 首先访问/actuator/loggers路径,可以得到如下结果,目前日志级别是INFO

 

执行输出test111方法如图:

访问POST请求如下,可以动态改变日志级别,改为DEBUG级别

 访问后再次执行test111方法如图:无需重启应用,非常方便生产环境使用

 

/info

自定义显示程序信息,有两种方式定制 info 信息

一种就是在application.properties配置文件中配置如下:

访问端点返回如下

 

另一种代码形式,实现InfoContributor接口

 

/threaddump 

与jstack工具一样,展示当前应用所有线程堆栈

 

Spring Boot 是基于 Spring 框架的一个快速开发框架,它能够简化 Spring 应用的初始化过程、开发和部署,提高开发效率。下面是 Spring Boot 的学习笔记: ## 1. Spring Boot 简介 Spring BootSpring 家族的一个全新的框架,它的设计目的是为了快速开发基于 Spring 的应用程序。 Spring Boot 采用了约定大于配置的原则,通过自动配置、快速开发、可插拔的特性,让开发者可以更加专注于业务逻辑。 ## 2. Spring Boot 的优点 - 简化配置:Spring Boot 通过自动配置的方式,避免了繁琐的配置。 - 快速开发:Spring Boot 集成了很多常用的框架和工具,使得开发过程更加快速。 - 易于部署:Spring Boot 可以将应用程序打包成 jar 包或 war 包,方便部署和运行。 - 微服务支持:Spring Boot 对于微服务的支持非常好,可以使用 Spring Cloud 进行服务治理。 ## 3. Spring Boot 的核心原理 Spring Boot 的核心原理是通过自动配置和约定大于配置来简化开发过程。 自动配置是指 Spring Boot 会根据项目的依赖和配置,自动为项目进行配置。开发者只需要添加相应的依赖,就可以使用相应的功能,无需进行繁琐的配置。 约定大于配置是指 Spring Boot 对于一些常见的配置,采用一些约定的方式进行配置。开发者只需要按照约定的方式进行开发,就可以使用相应的功能。 ## 4. Spring Boot 的常用注解 - @SpringBootApplication:Spring Boot 应用程序的入口,同时也是 Spring 的配置文件。 - @RestController:用于定义 RESTful 接口的控制器。 - @RequestMapping:用于定义请求的 URL 和请求方法。 - @Autowired:用于自动注入依赖。 - @Value:用于获取配置文件中的属性值。 ## 5. Spring Boot 的常用组件 - Spring MVC:用于定义 RESTful 接口和处理请求。 - Spring Data:用于简化数据库操作。 - Spring Security:用于实现安全认证和授权。 - Spring Boot Actuator:用于监控和管理应用程序。 ## 6. Spring Boot 的开发步骤 - 创建 Spring Boot 项目。 - 添加项目依赖。 - 编写业务代码。 - 运行项目。 ## 7. Spring Boot 的部署方式 - 打包成 jar 包,使用 java -jar 命令运行。 - 打包成 war 包,部署到 Tomcat 或其他 Servlet 容器中。 ## 8. Spring Boot监控和管理 Spring Boot Actuator 提供了一系列的监控和管理功能,包括健康检查、性能监控、日志记录等。可以通过 HTTP 接口或 JMX 进行访问和管理。 ## 9. Spring Boot 的测试 Spring Boot 提供了很好的测试支持,可以使用 JUnit 进行单元测试和集成测试。同时也可以使用 Spring Boot Test 提供的测试框架进行测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值