๐Ÿ’ป
DevOps Cookbook
  • Home
    • Meiko DevOps Cookbook
  • Gitlab
    • Tips
      • ์‚ฌ์ „ ์ •์˜๋œ CI/CD ๋ณ€์ˆ˜์˜ ๊ธฐ๋ณธ ์„ธํŠธ
    • ๋”ฅ๋‹ค์ด๋ธŒ Gitlab CI/CD
      • GitLab CI/CD ์‹œ์ž‘ํ•˜๊ธฐ
        • .gitlab-ci.yml ํŒŒ์ผ
        • Runner
        • ํŒŒ์ดํ”„๋ผ์ธ
        • CI/CD ๋ณ€์ˆ˜
        • CI/CD ์ปดํฌ๋„ŒํŠธ
      • CI/CD YAML ๊ตฌ๋ฌธ ์ฐธ์กฐ
    • CI/CD Notifications
      • CI/CD slack notifiaction ๊ตฌ์ถ•์ž‘์—… ๊ฒฐ๊ณผ
  • Kubernetes
    • Persistence Volume
      • play-cluster
    • Ingress
      • Ingress๋ž€
      • ์ˆ˜๋™์œผ๋กœ ingress ๋ฐฐํฌํ•˜๊ธฐ
    • Security
    • HPA
      • hpa troubleshooting history
        • 1. HELM_UPGRADE_VALUES_FILE๋กœ hpa๊ฐ€ ์ถ”๊ฐ€๋˜์ง€ ์•Š๋Š” ์›์ธ
        • 2. targetCPUUtilizationPercentage ๊ณ„์‚ฐ์€ ์–ด๋–ป๊ฒŒ ๋˜๋Š”๊ฐ€
        • 3. helm values์— cpu resource ๋‹จ์œ„๋ฅผ 1๋กœ ํ–ˆ์„ ๋•Œ ์‹ค์ œ ํŒŒ๋“œ์— 1m( 0.001 ) ์ฝ”์–ด๊ฐ€ ๋ถ€์—ฌ๋œ ๊ฒƒ
        • 4. pod cpu resources๊ฐ€ ํ• ๋‹น๋ฐ›์€ ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ธ ์ง€ ํ˜„์žฌ ์‚ฌ์šฉ๋Ÿ‰์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ์ธ์ง€ ๊ฒ€์ฆ
        • 5. ์„ค์ •ํ•œ hpa๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ pod auto scaling์ด ๋™์ž‘ํ•˜๋Š” ์ง€ ๊ฒ€์ฆ
      • HorizontalPodAutoscaler์˜ behavior ํ•„๋“œ ์ค‘ stabilizationWindowSeconds ๊ฐ’์ด Kubernetes ์ฝ”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๋ถ„์„
  • prometheus
    • prometheus ๋ฆฌ์†Œ์Šค alert ์„ธํŒ…
      • ์Šฌ๋ž™ ์ฑ„๋„ ๊ตฌ์„ฑ
      • alert ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๊ฐ€์ด๋“œ
  • Loki
    • loki-grafana alert ์„ธํŒ…
      • 1์ฐจ ๊ฒ€์ฆ ๊ฒฐ๊ณผ
      • Alert ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๊ฐ€์ด๋“œ
  • load test
    • nGrinder
      • nGrinder Test Configuration ๊ฐ’๋“ค
      • ์งˆ๋ฌธ๋ฆฌ์ŠคํŠธ
        • groovy๋Š” JUnit ์Šคํƒ€์ผ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๊ฑด๊ฐ€ ? + GTest๊ฐ€ ๋ญ”์ง€ ์ข€ ํ—ท๊ฐˆ๋ฆฐ๋‹ค
      • Script
        • Groovy Script Structure
          • reference
          • Groovy script deep dive
          • Groovy Script ์‹คํ–‰ ๊ตฌ์กฐ ๋ถ„์„
      • Test
        • [nGrinder] single endpoint load test ํ•˜๊ธฐ
          • [nGrinder] single endpoint load test script ๊ธฐ๋ฐ˜ cpu ์‚ฌ์šฉ๋Ÿ‰ ํ…Œ์ŠคํŠธ
          • [nGrinder] single endpoint load test script ๊ธฐ๋ฐ˜ pod autoscaling ํ…Œ์ŠคํŠธ
        • [nGrinder] multi endpoint load test ํ•˜๊ธฐ
          • [nGrinder] multi endpoint load test script์— ์ •์˜ํ•œ test๋“ค์ด ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋ณด์žฅ ๋ฐ›๋Š”๊ฐ€?
  • AWS
    • aws-cli
      • eks cluster vpc ์ŠคํŽ™๋ณด๊ธฐ
    • aws-vpc
  • EKS
    • youtube links
    • EKS best practice
    • ์งˆ๋ฌธ ์ •๋ฆฌ
  • Istio
    • Istio Basic
      • Istio ์ปดํฌ๋„ŒํŠธ ๋ณ„ ์—ญํ• 
      • Kubernetes Ingress์™€ Istio VirtualService์˜ ๊ด€๊ณ„
    • Gateway
      • Gateway ์ฃผ์š” ํŠน์ง•
      • Istio Gateway์™€ Kubernetes Ingress์˜ ์ฃผ์š” ์ฐจ์ด์ 
  • IAC
    • Terraform
      • ํ…Œ๋ผํผ ์„ค์น˜
      • ํ…Œ๋ผํผ ๋ฌธ์„œ
      • ํ…Œ๋ผํผ ๊ฐœ๋…
        • ์–ธ์–ด ๊ตฌ์กฐ
        • ์‚ฌ์šฉ ์ˆœ์„œ
        • ์ƒํƒœํŒŒ์ผ (tfstate)
        • ๋ณ€์ˆ˜ ์ •์˜ ๋ฐฉ๋ฒ•
      • Terraform - AWS VPC
    • Ansible
      • Ansible ์ดˆ๊ธฐ ํ•™์Šต ๋‚ด์šฉ
      • Ansible Playbook
      • Ansible Study
        • Inventory
        • Playbook
          • Module
        • Variable
  • etc
    • Toss SLASH24
    • Elastic Load Balancing
    • ๋‚™์„œ์žฅ
      • IRSA
    • deep dive
      • Istio ๊ณต์‹๋ฌธ์„œ ๋ฒˆ์—ญ
        • Overview
          • What is Istio?
          • Why choose Istio?
          • Sidecar or ambient?
        • Concepts
          • Traffic Management
        • Page
      • eks ์—์„œ control plane < - > data plane ํ†ต์‹  ์›๋ฆฌ
