Read and Configure
What report types does XLT offer?
Trend is not used very often.
Some important terms first to avoid confusion
These terms are important and different from other tools on purpose.
An executed test case forms a transaction
Transaction times are important for load estimations.
User interactions of any kind
Carefully craft actions, because you might create a false impression.
What really happens against the servers
Make sure you do not mix different calls into one line.
This is bandwidth usage per request bucket
Rarely used tab.
Socket timing view
These are averages and only one min and max, so this is nothing you can use to sum up things.
Hidden things, but not really on purpose.
Made for you to enrich the results
Timers and any values can be collected
You can also query other systems live to merge data in - custom samplers.
What was your execution environment doing?
This one is important and at the same time it isn't.
How to create reports from result data
bin $ ./create_report.sh ../results/20161126-131200
bin $ ./create_report.sh ../results/20161126-131200 -o ../reports/test01
Next slides will show some tricks.
Limit the view to a certain time period
./create_report.sh ../results/20161113-090012 -from +15m -to -45m -timezone=UTC
./create_report.sh ../results/20161113-090012 -from +15m -l 30m
./create_report.sh ../results/20161113-090012 -from 20161113-100000 -l 30m
./create_report.sh ../results/20161113-090012 -from 20161113-100000 -to 20161113-110000
./create_report.sh ../results/20161113-090012 -from +15m -l 30m -o /tmp/test-2
./create_report.sh ../results/20161113-090012 -to -30m -o /tmp/test-2
Can be great to compare two halfs of a single run against each other. For instance cold cache, warm cache or similar.
What else can be done?
More planned for future releases.
How to change these settings
## The percentiles to show in runtime data tables. Specify them as a comma-
## separated list of double values in the range (0, 100].
## Defaults to "50, 95, 99, 99.9". If left empty, no percentiles will be shown.
com.xceptance.xlt.reportgenerator.runtimePercentiles = 50, 95, 99, 99.9
## The list of run time values [ms] that mark the boundaries of the run time
## intervals which are used to segment the value range. For example, the values
## 1000 and 5000 segment the value range into three intervals: [0...1000],
## [0...5000] and [5001...]. These segments are shown separately in the
## report to illustrate the compliance to certain service level agreements.
## If this settings is missing or left empty, no segments will be shown.
com.xceptance.xlt.reportgenerator.runtimeIntervalBoundaries = 1000, 3000, 5000
To use too many datapoints, the tables get too wide and report evaluation gets harder.
XLT has extensive ways to adjust charts to see more details
## Sets a capping for run time charts. All run time values greater than the cap
## are not shown. The cap can be defined using two alternative methods. First,
## you may specify the capping value directly. Second, you may specify a factor
## that, when applied to the mean of all run time values, defines the ultimate
## capping value. The factor must be a double greater than 1. Note that capping
## values take precedence over capping factors. By default, there is no capping.
##
## Furthermore, you may configure the capping mode:
## - smart .... cap the chart only if necessary (ie. max > cap) [default]
## - always ... always cap the chart at the capping value
##
## Note that the capping value/factor and the capping mode can be defined
## separately for each chart type, but it is also possible to define a default
## that applies to all chart types.
#com.xceptance.xlt.reportgenerator.charts.cappingValue = 5000
#com.xceptance.xlt.reportgenerator.charts.cappingValue.transactions = 50000
#com.xceptance.xlt.reportgenerator.charts.cappingValue.actions = 10000
com.xceptance.xlt.reportgenerator.charts.cappingValue.requests = 10000
#com.xceptance.xlt.reportgenerator.charts.cappingValue.custom = 1000
#com.xceptance.xlt.reportgenerator.charts.cappingFactor = 5
#com.xceptance.xlt.reportgenerator.charts.cappingFactor.transactions = 5
#com.xceptance.xlt.reportgenerator.charts.cappingFactor.actions = 5
#com.xceptance.xlt.reportgenerator.charts.cappingFactor.requests = 5
#com.xceptance.xlt.reportgenerator.charts.cappingFactor.custom = 5
com.xceptance.xlt.reportgenerator.charts.cappingMode = always
It is often necessary to have different version side-by-side.
This is just a small glimpse of what is possible and good.
One of the most unique XLT features.
https://host.net/s/Foo/cart?dwcont=C1250297253
https://host.net/on/d.store/Sites-Foo-Site/en_US/COCustomer-Start
https://host.net/on/d.store/Sites-Foo-Site/en_US/
COAddress-UpdateShippingMethodList
?address1=&address2=&countryCode=&stateCode=&postalCode=
&city=&firstName=Armin&lastName=Warnes&format=ajax
https://host.net/on/d.store/Sites-Foo-Site/en_US/
COAddress-UpdateShippingMethodList
?address1=&address2=&countryCode=&stateCode=&postalCode=
&city=&firstName=Armin&lastName=Warnes
https://host.net/on/d.store/Sites-Foo-Site/en_US/COBilling-UpdateSummary
https://host.net/on/d.store/Sites-Foo-Site/en_US/__Analytics-Tracking
?url=https%3A%2F%2host.net%2Fon%2Fd.store%2FSites-Foo-Site%2Fen_US%2FCOCustomer-Start
&res=1600x1200&cookie=1&cmpn=&java=0&gears=0&fla=0&ag=0&dir=0&pct=0
&pdf=0&qt=0&realp=0&tz=US%2FEastern&wma=1&dwac=0.7869769714444649
&pcat=new-arrivals&title=Cole+Haan+Checkout&fake=13581407137497
Know the context first, you can do a lot of harm to your reports.
How to setup rules
com.xceptance.xlt.reportgenerator.requestMergeRules.1.newName = {n:0} NonJS [{u:1}]
com.xceptance.xlt.reportgenerator.requestMergeRules.1.namePattern = .+
com.xceptance.xlt.reportgenerator.requestMergeRules.1.statusCodePattern = (30[12])
com.xceptance.xlt.reportgenerator.requestMergeRules.1.contentTypePattern.exclude = javascript
com.xceptance.xlt.reportgenerator.requestMergeRules.1.stopOnMatch = false
newName .................. new request name (required)
namePattern [n] .......... reg-ex defining a matching request name
transactionPattern [t] ... reg-ex defining a matching transaction name
agentPattern [a] ......... reg-ex defining a matching agent name
contentTypePattern [c] ... reg-ex defining a matching response content type
statusCodePattern [s] .... reg-ex defining a matching status code
urlPattern [u] ........... reg-ex defining a matching request URL
runTimeRanges [r] ........ list of run time segment boundaries
stopOnMatch .............. whether or not to process the next rule even if
the current rule applied (defaults to true)
The more expensive the rule, the longer the calculation takes.
Couple of things before crunching data
Testing, testing, testing.
COLogin.1
https://host.net/s/Foo/cart?dwcont=C1250297253
COLogin.2
https://host.net/on/d.store/Sites-Foo-Site/en_US/COCustomer-Start
COLogin.3
https://host.net/on/d.store/Sites-Foo-Site/en_US/
COAddress-UpdateShippingMethodList
?address1=&address2=&countryCode=&stateCode=&postalCode=
&city=&firstName=Armin&lastName=Warnes&format=ajax
COLogin.4
https://host.net/on/d.store/Sites-Foo-Site/en_US/
COAddress-UpdateShippingMethodList
?address1=&address2=&countryCode=&stateCode=&postalCode=
&city=&firstName=Armin&lastName=Warnes
COLogin.5
https://host.net/on/d.store/Sites-Foo-Site/en_US/COBilling-UpdateSummary
COLogin.6
https://host.net/on/d.store/Sites-Foo-Site/en_US/__Analytics-Tracking
?url=https%3A%2F%2host.net%2Fon%2Fd.store%2FSites-Foo-Site%2Fen_US%2FCOCustomer-Start
&res=1600x1200&cookie=1&cmpn=&java=0&gears=0&fla=0&ag=0&dir=0&pct=0
&pdf=0&qt=0&realp=0&tz=US%2FEastern&wma=1&dwac=0.7869769714444649
&pcat=new-arrivals&title=Cole+Haan+Checkout&fake=13581407137497
See the merge rules rather as bucketing rules.
## Summarize Analytics Tracking
...requestMergeRules.10.newName = {u:1}
...requestMergeRules.10.urlPattern = /(__Analytics-Tracking)\\?
...requestMergeRules.10.stopOnMatch = true
## First, we eliminate the sub-request naming pattern, because we do not need
## that at the moment. This turns all "name.1" or "name.1.1"
## and so on into just "name".
...requestMergeRules.20.newName = {n:1}
...requestMergeRules.20.namePattern = ^([^\\.]*)(\\.[0-9]+)+$
...requestMergeRules.20.stopOnMatch = false
com.xceptance.xlt.reportgenerator replaced with '..'
# Do a split by pipeline name
...requestMergeRules.60.newName = {n:0} ({u:1})
...requestMergeRules.60.namePattern = [^.]+
...requestMergeRules.60.urlPattern = -Site/[^/]+/([^/\\?]+).*
...requestMergeRules.60.stopOnMatch = false
## Get us the redirect codes into the name
...requestMergeRules.80.newName = {n:0} [{s:0}]
...requestMergeRules.80.namePattern = .*
...requestMergeRules.80.statusCodePattern = (30[0-9])
...requestMergeRules.80.stopOnMatch = false
com.xceptance.xlt.reportgenerator replaced with '..'
How to compare two load test runs
./create_diff_report.sh <report-1> <report-2>
Request names have to be the same!
Comparing multiple reports forms a trend
./create_trend_report.sh <report-1> ... <report-n>
Request names have to be the same!
And they tested happily ever after.