Spring Boot Actuator

꾸준하게 달리기~·2023년 7월 31일
0

스프링 + 자바

목록 보기
9/20

들어가기 앞서

이전에 서버 모니터링을 위한 프로메테우스, 그라파나 사용법을 포스팅한적이 있다.
https://velog.io/@dlsrjsdl6505/Spring-%EA%B8%B0%EB%B0%98-Prometheus-Grafana%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81

그럼, 이제 서버의 CPU, 메모리, 커넥션 풀 등 상태를 시각적으로 알게 됐는데,

그 자세한 내용은 액츄에이터 선에서 어떻게 알 수 있을까?
해당 내용을 Spring Boot Actuator으로 알려주려고 한다!

액추에이터 의존성이 추가되었다는 가정 하에 설명하겠습니다!

implementation 'org.springframework.boot:spring-boot-starter-actuator'

참고 : 김영한님 spring boot 활용편



actuator란?

스프링 부트가 제공하는 액추에이터는 서비스에 문제가 없는지 모니터링하고 지표들을 심어서 감시하는 활동을 편리하게 사용하도록 해준다.



Actuator가 제공하는 다양한 엔드포인트

액추에이터의 핵심이다.
수많은 기능을 제공하지만,
그중 많이 사용하는 엔드포인트 사용을 중심으로 설명하겠다.

각각의 엔드포인트를 통해서 개발자는 애플리케이션 내부의 수 많은 기능을 관리하고 모니터링 할 수 있다.



엔드포인트 목록

  • health : 애플리케이션 헬스 정보를 보여준다.
    애플리케이션에 문제가 발생하면, 빠르게 인지할 수 있다.
    db 상태, 디스크 사용량, 애플리케이션이 응답하는지 등의 다양한 정보 포함되어 만들어진다.
    더 자세한 헬스 정보는 yml에 다음 설정을 추가한다.
management:
 endpoint:
   health:
     show-details: always

요런식으로 db가 살아있는지 여부, (H2, isValid())
diskSpace 즉 디스크 공간도 알 수 있다.
현재 사진에서는 H2 데이터베이스를 사용했지만,
mongo, redis, db 등 수많은 헬스 기능들을 제공한다.
실무에서는, 문제가 되는 범위를 쉽게 캐치하고 줄여주는 역할을 해 준다.




  • httpexchanges : HTTP 호출 응답 정보를 보여준다. HttpExchangeRepository 를 구현한 빈을 별도로
    등록해야 한다.
    해당 정보를 보여주기 위해,
    InMemoryHttpExchangeRepository 빈을 Main Appilcation 클래스 안에 추가해준다.
@Bean
 public InMemoryHttpExchangeRepository httpExchangeRepository() {
 	return new InMemoryHttpExchangeRepository();
 }

해당 코드를 추가한 후, 어플리케이션을 실행시키고,
아래의 log 엔드포인트(아래의 loggers 에서 작성했다!)
/log를 들어간 후

다시
/actuator/httpexchanges를 들어가보면,

해당 요청을 보낸 기록이 남아있다.

요청을 통해 받아온 코드 (200), 걸린 시간(timaTaken) 기록도 볼 수 있다.

해당 기능은 단순하고 제한이 많아 개발시 사용할 것을 권한다.
실제 운영에선 핀포인트 zipkin같은 다른 기술을 사용하는 것이 좋다.




  • info : 애플리케이션 정보를 보여준다.
    자바 런타임 정보, os 정보, 빌드 정보, git정보 등을 제공한다.
    단,
    빌드 정보와 깃 정보는, 해당 정보를 위한 설정파일이 필요하다. (git.properties, META-INF/build-info.properties)

자바와 os 정보를 확인하기 위해서, yml에 다음 설정을 추가한다.

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

위와 같이 os 정보 (윈11), 자바 정보(java 17)를 알 수 있다!




  • loggers : 애플리케이션 로거 설정을 보여주고 변경도 할 수 있다.
    해당 내용을 알아보기 위해, LogController을 생성한다.
@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";
    }
}

actuator/loggers에 접속하면, 처음에는

사진과 같이 info 로그와 그보다 더 위험한 레벨의 로그만 나오도록 작성되어있다. (기본값)
하지만 여기서,
더 많은 로그를 볼 수 있도록 yml에 설정을 추가한다.

