Spring Boot Actuator + Docker + Prometheus

Yoon Soojeong·2025년 12월 1일
post-thumbnail

00. 전체 핵심 맥락

"운영되는 시스템을 볼 수 있어야 한다!"

-> 그것이 Actuator 이고
-> 그걸 수집하는 것이 Prometheus이며
-> 그걸 보기 좋게 만드는 것이 Grafana이다.
-> 운영 환경에서는 이것들이 없으면 서비스 운영이 안됨...


01. Spring Boot Actuator = "계기판"

: 자동차를 운전할 때 속도, 연비, 엔진온도 등을 모르고 운전하면 사고가 나듯
서비스 운영도

  • CPU
  • Memory
  • Thread
  • API 응답 속도
  • DB 연결 수
  • 에러 개수

이것들을 모르면 장애가 난다.
Actuator는 이걸 노출하는 역할만 하는 것!
수집/저장은 Prometheus가 한다.


02. actuator/health

  1. "헬스체크란?"
    서비스가 살아있는지, 정상적으로 일하는지 자동으로 감지하는 기능.
    로드밸런서(Nginx등등)가 주로 사용한다.

  2. "Actuator 엔드포인트가 기본 비활성화인 이유?"

    • 보안 문제
    • DB 상태, 메모리 상태를 외부에 공개하면 큰일 남
    • 그래서 management.endpoints.web.exposure 로 제한
  3. "+ ping이란?"
    /actuator/health 중 가장 단순한 health indicator
    단순이 Spring이 살아있는지만 확인한다.

  4. "HealthIndicator는 어느 패키지에?"
    /src/main/java/com/xxx/global/health
    또는
    /common/health

why?

  • 모니터링은 비즈니스 로직이 아니라 "전역 기능"
  • 그러므로 domain 패키지가 아니라 global이나 common이 맞음!

02-1. 외부 API 헬스체크

  1. "checkExternalServer"
  • true = 외부 API 장애이면 내 서비스도 같이 down 처리
  • false = 외부 API가 죽어도 내 서비스는 up 처리

실무에서는 API 종류에 따라 다르게 선택한다.
ex) 카카오 로그인 API = true (강하게 의존)
날씨 API = false (부가 기능)


02-2. 파일존재 여부 & custom식 헬스체크

  1. 특정파일이 존재하면 down
    ex) /app/stop.txt가 존재하면 health = down
    -> 장점 : 자동 배포 시스템과 연동하기 좋음.

  2. custom식 헬스체크
    ex) 영업시간을 설정하여 사용

    • 09:00 ~18:00 = up
    • 그 외 = down
      -> 콜센터, 매장주문 시스템 같은 곳에서 많이 사용함.

03. actuator/metrics

  1. 주요 메트릭:
  • http.server.requests
  • jvm.memory.used
  • process.cpu.usage
  • hikaricp.connections.active

04. actuator/loggers


05. actuator/threaddump

  1. 스레드덤프 분석은 어떻게 하는가?
  • DEADLOCK 확인
  • 특정 스레드가 무한 대기 중인지
  • DB 커넥션이 누수됐는지
  • GC에 너무 많이 갇혀있는지
    -> 실무에서 중요하다.

06. Prometheus

  1. Prometheus는 앱으로부터 데이터들을 가져오는 Pull 방식이므로 스프링 앱에 부하가 적다.(good)

06-1. Micrometer

SLF4J가 로그 인터페이스의 표준이듯이
Micrometer는 수집 표준 라이브러리이다.


06-2. Prometheus 설정

  1. 왜 targets: ['api1:8080] 인가?
    컨테이너 이름으로 접근해야하기 때문.

+ 오늘 막혔던 부분과 해결 과정

  1. Spring Boot 앱 실행 안됨
    -> 원인 : DB주소가 로컬 기준
    -> 해결 : JDBC URL을 도커기준으로 변경... 간단한 문제였다.

  1. 8080 포트 충돌
    -> 해결 : 프로세스 종료 + 컨테이너 삭제후 재생성

  1. Prometheus에서 api1 인식 못함
    -> 원인 :
  • api1이 spring-net에 안 붙어 있었고

  • 컨테이너가 실행 실패로 죽어있었음…

    -> 해결 :

  • api1 컨테이너 재생성

  • Prometheus 재시작

  • 이미지 재빌드

  • 컨테이너 네트워크 연결 확인


    ==최종 성공==

0개의 댓글