Ist es möglich, die tatsächliche Antwortzeit von API-Anfragen mit dem JSR223/groovy Sampler in JMeter zu erhalten? Ich habe den folgenden Arbeitscode, aber bekomme keine richtige Antwortzeit, wenn ich meine Zuhörer beobachte (Antwortinhalt ist in Ordnung, einige JSON-Daten).Antwortzeiten mit JSR223 + JMeter erhalten
Die Ziel-URL wird im Sampler im Feld 'Parameter' angegeben (basierend auf Dmitris Beispiel). Außerdem habe ich ein Bearer-Token in den Header eingefügt, um das OAuth-Zugriffstoken zu verwenden, wenn Anfragen ausgeführt werden.
Ich habe versucht, einen Transaction-Controller zu verwenden und den JSR223-Sampler darin aufzunehmen, aber das hat nicht funktioniert, um die Antwortzeit zu erhalten (auch nicht beim Erstellen eines Eltern-Samples).
import org.apache.http.HttpEntity
import org.apache.http.HttpResponse
import org.apache.http.client.HttpClient
import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.DefaultHttpClient
import org.apache.http.util.EntityUtils
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
List<String> urls = new ArrayList<String>(); // initialize array of URLs
Collections.addAll(urls, args); // read URLs from "Parameters" input and add them to array
ExecutorService pool = Executors.newFixedThreadPool(urls.size());
// initialize pool of Future Tasks with number of threads equal to size of URLs provided
for (String url : urls) { // for each URL from list
final String currentURL = url;
pool.submit(new Runnable() { // Sumbit a new thread which will execute GET request
@Override
public void run() {
try {
HttpClient client = new DefaultHttpClient(); // Use Apache Commons HTTPClient to perform GET request
HttpGet get = new HttpGet(currentURL);
get.addHeader("authorization","Bearer ${AccessToken}"); // Add the access token into the header
get.addHeader("connection","keep-alive"); // Add keep-alive in header
HttpResponse response = client.execute(get); // HttpResponse response = client.execute(post);
HttpEntity entity = response.getEntity();
log.info("Response Status Code: " + response.getStatusLine().getStatusCode() + " " + response.getStatusLine().getReasonPhrase());
SampleResult.setResponseData(EntityUtils.toByteArray(entity));
} catch (Exception ex) {
ex.printStackTrace();
throw ex;
}
}
});
}
pool.shutdown(); // shut down thread pool
Ihre Frage ist unklar. Meinst du, du möchtest die Antwortzeit von 'HttpResponse response = client.execute (get);' anstelle der Reaktionszeit des gesamten Samplers bekommen? oder etwas anderes? –
ja die Antwortzeit der Probe. Ich bekomme einen gültigen Antwort Inhalt (JSON Nachricht) für diese API Anfrage. aber ich möchte wissen, wie lange die Anfrage dauerte, daher muss ich die Reaktionszeit wissen. für was ich jetzt sehe, ist die Antwortzeit des Jsr223 Sampler etwa 10-20ms oder so, was nicht korrekt ist (sollte für diese API Anfrage über 1> sec sein). – DMC
Seltsamerweise: Ich würde denken, Sampler wäre länger als einzelne Operation in ihm. Es könnte etwas mit der Verwendung separater Threads zu tun haben, um den Code auszuführen. Die Hauptannahme von JMeter ist, dass jeder Sampler eine einzelne "Operation" ist, die von einem einzelnen Thread ausgeführt wird. Und Sie haben mehrere Threads, die mehrere Dinge parallel zu mehreren URLs ausführen. So kann es komisch werden. Ich würde vorschlagen, Sampler eine Sache zu verarbeiten, und steuern die Verarbeitung aller URLs auf Thread-Gruppenebene –