JMeter & ELK Search Meetup Jan. 2015
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
Hintergrundinfos ‣ schon mehrere Lasttests durchgeführt: ‣ größere (2500 req/s) ‣ mittlere ‣ aber auch kleine (40 req/s) ‣ grober Ablauf stets: ‣ Testspezifikation ‣ Was genau soll getestet werden? ‣ Was sind die Exit Kriterien? ‣ Tests programmieren und Tests durchführen ‣ Testergebnisse auswerten und interpretieren ‣ Ggf. Anpassungen am object under test und/oder den Tests ‣ rinse and repeat 2
Problemstellung 1: Unklare Anforderungen ‣ Was ist „schnell“? Was bedeutet „auch unter Last stabil“? ‣ Wenn möglich: sich an vorhandenen oder ähnlichen Systemen orientieren ‣ Klassischer ELK use-case: Logfiles analysieren 3
Problemstellung 2: Datenmenge ‣ 2500 req/s * 120 Minuten Laufzeit = 18.000.000 req ‣ Zu viel für Excel ‣ Einige JMeter Elemente „töten“ das GUI ‣ „View Results Tree“ ganz sicher1 ‣ „Graph Results“ manchmal ‣ Headless ist generell zu bevorzugen ‣ Lösungsansatz ohne ELK war: ‣ aggregator.groovy2 ‣ Excel 1) fairerweise: ist auch eher fürs Entwickeln/Debuggen gedacht 2) auch im JMeter Wiki wird ein „Shell Script to Aggregate Per Minute“ beschrieben (http://wiki.apache.org/jmeter/LogAnalysis) 4
Testergebnisse Ohne ELK, mit Excel 15 15 20 Webserver, Webserver, Webserver, überlastet überlastet stabil +5 Webserver 15 Webserver 5
Problemstellung 3: Nachgelagerte Analysen http://jmeter.apache.org/images/screenshots/graph_results.png 6
Problemstellung 3: Nachgelagerte Analysen http://jmeter.apache.org/images/screenshots/response_time_graph.png 7
Lösung: JMeter ELK Integration JMeter schreibt ein .csv /JMeter/config/addiontal.properties # Timestamp format - this only affects CSV output files # legitimate values: none, ms, or a format suitable for SimpleDateFormat # Default: # jmeter.save.saveservice.timestamp_format=ms jmeter.save.saveservice.timestamp_format=yyyy-MM-dd_HH:mm:ss.SSS # For use with Comma-separated value (CSV) files or other formats # where the fields' values are separated by specified delimiters. # Default: # jmeter.save.saveservice.default_delimiter=, jmeter.save.saveservice.default_delimiter=| /Jmeter/logs/MasterTestPlan.jmx_foo.bar.de_20140708-145452 timeStamp|elapsed|label|responseCode|responseMessage|threadName|dataType|success| failureMessage|bytes|grpThreads|allThreads|URL|Filename|Latency|Encoding|SampleCount| ErrorCount|Hostname|IdleTime 2014-07-08_14:54:53.238|167|TC4-ChatPollHttpPost|200|OK|Thread Group 1-1|text|true||537|1|1| http://foo.bar.de/index.php/?m=lite&module=chat&action=ping&hx1ylvte||167|ISO-8859-1|1|0| barfoo|0 2014-07-08_14:54:54.074|67|TC4-ChatPollHttpPost|200|OK|Thread Group 1-1|text|true| 8
Lösung: JMeter ELK Integration grok und date Filter zum einlesen der JMeter Daten /etc/logstash/conf.d/foobar_jmeter_csv.conf # use a grok filter to match our event. For debugging use http://grokdebug.herokuapp.com/ grok { patterns_dir => "/etc/logstash/patterns" match => [ "message“, "%{JMETER_TIMESTAMP:timestamp}\|%{NONNEGINT:elapsed:int}\|%{DATA:label}\| %{POSINT_OR_DATA:responseCode}\|%{DATA:responseMessage}\|%{DATA:threadName} \| %{DATA:dataType}\|%{DATA:success}\|%{DATA:failureMessage}\| %{NONNEGINT:bytes:int}\|%{NONNEGINT:grpThreads:int}\| %{NONNEGINT:allThreads:int}\|%{URI:uri}\|%{DATA:filename}\| %{NONNEGINT:latency:int}\|%{DATA:encoding}\|%{NONNEGINT:sampleCount:int}\| %{NONNEGINT:errorCount:int}\|%{HOSTNAME:hostname}\| %{NONNEGINT:idleTime:int}" ] } # use a date filter to extract the @timestamp metadata field from the timestamp field # remove timestamp when done date { match => [ "timestamp", "yyyy-MM-dd_HH:mm:ss.SSS" ] timezone => "Europe/Berlin" remove_field => [ "timestamp" ] 9
Testergebnisse „Social Intranet“ 3 Testläufe von Köln aus ‣ idle ≈ 1 req/s ‣ elapsed time ≈ 100ms 10
Testergebnisse „Social Intranet“ 3 Testläufe von Köln aus ‣ 100% Last ≈ 45 req/s ‣ elapsed time ≈ 200ms 11
Testergebnisse „Social Intranet“ 3 Testläufe von Köln aus ‣ ~150% Last ≈ 70 req/s ‣ elapsed time ≈ 150ms (?!? *shrug*) 12
Testergebnisse „Social Intranet“ Testlauf von Hong-Kong mit 100% Last 13
Testergebnisse „Social Intranet“ Zoom auf die ersten 10 Minuten ‣ nur zu Beginn einige erfolgreiche Requests 14
Testergebnisse „Social Intranet“ Zoom auf die ersten 10 Minuten ‣ Fehler: großteils Timeouts 15
Testergebnisse „Social Intranet“ Zoom auf die letzten 10 Minuten ‣ Fehler nun: UnknownHostExceptions (DNS?). Zu diesem Zeitpunkt kommen die Requests gar nicht mehr am Server an 16
Kurze Live-Demo ‣ cd ~/git-repos/inovex-vagrant/vagrantfiles/ubuntu12-with-jmeter-and-elk ‣ vagrant up ‣ http://localhost:13080/kibana/index.html#/dashboard/file/logstash.json ‣ load ~/git-repos/inovex-vagrant/vagrantfiles/ubuntu12-with-jmeter-and-elk/kibana- dashboard_jmeter.json 17
Fazit & Ausblick ‣ ELK hilft in der Testspezifikation ‣ ELK ist sehr geeignet für die event-basierten Daten aus JMeter ‣ Datenmengen sind kein Problem mehr ‣ Nachträgliche Auswertungen inkl. Drill-down ‣ Korrelationsmöglichkeit zwischen client-seitigen Metriken aus JMeter und server- seitigen Metriken 18
Vielen Dank für Ihre Aufmerksamkeit Kontakt Max Wippert Head of Project Management & Quality Assurance inovex GmbH Office Köln Kupferhütte 4.1 Schanzenstraße 6-20 51063, Köln Mobil: 0173-3181-048 Mail: max.wippert@inovex.de 19
Sie können auch lesen