Powered by GitBook
On this page
Edit on GitHub
  1. load test
  2. nGrinder

Script

nGrinder๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Groovy ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ nGrinder์—์„œ๋Š” The Grinder์˜ ๊ธฐ์กด ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค. ํŠนํžˆ, Jython์„ ๊ธฐ๋ณธ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

์ด์™ธ์—๋„ Groovy ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑํ•˜๋ ค๋ฉด nGrinder์˜ JUnit ์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. nGrinder ์ž์ฒด์ ์œผ๋กœ Groovy ์Šคํƒ€์ผ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, JUnit์„ ํ†ตํ•œ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

JUnit ์Šคํƒ€์ผ ์˜ˆ์‹œ ( java) :

JUnit ํ…Œ์ŠคํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด Groovy ์Šคํƒ€์ผ๊ณผ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

// JUnit ์Šคํฌ๋ฆฝํŠธ ์˜ˆ์‹œ (Java)

import static net.grinder.script.Grinder.grinder;
import net.grinder.plugin.http.HTTPRequest;
import net.grinder.plugin.http.HTTPResponse;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertTrue;

public class TestRunner {
    private HTTPRequest request;

    @Before
    public void setUp() {
        request = new HTTPRequest();
        grinder.logger.info("Setting up the test.");
    }

    @Test
    public void testRequest() {
        HTTPResponse response = request.GET("http://example.com");

        assertTrue("Expected status 200, got " + response.getStatusCode(),
                   response.getStatusCode() == 200);

        if (response.getStatusCode() == 200) {
            grinder.logger.info("Request successful.");
        } else {
            grinder.logger.warn("Request failed.");
        }
    }
}

Groovy ์˜ˆ์‹œ:

Groovy๋Š” Java ๋ฌธ๋ฒ•๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// Groovy ์Šคํฌ๋ฆฝํŠธ ์˜ˆ์‹œ

import static net.grinder.script.Grinder.grinder
import net.grinder.plugin.http.HTTPRequest
import net.grinder.plugin.http.HTTPResponse
import org.junit.Before
import org.junit.Test
import static org.junit.Assert.assertTrue

class TestRunner {
    private HTTPRequest request = new HTTPRequest()

    @Before
    void setUp() {
        grinder.logger.info("Setting up the test.")
    }

    @Test
    void testRequest() {
        HTTPResponse response = request.GET("http://example.com")

        assertTrue("Expected status 200, got ${response.getStatusCode()}",
                   response.getStatusCode() == 200)

        if (response.getStatusCode() == 200) {
            grinder.logger.info("Request successful.")
        } else {
            grinder.logger.warn("Request failed.")
        }
    }
}

Groovy์™€ Java ๋น„๊ต

๊ฒฐ๋ก : nGrinder๋Š” Groovy ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง์ ‘ ์ง€์›ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, Java ๊ธฐ๋ฐ˜์˜ JUnit ์Šคํฌ๋ฆฝํŠธ๊ฐ€ Groovy ์Šคํƒ€์ผ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€

