본문 바로가기
관리자

Programming-[Backend]/SpringBoot

Spring actuator 기본 개념 feat. Chaos Monkey

728x90
반응형

 

1. 배경

 

프로젝트의 성능 테스트를 위해서 실제 로직을 Chaos Monkey를 이용하여 대체했다. 실제 로직 수행에 1초가 걸리면, 아래와 같이 설정하여 chaos monkey가 1초간의 지연을 모사하도록 할 수 있다. 이를 통해 성능 테스트를 했는데, management는 어떤 설정인지가 궁금했다. enabled: true는 chaos monkey를 적용하는 것일텐데, 그럼 endpoints는 뭘까?

 

chaos:
  monkey:
    enabled: true
    watcher:
      bean-classes:
        - {chaos monkey를 적용할 서비스 구현체의 패키지명 ex. com.exmample.service.TestServiceImpl}
    assaults:
      latency-active: true # 지연 활성화
      latency-range-start: ${CHAOSMONKEY_LATENCY_START:1000} # 최소 지연 시간 (ms)
      latency-range-end: ${CHAOSMONKEY_LATENCY_END:1000} # 최대 지연 시간 (ms)
      exceptions-active: false # 예외 활성 여부
      exception:
        type: org.springframework.web.client.ResourceAccessException
      level: ${CHAOSMONKEY_ASSAULT_LEVEL:1} # 1: 요청마다 공격 ~ 10000: 10000개 중 10000번째 요청만 공격

management:
  endpoint:
    chaosmonkey:
      enabled: true
  endpoints:
    web:
      exposure:
        include:
          - health
          - info
          - chaosmonkey

 

 

2. spring actuator

management 설정 값은 spring actuator의 설정 값이다. 이 설정 값을 통해 spring actuator에서 제공하는 기능과 endpoints들을 활성화하고 설정할 수 있다. chaos monkey도 spring actuator를 기반으로 해서 동작한다.

 

spring actuator는 애플리케이션의 상태를 모니터링하고 관리할 수 있도록 하는 endpoints도 제공한다. 이는 JMX MBeans(Managed Beans)를 통해서도 접근이 가능하다. spring actuator의 일부 기능은 JMX MBean을 통해 관리되도록 설계되어있다. 또한 chaos monkey 뿐만 아니라 Prometheus, Micrometer 등 모니터링용 시스템과도 연계가 가능하다.

 

또한 endpoints의 하위 설정값에 health, info가 있는 것을 볼 수 있는데 예를 들어 health를 추가하면 health check용 엔드포인트를 제공한다. 다시 말해 Spring 프로젝트의 Controller에 /health와 같은 엔드포인트를 만들어 처리하지 않더라도 {host 주소}/actuator/health와 같은 엔드포인트를 제공하여 헬스체크가 편하도록 해준다.

 

이외에도 설정값을 동적으로 바꿀 수 있는 기능도 제공한다. endpoints로 지정한 부분에 아래처럼 curl 등으로 요청을 보내면 환경변수를 runtime에 바로 교체할 수 있게 된다.

 

ex) chaos monkey의 endpoint로 요청을 보내서, 지연 시간을 바꾸는 명령어

# latency 변경 명령어 curl -X POST http://localhost:8080/actuator/chaosmonkey/assaults -H "Content-Type: application/json" -d '{"latencyRangeStart": 10000, "latencyRangeEnd": 15000, "latencyActive": true}'

 

 

 

 

spring actuator가 제공하는 기능을 요약하여 간략히만 보자면 아래와 같다.

 

 

액추에이터 지원 기능 요약

기능 설명
헬스 체크 (/actuator/health) 애플리케이션의 상태 확인
메트릭 (/actuator/metrics) CPU, 메모리, GC, HTTP 요청 수집
환경 (/actuator/env) 환경 변수 및 프로퍼티 정보 확인
로깅 (/actuator/loggers) 런타임에서 로깅 레벨 변경 가능
트레이싱 (/actuator/httptrace) HTTP 요청 추적
쓰레드 덤프 (/actuator/threaddump) 현재 실행 중인 쓰레드 정보 조회
데이터베이스 상태 (/actuator/db) 연결된 DB의 상태 확인

 

 

3. 주의 사항

 

분산 환경에서 사용하면 추가적인 처리가 필요하다. 다시 말해 애플리케이션의 동일한 인스턴스가 여러 대 있고, 앞쪽에 로드밸런서 등이 요청을 분산해주는 환경이라면 문제가 될 수 있다.

 

spring actuator의 엔드포인로 요청을 보내면 어떤 인스턴스로 요청이 전달될지 모른다. 여러 번 보내서 모든 인스턴스에 적용하더라도 시간차가 있어서 문제가 발생할 수도 있다. 인스턴스간 값들이 달라지면 시스템에 치명적인 문제가 발생할 수도 있다.

 

health 엔드포인트 같은 조회용 엔드포인트 정도는 상태 체크라서 괜찮다고 생각할 수도 있으나, health도 애플리케이션에 연결된 모든 구성요소가 다 health 상태여야만 health 체크에 성공한다. 그리고 앞서 설명한대로 요청을 보낼 때마다 인스턴스 마다 상태가 다를 수 있으므로 health 상태를 정확히 보장할 수 없다.

 

따라서 단일 인스턴스 환경에서만 사용하거나, 분산 환경에서의 정합성을 보장해주는 형태로 Spring Cloud Bus, Spring Boot Admin, Centralized Logging/Monitoring 등을 사용해야한다.

728x90
반응형