programing

스프링 부트 액추에이터(스프링 액추에이터

instargram 2023. 3. 18. 08:16
반응형

스프링 부트 액추에이터(스프링 액추에이터

봄/봄 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 {

}

는 심지어 더하기까지 했다.@EnableConfigurationPropertiesStack 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);
    }
}

다음으로 어플리케이션의 메트릭을 확인할 수 있습니다.

http://localhost: 8085/module

액튜타오르 끝점

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

반응형