다음을 통해 공유


JavaScript용 Azure Load Testing 클라이언트 라이브러리 - 버전 1.0.0

Azure Load Testing은 Azure Load Testing 서비스와 기본적으로 상호 작용할 수 있는 사용자에게 JavaScript의 클라이언트 라이브러리를 제공합니다. Azure Load Testing은 대규모 부하를 생성할 수 있는 완전 관리형 부하 테스트 서비스입니다. 서비스는 호스팅되는 위치에 관계없이 애플리케이션에 대한 트래픽을 시뮬레이션합니다. 개발자, 테스터 및 QA(품질 보증) 엔지니어는 이를 사용하여 애플리케이션 성능, 확장성 또는 용량을 최적화할 수 있습니다.

이 라이브러리를 사용하려면 REST 클라이언트 문서에 크게 의존하세요.

설명서

시작하는 데 도움이 되는 다양한 설명서를 사용할 수 있습니다.

시작

현재 지원되는 환경

  • Node.js 버전 14.x.x 이상

사전 요구 사항

@azure-rest/load-testing 패키지를 설치합니다.

을 사용하여 JavaScript용 AzureLoadTesting 클라이언트 REST 클라이언트 라이브러리를 npm설치합니다.

npm install @azure-rest/load-testing

클라이언트 만들기 및 인증 AzureLoadTesting

AAD(Azure Active Directory) 토큰 자격 증명을 사용하려면 @azure/ID 라이브러리에서 가져온 원하는 자격 증명 형식의 인스턴스를 제공합니다.

AAD로 인증하려면 먼저 npm 설치해야 합니다. @azure/identity

설치 후 사용할 자격 증명@azure/identity 유형을 선택할 수 있습니다. 예를 들어 DefaultAzureCredential을 사용하여 클라이언트를 인증할 수 있습니다.

