우리가 서비스를 운영하다보면 간혹 장애가 발생하는 일이 있다. 장애 상황은 다양해 경험했을 수도, 예기치 못할 수도 있다. Chaos Monkey는 운영 환경에서 장애 상황을 가정하고 대응할 수 있도록 함으로써 약점을 진단하고 보완하기에 시스템에 대한 신뢰성을 높여준다.
Chaos monkey는 4단계로 진행하며 방법은 아래와 같다.
실험을 지속하면서 약점을 발견하고 정상 상태를 방해하는 것이 어려울수록 신뢰성을 높이는 것이 목표이다.
위 그림처럼 chaos monkey 프로필을 활성화하면 watcher를 활성화 시켜 대상 서비스를 공격할 수 있다. 아래는 적용하는데 작성한 코드이다.
build.gradle
implementation 'de.codecentric:chaos-monkey-spring-boot:2.7.1'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
application.yml
spring:
profiles:
active: chaos-monkey
chaos:
monkey:
enabled: true
watcher: // watcher 활성화 대상
controller: false
restController: false
service: true
repository: false
assaults:
level: 3 // 공격할 요청 수 (1-10000까지 설정가능) n번째 요청 시 공격
latencyActive: true // 지연 발생 공격
latencyRangeStart: 1000 // 최소 지연 시간
latencyRangeEnd: 3000 // 최대 지연 시간
exceptionsActive: false// 예외 발생
exception:
type: java.lang.RuntimeException // 공격 시 적용 예외
killApplicationActive: false // appkiller 공격
cpuActive : false // cpu 자원 공격
management:
endpoint:
chaosmonkey:
enabled: true
endpoints:
web:
exposure:
include:
- health
- info
- chaosmonkey
Chaos Monkey가 응답 지연을 발생시키는지 확인을 위해 지난번 포스팅에서 작성한 APM을 참고한다. level: 3으로 latencyActive를 활성화했기에 3번째 요청을 주로 살펴보겠다.
아래와 같이 Jmeter로 초당 1개의 요청을 가정해 보내봤다.
위 HTTP 요청으로 chaos monkey가 활성 중인지 보거나 활성시킬 수 있고 wathcer나 assaults도 확인 후 활성화 시킬 수 있다.
현재는 아래와 같이 latency assualts만 활성화 중인 상태다.
APM
아래 요청으로 latency 횟수를 변경해본 후(level : 10) 다시 모니터링을 해봤다.
예상대로 avg가 줄어들었다. 다음 포스팅에선 예외 발생 assaults를 활용한 테스트를 진행해보겠다.
참고
http://channy.creation.net/blog/1173 (카오스 엔지니어링의 원칙)
https://codecentric.github.io/chaos-monkey-spring-boot/latest/ (CM4SB doc)
https://www.inflearn.com/course/the-java-application-test/dashboard (더 자바, 애플리케이션을 테스트하는 다양한 방법)