리스너 (Listeners) 이해하기

리스너 (Listeners) 이해하기

리스너는 샘플 결과를 보여주는 구성 요소예요. 결과를 트리, 표, 그래프로 보여주거나 로그 파일에 쓰기만 할 수도 있어요. 특정 샘플러의 응답 내용을 보려면 "View Results Tree"나 "View Results in table" 리스너를 테스트 계획에 추가하고, 응답 시간을 그래프로 보려면 Graph Results를 추가하면 돼요. 여기서는 리스너의 출력 파일 설정, CSV/XML 형식, CLI 배치 실행, 리소스 사용량, 결과 읽기까지 다뤄볼게요.

출처: Introduction to Listeners — Apache JMeter 공식 문서

본문

리스너는 각각 응답 정보를 다른 방식으로 보여줘요. 하지만 파일을 지정하면 모두 같은 원시 데이터를 출력 파일에 써요. "Configure" 버튼으로 파일에 쓸 필드와 CSV 또는 XML 중 무엇으로 쓸지 지정할 수 있어요. CSV 파일은 XML보다 훨씬 작으니 많은 샘플을 만들 때는 CSV를 쓰세요. 파일 이름은 상대 경로나 절대 경로로 지정할 수 있어요. 상대 경로는 현재 작업 디렉터리(기본 bin/ 디렉터리)를 기준으로 해석돼요. JMeter는 현재 테스트 계획(JMX 파일)이 있는 디렉터리를 기준으로 하는 경로도 지원해요. 경로 이름이 "~/"로 시작하면(또는 jmeter.save.saveservice.base_prefix JMeter 프로퍼티에 있는 값이면) 그 경로는 JMX 파일 위치를 기준으로 하는 것으로 간주돼요. 특정 샘플만 기록하려면 리스너를 샘플러의 자식으로 추가하면 돼요. 또는 Simple Controller로 샘플러 집합을 묶고 거기에 리스너를 추가해도 돼요. 여러 샘플러가 같은 파일 이름을 쓸 수 있지만, 모두 같은 구성을 쓰도록 확인하세요!

12.1 기본 구성 (Default Configuration)

저장할 기본 항목은 jmeter.properties(또는 user.properties) 파일에서 정의할 수 있어요. 이 프로퍼티는 Listener Config 팝업의 초기 설정으로 사용되고, -l 커맨드라인 플래그가 지정하는 로그 파일에도 사용돼요(주로 CLI 모드 테스트 실행에서 씀). 기본 형식을 바꾸려면 jmeter.properties에서 다음 줄을 찾으세요.

jmeter.save.saveservice.output_format=

저장할 정보는 설정 가능해요. 최대 정보를 얻으려면 형식으로 "xml"을 고르고 Test Plan 요소에 "Functional Test Mode"를 지정해요. 이 박스를 체크하지 않으면 기본 저장 데이터에는 타임스탬프(1970년 1월 1일 자정 이후 밀리초), 데이터 타입, 스레드 이름, 라벨, 응답 시간, 메시지와 코드, 성공 표시가 포함돼요. 체크하면 전체 응답 데이터를 포함한 모든 정보가 기록돼요. 다음 예시는 세로 막대("|")로 구분된 형식을 만들 프로퍼티를 설정하는 방법을 보여줘요.

timeStamp|time|label|responseCode|threadName|dataType|success|failureMessage
02/06/03 08:21:42|1187|Home|200|Thread Group-1|text|true|
02/06/03 08:21:42|47|Login|200|Thread Group-1|text|false|Test Failed:
 expected to contain: password etc.

설정해야 하는 해당 jmeter.properties는 다음과 같아요. 이 예시의 한 가지 특이점은 output_format이 csv로 설정되어 있어 보통 쉼표로 구분된 값(comma-separated values)을 뜻하는데, default_delimiter를 쉼표 대신 세로 막대로 설정해서 이 경우 csv 태그가 잘못된 이름이 됐다는 거예요(CSV를 character separated values로 생각하세요).

jmeter.save.saveservice.output_format=csv
jmeter.save.saveservice.assertion_results_failure_message=true
jmeter.save.saveservice.default_delimiter=|

결과 파일 출력에 영향을 주는 전체 프로퍼티 집합은 다음과 같아요(주석 처리된 값이 기본값이에요).