logging:
  level:
    hello.controller: debug # 헬로 컨트롤러의 하위 친구들의 로그 정보는, 디버그부터 보여줘잉!

설정 후, 다시 actuator/loggers에 접속하면, 로그를 기록할지 말지를 결정하는 로깅의 레벨이 변한 것을 볼 수 있다.

(이전엔 info 레벨부터 보여줬는데, 이후엔 설정으로 인해 debug 레벨의 로그부터 보여준다.)

즉, 해당 정보를 보고 아, 이 어플리케이션은 로그 정도를 이정도로 설정했구나! 를 알 수 있다.

그런데, 보통 서버는 서버 운영에 있어 너무 높지도 않고 낮지도 않은 INFO 레벨의 로그를 사용한다. 만약 서버 운영중 확인해야 할 사항이 있어 해당 레벨을 변경해야 한다면? loggers 엔드포인트를 통해 운영중인 서버를 다시 시작하지 않고 실시간으로 레벨을 변경할 수 있다.

사진과 같이 컨트롤러를 지정하고 POST요청을 보내면 된다.
(해당 경로 하위 있는 컨트롤러들 로깅 레벨 TRACE로 변경해달라는 요청)

그 결과 어플리케이션을 종료하지 않고도
TRACE 레벨로 변경된 것을 볼 수 있다.




  • metrics : metrics 엔드포인트에서 actuator에서 제공되는 메트릭들을 확인할 수 있다.

/actuator/metrics 엔드포인트에서 아래와 같이

수많은 메트릭들을 볼 수 있고,
그중에서 대표적으로 jvm.memory.used 를 붙여

현재 메모리 사용량 (106954592 바이트) 도 볼 수 있다.
아래의 태그 필터들을 선택하여 더 자세하게 들어가면,
(tag=KEY:VALUE 방식)


이런식으로 사용중인 메모리에서 힙메모리 영역(26577008 바이트)만 따로 볼 수 도 있다.

지금 보여준 내용은 메트릭중 jvm 메모리라는 하나의 예시이고,
/actuator/metrics/.... 하위로
각자 다른 엔드포인트를 지정하여 어플리케이션에 대한 다양한 정보를 알 수 있다.

JVM 메트릭 (jvm. 메모리, 스레드, 등의 정보)

시스템 메트릭 (system. CPU지표, 가동 시간, 디스크 공간 등의 정보)

애플리케이션 시작 메트릭 (application. 시작시간, 요청처리시간 등의 정보)

스프링 MVC 메트릭 (http.server.requests MVC 컨트롤러가 처리하는 정보)

톰캣 메트릭 (tomcat.threads.busy, tomcat.threads.config.max 각각 바쁘게 동작하는 스레드와, 최대 동작 가능 스레드의 정보를 알려주고, 해당 내용을 실무에서 많이 사용한다.)

데이터 소스 메트릭 (jdbc.connections. 데이터소스, 커넥션 풀에 대한 정보)

로그 메트릭 (logback.events?tag=level:error 과 같이 tag=KEY:VALUE 방식을 사용하여 특정 레벨에 대한 로그를 볼 수 있다. 위 예시는, 에러로그를 보여주도록 설정하여 에러로그가 늘어난다면 서버에 문제가 생긴 것을 인지할수 있다.)

등등을 알 수 있다.

+ 핵심 비즈니스에 대해선, 사용자 정의 매트릭스도 가능하다!
그리고, 우리는 지금껏 actuator에서 어떤 정보를 알기 위해, .을 사용하며 정보를 지정했다. (ex - http.server.requests)

위와 같이 actuator에서 메트릭을 수집한 후 prometheus와 같은 다른 모니터링 툴이 actuator이 수집한 메트릭을 이해할 수 있도록 해주는 역할이 마이크로미터이다.
액추에이터 : http.server.requests
마이크로미터가 변형
프로메테우스 : http_server_requests
이런 방식이다.




전체 엔드포인트는 다음 공식 메뉴얼을 참고하자.
https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.endpoints

profile
반갑습니다~! 좋은하루 보내세요 :)

1개의 댓글

comment-user-thumbnail
2023년 7월 31일

좋은 글 감사합니다.

답글 달기