올라가는 AWS 서버 비용으로 인해 nGrinder 를 로컬 환경에서 진행하기로 했다. 네트워크 환경이 클라우드 환경과는 달라 차이가 있을 수 있지만 부하는 대응하기 위한 테스트를 하기 위해서는 테스트 작업으로 로컬 환경에서 환경을 구성해보기로 했다. ngrinder 에서는 로컬 환경에서 구성 방법과 에러 기록들을 간단히 기록해놓는다. 설치했던 버전은 현재 최신 버전인 ngrinder-controller ver.3.5.9 을 사용했다.

 

1. ngrinder-controller & ngrinder-agent 설치 

[1] download ngrinder-controller

(1) download ngrinder-controller file

 

(2) Users/[username]/.ngrinder/system.conf - controller.ip 설정하기

controller.host=127.0.0.1

 

(3) ngrinder-controller 실행

  • Djava.io.tmpdir 을 사용하지 않으면 에러 메세지 출력
  • --port : 실행할 port number 설정
java -Djava.io.tmpdir=/Users/Cooper/study/ngrinder/temp -jar ngrinder-controller-3.5.9.war --port=8200

 

 

[2] download ngrinder-agent

(1) download ngrinder-agent 

  • ngrinder-controller 실행 : http://localhost:[port number]
  • 우측 상단에 admin > 에이전트 다운로드 를 통해 설치해서 압축 해제하기
tar -xvf ngrinder-agent-3.5.5-localhost.tar

 

 

(2) .ngrinder-agent/agent.conf 파일 호스트 설정

  • 파일 위치 : /Users/[username]/ngrinder-agent/agent.conf
  • 변경 필드 : agent.controller_host
agent.controller_host=127.0.0.1

 

 

(3) ngrinder-agent 실행

  • 압축 해제 안 파일 필드로 선언된 run_agent.sh 실행

압축 해제한 ngrinder-agent 디렉토리 내부 파일들

 

정상 동작 테스트

  1. script 에 http://127.0.0.1 을 추가해서 스크립트에서 verify 테스트
  2. 실제 테스트 실행해서 agent 도 정상 동작하는지 확인하기
    1. smoke test 와 같이 기본 동작이 정상적으로 되는지 확인해보기
      1. VUser 1 = 1 process * 1 thread

 

파란불이 뜨면 됐다!

 

스크립트

import static net.grinder.script.Grinder.grinder
import static org.junit.Assert.*
import static org.hamcrest.Matchers.*
import net.grinder.script.GTest
import net.grinder.script.Grinder
import net.grinder.scriptengine.groovy.junit.GrinderRunner
import net.grinder.scriptengine.groovy.junit.annotation.BeforeProcess
import net.grinder.scriptengine.groovy.junit.annotation.BeforeThread
// import static net.grinder.util.GrinderUtils.* // You can use this if you're using nGrinder after 3.2.3
import org.junit.Before
import org.junit.BeforeClass
import org.junit.Test
import org.junit.runner.RunWith

import org.ngrinder.http.HTTPRequest
import org.ngrinder.http.HTTPRequestControl
import org.ngrinder.http.HTTPResponse
import org.ngrinder.http.cookie.Cookie
import org.ngrinder.http.cookie.CookieManager

/**
* A simple example using the HTTP plugin that shows the retrieval of a single page via HTTP.
*
* This script is automatically generated by ngrinder.
*
* @author admin
*/
@RunWith(GrinderRunner)
class TestRunner {

	public static GTest test
	public static HTTPRequest request
	public static Map<String, String> headers = [:]
	public static Map<String, Object> params = [:]
	public static List<Cookie> cookies = []

	@BeforeProcess
	public static void beforeProcess() {
		HTTPRequestControl.setConnectionTimeout(300000)
		test = new GTest(1, "Test1")
		request = new HTTPRequest()
		grinder.logger.info("before process.")
	}

	@BeforeThread
	public void beforeThread() {
		test.record(this, "test")
		grinder.statistics.delayReports = true
		grinder.logger.info("before thread.")
	}

	@Before
	public void before() {
		request.setHeaders(headers)
		CookieManager.addCookies(cookies)
		grinder.logger.info("before. init headers and cookies")
	}

	@Test
	public void test() {
		HTTPResponse response = request.GET("http://127.0.0.1:8080", params)

		if (response.statusCode == 301 || response.statusCode == 302) {
			grinder.logger.warn("Warning. The response may not be correct. The response code was {}.", response.statusCode)
		} else {
			assertThat(response.statusCode, is(200))
		}
	}
}

 

 

2. 설치 과정에서 만났던 에러 기록 🚨

