๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒฟ Spring

[Spring Boot/RESTful] REST API Monitoring์„ ์œ„ํ•œ Actuator(+spring fox PathPatternParser ์ด์Šˆ)

by nitronium102 2022. 2. 18.

Actuator

ํ˜„์žฌ ๊ธฐ๋™ํ•˜๊ณ  ์žˆ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์‰ฝ๊ฒŒ monitoringํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ˜„์žฌ ์„œ๋ฒ„๊ฐ€ ๊ตฌ๋™ ์ค‘์ธ์ง€๋„ ํ™•์ธ ๊ฐ€๋Šฅ 

๊ธฐ๋ณธ ์ œ๊ณตํ•˜๋Š” ๋งํฌ๋ฅผ ๋ณ„๋„๋กœ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์ข‹๋‹ค.

 

Actuator ๊ตฌํ˜„

dependency ์ถ”๊ฐ€

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

์—๋Ÿฌ

Actuator๋Š” PathPatternParser๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€๋‚œ Swagger ์„ค์ •์—์„œ ํ—ˆ์šฉํ•ด์คฌ๋˜ yml ์„ค์ •์œผ๋กœ๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค.

org.springframework.context.ApplicationContextException: 
Failed to start bean 'documentationPluginsBootstrapper';

https://github.com/springfox/springfox/issues/3462

 

Spring 5.3/Spring Boot 2.4 support · Issue #3462 · springfox/springfox

If you enable the new PathPatternParser (https://spring.io/blog/2020/06/30/url-matching-with-pathpattern-in-spring-mvc), springfox fails with an NPE Details org.springframework.context.ApplicationC...

github.com

spring fox์—์„œ ์—…๋ฐ์ดํŠธ๋ฅผ ์•ˆ ํ•ด์„œ ์ƒ๊ธด ๋ฒ„์ „ ์ด์Šˆ๋กœ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์„ค์ •ํ•ด์ฃผ๋ฉด ๋œ๋‹ค. 

SwaggerConfig.java ์•ˆ์— bean ์„ค์ •ํ•ด์ฃผ๊ธฐ
@Bean
public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping
        (WebEndpointsSupplier webEndpointsSupplier, 
        ServletEndpointsSupplier servletEndpointsSupplier, 
        ControllerEndpointsSupplier controllerEndpointsSupplier, 
        EndpointMediaTypes endpointMediaTypes, 
        CorsEndpointProperties corsProperties, 
        WebEndpointProperties webEndpointProperties, 
        Environment environment) 
		{
	        List<ExposableEndpoint<?>> allEndpoints = new ArrayList();
	        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 = this.shouldRegisterLinksMapping(
            		webEndpointProperties, environment, basePath);
	        return new WebMvcEndpointHandlerMapping(
            		endpointMapping, webEndpoints, endpointMediaTypes, 
                    corsProperties.toCorsConfiguration(), 
                    new EndpointLinksResolver(allEndpoints, basePath), 
                    shouldRegisterLinksMapping, null);
	    }

	private boolean shouldRegisterLinksMapping(WebEndpointProperties webEndpointProperties,
   		 Environment environment, String basePath) 
         {
	        return webEndpointProperties.getDiscovery().isEnabled() 
            && (StringUtils.hasText(basePath) || 
            ManagementPortType.get(environment).equals(ManagementPortType.DIFFERENT));
	    }

๋งํฌ ์ ‘์†

http://localhost:8088/actuator

http://localhost:8088/actuator/health → ์„œ๋ฒ„๊ฐ€ ์ž‘๋™ ์ค‘์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

 

application.yml ์„ค์ •

์กฐ๊ธˆ ๋” ๋‹ค์–‘ํ•œ ํŒŒ์ผ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

# actuator ์„ค์ •
management:
  endpoints:
    web:
      exposure:
        include: "*"

 

๋Œ“๊ธ€