Freigeben über


Azure Load Testing-Clientbibliothek für Java– Version 1.0.7

Azure Load Testing stellt dem Benutzer eine Clientbibliothek in Java bereit, mit der er nativ mit dem Azure Load Testing-Dienst interagieren kann. Azure Load Testing ist ein vollständig verwalteter Auslastungstestdienst, mit dem Sie eine hohe Auslastung generieren können. Der Dienst simuliert Datenverkehr für Ihre Anwendungen, unabhängig davon, wo sie gehostet werden. Entwickler, Tester und Qa-Techniker (Quality Assurance, Qualitätssicherung) können sie verwenden, um die Anwendungsleistung, Skalierbarkeit oder Kapazität zu optimieren.

Dieses Paket enthält die Microsoft Azure Developer LoadTesting-Clientbibliothek.

Dokumentation

Es stehen verschiedene Dokumentationen zur Verfügung, die Ihnen den Einstieg erleichtern

Erste Schritte

Voraussetzungen

Hinzufügen des Pakets zu Ihrem Produkt

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-developer-loadtesting</artifactId>
    <version>1.0.7</version>
</dependency>

Authentifizierung

Das Azure Identity-Paket stellt die Standardimplementierung für die Authentifizierung des Clients bereit.

Standardmäßig hängt die Azure Active Directory-Tokenauthentifizierung von der korrekten Konfiguration der folgenden Umgebungsvariablen ab.

  • AZURE_CLIENT_ID für die Azure-Client-ID.
  • AZURE_TENANT_ID für die Azure-Mandanten-ID.
  • AZURE_CLIENT_SECRET oder AZURE_CLIENT_CERTIFICATE_PATH für geheime Clientschlüssel oder Clientzertifikate.

Darüber hinaus kann die Azure-Abonnement-ID über die Umgebungsvariable AZURE_SUBSCRIPTION_IDkonfiguriert werden.

Mit der obigen Konfiguration kann der azure Client mit folgendem Code authentifiziert werden:

// ensure the user, service principal or managed identity used has Loadtesting Contributor role for the resource
TokenCredential credential = new DefaultAzureCredentialBuilder()
    .build();
// create client using DefaultAzureCredential
LoadTestAdministrationClient adminClient = new LoadTestAdministrationClientBuilder()
        .credential(credential)
        .endpoint("<Enter Azure Load Testing Data-Plane URL>")
        .buildClient();
LoadTestRunClient testRunClient = new LoadTestRunClientBuilder()
        .credential(credential)
        .endpoint("<Enter Azure Load Testing Data-Plane URL>")
        .buildClient();

RequestOptions reqOpts = new RequestOptions()
    .addQueryParam("orderBy", "lastModifiedDateTime")
    .addQueryParam("maxPageSize", "10");
adminClient.listTests(reqOpts);

reqOpts = new RequestOptions()
    .addQueryParam("orderBy", "lastModifiedDateTime")
    .addQueryParam("status", "EXECUTING,DONE")
    .addQueryParam("maxPageSize", "10");
testRunClient.listTestRuns(reqOpts);

Wichtige Begriffe

Die folgenden Komponenten bilden den Azure Load Testing-Dienst. Mit der Azure Load Test-Clientbibliothek für Java können Sie mithilfe von Clients mit jeder dieser Komponenten interagieren. Es gibt zwei Clients auf oberster Ebene, die die Standard Einstiegspunkte für die Bibliothek sind.

  • LoadTestingClient

  • LoadTestingAsyncClient

Die beiden Clients verfügen über ähnliche Methoden, mit der Ausnahme, dass die Methoden im asynchronen Client ebenfalls asynchron sind.

Die Clients der obersten Ebene verfügen über zwei Unterclients.

  • LoadTestAdministration

  • TestRun

Diese Unterclients werden zum Verwalten und Verwenden verschiedener Komponenten des Diensts verwendet.

Auslastungstestverwaltungsclient

Die LoadTestAdministration Unterclients werden zum Verwalten und Konfigurieren der Auslastungstests, App-Komponenten und Metriken verwendet.

Test

Ein Test gibt das Testskript und die Konfigurationseinstellungen zum Ausführen eines Auslastungstests an. Sie können in einer Azure Load Testing-Ressource einen oder mehrere Tests erstellen.

App-Komponente

Wenn Sie einen Auslastungstest für eine in Azure gehostete Anwendung ausführen, können Sie Ressourcenmetriken für die verschiedenen Azure-Anwendungskomponenten (serverseitige Metriken) überwachen. Sie können während des Auslastungstests und nach seinem Abschluss die Ressourcenmetriken auf dem Azure Load Testing-Dashboard überwachen und analysieren.

Metriken