AAD 애플리케이션의 클라이언트 ID, 테넌트 ID 및 클라이언트 암호 값을 환경 변수로 설정합니다( AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET

import AzureLoadTesting, { AzureLoadTestingClient } from "@azure-rest/load-testing";
import { DefaultAzureCredential } from "@azure/identity";

const Client: AzureLoadTestingClient = AzureLoadTesting(Endpoint, new DefaultAzureCredential());

주요 개념

다음 구성 요소는 Azure Load Testing Service를 구성합니다. JavaScript용 Azure 부하 테스트 클라이언트 라이브러리를 사용하면 전용 클라이언트 개체를 사용하여 이러한 각 구성 요소와 상호 작용할 수 있습니다.

테스트

테스트는 부하 테스트를 실행하기 위한 테스트 스크립트 및 구성 설정을 지정합니다. Azure Load Testing 리소스에서 하나 이상의 테스트를 만들 수 있습니다.

앱 구성 요소

Azure 호스트 애플리케이션에 대한 부하 테스트를 실행하는 경우 다양한 Azure 애플리케이션 구성 요소에 대한 리소스 메트릭(서버 쪽 메트릭)을 모니터링할 수 있습니다. 부하 테스트가 실행되는 동안 및 테스트가 완료된 후 Azure Load Testing 대시보드에서 리소스 메트릭을 모니터링하고 분석할 수 있습니다.

메트릭

부하 테스트 중에 Azure Load Testing은 테스트 실행에 대한 메트릭을 수집합니다. 다음과 같이 두 가지 유형의 메트릭이 있습니다.

  1. 클라이언트 쪽 메트릭은 테스트 엔진에서 보고한 세부 정보를 제공합니다. 이러한 메트릭에는 가상 사용자 수, 요청 응답 시간, 실패한 요청 수 또는 초당 요청 수가 포함됩니다.

  2. 서버 쪽 메트릭은 Azure 호스트 애플리케이션에 사용할 수 있으며 Azure 애플리케이션 구성 요소에 대한 정보를 제공합니다. 메트릭은 데이터베이스 읽기 수, HTTP 응답 유형 또는 컨테이너 리소스 사용량에 대한 것일 수 있습니다.

테스트 엔진

테스트 엔진은 Apache JMeter 테스트 스크립트를 실행하는 컴퓨팅 인프라입니다. 테스트 엔진 수를 구성하여 부하 테스트를 스케일 아웃할 수 있습니다. 테스트 스크립트는 지정된 수의 테스트 엔진에서 병렬로 실행됩니다.

테스트 실행

테스트 실행은 부하 테스트를 한 번 실행하는 것을 나타냅니다. Apache JMeter 스크립트 실행, 부하 테스트 YAML 구성, 모니터링할 앱 구성 요소 목록 및 테스트 결과와 관련된 로그를 수집합니다.

Data-Plane 엔드포인트

Azure Load Testing 리소스의 데이터 평면은 다음 URL 형식을 사용하여 주소를 지정할 수 있습니다.

00000000-0000-0000-0000-000000000000.aaa.cnt-prod.loadtesting.azure.com

첫 번째 GUID 00000000-0000-0000-0000-000000000000 는 Azure Load Testing 리소스에 액세스하는 데 사용되는 고유 식별자입니다. 그 다음에 aaa 는 리소스의 Azure 지역이 표시됩니다.

데이터 평면 엔드포인트는 컨트롤 플레인 API에서 가져옵니다.

예제:1234abcd-12ab-12ab-12ab-123456abcdef.eus.cnt-prod.loadtesting.azure.com

위의 예제에서 는 eus Azure 지역 East US을 나타냅니다.

예제

부하 테스트 만들기

import { AzureLoadTestingClient } from "@azure-rest/load-testing";
import AzureLoadTesting from "@azure-rest/load-testing";
import { DefaultAzureCredential } from "@azure/identity";

var TEST_ID = "some-test-id";
var DISPLAY_NAME = "my-load-test";

const client: AzureLoadTestingClient = AzureLoadTesting("<Endpoint>", new DefaultAzureCredential());

await client.path("/tests/{testId}", TEST_ID).patch({
  contentType: "application/merge-patch+json",
  body: {
    displayName: DISPLAY_NAME,
    description: "",
    loadTestConfiguration: {
      engineInstances: 1,
      splitAllCSVs: false,
    },
    secrets: {},
    environmentVariables: {},
    passFailCriteria: { passFailMetrics: {} },
  },
});

테스트에 .jmx 파일 업로드

import { AzureLoadTestingClient, getLongRunningPoller, isUnexpected } from "@azure-rest/load-testing";
import AzureLoadTesting from "@azure-rest/load-testing";
import { AbortController } from "@azure/abort-controller";
import { DefaultAzureCredential } from "@azure/identity";
import { createReadStream } from "fs";

const client: AzureLoadTestingClient = AzureLoadTesting("<Endpoint>", new DefaultAzureCredential());

var TEST_ID = "some-test-id";
const readStream = createReadStream("./sample.jmx");

const fileUploadResult = await client
  .path("/tests/{testId}/files/{fileName}", TEST_ID, "sample.jmx")
  .put({
    contentType: "application/octet-stream",
    body: readStream,
  });

if (isUnexpected(fileUploadResult)) {
  throw fileUploadResult.body.error;
}

let fileValidateResult;
const fileValidatePoller = await getLongRunningPoller(client, fileUploadResult);
try{
fileValidateResult = await fileValidatePoller.pollUntilDone({
  abortSignal: AbortController.timeout(120*1000), // timeout of 120 seconds
});} catch (ex: any) {
new Error("Error in polling file Validation" + ex.message); //polling timed out
}

if (fileValidatePoller.getOperationState().status != "succeeded" && fileValidateResult)
  throw new Error(
    "There is some issue in validation, please make sure uploaded file is a valid JMX." +
      fileValidateResult.body.validationFailureDetails
  );

테스트 실행 및 메트릭 가져오기

import { AzureLoadTestingClient, getLongRunningPoller, isUnexpected } from "@azure-rest/load-testing";
import AzureLoadTesting from "@azure-rest/load-testing";
import { DefaultAzureCredential } from "@azure/identity";
import { AbortController } from "@azure/abort-controller";

const client: AzureLoadTestingClient = AzureLoadTesting("<Endpoint>", new DefaultAzureCredential());

var TEST_ID = "some-test-id";
var DISPLAY_NAME = "my-load-test";
var TEST_RUN_ID = "some-test-run-id";

// Creating/Updating the test run
const testRunCreationResult = await client.path("/test-runs/{testRunId}", TEST_RUN_ID).patch({
  contentType: "application/merge-patch+json",
  body: {
    testId: TEST_ID,
    displayName: DISPLAY_NAME,
  },
});

if (isUnexpected(testRunCreationResult)) {
  throw testRunCreationResult.body.error;
}

if (testRunCreationResult.body.testRunId === undefined)
  throw new Error("Test Run ID returned as undefined.");

const testRunPoller = await getLongRunningPoller(client, testRunCreationResult);
  let testRunResult;

  try {
    testRunResult = await testRunPoller.pollUntilDone({
      abortSignal: AbortController.timeout(60000), // timeout of 60 seconds
    });
  } catch (ex: any) {
    new Error("Error in polling test run completion" + ex.message); //polling timed out
  }

  if (testRunPoller.getOperationState().status != "succeeded")
    throw new Error("There is some issue in running the test, Error Response : " + testRunResult);

  if (testRunResult) {
    let testRunStarttime = testRunResult.body.startDateTime;
    let testRunEndTime = testRunResult.body.endDateTime;

    // get list of all metric namespaces and pick the first one
    const metricNamespaces = await client
      .path("/test-runs/{testRunId}/metric-namespaces", TEST_RUN_ID)
      .get();

    if (isUnexpected(metricNamespaces)) {
      throw metricNamespaces.body.error;
    }

    const metricNamespace = metricNamespaces.body.value[0];

    if (metricNamespace.name === undefined) {
      throw "No Metric Namespace name is defined.";
    }

    // get list of all metric definitions and pick the first one
    const metricDefinitions = await client
      .path("/test-runs/{testRunId}/metric-definitions", TEST_RUN_ID)
      .get({
        queryParameters: {
          metricNamespace: metricNamespace.name,
        },
      });

    if (isUnexpected(metricDefinitions)) {
      throw metricDefinitions.body.error;
    }

    const metricDefinition = metricDefinitions.body.value[0];

    if (metricDefinition.name === undefined) {
      throw "No Metric Namespace name is defined.";
    }

    // fetch client metrics using metric namespace and metric name
    const metricsResult = await client.path("/test-runs/{testRunId}/metrics", TEST_RUN_ID).post({
      queryParameters: {
        metricname: metricDefinition.name,
        metricNamespace: metricNamespace.name,
        timespan: testRunStarttime + "/" + testRunEndTime,
      },
    });

    console.log(metricsResult);
    console.log(testRunResult);
}

문제 해결

로깅

로깅을 사용하도록 설정하면 실패에 대한 유용한 정보를 파악하는 데 도움이 될 수 있습니다. HTTP 요청 및 응답 로그를 보려면 AZURE_LOG_LEVEL 환경 변수를 info로 설정합니다. 또는 @azure/logger에서 setLogLevel을 호출하여 런타임에 로깅을 사용하도록 설정할 수 있습니다.

import { setLogLevel } from "@azure/logger";

setLogLevel("info");

로그를 사용하는 방법에 대한 자세한 내용은 @azure/logger package docs를 참조하세요.

다음 단계

Azure Loading Testing JavaScript SDK 샘플은 SDK의 GitHub 리포지토리에서 사용할 수 있습니다. 이러한 샘플은 일반적으로 발생하는 추가 시나리오에 대한 예제 코드를 제공합니다.

Azure Load Testing 샘플을 참조하세요.

참여

이 리포지토리에 기여하는 방법은 기여 가이드를 참조하세요.

  1. 포크
  2. 기능 분기 만들기(git checkout -b my-new-feature)
  3. 변경 내용 커밋(git commit -am 'Add some feature')
  4. 분기에 푸시(git push origin my-new-feature)
  5. 새 끌어오기 요청 만들기