java-rust-glowroot-agent 0.3.0
java-rust-glowroot-agent 0.3.0
0.3.0 adds bounded telemetry profiles that can be changed while the application is running. The
HTTP programming model and Java business code do not change.
What Users Get
- Keep the normal production surface small with
reactor.glowroot.profile=micro. - Temporarily enable JVM gauges with
jvm, explicit SQL timing withsql, or both plus bounded
error stacks withfull. - Use
diagnosticonly for an authorized, short incident window when a thread dump, heap histogram,
or heap dump is required. - Return to the configured baseline with
restoreConfiguredProfile(). Profile-owned queues, SQL
slots, JNI references, and retired export state are released before the call returns. - Run aggregation, protobuf encoding, HTTP/2 export, reconnect, and resource reclamation on one
isolated Rust thread with a256 KiBstack. Hyper and application workers are not reused. - Keep embedded REST request capture in one compact 32-bit state value. Exact 5xx accounting and
the configured rotating sample frequency remain unchanged. - Validate collector reachability when the exporter starts. Linux runs export as low-priority
batch work and Windows uses the lowest normal thread priority. Embedded REST closes the startup
probe and reconnects only for a bounded export window. Standalone Spring reuses one bounded
connection. - Use one bounded Tomcat context valve instead of entering the Spring MVC interceptor lifecycle on
every request. Jetty, Undertow, and other Servlet containers retain the portable interceptor
fallback. Both paths preserve exact5xx, route limits, and async completion. - Use the same starter in non-web Spring Boot workers. Process/JVM gauges, explicit SQL timing, and
authorized diagnostics no longer require Servlet MVC, Tomcat, or a web application context. - Keep the Servlet condition only on the optional MVC adapter. Set
reactor.glowroot.spring.enabled=falseto disable HTTP interception while retaining core
telemetry. Setreactor.glowroot.spring.tomcat-native.enabled=falseonly to force the portable MVC
fallback, orreactor.glowroot.enabled=falseto stop the native runtime completely.
Minimal Configuration
reactor.glowroot.enabled=true
reactor.glowroot.profile=micro
reactor.glowroot.collector.address=http://glowroot-collector:8181
reactor.glowroot.agent.id=orders::pod-1
reactor.glowroot.application.name=orders-apiFor any Spring Boot application, add:
<dependency>
<groupId>com.reactor</groupId>
<artifactId>java-rust-glowroot-spring-boot-starter</artifactId>
<version>0.3.0</version>
</dependency>Rust-Java REST 4.5.4 already contains the embedded runtime. It needs no starter. Add the small
java-rust-glowroot-agent:0.3.0 bootstrap only when your platform requires -javaagent syntax.
Compatibility
| Runtime | Required contract |
|---|---|
| Rust-Java REST | rust-java-rest:4.5.4, REST ABI 29, Glowroot ABI 3 |
| Spring Boot, web or non-web | java-rust-glowroot-spring-boot-starter:0.3.0, Glowroot ABI 3 |
| Native platform | Windows x64 or Linux glibc x64 from the clean rust-spring v4.5.4 revision |
Do not copy DLL/SO files between versions. Startup validates ABI, source revision, and SHA-256
provenance before telemetry starts.
Production Boundary
Profiles are process-wide. Protect any profile-switch or diagnostic endpoint with authentication
and authorization. The release gate verifies Spring Boot and embedded REST behavior, collector-down
fail-open, bounded memory, RPS/p99 limits, exact 5xx handling, and the optional bootstrap on the
exact release commit. Stable-release benchmark cells allow no non-2xx regression and retain a strict
0.05% absolute error ceiling. Spring retained-memory evidence is sampled only after all performance cells;
both variants then receive the same benchmark-only full GC and idle window so GC phase does not bias
the +3 MiB decision. The reports, native provenance manifest, and SHA256SUMS file are attached to
the GitHub Release.
The full performance matrix runs only on the dedicated
reactor-performance-native-linux self-hosted runner class. GitHub Actions remains the orchestrator
and release gatekeeper. It verifies the actual runner labels and native-host preflight evidence for
the exact release commit. Local Docker/WSL quick gates are useful during development but cannot
approve this release.
The runner uses calibrated, deterministic CPU roles on separate physical groups instead of selecting an arbitrary idle core.
The application and the two-thread wrk load runner each reserve a complete SMT sibling group.
Stable evidence uses the full application group behind a one-CPU quota; a single-logical-CPU pin is
diagnostic only. Both JVM variants use the same production-representative OpenJ9 policy with JIT
enabled. Docker polling
and benchmark control run on a fourth, isolated orchestrator group rather than competing with wrk.
Release evidence is content-addressed. A benchmark-only follow-up may reuse a passing REST matrix
only when the bootstrap, packaged native, and REST image Git objects are identical. Spring-only
adapter code is outside the embedded REST runtime. The
release commit still executes protocol and Spring gates and ships the identity manifest.
OpenJ9 receives four equal pre-warm cycles and six measured warmup rounds. Only a process that is
still improving receives up to fourteen bounded confirmation rounds. The rolling gate stops as soon
as the process plateaus, so the extra capacity is used only instead of restarting a complete matrix.
A single persistent wrk container
removes per-sample Docker startup noise. The normal release gate starts with three independent JVM
pairs and stops only under a stricter early-pass envelope; a boundary result continues to six. The
gate may discard at most two process pairs that cannot satisfy the unchanged warmup stability rule.
The entire pair is removed and both variants restart; rejected data never enters the decision.
optional extended qualification always uses all six. Stable release evidence measures small/raw
JSON at c64/c256; these high-request-rate paths expose the agent's fixed request cost without adding
serializer/JIT noise. Dynamic heavy JSON remains in functional route smoke. Extended qualification
measures it at c64/c128 as a separate stress scope and cannot authorize the stable package. The
Rust-Java matrix runs first and a failure skips Spring automatically. Throughput trend, dispersion,
p99, error, and memory limits remain unchanged.