Während eines Auslastungstests sammelt Azure Load Testing Metriken zur Testausführung. Es gibt zwei Typen von Metriken:

  1. Clientseitige Metriken enthalten Details, die von der Test-Engine gemeldet werden. Zu diesen Metriken gehören die Anzahl der virtuellen Benutzer*innen, die Antwortzeit auf Anforderungen, die Anzahl fehlerhafter Anforderungen oder die Anzahl der Anforderungen pro Sekunde.

  2. Serverseitige Metriken sind für in Azure gehostete Anwendungen verfügbar und enthalten Informationen zu Ihren Azure-Anwendungskomponenten. Metriken können für die Anzahl der Datenbanklesevorgänge, den Typ der HTTP-Antworten oder den Verbrauch von Containerressourcen gelten.

Testausführungsclient

Die TestRun Unterclients werden verwendet, um Testläufe zu starten und zu beenden, die einem Auslastungstest entsprechen. Ein Testlauf stellt eine Ausführung eines Auslastungstests dar. Er erfasst die Protokolle, die der Ausführung des Apache JMeter-Skripts zugeordnet sind, die YAML-Konfiguration des Auslastungstests, die Liste der zu überwachenden App-Komponenten und die Ergebnisse des Tests.

Data-Plane-Endpunkt

Die Datenebene von Azure Load Testing-Ressourcen kann mithilfe des folgenden URL-Formats adressiert werden:

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

Die erste GUID 00000000-0000-0000-0000-000000000000 ist der eindeutige Bezeichner, der für den Zugriff auf die Azure Load Testing-Ressource verwendet wird. Darauf folgt aaa , welche Azure-Region der Ressource ist.

Der Datenebenenendpunkt wird über Steuerungsebenen-APIs abgerufen.

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

Im obigen eus Beispiel stellt die Azure-Region East USdar.

Beispiele

Erstellen eines Auslastungstests

LoadTestAdministrationClient adminClient = new LoadTestAdministrationClientBuilder()
        .credential(new DefaultAzureCredentialBuilder().build())
        .endpoint("<endpoint>")
        .buildClient();

// construct Test object using nested String:Object Maps
Map<String, Object> testMap = new HashMap<String, Object>();
testMap.put("displayName", "Sample Display Name");
testMap.put("description", "Sample Description");

// loadTestConfig describes the number of test engines to generate load
Map<String, Object> loadTestConfigMap = new HashMap<String, Object>();
loadTestConfigMap.put("engineInstances", 1);
testMap.put("loadTestConfiguration", loadTestConfigMap);

// environmentVariables are plain-text data passed to test engines
Map<String, Object> envVarMap = new HashMap<String, Object>();
envVarMap.put("a", "b");
envVarMap.put("x", "y");
testMap.put("environmentVariables", envVarMap);

// secrets are secure data sent using Azure Key Vault
Map<String, Object> secretMap = new HashMap<String, Object>();
Map<String, Object> sampleSecretMap = new HashMap<String, Object>();
sampleSecretMap.put("value", "https://samplevault.vault.azure.net/secrets/samplesecret/f113f91fd4c44a368049849c164db827");
sampleSecretMap.put("type", "AKV_SECRET_URI");
secretMap.put("sampleSecret", sampleSecretMap);
testMap.put("secrets", secretMap);

// passFailCriteria define the conditions to conclude the test as success
Map<String, Object> passFailMap = new HashMap<String, Object>();
Map<String, Object> passFailMetrics = new HashMap<String, Object>();
Map<String, Object> samplePassFailMetric = new HashMap<String, Object>();
samplePassFailMetric.put("clientmetric", "response_time_ms");
samplePassFailMetric.put("aggregate", "percentage");
samplePassFailMetric.put("condition", ">");
samplePassFailMetric.put("value", "20");
samplePassFailMetric.put("action", "continue");
passFailMetrics.put("fefd759d-7fe8-4f83-8b6d-aeebe0f491fe", samplePassFailMetric);
passFailMap.put("passFailMetrics", passFailMetrics);
testMap.put("passFailCriteria", passFailMap);

// convert the object Map to JSON BinaryData
BinaryData test = BinaryData.fromObject(testMap);

// receive response with BinaryData content
Response<BinaryData> testOutResponse = adminClient.createOrUpdateTestWithResponse("test12345", test, null);
System.out.println(testOutResponse.getValue().toString());

Hochladen einer JMX-Datei in einen Auslastungstest

LoadTestAdministrationClient adminClient = new LoadTestAdministrationClientBuilder()
    .credential(new DefaultAzureCredentialBuilder().build())
    .endpoint("<endpoint>")
    .buildClient();

// extract file contents to BinaryData
BinaryData fileData = BinaryData.fromFile(new File("path/to/file").toPath());

// receive response with BinaryData content
Response<BinaryData> fileUrlOut = adminClient.uploadTestFileWithResponse("test12345", "sample-file.jmx", fileData, null);
System.out.println(fileUrlOut.getValue().toString());

