부하테스트를 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 컨테이너도 강제 재시작됨.