부하테스트를 jmatter 를 사용해서 처리하는데,
SRE팀에서 locust 를 적용하여 간략하게 작한 한 내용을 정리함.
참고주소 : (https://locust.io/)
pip3 install locust
locust --version
locust 작성 문법
해당 소스는 외부 에러를 발생했을 때,
서버가 내려가는 현상을 확인하여, 해당 현상 재현을 위한 부타테스트.
from locust import HttpUser, TaskSet, task, between, constant, SequentialTaskSet
from locust.contrib.fasthttp import FastHttpUser
class MetricsTaskSet(SequentialTaskSet):
_body = None
_body_delivery_possible = None
_header_authoriztion = None
_test_set_number = 0
def on_start(self):
print('on_sart is called on task class!', self._test_set_number)
def on_stop(self):
print('on_stop is called on task class!', self._test_set_number)
def setup(self):
print('setup is called on task class!')
def teardown(self):
print('teardown is called on task class!')
@task
def case_1(self):
print(f'[{self._test_set_number}] Case #1 go')
self.client.get(
f'/c:%252e%252e%255f%252e%252e%255f%252e%252e%255f%252e%252e%255f%252e%252e%255f%252e%252e%255fboot.ini%23vt/test',
name=f'/c:%252e%252e%255f%252e%252e%255f%252e%252e%255f%252e%252e%255f%252e%252e%255f%252e%252e%255fboot.ini%23vt/test',
headers=self._header_authoriztion
)
@task
def case_2(self):
print(f'[{self._test_set_number}] Case #2 go')
self.client.get(
f'/c:.....//.....//.....//.....//.....//.....//etc/passwd%23vt/test',
name=f'/c:.....//.....//.....//.....//.....//.....//etc/passwd%23vt/test',
headers=self._header_authoriztion
)
class MetricsLocust(FastHttpUser):
tasks = {MetricsTaskSet}
wait_time = constant(1)
def setup(self):
print('MetricsLocust setup is called on locust class !')
def teardown(self):
print('MetricsLocust teardown is called on locust class!')
locust 실행
locust --host={테스트할도메인} --locustfile=./{실행파일}.py
부하 테스트 결과는 외부 공격에 의해 fluent 가 OOM 이 발생함.
fluent 는 로그성 컨테이너이므로, 해당 컨테이너가 내려가더라도 java application 이 중지되면 안되는 것을 확인하여, 테스트 종료.
해당 TASK 안에 컨테이너가 2개가 올라가있음 사이드카로 fluent가 동작되고 있음.
Essential container 의 필수값 옵션에 의해 fluent가 죽으면 자동으로 JVM 컨테이너도 강제 재시작됨.