Ausführen eines Auslastungstests

LoadTestRunClient testRunClient = new LoadTestRunClientBuilder()
    .credential(new DefaultAzureCredentialBuilder().build())
    .endpoint("<endpoint>")
    .buildClient();

// construct Test Run object using nested String:Object Maps
Map<String, Object> testRunMap = new HashMap<String, Object>();
testRunMap.put("testId", "test12345");
testRunMap.put("displayName", "SDK-Created-TestRun");

// convert the object Map to JSON BinaryData
BinaryData testRun = BinaryData.fromObject(testRunMap);

// start test with poller
SyncPoller<BinaryData, BinaryData> poller = testRunClient.beginTestRun("testrun12345", testRun, null);
Duration pollInterval = Duration.ofSeconds(5);
poller = poller.setPollInterval(pollInterval);

// wait for test to reach terminal state
JsonNode testRunJson = null;
String testStatus;
PollResponse<BinaryData> pollResponse = poller.poll();
while (pollResponse.getStatus() == LongRunningOperationStatus.IN_PROGRESS || pollResponse.getStatus() == LongRunningOperationStatus.NOT_STARTED) {
    try {
        testRunJson = new ObjectMapper().readTree(pollResponse.getValue().toString());
        testStatus = testRunJson.get("status").asText();
        System.out.println("Test run status: " + testStatus);
    } catch (JsonProcessingException e) {
        System.out.println("Error processing JSON response");
        // handle error condition
    }

    // wait and check test status every 5 seconds
    try {
        Thread.sleep(pollInterval.toMillis());
    } catch (InterruptedException e) {
        // handle interruption
    }

    pollResponse = poller.poll();
}

poller.waitForCompletion();
BinaryData testRunBinary = poller.getFinalResult();
try {
    testRunJson = new ObjectMapper().readTree(testRunBinary.toString());
    testStatus = testRunJson.get("status").asText();
} catch (JsonProcessingException e) {
    System.out.println("Error processing JSON response");
    // handle error condition
}

String startDateTime = testRunJson.get("startDateTime").asText();
String endDateTime = testRunJson.get("endDateTime").asText();

// get list of all metric namespaces and pick the first one
Response<BinaryData> metricNamespacesOut = testRunClient.getMetricNamespacesWithResponse("testrun12345", null);
String metricNamespace = null;
// parse JSON and read first value
try {
    JsonNode metricNamespacesJson = new ObjectMapper().readTree(metricNamespacesOut.getValue().toString());
    metricNamespace = metricNamespacesJson.get("value").get(0).get("metricNamespaceName").asText();
} catch (JsonProcessingException e) {
    System.out.println("Error processing JSON response");
    // handle error condition
}

// get list of all metric definitions and pick the first one
Response<BinaryData> metricDefinitionsOut = testRunClient.getMetricDefinitionsWithResponse("testrun12345", metricNamespace, null);
String metricName = null;
// parse JSON and read first value
try {
    JsonNode metricDefinitionsJson = new ObjectMapper().readTree(metricDefinitionsOut.getValue().toString());
    metricName = metricDefinitionsJson.get("value").get(0).get("name").get("value").asText();
} catch (JsonProcessingException e) {
    System.out.println("Error processing JSON response");
    // handle error condition
}

// fetch client metrics using metric namespace and metric name
PagedIterable<BinaryData> clientMetricsOut = testRunClient.listMetrics("testrun12345", metricName, metricNamespace, startDateTime + '/' + endDateTime, null);
clientMetricsOut.forEach((clientMetric) -> {
    System.out.println(clientMetric.toString());
});

Problembehandlung

Azure SDKs für Java bieten einen konsistenten Protokollierungsverlauf, um die Problembehandlung von Anwendungsfehlern zu unterstützen und deren Lösung zu beschleunigen. Die erstellten Protokolle erfassen den Flow einer Anwendung, bevor sie den Endzustand erreichen. Dies trägt zur Ermittlung der Grundursache bei. Informationen zum Aktivieren der Protokollierung finden Sie im Protokollierungswiki.

Nächste Schritte

Azure Loading Testing Java SDK-Beispiele stehen Ihnen im GitHub-Repository des SDK zur Verfügung. Diese Beispiele enthalten Beispielcode für zusätzliche Szenarien, die häufig auftreten. Weitere Informationen finden Sie unter Azure Load Testing-Beispiele.

Mitwirken

Ausführliche Informationen zum Mitwirken an diesem Repository finden Sie im Leitfaden zum Mitwirken.

  1. Verzweigen sie
  2. Erstellen Ihrer Featurebranch (git checkout -b my-new-feature)
  3. Committen Ihrer Änderungen (git commit -am 'Add some feature')
  4. Pushen in den Branch (git push origin my-new-feature)
  5. Erstellen eines neuen Pull Requests