이전에 서버 모니터링을 위한 프로메테우스, 그라파나 사용법을 포스팅한적이 있다.
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 활용편
스프링 부트가 제공하는 액추에이터는 서비스에 문제가 없는지 모니터링하고 지표들을 심어서 감시하는 활동을 편리하게 사용하도록 해준다.
액추에이터의 핵심이다.
수많은 기능을 제공하지만,
그중 많이 사용하는 엔드포인트 사용을 중심으로 설명하겠다.
각각의 엔드포인트를 통해서 개발자는 애플리케이션 내부의 수 많은 기능을 관리하고 모니터링 할 수 있다.
management:
endpoint:
health:
show-details: always
요런식으로 db가 살아있는지 여부, (H2, isValid())
diskSpace 즉 디스크 공간도 알 수 있다.
현재 사진에서는 H2 데이터베이스를 사용했지만,
mongo, redis, db 등 수많은 헬스 기능들을 제공한다.
실무에서는, 문제가 되는 범위를 쉽게 캐치하고 줄여주는 역할을 해 준다.
@Bean
public InMemoryHttpExchangeRepository httpExchangeRepository() {
return new InMemoryHttpExchangeRepository();
}
해당 코드를 추가한 후, 어플리케이션을 실행시키고,
아래의 log 엔드포인트(아래의 loggers 에서 작성했다!)
/log를 들어간 후
다시
/actuator/httpexchanges를 들어가보면,
해당 요청을 보낸 기록이 남아있다.
요청을 통해 받아온 코드 (200), 걸린 시간(timaTaken) 기록도 볼 수 있다.
해당 기능은 단순하고 제한이 많아 개발시 사용할 것을 권한다.
실제 운영에선 핀포인트 zipkin같은 다른 기술을 사용하는 것이 좋다.
자바와 os 정보를 확인하기 위해서, yml에 다음 설정을 추가한다.
management:
info:
java:
enabled: true
os:
enabled: true
위와 같이 os 정보 (윈11), 자바 정보(java 17)를 알 수 있다!
@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 레벨로 변경된 것을 볼 수 있다.
/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
좋은 글 감사합니다.