#---------------------------------------------------------------------------
# Results file configuration
#---------------------------------------------------------------------------
# This section helps determine how result data will be saved.
# The commented out values are the defaults.
# legitimate values: xml, csv, db. Only xml and csv are currently supported.
#jmeter.save.saveservice.output_format=csv
# true when field should be saved; false otherwise
# assertion_results_failure_message only affects CSV output
#jmeter.save.saveservice.assertion_results_failure_message=true
# legitimate values: none, first, all
#jmeter.save.saveservice.assertion_results=none
#jmeter.save.saveservice.data_type=true
#jmeter.save.saveservice.label=true
#jmeter.save.saveservice.response_code=true
# response_data is not currently supported for CSV output
#jmeter.save.saveservice.response_data=false
# Save ResponseData for failed samples
#jmeter.save.saveservice.response_data.on_error=false
#jmeter.save.saveservice.response_message=true
#jmeter.save.saveservice.successful=true
#jmeter.save.saveservice.thread_name=true
#jmeter.save.saveservice.time=true
#jmeter.save.saveservice.subresults=true
#jmeter.save.saveservice.assertions=true
#jmeter.save.saveservice.latency=true
#jmeter.save.saveservice.connect_time=true
#jmeter.save.saveservice.samplerData=false
#jmeter.save.saveservice.responseHeaders=false
#jmeter.save.saveservice.requestHeaders=false
#jmeter.save.saveservice.encoding=false
#jmeter.save.saveservice.bytes=true
#jmeter.save.saveservice.sent_bytes=true
#jmeter.save.saveservice.url=false
#jmeter.save.saveservice.filename=false
#jmeter.save.saveservice.hostname=false
#jmeter.save.saveservice.thread_counts=true
#jmeter.save.saveservice.sample_count=false
#jmeter.save.saveservice.idle_time=true
# Timestamp format - this only affects CSV output files
# legitimate values: none, ms, or a format suitable for SimpleDateFormat
#jmeter.save.saveservice.timestamp_format=ms
#jmeter.save.saveservice.timestamp_format=yyyy/MM/dd HH:mm:ss.SSS
# For use with Comma-separated value (CSV) files or other formats
# where the fields' values are separated by specified delimiters.
# Default:
#jmeter.save.saveservice.default_delimiter=,
# For TAB, since JMeter 2.3 one can use:
#jmeter.save.saveservice.default_delimiter=\t
# Only applies to CSV format files:
# Print field names as first line in CSV
#jmeter.save.saveservice.print_field_names=true
# Optional list of JMeter variable names whose values are to be saved in the result data files.
# Use commas to separate the names. For example:
#sample_variables=SESSION_ID,REFERENCE
# N.B. The current implementation saves the values in XML as attributes,
# so the names must be valid XML names.
# JMeter sends the variable to all servers
# to ensure that the correct data is available at the client.
# Optional xml processing instruction for line 2 of the file:
#jmeter.save.saveservice.xml_pi=<?xml-stylesheet type="text/xsl" href="sample.xsl"?>
# Prefix used to identify filenames that are relative to the current base
#jmeter.save.saveservice.base_prefix=~/
# AutoFlush on each line written in XML or CSV output
# Setting this to true will result in less test results data loss in case of Crash
# but with impact on performances, particularly for intensive tests (low or no pauses)
# Since JMeter 2.10, this is false by default
#jmeter.save.saveservice.autoflush=false
# Put the start time stamp in logs instead of the end
sampleresult.timestamp.start=true
# Whether to use System.nanoTime() - otherwise only use System.currentTimeMillis()
#sampleresult.useNanoTime=true
# Use a background thread to calculate the nanoTime offset
# Set this to ≤ 0 to disable the background thread
#sampleresult.nanoThreadSleep=5000

timestamp_format에 쓰는 날짜 형식은 SimpleDateFormat에 설명되어 있어요. 타임스탬프 형식은 파일을 쓰고 읽을 때 모두 사용돼요. 형식을 "ms"로 설정하고 열이 long 정수로 파싱되지 않으면 JMeter(2.9+)는 다음 형식을 시도해요.

  • yyyy/MM/dd HH:mm:ss.SSS
  • yyyy/MM/dd HH:mm:ss
  • yyyy-MM-dd HH:mm:ss.SSS
  • yyyy-MM-dd HH:mm:ss
  • MM/dd/yy HH:mm:ss (이전 버전 호환용이라 형식으로 권장하지 않아요)

매칭도 이제 엄격하고(비관대적 non-lenient) JMeter 2.8 이하는 관대 모드를 썼는데 잘못된 날짜의 타임스탬프가 나올 수 있었어요(시간은 보통 정확했어요).

12.1.1 샘플 변수 (Sample Variables) — JMeter는 sample_variables 프로퍼티를 지원해서 JTL 파일의 각 샘플에 함께 저장할 추가 JMeter 변수 목록을 정의할 수 있어요. 값은 CSV 파일에 추가 열로, XML 파일에는 추가 속성(attribute)으로 쓰여져요.

