스프링 부트 어드민을 통한 애플리케이션 모니터링 및 메트릭 확장

스프링 부트 어드민을 활용한 시각화 모니터링 설정

스프링 부트의 Actuator 기능은 기본적으로 /health, /info 등의 엔드포인트를 제공하지만, 추가적인 운영 정보도 필요합니다. 예를 들어 현재 활성 세션 수, 동시 요청 수, 지연 시간 등 다양한 메트릭 데이터를 수집하고 시각화할 수 있어야 합니다. 이 글에서는 Spring Boot Admin을 사용해 애플리케이션 상태를 실시간으로 모니터링하는 방법과 사용자 정의 메트릭을 추가하는 과정을 다룹니다.

환경 준비

Spring Boot Admin은 GitHub 저장소에서 공개된 오픈소스이며, 스프링 부트 Actuator의 기능을 기반으로 간결한 웹 인터페이스를 제공합니다.

  1. start.spring.io를 통해 새로운 프로젝트 생성:
  • Group: org.sample.admin
  • Artifact: spring-boot-admin-web
  • Name: Spring Boot Admin Web
  • Description: Spring Boot Admin Web Application
  • Package Name: org.sample.admin
  • Type: Maven Project
  • Packaging: Jar
  • Java Version: 1.8
  • Language: Java
  • Spring Boot Version: 1.3.1
  1. Dependencies 섹션에서 Actuator 선택
  2. 프로젝트 생성 후 다운로드하여 IDE(예: IntelliJ IDEA)에서 열기
  3. pom.xml에 다음 의존성 추가:
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-server</artifactId>
    <version>1.3.2</version>
</dependency>
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-server-ui</artifactId>
    <version>1.3.2</version>
</dependency>
  1. 메인 클래스에 @EnableAdminServer 어노테이션 추가:
@SpringBootApplication
@EnableAdminServer
public class SpringBootAdminWebApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootAdminWebApplication.class, args);
    }
}
  1. application.properties 파일에 아래 설정 추가:
server.port=8090
spring.application.name=Spring Boot Admin Web
spring.boot.admin.url=http://localhost:${server.port}
spring.jackson.serialization.indent_output=true
endpoints.health.sensitive=false
  1. 애플리케이션 실행 후 로그 확인 → http://localhost:8090 접속 시 관리자 대시보드 확인 가능

대상 애플리케이션 연결

모니터링 대상 애플리케이션(예: BookPub)에 다음과 같이 구성합니다.

  1. db-count-starter 모듈에 DbCountMetrics 클래스 추가:
public class DbCountMetrics implements PublicMetrics {
    private final Collection<CrudRepository> repositories;

    public DbCountMetrics(Collection<CrudRepository> repositories) {
        this.repositories = repositories;
    }

    @Override
    public Collection<Metric<?>> metrics() {
        List<Metric<?>> result = new ArrayList<>();
        for (CrudRepository repo : repositories) {
            String repoName = DbCountRunner.getRepositoryName(repo.getClass());
            String metricKey = "counter.datasource." + repoName;
            result.add(new Metric<>(metricKey, repo.count()));
        }
        return result;
    }
}
  1. 자동 구성 설정 클래스에서 빈 등록:
@Bean
public PublicMetrics dbCountMetrics(Collection<CrudRepository> repositories) {
    return new DbCountMetrics(repositories);
}
  1. pom.xml에 클라이언트 의존성 추가:
<dependency>
    <groupId>de.codecentric</groupId>
    <artifactId>spring-boot-admin-starter-client</artifactId>
    <version>1.3.2</version>
</dependency>
  1. application.properties 설정:
spring.application.name=@project.description@
server.port=8080
spring.boot.admin.url=http://localhost:8090
  1. BookPub 애플리케이션 시작 후 http://localhost:8090에 접속 → 등록된 애플리케이션 목록 확인 가능

  2. 상세 정보 보기 → 'Details' 클릭 시 메트릭, 환경 변수, 설정 등 전체 정보 확인

메트릭 확장: Counter 및 Gauge 사용

스프링 부트는 CounterServiceGaugeService를 통해 사용자 정의 메트릭을 쉽게 구현할 수 있습니다.

1. 요청 횟수 카운팅 (Counter)

AOP를 활용해 컨트롤러 메서드 호출 횟수를 추적합니다.

  • pom.xml에 AOP 의존성 추가:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
  • Aspect 클래스 작성:
@Aspect
@Component
public class RequestCounterAspect {

    @Autowired
    private CounterService counterService;

    @Before("execution(* com.test.bookpub.controller.*.*(..))")
    public void incrementCallCount(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().toString();
        counterService.increment(methodName + ".invoked");
    }
}
  • application.properties에 AOP 활성화:
spring.aop.auto=true

호출 후 /metrics 엔드포인트에서 해당 메서드 호출 횟수 확인 가능

2. 응답 지연 시간 측정 (Gauge)

인터셉터를 통해 각 요청 처리 시간을 측정하고 시각화합니다.

@Around("execution(* com.test.bookpub.controller.*.*(..))")
public void measureLatency(ProceedingJoinPoint pjp) throws Throwable {
    long startTime = System.currentTimeMillis();
    pjp.proceed();
    long latency = System.currentTimeMillis() - startTime;
    gaugeService.submit(pjp.getSignature().toString(), latency);
}

이후 스프링 부트 어드민 웹 대시보드에서 특정 엔드포인트의 지연 시간 그래프를 확인할 수 있습니다.

로그 레벨 동적 조정

실시간 로그 레벨 변경을 원할 경우, Jolokia를 통해 JMX 접근을 허용해야 합니다.

  • pom.xml에 추가:
<dependency>
    <groupId>org.jolokia</groupId>
    <artifactId>jolokia-core</artifactId>
    <version>1.6.3</version>
</dependency>
  • src/main/resources/logback-spring.xml 파일 생성:
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <jmxConfigurator/>
</configuration>

이후 어드민 웹 인터페이스에서 LOGGING 탭에서 레벨 변경 가능

태그: spring-boot-admin Monitoring metrics actuator AOP

6월 24일 22:46에 게시됨