100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Testing

Analyzing Results with HTML Dashboards

Learn how to generate and read JMeter's built-in HTML reporting dashboard, including its APDEX, percentile, and throughput graphs, to interpret a load test run correctly.

Scripting & PluginsBeginner8 min readJul 10, 2026
Analogies

The HTML Reporting Dashboard

Since JMeter 3.0, the tool ships with a built-in HTML Reporting Dashboard generated from a .jtl results file using the -e -o command-line flags (or the 'Generate Report Dashboard' button in the GUI). This replaced the older practice of relying on individual GUI listeners like the Graph Results or Aggregate Report during a run, which are explicitly discouraged for actual load generation because rendering live graphs consumes CPU and memory that should go toward generating load. The dashboard instead reads the complete .jtl file after the run finishes and renders a self-contained set of static HTML pages with interactive charts built on top of aggregated statistics.

🏏

Cricket analogy: It's like reviewing the full match scorecard and Hawk-Eye data after the game instead of a commentator trying to calculate a bowler's exact economy rate live, ball by ball, which would slow the broadcast down.

Key Dashboard Graphs and Statistics

The dashboard's main 'APDEX' (Application Performance Index) table scores each request label between 0 and 1 based on configurable satisfied/tolerating thresholds, giving a single normalized number for stakeholders who don't want to read raw millisecond values. The 'Statistics' table below it is the real workhorse, showing per-label counts, error percentage, average, min, max, and standard deviation, alongside the 90th, 95th, and 99th percentile response times, and throughput in requests per second, which together tell you far more about real user experience than the average alone.

🏏

Cricket analogy: APDEX is like a single 'player of the match' rating that sums up a performance in one number, while the full statistics table is like the complete scorecard with strike rate, boundary count, and dot-ball percentage.

bash
# Generate the HTML dashboard from an existing results file (no test re-run needed)
jmeter -g results/checkout-flow.jtl -o results/dashboard

# Or generate results AND the dashboard in a single run
jmeter -n -t checkout-flow.jmx -l results/checkout-flow.jtl -e -o results/dashboard

Response Time Percentiles Over Time and Distribution Graphs

Beyond the summary tables, the dashboard's 'Charts' section includes 'Response Times Over Time,' which plots percentiles across the run's duration and is the single best graph for spotting whether performance degraded as the test progressed (for example, response times staying flat for the first ten minutes then climbing steadily, a classic sign of a memory leak or connection pool exhaustion), and 'Response Time Percentiles,' a distribution curve showing what fraction of requests fell under each response time value, useful for seeing whether a slow tail is a small isolated spike or a broad systemic shift.

🏏

Cricket analogy: It's like plotting a bowler's speed gun readings across a full spell rather than just the average pace, revealing whether pace dropped steadily after the eighth over, a sign of fatigue rather than a single bad ball.

Averages can be dangerously misleading in performance analysis: a request label with a 200ms average could hide the reality that 90% of requests return in 100ms while 10% take 2 seconds, a pattern only percentiles and the distribution graph reveal. Always check p90/p95/p99 alongside the average before declaring a test result healthy.

Interpreting APDEX and Error Rate

APDEX thresholds are configurable via the jmeter.properties file (jmeter.reportgenerator.apdex_satisfied_threshold and jmeter.reportgenerator.apdex_tolerating_threshold), and choosing sensible values matters: leaving the defaults (500ms satisfied, 1500ms tolerating) unchanged for an API that's expected to respond in 50ms will produce a misleadingly perfect APDEX score of 1.0 even if performance has quietly doubled. The error percentage column deserves equal attention to latency; a test with excellent response times but a climbing error rate under load is often revealing a saturation point, such as a connection pool or thread pool exhausting, well before response times themselves show the strain, because failed requests frequently return fast (a quick 503) rather than slow.

🏏

Cricket analogy: Using default APDEX thresholds meant for a Test match on a T20 innings is like judging a T20 batter's strike rate against Test-match run-rate benchmarks, producing a flattering but meaningless score.

Never merge results from multiple separate test runs into one .jtl file and regenerate a single dashboard from it unless the runs used identical configuration (same thread count, ramp-up, and environment); mixed-configuration merges silently produce misleading aggregated percentiles and throughput numbers that don't correspond to any real single run.

  • The HTML Reporting Dashboard is generated from a .jtl file after a run via -e -o, replacing live GUI listeners that shouldn't be used during actual load generation.
  • APDEX gives a single normalized 0-1 score per label based on configurable satisfied/tolerating thresholds, useful for a quick stakeholder-level summary.
  • The Statistics table's percentiles (p90/p95/p99) and error rate matter far more than the average for understanding real user experience.
  • Response Times Over Time reveals whether performance degrades progressively during a run, a classic sign of leaks or resource exhaustion.
  • Response Time Percentiles (distribution) shows whether a slow tail is an isolated spike or a broad systemic shift.
  • APDEX thresholds must be tuned in jmeter.properties to match the actual expected latency of the system under test, or the score becomes meaningless.
  • Rising error rate under load, even with healthy latency, often signals a saturation point like connection pool exhaustion before response times show strain.

Practice what you learned

Was this page helpful?

Topics covered

#Testing#JMeterStudyNotes#TestingQA#AnalyzingResultsWithHTMLDashboards#Analyzing#Results#HTML#Dashboards#WebDevelopment#StudyNotes#SkillVeris