12.1.2 샘플 결과 저장 구성 (Sample Result Save Configuration) — 리스너는 Config 팝업으로 결과 로그 파일(JTL)에 저장할 항목을 다르게 구성할 수 있어요. 기본값은 위의 Listener Default Configuration에서 정의한 대로예요. 이름 뒤에 (CSV)가 붙은 항목은 CSV 형식에만, (XML)이 붙은 항목은 XML 형식에만 적용돼요. CSV 형식은 줄바꿈을 포함한 항목은 현재 저장할 수 없어요. 쿠키, 메서드, 쿼리 문자열은 "Sampler Data" 옵션의 일부로 저장된다는 점에 유의하세요.

12.2 CLI 모드(배치) 테스트 실행

CLI 모드에서 실행할 때 -l 플래그로 테스트 실행을 위한 최상위 리스너를 만들 수 있어요. 이는 테스트 계획에 정의된 리스너에 추가로 생겨요. 이 리스너의 구성은 앞 절에서 설명한 것처럼 jmeter.properties의 항목으로 제어돼요. 이 기능을 쓰면 각 테스트 실행에 다른 데이터·로그 파일을 지정할 수 있어요.

jmeter -n -t testplan.jmx -l testplan_01.jtl -j testplan_01.log
jmeter -n -t testplan.jmx -l testplan_02.jtl -j testplan_02.log

JMeter 로깅 메시지는 기본적으로 jmeter.log 파일에 쓰여진다는 점을 유의하세요. 이 파일은 매번 다시 생성되므로, 각 실행의 로그 파일을 보관하려면 위처럼 -j 옵션으로 이름을 바꿔야 해요. JMeter는 로그 파일 이름에서 변수를 지원해요. 파일 이름에 짝을 이룬 작은따옴표가 있으면 이름이 현재 날짜에 적용되는 SimpleDateFormat 형식으로 처리돼요. 예: log_file='jmeter_'yyyyMMddHHmmss'.tmp'. 이렇게 하면 각 테스트 실행에 고유한 이름을 만들 수 있어요.

12.3 리소스 사용량 (Resource usage)

리스너는 샘플이 많으면 메모리를 많이 쓸 수 있어요. 대부분의 리스너는 표시하는 모든 샘플 사본을 보관하는데, 다음은 예외예요.

  • Simple Data Writer
  • BeanShell/JSR223 Listener
  • Mailer Visualizer
  • Monitor Results
  • Summary Report

다음 리스너는 더 이상 모든 개별 샘플 사본을 보관할 필요가 없어요. 대신 경과 시간이 같은 샘플을 집계해요. 특히 대부분의 샘플이 1~2초 이하라면 메모리가 훨씬 덜 필요해요.

  • Aggregate Report
  • Aggregate Graph

필요한 메모리를 최소화하려면 Simple Data Writer를 쓰고 CSV 형식을 사용하세요.

12.4 CSV 로그 형식

CSV 로그 형식은 구성에서 선택한 데이터 항목에 따라 달라져요. 지정한 데이터 항목만 파일에 기록돼요. 열의 등장 순서는 고정되어 있으며 다음과 같아요.

  • timeStamp — 1/1/1970 이후 밀리초
  • elapsed — 밀리초
  • label — 샘플러 라벨
  • responseCode — 예: 200, 404
  • responseMessage — 예: OK
  • threadName
  • dataType — 예: text
  • success — true 또는 false
  • failureMessage — 있는 경우
  • bytes — 샘플의 바이트 수
  • sentBytes — 샘플에 대해 보낸 바이트 수
  • grpThreads — 이 스레드 그룹의 활성 스레드 수
  • allThreads — 모든 그룹의 총 활성 스레드 수
  • URL
  • Filename — Save Response to File을 쓴 경우
  • latency — 첫 응답까지의 시간
  • connect — 연결 수립까지의 시간
  • encoding
  • SampleCount — 샘플 수(여러 샘플이 집계되지 않으면 1)
  • ErrorCount — 오류 수(여러 샘플이 집계되지 않으면 0 또는 1)
  • Hostname — 샘플이 생성된 위치
  • IdleTime — 'Idle' 시간 밀리초(보통 0)
  • Variables, 지정된 경우

12.5 XML 로그 형식

XML(2.1) 형식은 아래와 같아요. JTL 파일 형식은 2.2와 2.1에서 동일해요. 형식 2.2는 JMX 파일에만 영향을 줘요. 샘플 노드 이름은 "sample" 또는 "httpSample"일 수 있다는 점에 유의하세요. 각 httpSample/sample 요소에는 여러 속성이 있는데, 이 속성의 의미는 다음 절(12.7 샘플 속성)에서 다뤄요.

