본문 바로가기
Spring Study/SpringBoot

[SpringBoot] Actuator

by 정재인 2023. 12. 6.

프로덕션 준비 기능이란?

개발자가 애플리케이션을 개발할 때 기능 요구사항만 개발하는 것은 아니다. 서비스를 실제 운영 단계에 올리게 되면 개발자들이 해야하는 또 다른 중요한 업무가 있다. 바로 서비스에 문제가 없는지 모니터링하고 지표들을 심어서 감시하는 활동들이다.

 

운영 환경에서 서비스할 때 필요한 이런 기능들을 프로덕션 준비 기능이라 한다.

 

즉, 애플리케이션이 현재 살아있는지, 로그 정보는 정상 설정 되었는지, 커넥션 풀은 얼마나 사용되고 있는지 등을 확인할 수 있어야 한다.

 

application.yml - 추가

management:
  endpoints:
    web:
      exposure:
        include: "*"

 


엔드포인트 설정 (endpoint)

엔드포인트를 사용하려면 2가지 과정이 모두 필요하다.

1. 엔드포인트 활성화: 해당 기능 자체를 사용할지 말지 on, off를 선택하는 것

2. 엔드포인트 노출: 활성화된 엔드포인트를 HTTP에 노출할지 JMX에 노출할지 선택

 

엔드포인트는 대부분 기본으로 활성화 되어있다. (shutdown 제외) 노출이 되어 있지 않을 뿐이다.

 

application.yml - 모든 엔드포인트를 웹에 노출

management:
  endpoints:
    web:
      exposure:
        include: "*"

 

 

application.yml - shutdown 엔드포인트 활성화

management:
  endpoint:
    shutdown:
      enable: true
  endpoints:
    web:
      exposure:
        include: "*"

 

 

다양한 엔드포인트

beans : 스프링 컨테이너에 등록된 스프링 빈을 보여준다.

conditions : condition 을 통해서 빈을 등록할 때 평가 조건과 일치하거나 일치하지 않는 이유를 표시한다.

configprops : @ConfigurationProperties 를 보여준다.

env : Environment 정보를 보여준다.

health : 애플리케이션 헬스 정보를 보여준다.

httpexchanges : HTTP 호출 응답 정보를 보여준다. HttpExchangeRepository 를 구현한 빈을 별도로

등록해야 한다.

info : 애플리케이션 정보를 보여준다.

loggers : 애플리케이션 로거 설정을 보여주고 변경도 할 수 있다.

metrics : 애플리케이션의 메트릭 정보를 보여준다.

mappings : @RequestMapping 정보를 보여준다.

threaddump : 쓰레드 덤프를 실행해서 보여준다.

shutdown : 애플리케이션을 종료한다. 이 기능은 기본으로 비활성화 되어 있다.

 


헬스 정보

헬스 정보를 사용하면 애플리케이션에 문제가 발생했을 때 문제를 빠르게 인지할 수 있다.

management:
  endpoint:
    health:
      show-details: always

 

JAVA, OS 정보

management:
  info:
    java:
      enabled: true
    os:
      enabled: true

 

 

Environment에서 info. 으로 시작하는 정보 출력

management:
  info:
    env:
      enabled: true
      
info:
  app:
    name: hello-actuator
    company: ji

 

 


로거(Logger)

loggers 엔드포인트를 사용하면 로깅과 관련된 정보를 확인하고, 실시간을 변경할 수 있다.

 

LogController

package hello.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class LogController {
    
    @GetMapping("/log")
    public String log() {
        log.trace("trace log");
        log.debug("debug log");
        log.info("info log");
        log.warn("warn log");
        log.error("error log");
        
        return "ok";
        } 
}

 

 

application.yml 설정

logging:
  level:
    hello.controller: debug

 

hello.controller 패키지와 그 하위는 debug 레벨을 출력하도록 설정

 

개발 서버는 보통 DEBUG 로그를 사용하지만, 운영 서버는 요청이 많다. 따라서 로그도 너무 많이 남기 때문에 운영서버는 중요하다고 판단되는 INFO 로그 레벨을 사용한다.

 

서비스 운영 중에 문제가 있어 DEBUG나 TRACE 로그를 남겨서 확인해야 한다면 위처럼 로깅 설정을 변경하고 서버를 다시 시작해야 한다. 

 


 

Actuator와 보안

Actuator가 제공하는 기능들은 애플리케이션의 내부 정보를 많이 노출한다. 따라서 외부 인터넷 망이 공개된 곳에 actuator의 엔드포인트를 공개하는 것은 좋은 방법이 아니다.

 

이를 해결하기 위해 actuator를 다른 포트에서 실행한다.

예를 들어 외부 인터넷 망을 통해 8080 포트에만 접근할 수 있고, 다른 포트는 내부망에서만 접근할 수 있도록 설정한다.

 

actuator 포트 설정

manaement.server.port=9292

 

엔드포인트 경로 변경

application.yml

management;
  endpoints:
    web:
      base-path: "/manage"

 

/actuator/{엔드포인트} 대신 /manage/{엔드포인트}로 변경된다.

댓글