Q1: nGrinder์—์„œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ Groovy ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

  • ๋‹ต๋ณ€: Groovy ์Šคํฌ๋ฆฝํŠธ๋Š” nGrinder์—์„œ ์ง์ ‘์ ์œผ๋กœ ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ, Java ๊ธฐ๋ฐ˜ JUnit ์Šคํฌ๋ฆฝํŠธ๊ฐ€ Groovy์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋กœ ์ž‘์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Q2: Groovy ์Šคํƒ€์ผ๋กœ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

  • ๋‹ต๋ณ€: Groovy ์Šคํƒ€์ผ๋กœ ์ž‘์„ฑํ•˜๋ ค๋ฉด Java JUnit ์Šคํƒ€์ผ๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜, Jython์„ ์‚ฌ์šฉํ•ด GTest ์Šคํƒ€์ผ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Q3: nGrinder์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด์™€ ๊ฐ๊ฐ์˜ ์žฅ๋‹จ์ ์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

  • ๋‹ต๋ณ€:

    • JUnit ์Šคํƒ€์ผ (Java):

      • ์žฅ์ : Java ์–ธ์–ด์˜ ํ’๋ถ€ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ธฐ๋Šฅ ํ™œ์šฉ ๊ฐ€๋Šฅ.

      • ๋‹จ์ : ์ž‘์„ฑ ์‹œ ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Œ.

    • GTest ์Šคํƒ€์ผ (Jython):

      • ์žฅ์ : Python ์Šคํƒ€์ผ๋กœ ๋” ๊ฐ„๊ฒฐํ•œ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ๊ฐ€๋Šฅ.

      • ๋‹จ์ : Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ผ๋ถ€ ๊ธฐ๋Šฅ ์ œ์•ฝ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Œ.

Q1: nGrinder์—์„œ ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ด ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€?

Q2: Jython ์Šคํƒ€์ผ๋กœ ๋ณต์žกํ•œ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜?

Q3: Groovy ์Šคํƒ€์ผ์˜ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•œ ์‚ฌ๋ก€๊ฐ€ ์žˆ๋Š”๊ฐ€?

GTest ์Šคํƒ€์ผ ์˜ˆ์‹œ:

๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” GTest ๋ฐฉ์‹์˜ ์˜ˆ์ œ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

# Jython ์Šคํฌ๋ฆฝํŠธ ์˜ˆ์‹œ (GTest ์Šคํƒ€์ผ)

from net.grinder.script.Grinder import grinder
from net.grinder.plugin.http import HTTPRequest

class TestRunner:
    def __init__(self):
        self.request = HTTPRequest()

    def beforeTest(self):
        grinder.logger.info("Before Test.")

    def test(self):
        response = self.request.GET("http://example.com")

        if response.getStatusCode() == 200:
            grinder.logger.info("Request successful.")
        else:
            grinder.logger.warn("Request failed.")

        assert response.getStatusCode() == 200

nGrinder ์Šคํฌ๋ฆฝํŠธ ์ข…๋ฅ˜ ์ •๋ฆฌ:

  • JUnit ์Šคํƒ€์ผ (Java): Java๋กœ ์ž‘์„ฑ๋œ ํ‘œ์ค€ JUnit ๊ธฐ๋ฐ˜์˜ ์Šคํฌ๋ฆฝํŠธ.

  • GTest ์Šคํƒ€์ผ (Jython): Python์˜ Jython ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ.

์š”์•ฝ:

  1. Groovy ์ง€์› ์—ฌ๋ถ€:

    • nGrinder ์ž์ฒด์ ์œผ๋กœ Groovy ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง์ ‘ ์ง€์›ํ•˜์ง€๋Š” ์•Š์œผ๋‚˜, Java ๊ธฐ๋ฐ˜ JUnit ์Šคํƒ€์ผ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด Groovy ์Šคํƒ€์ผ๊ณผ ์œ ์‚ฌํ•œ ํ˜•ํƒœ๋กœ ์ž‘์„ฑ ๊ฐ€๋Šฅ.

  2. nGrinder ์ง€์› ์Šคํฌ๋ฆฝํŠธ ์ข…๋ฅ˜:

    • Jython ๊ธฐ๋ฐ˜ GTest ์Šคํƒ€์ผ

    • Java ๊ธฐ๋ฐ˜ JUnit ์Šคํƒ€์ผ

Q1: Jython์„ ์ด์šฉํ•ด ๋” ๋ณต์žกํ•œ GTest ์Šคํƒ€์ผ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜์š”?

Q2: JUnit ์Šคํƒ€์ผ ์Šคํฌ๋ฆฝํŠธ์—์„œ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค์ •ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

Q3: nGrinder ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ์‹œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

Previousgroovy๋Š” JUnit ์Šคํƒ€์ผ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๊ฑด๊ฐ€ ? + GTest๊ฐ€ ๋ญ”์ง€ ์ข€ ํ—ท๊ฐˆ๋ฆฐ๋‹คNextGroovy Script Structure

Last updated 1 year ago