<?xml version="1.0" encoding="UTF-8"?>
<testResults version="1.2">
  <httpSample t="1392" lt="351" ts="1144371014619" s="true"
   lb="HTTP Request" rc="200" rm="OK"
   tn="Listen 1-1" dt="text" de="iso-8859-1" by="12407">
    ... nested samples, responseHeader, requestHeader, responseData, cookies, method, queryString, url ...
  </httpSample>
</testResults>

12.7 샘플 속성 (Sample Attributes)

샘플 속성의 의미는 다음과 같아요.

속성 내용
by Bytes (바이트)
sby Sent Bytes (보낸 바이트)
de Data encoding (데이터 인코딩)
dt Data type (데이터 타입)
ec Error count (오류 수; 여러 샘플이 집계되지 않으면 0 또는 1)
hn Hostname where the sample was generated (샘플이 생성된 호스트명)
it Idle Time = time not spent sampling (샘플링에 쓰지 않은 시간, ms; 보통 0)
lb Label (라벨)
lt Latency = time to initial response (첫 응답까지 시간, ms) — 모든 샘플러가 지원하지는 않음
ct Connect Time = time to establish the connection (연결 수립 시간, ms) — 모든 샘플러가 지원하지는 않음
na Number of active threads for all thread groups (모든 스레드 그룹의 활성 스레드 수)
ng Number of active threads in this group (이 그룹의 활성 스레드 수)
rc Response Code (응답 코드, 예: 200)
rm Response Message (응답 메시지, 예: OK)
s Success flag (성공 플래그, true/false)
sc Sample count (샘플 수; 여러 샘플이 집계되지 않으면 1)
t Elapsed time (경과 시간, ms)
tn Thread Name (스레드 이름)
ts timeStamp (1970년 1월 1일 자정 이후 밀리초)
varname Value of the named variable (이름 붙은 변수의 값)

JMeter는 테스트 계획과 함께 추가 변수를 저장할 수 있어요. 현재 변수는 추가 속성으로 저장돼요. 테스트 계획 변수 이름이 속성 이름으로 쓰여져요(위의 Sample Variables 참조).

12.8 응답 데이터 저장 (Saving response data)

위에서 보았듯 필요하면 응답 데이터를 XML 로그 파일에 저장할 수 있어요. 하지만 이러면 파일이 꽤 커질 수 있고, 텍스트가 여전히 유효한 XML이 되도록 인코딩되어야 해요. 또한 이미지는 포함할 수 없어요. TEXT 타입의 샘플 응답만 저장할 수 있어요. 또 다른 해결책은 Post-Processor인 Save_Responses_to_a_file을 쓰는 거예요. 각 샘플에 새 파일을 만들고 파일 이름을 샘플에 저장해요. 파일 이름은 샘플 로그 출력에 포함될 수 있고, 샘플 로그 파일을 다시 로드할 때 필요하면 파일에서 데이터를 가져와요.

12.9 응답 데이터 로드(읽기)

기존 결과 파일을 보려면 File "Browse…" 버튼으로 파일을 선택하면 돼요. 필요하면 적절한 리스너가 들어 있는 더미 테스트 계획을 만들면 돼요. 결과는 XML 또는 CSV 형식 파일에서 읽을 수 있어요. CSV 결과 파일을 읽을 때는 헤더(있는 경우)로 어떤 필드가 저장됐는지 판단해요. 헤더 없는 CSV 파일을 제대로 해석하려면 적절한 JMeter 프로퍼티를 설정해야 해요. JMeter는 새 파일을 로드하기 전에 현재 데이터를 지우지 않아서 파일을 병합할 수 있어요. 현재 데이터를 지우려면 파일을 로드하기 전에 Run → Clear(Ctrl + Shift + E) 또는 Run → Clear All(Ctrl + E) 메뉴를 사용하세요.

12.10 리스너 GUI 데이터 저장 (Saving Listener GUI data)

JMeter는 어떤 리스너든 PNG 파일로 저장할 수 있어요. 왼쪽 패널에서 리스너를 선택하고 Edit → Save Node As Image를 클릭하면 파일 대화상자가 나타나고, 원하는 이름을 입력해 저장하면 돼요. 테이블로 출력하는 리스너는 복사/붙여넣기로도 저장할 수 있어요. 테이블에서 원하는 셀을 선택하고 OS 복사 단축키(보통 Ctrl + C)를 쓰면 데이터가 클립보드에 저장돼 스프레드시트나 텍스트 편집기 같은 다른 애플리케이션에 붙여넣을 수 있어요.

더 알아보기