1. ~/.ngrinder-agent/agent.conf 에서 host 미설정으로 인해 발생한 Setting of DNS provider failed 에러

  • 만약 테스트 실행 시 에러 로그에 이와 같은 내용이 발생하면 ~/.ngrinder-agent/agent.conf 파일 변경하면 된다!
2024-03-29 02:47:01,707 ERROR Error running worker process
net.grinder.engine.common.EngineException: Setting of Local DNS provider failed
	at net.grinder.engine.process.GrinderProcess.<init>(GrinderProcess.java:154)
	at net.grinder.engine.process.WorkerProcessEntryPoint.run(WorkerProcessEntryPoint.java:78)
	at net.grinder.engine.process.WorkerProcessEntryPoint.main(WorkerProcessEntryPoint.java:60)
Caused by: java.lang.ClassNotFoundException: sun.net.spi.nameservice.NameService
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:421)
	at java.base/java.lang.Class.forName(Class.java:412)
	at org.ngrinder.dns.NameServiceProxy.set(NameServiceProxy.java:59)
	at net.grinder.engine.process.GrinderProcess.<init>(GrinderProcess.java:151)
	... 2 common frames omitted
agent.controller_host=127.0.0.1

 

2. ~/.ngrinder/system.conf 에서 ip 미설정으로 인해 발생한 Setting of DNS provider failed 에러

  • 스크립트 실행 시, Setting of DNS provider failed 에러가 발생하면 해당 경로로 가서 설정 변경하자!
  • 혹시 아래와 같은 설정이 되어도 같은 현상이 반복된다면 java version 을 확인해보자. (java version = 1.8 or 11)
2024-03-29 02:47:01,707 ERROR Error running worker process
net.grinder.engine.common.EngineException: Setting of Local DNS provider failed
	at net.grinder.engine.process.GrinderProcess.<init>(GrinderProcess.java:154)
	at net.grinder.engine.process.WorkerProcessEntryPoint.run(WorkerProcessEntryPoint.java:78)
	at net.grinder.engine.process.WorkerProcessEntryPoint.main(WorkerProcessEntryPoint.java:60)
Caused by: java.lang.ClassNotFoundException: sun.net.spi.nameservice.NameService
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:421)
	at java.base/java.lang.Class.forName(Class.java:412)
	at org.ngrinder.dns.NameServiceProxy.set(NameServiceProxy.java:59)
	at net.grinder.engine.process.GrinderProcess.<init>(GrinderProcess.java:151)
	... 2 common frames omitted
controller.host=127.0.0.1

 

3. controller 실행 시, Djava.io.tmpdir 옵션 추가하라는 에러

  • controller 를 실행할 때 아래와 같은 메세지를 본다면 쿨하게 Djava.io.tmpdis 을 추가해주도록 하자.
ERROR
Please set `java.io.tmpdir` property like following. tmpdir should be different from the OS default tmpdir.
`java -Djava.io.tmpdir=${NGRINDER_HOME}/lib -jar ngrinder-controller.war`
java -Djava.io.tmpdir=/Users/Cooper/study/ngrinder/temp -jar

 

4. 그리고 만약 실행하고픈 프로젝트가 java version > 11 이라면 ?

ngrinder 는 3.5.9 버전 기준으로 Java 11 까지 지원한다. 만약 실행하고 싶은 프로젝트가 맥을 사용한다면 사용하고 싶은 Java version 의 bin 파일을 이용해서 실행해보자. (인텔리제이를 사용해서 그런걸 수도?)

  • 기준 경로 : /Users/[username]/Library/Java/JavaVirtualMachines/[자바 버전]/Contents/Home/bin/java
  • 예시 : /Users/[username]/Library/Java/JavaVirtualMachines/openjdk-21/Contents/Home/bin/java

 

실행 명령어

/Users/cooper/Library/Java/JavaVirtualMachines/openjdk-21/Contents/Home/bin/java -jar \
-javaagent:/Users/cooper/Cooper/study/pinpoint/pinpoint-agent-2.5.3/pinpoint-bootstrap-2.5.3.jar \
-Dpinpoint.agentId=member-api \
-Dpinpoint.applicationName=member-api \
-Dspring.profiles.active=local \
-Dpinpoint.config=/Users/cooper/Cooper/study/pinpoint/pinpoint-agent-2.5.3/pinpoint-root.config \
/Users/cooper/Cooper/study/infra-workshop/member/build/libs/member-0.0.1-SNAPSHOT.jar

'인프라 공방 > summary' 카테고리의 다른 글

nGrinder tutorial  (0) 2024.03.19
pinpoint simple summary  (0) 2024.03.08
[인프라공방] HTTP Cache  (0) 2024.02.28