스프링 부트 액추에이터(스프링 액추에이터
봄/봄 MVC 애플리케이션 작업을 진행 중인데 성능 메트릭을 추가하려고 합니다.Spring Boot Actuator를 발견했는데 훌륭한 솔루션인 것 같습니다.단, 어플리케이션은 Spring Boot 어플리케이션이 아닙니다.응용 프로그램은 기존 컨테이너 Tomcat 8에서 실행되고 있습니다.
다음과 같은 종속성을 추가했습니다.
// Spring Actuator
compile "org.springframework.boot:spring-boot-starter-actuator:1.2.3.RELEASE"
다음 구성 클래스를 만들었습니다.
@EnableConfigurationProperties
@Configuration
@EnableAutoConfiguration
@Profile(value = {"dev", "test"})
@Import(EndpointAutoConfiguration.class)
public class SpringActuatorConfig {
}
는 심지어 더하기까지 했다.@EnableConfigurationProperties
Stack Overflow 설정을 사용법엔드포인트가 아직 생성되지 않아 404를 반환합니다.
먼저 Spring Boot을 사용하지 않으면 Spring Boot Actuator를 사용할 수 없음을 명확히 합니다.
Spring Boot 없이는 할 수 없었던 것이 잘못입니다.그 방법의 예에 대해서는, @stefaan-neyts 의 회답을 참조해 주세요.
최소한의 Spring Boot 자동 구성을 사용하여 기본 SpringMVC 애플리케이션을 변환하는 방법을 보여 주는 샘플 프로젝트를 만들었습니다.
출처 : http://www.mkyong.com/spring-mvc/gradle-spring-mvc-web-project-example
변환 소스: https://github.com/Pytry/minimal-boot-actuator
dispatcher-servlet.xml 및 web.xml 파일을 완전히 삭제할 수도 있었지만 변경을 최대한 최소화하고 보다 복잡한 프로젝트 변환을 단순화하는 방법을 보여주기 위해 파일을 보관했습니다.
다음은 변환하기 위해 취한 단계 목록입니다.
변환 프로세스
- @SpringBootApplication 주석이 달린 Java 구성 파일 추가
- 응용 프로그램컨피규레이션파일을 기존 xml Configuration에 bean으로 추가합니다(콘텍스트스캔 직후에 추가).
뷰 리졸버를 응용 프로그램 Java 구성으로 이동합니다.
또는 application.properties에 접두사와 접미사를 추가합니다.그런 다음 응용 프로그램에 @Value를 삽입하거나 완전히 삭제하고 제공된 스프링 부트 뷰 해결 프로그램을 사용할 수 있습니다.나는 전자를 택했다.
spring context xml에서 기본 컨텍스트청취자를 삭제했습니다.
이건 중요해!스프링 부트에서는 이 기능이 제공되기 때문에 그렇지 않으면 "Error Listener Start" 예외가 발생합니다.
빌드 스크립트 종속성에 스프링 부트 플러그인 추가(그래들을 사용 중)
mainClassName 속성을 빌드 파일에 추가하고 빈 문자열로 설정합니다(실행 파일을 만들지 않음을 나타냄).
스프링 부트 액추에이터에 대한 종속성 수정
스프링 부츠 없이 액추에이터를 사용할 수 있습니다.이것을 pom.xml에 추가합니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.5.RELEASE</version>
</dependency>
다음으로 컨피규레이션클래스로
@Configuration
@EnableWebMvc
@Import({
EndpointAutoConfiguration.class , PublicMetricsAutoConfiguration.class , HealthIndicatorAutoConfiguration.class
})
public class MyActuatorConfig {
@Bean
@Autowired
public EndpointHandlerMapping endpointHandlerMapping(Collection<? extends MvcEndpoint> endpoints) {
return new EndpointHandlerMapping(endpoints);
}
@Bean
@Autowired
public EndpointMvcAdapter metricsEndPoint(MetricsEndpoint delegate) {
return new EndpointMvcAdapter(delegate);
}
}
다음으로 어플리케이션의 메트릭을 확인할 수 있습니다.
Spring Boot 기능을 사용하지 않고 Spring Boot 기능을 사용하는 것은 좋지 않지만 가능합니다.
예를 들어, 이 Java 설정에서는 Spring Boot을 사용하지 않고 Spring Boot Actuator Metrics를 사용할 수 있습니다.
import java.util.Collection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration;
import org.springframework.boot.actuate.autoconfigure.PublicMetricsAutoConfiguration;
import org.springframework.boot.actuate.endpoint.MetricsEndpoint;
import org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping;
import org.springframework.boot.actuate.endpoint.mvc.EndpointMvcAdapter;
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import({ EndpointAutoConfiguration.class, PublicMetricsAutoConfiguration.class })
public class SpringBootActuatorConfig {
@Bean
@Autowired
public EndpointHandlerMapping endpointHandlerMapping(Collection<? extends MvcEndpoint> endpoints) {
return new EndpointHandlerMapping(endpoints);
}
@Bean
@Autowired
public EndpointMvcAdapter metricsEndPoint(MetricsEndpoint delegate) {
return new EndpointMvcAdapter(delegate);
}
}
Maven 의존관계:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
<version>1.3.5.RELEASE</version>
</dependency>
답변은 이미 받아들여졌지만, 저는 제 경험을 업데이트하려고 생각했습니다.응용 프로그램을 스프링 부트로 변환하고 싶지 않았습니다.@SpringBootApplication
필요한 최소한의 코드를 언급한 다른 질문을 참조하십시오.
이미 Spring Boot Actuator 2.x가 있기 때문에 기존 Spring MVC 프로젝트에 액튜에이터를 포함시키는 방법은 다음과 같습니다.
@Configuration
@Import({
EndpointAutoConfiguration.class,
HealthIndicatorAutoConfiguration.class,
InfoEndpointAutoConfiguration.class,
HealthEndpointAutoConfiguration.class,
WebEndpointAutoConfiguration.class,
ServletManagementContextAutoConfiguration.class,
ManagementContextAutoConfiguration.class,
})
@EnableConfigurationProperties(CorsEndpointProperties.class)
class ActuatorConfiguration {
@Bean //taken from WebMvcEndpointManagementContextConfiguration.class
public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier,
ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier,
EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties,
WebEndpointProperties webEndpointProperties) {
List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
allEndpoints.addAll(webEndpoints);
allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
EndpointMapping endpointMapping = new EndpointMapping(webEndpointProperties.getBasePath());
return new WebMvcEndpointHandlerMapping(endpointMapping, webEndpoints, endpointMediaTypes,
corsProperties.toCorsConfiguration(),
new EndpointLinksResolver(allEndpoints, webEndpointProperties.getBasePath()));
}
@Bean
DispatcherServletPath dispatcherServletPath() {
return () -> "/";
}
}
포함시켰어요.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator-autoconfigure</artifactId>
<version>2.1.18.RELEASE</version>
</dependency>
(5.1.19)를 사용하고 있는 Spring 버전과의 호환성을 확보합니다.릴리스)
Prometheus a.k.a.의 메트릭을 사용하여 엔드포인트를 작성하는 것이 목표인 경우.OpenMetrics는 Spring 프레임워크와 호환되는 Prometheus JVM 클라이언트를 사용할 수 있습니다.
종속성 추가:
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_servlet</artifactId>
<version>0.16.0</version>
</dependency>
요청 메트릭을 수집하려면 첫 번째 필터로 추가합니다.web-app/WEB-INF/web.xml
:
<filter>
<filter-name>prometheusFilter</filter-name>
<filter-class>io.prometheus.client.filter.MetricsFilter</filter-class>
<init-param>
<param-name>metric-name</param-name>
<param-value>webapp_metrics_filter</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>prometheusFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
메트릭을 HTTP 엔드포인트로 표시하려면 servlet을 추가합니다.
<servlet>
<servlet-name>prometheus</servlet-name>
<servlet-class>io.prometheus.client.exporter.MetricsServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>prometheus</servlet-name>
<url-pattern>/metrics</url-pattern>
</servlet-mapping>
그런 다음 에 대한 메트릭을 볼 수 있습니다./metrics
엔드 포인트
시간이 흐른 후, 우리는 Spring 6, Spring Boot 3, 자카르타를 가지고 있다.EE를 기준으로 하지만, 사람들은 여전히 레거시 스프링 애플리케이션에 액추에이터를 추가하는 것을 고려하고 있습니다.작은 업데이트: 스프링 + 액추에이터(스프링 부트 없음)사실 큰 변화는 없습니다(그리고 이미 그 변화는 지적되었습니다).
의존관계
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>6.0.3</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator-autoconfigure</artifactId>
<version>3.0.1</version>
</dependency>
액추에이터 구성
@Configuration
@ImportAutoConfiguration({
EndpointAutoConfiguration.class,
WebEndpointAutoConfiguration.class,
ServletManagementContextAutoConfiguration.class,
ManagementContextAutoConfiguration.class,
HealthContributorAutoConfiguration.class,
InfoEndpointAutoConfiguration.class,
HealthEndpointAutoConfiguration.class,
HeapDumpWebEndpointAutoConfiguration.class,
ThreadDumpEndpointAutoConfiguration.class,
LoggersEndpointAutoConfiguration.class,
PrometheusMetricsExportAutoConfiguration.class,
})
@EnableConfigurationProperties(CorsEndpointProperties.class)
class ActuatorConfiguration {
@Bean //taken from WebMvcEndpointManagementContextConfiguration.class
public WebMvcEndpointHandlerMapping webEndpointServletHandlerMapping(WebEndpointsSupplier webEndpointsSupplier,
ServletEndpointsSupplier servletEndpointsSupplier, ControllerEndpointsSupplier controllerEndpointsSupplier,
EndpointMediaTypes endpointMediaTypes, CorsEndpointProperties corsProperties,
WebEndpointProperties webEndpointProperties) {
List<ExposableEndpoint<?>> allEndpoints = new ArrayList<>();
Collection<ExposableWebEndpoint> webEndpoints = webEndpointsSupplier.getEndpoints();
allEndpoints.addAll(webEndpoints);
allEndpoints.addAll(servletEndpointsSupplier.getEndpoints());
allEndpoints.addAll(controllerEndpointsSupplier.getEndpoints());
EndpointMapping endpointMapping = new EndpointMapping(webEndpointProperties.getBasePath());
return new WebMvcEndpointHandlerMapping(endpointMapping,
webEndpoints,
endpointMediaTypes,
corsProperties.toCorsConfiguration(),
new EndpointLinksResolver(allEndpoints, webEndpointProperties.getBasePath()),
true);
}
@Bean
DispatcherServletPath dispatcherServletPath() {
return () -> WebInitializer.APPLICATION_ROOT;
}
}
이 예에서는 maven jetty 플러그인에서 직접 실행할 수 있습니다(mvn jetty:run-war
).
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>11.0.13</version>
</plugin>
코드에 @springboot 주석을 삽입하지 않은 것이 실수입니다.@springboot ot을 추가하면 컴파일러에 의해 자동으로 부트 프로그램으로 간주되며 컴파일러에 필요한 의존관계 파일과 액튜에이터 의존관계 파일이 추가됩니다.
언급URL : https://stackoverflow.com/questions/29953157/spring-boot-actuator-without-spring-boot
'programing' 카테고리의 다른 글
Angularjs의 templateUrl을 사용하여 템플릿을 로드할 수 없습니다. (0) | 2023.03.18 |
---|---|
NodeJs - JWT 토큰에서 사용자 정보를 검색하시겠습니까? (0) | 2023.03.18 |
JPA를 사용하여 LocalDate를 유지하는 방법 (0) | 2023.03.18 |
ESLint - 구성 요소를 순수한 기능으로 작성해야 합니다(반응 선호/상태 없음 기능). (0) | 2023.03.18 |
서브 도메인에 대한 AJAX 콜은 사이트 간 스크립팅으로 간주됩니까? (0) | 2023.03.18 |