본문 바로가기

개발일지/TIL

[230818] Jmeter SSE 테스트

Jmeter SSE 테스트

💬 서비스에서 가장 핵심이 되는 경매 입찰 기능이 SSE로 구현되어 있습니다. Jmeter에서 SSE 테스트 환경을 구성을 해야 합니다.

 

스크립트 작성

💬 Jmeter에서 SSE 테스트 환경을 구성하기 위해서는 JSR223 Sampler에 Groovy 언어로 스크립트를 작성을 해야 합니다. 스크립트에 EventSource 라이브러리를 사용해 SSE 테스트 기능을 작성했습니다.

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 javax.json.Json
import javax.json.JsonObject
import javax.json.JsonReader
import javax.json.JsonValue

class SimpleEventHandler implements EventHandler {
    List<String> respList = []

    void onOpen() {
        log.info("The connection has been opened")
    }

    void onClosed() {
        log.info("The connection has been closed")
    }

    void onMessage(String Event, MessageEvent messageEvent) {
        if (Event.equals("BID_PRICE_UPDATE")) {
            respList.add(messageEvent.getData())  
        }
    }

    void onComment(String comment) {
        log.info(comment)
    }

    void onError(Throwable t) {
        log.info("Error $t")
    }
}

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.build()
eventSource.setReconnectTimeMillis(reconnectionTimeMs)

try {
     eventSource.start()
     TimeUnit.SECONDS.sleep(sleepDuration)
} catch(Exception e) {
	eventSource.close()
} finally {
	eventSource.close()
}

for (String bidPrice : eH.respList) {
    responseList = responseList + "Updated Bid Price: ${bidPrice}\n"
}
SampleResult.setResponseData(responseList, "866")​

 

 라이브러리 설치

💬 Jmeter에서는 EventSource에 필요한 라이브러리가 별도로 제공하지 않습니다. 위 스크립트에서 EventSource에 관련된 라이브러리가 없다는 에러가 발생합니다.

💬 설치 라이브러리 목록
     ➡ okio-jvm-3.5.0.jar
     ➡ okio-3.5.0.jar
     ➡ okhttp-eventsource-3.0.0.jar
     ➡ okhttp-4.11.0.jar
     ➡ launchdarkly-logging-1.1.1.jar

💬 설치 위치
     ➡ [내 로컬 기준] /opt/homebrew/Cellar/jmeter/5.6.2/libexec/lib/ext

 

 문제

💢 스크립트가 정상적으로 실행은 되었으나 서버에서 보내는 데이터가 받아지지 않는 문제가 발생합니다. 서버에서는 "전송 오류" 에러가 발생하고 있었습니다.

💬 직면한 문제를 해결하려고 노력했으나 시간 부족으로 당일 날 해결을 하지 못했습니다. 다음 날 더 확인해 보며 해결할 수 있었습니다.
     
SSE 테스트 문제 해결