본문 바로가기

개발일지/TIL

[230822] Jmeter에서 SSE 에러 실패로 표시하기

 Jmeter에서 SSE 에러 실패로 표시하기

💬 Jmeter에서 서버에서 보내는 에러가 받아지는 것을 확인했습니다. 이제는 그 에러를 가지고 메시지를 출력해주려고 합니다. 결과를 실패로 변경해야 합니다.  

 

✔ 첫 번째 시도

💬 JSR223 Sampler에 작성한 스크립트에서 발생하는 에러를 JSR233 Assertion에서 받아서 실패로 처리해주려고 했습니다. 두 작업 간에 데이터를 공유시켜 줄 수 있는 내장 변수 객체 vars를 사용하기로 했습니다.

💢 공유할 데이터가 vars에 업데이트가 되지 않았습니다. 원인은 EventHandler 클래스 같은 외부 라이브러리에서 Jmeter 내장 객체 vars를 사용할 수 없기 때문이었습니다.

 

✔ 두 번째 시도

💬 vars를 사용할 수 없다면 그것을 대체할 수 있는 클래스를 하나 만들어 사용하기로 했습니다. 클래스를 하나 만들어 Jmeter에서 사용할 수 있도록 *. jar를 파일을 Jmeter/lib/ext 파일 안에 넣어줬습니다.

💢 매 스레드마다 객체가 추가적으로 생성이 되다 보니, 기존에 성공했던 요청도 Jmeter에서 사용할 수 있는 메모리의 한계치를 넘어가 실패가 발생했습니다. 

 

✔ 세 번째 시도

💬 기능이 별도로 분리가 되는 것이 좋다고 생각해서 Sampler와 Assertion로 나누었습니다. 그런데 이것을 위해서는 두 작업 간에 데이터 공유가 가능해야 하는데 한계가 있다는 것이 알게 되었습니다. 그래서 간단하게 Assertion을 없애고 Sampler에 하나에서 처리하기로 했습니다.

✅ EeventHandler 클래스에 errorMessage 멤버 변수를 선언을 했습니다. onError가 뜰 경우 errorMessage에 메시지를 넣게 했습니다. 그리고 작업이 모두 끝날 때 errorMessage가 null이 아닌 경우 실패로 뜨게 했습니다. 이것을 통해 에러를 표시할 수 있게 되었습니다.

import com.launchdarkly.eventsource.EventSource
import com.launchdarkly.eventsource.EventHandler
import com.launchdarkly.eventsource.MessageEvent
import java.net.URI
import java.io.StringReader
import java.util.concurrent.TimeUnit
import java.time.Duration
import java.time.LocalTime
import java.util.concurrent.ConcurrentHashMap

class SimpleEventHandler implements EventHandler {
    List<String> respList = []
    String errorMessage = null
    int count = 0

    void onOpen() {}

    void onClosed() {}

    void onMessage(String Event, MessageEvent messageEvent) throws java.lang.Exception {
        if (Event.equals("BID_PRICE_UPDATE")) {
        	  count = count + 1
              respList.add(messageEvent.getData())
        } else {
        	  respList.add("init message : " + messageEvent.getData() + "\n")
        }
    }

    void onComment(String comment) {
        System.out.println("comment : " + comment)
    }

    void onError(Throwable t) {
    	 int threadNum = Thread.currentThread().getId();
    	 errorMessage = t.getMessage();
    }

}

EventHandler eH = new SimpleEventHandler()
String responseList = ""

String[] parameters = Parameters.split(",")
String uri = parameters[0]  
long reconnectionTimeMs = parameters[1].toLong()
long sleepDuration = parameters[2].toLong()

EventSource.Builder builder = new EventSource.Builder(eH, URI.create(uri))
EventSource eventSource = builder.readTimeout(sleepDuration + 10, TimeUnit.SECONDS).build()
eventSource.setReconnectTimeMillis(reconnectionTimeMs)

try {
     eventSource.start()
     TimeUnit.SECONDS.sleep(sleepDuration)

} catch(Exception e) {
	eventSource.close()
} finally {
	eventSource.close()
}

responseList = responseList + "amount : " + eH.count + "\n"
responseList = responseList + "erro message : " + eH.errorMessage + "\n" 
for (String respRecord : eH.respList) {
    responseList = responseList + "Updated Bid Price: ${respRecord}\n"
}

SampleResult.setResponseData(responseList, "866")


if(eH.errorMessage != null) {
	SampleResult.setSuccessful(false);
}​

 

✔ 결과