Chapter 35Lesson 03~250 minutes

Capstone: Design and Operate a Production Performance-Testing Program: Configuration, Design Patterns, and Trade-Offs

A production program is a portfolio of experiments, not one permanent thread count. The correct design depends on risk, feedback speed, environment stability, evidence cost, and the failure modes you need to detect. This lesson turns the capstone artifacts into durable operating choices.

PortfolioCadenceInjectorsTelemetryOwnership

Learning objectives

  • Compare the principal configuration and design choices for Capstone: Design and Operate a Production Performance-Testing Program without changing the workload question unintentionally.
  • Identify which settings belong to the JMeter plan, JVM, OS/network, target, extensions, CI/container, or distributed-engine layers.
  • Explain the trade-offs among performance cost, reliability, reproducibility, security, portability, and operational complexity.
  • Choose an appropriate pattern from measured evidence and explicit constraints rather than from convenience or folklore.
  • Preserve measurement validity and a stable evidence baseline before moving into failure diagnosis.

1. Test portfolio and cadence

Portfolio layer Purpose Typical cadence Evidence depth
PR/commit smoke Catch broken correlation/assertions/obvious regressions cheaply. Per change on controlled local/CI runner. JTL/log + compact summary/gate.
Nightly regression Detect repeatable endpoint/journey degradation. Nightly or scheduled. Repeated runs + dashboard + target/generator telemetry + trend.
Release candidate Govern release against approved baseline/SLO. Per release candidate. Full packet, hashes, governance decision and sign-off/exception if needed.
Soak/capacity Find leaks/limits/time-dependent degradation. Periodic/on demand with explicit authorization. Longer telemetry, generator/SUT resource history, recovery evidence.

Do not force every test into per-commit CI. A noisy shared runner cannot support the same precision as an isolated release environment. Match cadence and gate strictness to experimental validity.

2. Workload model per journey

Different user journeys may need different models. A login/checkout path can be a closed user loop with think time; an event-ingestion endpoint may be arrival-rate driven; a batch API may be scheduled bursts. Keep the business journey separate from the execution profile so local, CI and distributed injectors can run the same logical flow at different authorized scales.

The mandatory capstone stays with the stable core Thread Group and closed 2×5 profile. Experimental Open Model behavior is not required. If adopted later, pin the JMeter version, label it experimental, prove configured versus achieved arrivals, and keep a stable core fallback.

3. Result-retention policy

Artifact Retention intent Risk/cost
Raw JTL + jmeter.log Short/medium term for reanalysis and first-failure diagnosis. Larger; may contain operational detail.
Target telemetry Keep with the run while diagnosing SUT/generator causality. Can expose topology/build detail.
Dashboard Convenient review artifact; regenerate from preserved compatible JTL when possible. Many files; derived evidence.
Summary/gate/governance Long-lived, compact decision history. Must retain hashes/identity to stay meaningful.
Generator observations Keep at least through review/incident window. OS/process details may be sensitive.

Minimize response/header/body retention at collection time rather than relying on deletion later. The capstone JTL intentionally omits response bodies and request/response headers.

4. Local versus distributed injectors

Local/one injector Distributed fleet
Simpler diagnosis, data/state ownership and network topology. Higher aggregate load/capacity when one generator is insufficient.
Best starting point and reproducibility baseline. Every engine runs the complete plan unless properties/data deliberately partition it.
One generator resource profile to validate. Must validate controller and every engine, JMeter/Java/JAR/data parity and result transfer.
No RMI dependency. RMI SSL/network ports/keystore and clock synchronization become operating state.

Scale injectors because evidence proves one generator is insufficient—not because “production uses many servers.”

5. HTML report versus real-time telemetry

HTML dashboard Real-time/backend telemetry
Excellent post-run browser analysis from CSV JTL. Useful during longer tests and for correlating JMeter/SUT/system metrics.
No extra telemetry service required. Requires backend/network/schema/cardinality/retention governance.
Can be regenerated from compatible raw JTL. May introduce generator/network overhead and backend failure modes.
Best mandatory local path. Optional extension for production monitoring and incident response.

Chapter24's Backend Listener/InfluxDB/Grafana design is the upgrade path when live visibility is justified. Keep raw JTL even when live telemetry exists.

6. Absolute versus regression gates

Absolute SLOs protect user/business objectives. Relative regression budgets detect erosion while SLOs still pass. Gate only valid evidence. A useful release gate often checks both, plus error rate and achieved work. Do not gate directly on a dashboard screenshot or one noisy percentile.

7. Extension/plugin policy

Core JMeter is the default. Use cached JSR223 Groovy for small local logic and custom Java/third-party plugins only when value justifies the new compatibility/supply-chain burden. Every runtime extension must have exact version/source/hash, API compatibility checks, remote-engine parity and rollback. The mandatory capstone deliberately needs no plugin.

8. Ownership and incident handoff

Role Owns
Service owner SLO, target safety, release risk, accepted exceptions/remediation.
Performance-program owner Charter/workload/baseline/policy/runbook quality and review process.
Test-plan maintainer JMX/data/config correctness, correlation/assertions and compatibility.
Platform/CI owner Runner/injector/container/remote-engine health and artifact delivery.
Incident responder Preserve-first diagnosis across generator/network/SUT and evidence handoff.

Ownership can be one person in a small team, but the responsibilities should still be explicit.

9. Upgrade and compatibility checklist

Before changing JMeter/Java/plugin/container/CI/telemetry versions:

  1. freeze the current approved lock/baseline and representative raw evidence;
  2. read current release notes/Javadocs/provider docs;
  3. run tiny functional/correlation tests;
  4. run the same local governed workload on old and candidate runtime;
  5. compare configured/achieved samples, result schema, percentile calculation and generator state;
  6. verify remote/container/plugin parity if those paths exist;
  7. promote the runtime lock and, only if measurement semantics legitimately changed, review baseline compatibility.

JMeter 5.6.3 is the current course lock; Java17 is recommended for the 5.6.x line. A future major release may change Java requirements, so runtime upgrades are governance events.

10. Configuration-layer separation

Layer Examples in capstone
JMeter core/test plan Thread Group, CSV/cookie/header managers, timer, JSON extractors/assertions, result fields.
Java/JVM Java17, heap/GC, truststore, JMeter process health.
OS/network Loopback ports, socket limits, resolver/routes, injector CPU.
SUT Fixture build, endpoint delays, session/cart/order state, request guard.
Plugin/driver None mandatory; any future plugin/JDBC/JMS driver gets a lock.
CI provider Runner resources, job timeout, artifact upload and gate exit handling.
Container/orchestrator Image digest, CPU/memory/network/service discovery and mounted data.
Distributed RMI Controller/engine plan fan-out, SSL, ports, clocks, data/JAR parity.

11. Worked decision scenario

A nightly run needs 800 req/s but one injector reaches only520 req/s while CPU=96%, GC increases, target CPU=35%, and server latency is stable. Should the target be scaled first?

No. Configured load is not achieved and the generator is saturated. Scale/partition injectors, preserve workload semantics/data uniqueness, and revalidate fleet parity. Only when the generator can deliver the intended rate with headroom should target capacity be inferred.

12. Program design table

Question Default choice Escalate when
Can one injector deliver valid load? Local/single CLI injector. Generator/network becomes limiting.
Need live telemetry? Raw JTL + dashboard + SUT metrics. Long tests/incident correlation justify backend telemetry.
Need plugin/custom code? Core components first. Protocol/reuse/performance gap is proven and governed.
Gate absolute or relative? Both when baseline is trustworthy. Noise/sample limitations require review or stronger experiment.
Raw retention? Short enough for privacy/cost; long enough for reanalysis. Incidents/exceptions/regulatory needs require longer protected retention.
Where run? Most controlled free/local environment that answers risk. Scale to isolated CI/shared lab/distributed only with identity/parity controls.

13. Measurement validity before capacity claims

Always report configured and achieved load, generator CPU/heap/GC/network state, target telemetry, errors, workload/environment version, and limitations. A fast target under under-delivered load is not a capacity result. A slow dashboard under saturated generator is not automatically a server regression.

Mandatory profile remains: Apache JMeter5.6.3/Java17, no plugins, HttpClient4, 127.0.0.1:8035, 2×5 journeys,40 samples,75ms pacing, raw JTL+jmeter.log+dashboard+target telemetry+generator observation.

Knowledge check

Why not use the same strict percentile gate on every PR runner?

When should injector scaling happen?

Why keep raw JTL if Grafana exists?

What makes a plugin policy part of production operations?

Who owns the handoff when a gate failure may be generator rather than SUT?

Next lesson

Diagnose program-level failures

Lesson4 applies the preserve-first troubleshooting sequence to architecture, workload safety, generator validity, secrets, data ownership, dashboards, CI gates and baseline history.

Official references and version notes

Version and compatibility note

Current behavior was rechecked against primary Apache JMeter documentation on 2026-09-06. Mandatory path: Apache JMeter 5.6.3, Java 17, built-in HttpClient4, no third-party plugin, Python 3 standard library fixture/tools, loopback target only. JMeter 5.6.3 requires Java 8+ and the 5.6.x line recommends Java 17+. Meaningful load is CLI; GUI is for authoring/debug. HTTP retry remains disabled; correlation uses built-in JSON Extractor; data uses CSV Data Set Config; per-thread cookies use HTTP Cookie Manager. The HTML dashboard is generated from raw CSV JTL and is corroborating evidence rather than the only source. Real remote mode is optional: every server runs the whole plan, so configured load multiplies unless per-engine properties are adjusted; engines require exact JMeter parity, should use the same Java, need their own data files, and RMI SSL remains enabled. No external container, CI provider, plugin, telemetry server, or paid service is mandatory.

Keep the academy open

Support free, practical DevOps education.

Every lesson is designed to remain readable in a browser, downloadable from GitHub, and usable without a paid learning platform. Contributions help expand and maintain the curriculum.

Ethereum / ERC-20
0x716c4Ab160C4B66F31a28AE2448BfF68fc3a2ef0 Send only Ethereum/ERC-20 compatible assets to this address.