Skip to content

Releases: esasmer-dou/java-rust-glowroot-agent

java-rust-glowroot-agent 0.4.1

Choose a tag to compare

@github-actions github-actions released this 18 Aug 13:29

java-rust-glowroot-agent 0.4.1

English | Turkish

0.4.1 is a Linux native compatibility patch. It does not change the telemetry contract, Java
integration, runtime profiles, thread count, memory limits, REST ABI, or Glowroot ABI.

What Changed

  • The Linux x64 agent is now linked with a fixed glibc 2.17 symbol ceiling.
  • CI rejects any native artifact that requires a newer GLIBC symbol.
  • CI loads the release .so on Debian Stretch (glibc 2.24) and Debian Bookworm (glibc 2.36).
  • Native provenance now records linux-x64.glibc-minimum=2.17.
  • Maven package and GitHub Release verification repeat the GLIBC symbol gate.

The previous 0.4.0 Linux artifact inherited the current hosted runner's linker surface and could
require symbols through GLIBC_2.34. That artifact cannot load in older enterprise images such as
Debian Stretch. The 0.4.1 artifact requires no symbol newer than GLIBC_2.17.

Upgrade

Spring Boot applications should update the selected artifact to 0.4.1:

<dependency>
  <groupId>com.reactor</groupId>
  <artifactId>java-rust-glowroot-spring-boot-starter</artifactId>
  <version>0.4.1</version>
</dependency>

If the native file is copied separately, replace it with the 0.4.1 release asset and keep the
application path unchanged:

/u01/applications/nmc-store-common/glowroot/librust_glowroot_agent.so

Verify the final image before deployment:

getconf GNU_LIBC_VERSION
ldd /u01/applications/nmc-store-common/glowroot/librust_glowroot_agent.so

Do not validate only the builder stage. Use the same immutable custom-JRE image or digest in the
builder and final stages.

Compatibility Evidence

Artifact Highest required GLIBC symbol Stretch 2.24 Bookworm 2.36
Published 0.4.0 Linux agent 2.34 Fails to load Loads
0.4.1 Linux agent 2.17 Loads Loads

Linux and Windows artifacts were rebuilt from clean rust-spring revision
69961d2ac3abc53e601585c387e7aed161658f18. Glowroot ABI remains 3.

java-rust-glowroot-agent 0.4.0

Choose a tag to compare

@github-actions github-actions released this 18 Aug 00:33

java-rust-glowroot-agent 0.4.0

English | Turkish

0.4.0 gives every supported Spring web runtime the same bounded HTTP telemetry contract without
making the agent choose or add a web server.

What Users Get

  • Add one starter to a Spring MVC application. The existing server is detected automatically.
  • Tomcat uses a context Valve, Jetty uses a completion RequestLog, and Undertow uses an exchange
    completion listener. All three cover sync, async, mapped status, exception, 404, bounded route,
    slow-request, and error telemetry.
  • WebFlux remains a separate small artifact and uses one bounded WebFilter.
  • The WebFlux adapter now completes the application signal before it records the bounded telemetry
    event. This removes response-critical callback work while preserving final status, normalized
    route, asynchronous completion, and error accounting.
  • Non-web Spring Boot workers can use only java-rust-glowroot-spring-runtime; no Servlet, MVC,
    embedded-server, or WebFlux dependency is required.
  • The common Rust runtime still owns aggregation, protobuf encoding, reconnect, bounded queues, and
    resource release on its isolated exporter thread.
  • Java request threads no longer read exception messages or walk stack traces. They hand a bounded
    weak reference to Rust; the isolated exporter extracts optional error detail under the existing
    trace-capacity limit and drops it safely if GC or backpressure wins.
  • No Tomcat, Jetty, Undertow, Reactor Netty, or Servlet engine is added by the agent. Server API
    dependencies are provided and optional inside isolated adapter modules.
  • There is no per-server toggle. A supported server always receives its optimized adapter when
    reactor.glowroot.enabled=true and reactor.glowroot.spring.enabled=true.

Spring MVC Setup

<dependency>
  <groupId>com.reactor</groupId>
  <artifactId>java-rust-glowroot-spring-boot-starter</artifactId>
  <version>0.4.0</version>
</dependency>

Keep the application's normal Tomcat, Jetty, or Undertow selection. No agent-specific server
dependency or property is required.

Runtime Active adapter Server engine added by agent
Spring MVC + Tomcat tomcat-valve None
Spring MVC + Jetty jetty-request-log None
Spring MVC + Undertow undertow-completion-listener None

WebFlux Setup

<dependency>
  <groupId>com.reactor</groupId>
  <artifactId>java-rust-glowroot-spring-webflux-adapter</artifactId>
  <version>0.4.0</version>
</dependency>

The application still supplies spring-boot-starter-webflux and selects its reactive server.

Non-Web Spring Boot Setup

Use the runtime-only artifact for a Kafka worker, scheduler, batch process, command-line application,
or database-only Spring Boot service:

<dependency>
  <groupId>com.reactor</groupId>
  <artifactId>java-rust-glowroot-spring-runtime</artifactId>
  <version>0.4.0</version>
</dependency>
spring.main.web-application-type=none
reactor.glowroot.enabled=true
reactor.glowroot.profile=jvm
reactor.glowroot.collector.address=http://glowroot-collector:8181
reactor.glowroot.agent.id=invoice-worker::pod-1
reactor.glowroot.application.name=invoice-worker

The umbrella Spring Boot starter also works, but the runtime-only artifact is the smallest classpath.
When enabled, Spring creates one process-scoped native runtime and one isolated Rust exporter thread.
When disabled, it creates no telemetry bean, loads no native library, and allocates no exporter state.

Profile Non-web data
micro Process RSS, operating-system thread count, exporter/reconnect/drop health
jvm micro plus heap, non-heap, memory pools, GC count, and GC time
sql micro plus explicitly registered SQL duration, error, and row aggregates
full JVM gauges, explicit SQL, and bounded error stacks
diagnostic full plus authorized thread dump, heap histogram, and heap dump commands

Kafka topics, scheduler jobs, batch steps, arbitrary Java methods, and JDBC calls are not woven or
discovered automatically. Process/JVM evidence is automatic. SQL timing uses an explicit reusable
NativeTelemetry.SqlStatement descriptor. The optional -javaagent bootstrap only maps early
properties; it does not replace the runtime dependency.

Validation

The release source includes an executable OpenJ9 compatibility gate for Tomcat, Jetty, Undertow,
and Reactor Netty. It verifies sync 200, async 200, 500, 404, native route registration,
selected-adapter identity, and a short zero-non-2xx load. A separate dependency gate inspects both
Maven runtime trees and executable BOOT-INF/lib contents and fails on any unselected server engine.
An executable WebApplicationType.NONE gate separately verifies native JVM/SQL telemetry without MVC
beans or web runtime dependencies.

Compatibility results are not a server-performance ranking. Production overhead must still be read
from same-server telemetry-off versus telemetry-on paired evidence.

Stable A/B Gate

The runtime was measured with Semeru OpenJ9 21 in randomized telemetry-off/on process pairs. Each
WebFlux cell ran for 60 s, so every candidate cell included at least one real exporter window. A
final exact-source confirmation repeated the most sensitive raw-JSON cell after fail-open hardening.

Runtime and workload Useful RPS delta p99 delta Process RSS delta Non-2xx
Tomcat, small JSON, c256 -1.91% +5.43% +2.23 MiB 0
WebFlux, small JSON, c64 -1.22% -6.18% +2.11 MiB max 0
WebFlux, small JSON, c256 +0.27% -7.58% +2.11 MiB max 0
WebFlux, raw JSON, c64, exact final source +1.23% -5.97% +0.82 MiB 0
WebFlux, raw JSON, c256 -0.40% -8.19% +2.11 MiB max 0

All cells passed the release limits: useful RPS loss at most 2%, p99 regression at most 10%,
and process RSS growth at most 3 MiB. The full WebFlux matrix's maximum RSS delta was +2.11 MiB.
The standalone runtime still owns one exporter thread.
Windows may expose one additional operating-system socket helper in the process thread count; no
second agent worker or Java executor is created.

Compatibility

Use Rust-Java REST 4.5.5, REST ABI 29, and Glowroot ABI 3. The native telemetry ABI did
not change in this release. Do not copy native binaries between unrelated versions.

java-rust-glowroot-agent 0.3.0

Choose a tag to compare

@github-actions github-actions released this 16 Aug 14:12

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 with sql, or both plus bounded
    error stacks with full.
  • Use diagnostic only 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 a 256 KiB stack. 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 exact 5xx, 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=false to disable HTTP interception while retaining core
    telemetry. Set reactor.glowroot.spring.tomcat-native.enabled=false only to force the portable MVC
    fallback, or reactor.glowroot.enabled=false to 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-api

For 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.

java-rust-glowroot-agent 0.2.1

Choose a tag to compare

@github-actions github-actions released this 14 Aug 08:12

java-rust-glowroot-agent 0.2.1

This stable patch closes the remaining release-evidence gap between the two supported runtime
models. Java business code and public telemetry configuration remain unchanged.

What Changed

  • Rust-Java REST now has the same exact-commit production gate as Spring Boot MVC.
  • The REST gate pins rust-java-rest:4.4.1 and rejects any native ABI other than 28.
  • The Spring Boot starter packages clean rust-spring v4.4.2 standalone binaries and records the
    complete 40-character source commit with platform SHA-256 hashes.
  • Spring MVC integration now uses a bounded MVC interceptor instead of wrapping every request in a
    Servlet filter. Normal unsampled successes create no agent request object; exact 5xx and async
    completion behavior remain covered by tests.
  • The bounded Spring route cache now uses a fixed allocation-free lookup table instead of creating a
    temporary composite key on every sampled request.
  • The public 0.2.0 RustGlowrootFilter type remains as a deprecated manual compatibility adapter.
    Auto-configuration never registers it, so it adds no class loading or request-path cost by default.
  • Small JSON, raw/precomputed JSON, and heavy JSON run at c64 and c256 with six paired repetitions.
  • Telemetry-off and telemetry-on variants run sequentially on the same reserved physical CPU group.
  • Both variants execute eight fixed warmup rounds per endpoint. Measurement starts only when the final
    three-round RPS stability window passes, preventing unequal OpenJ9 warmup from biasing the result.
  • REST embedded telemetry must stay within +3 MiB, add no OS thread, and remain inside the
    documented RPS and p99 limits. Non-2xx may not regress in either the paired median or the
    request-weighted aggregate across all six repeats, and candidate peak error rate may not exceed
    baseline peak; the worst paired delta remains attached as diagnostic evidence.
  • Glowroot wire compatibility, collector-down fail-open behavior, and the optional -javaagent
    bootstrap are mandatory release checks.
  • The release workflow now refuses Maven deploy and GitHub Release publication unless both the
    Spring and REST evidence artifacts pass on the exact tag commit.

Supported Combinations

Application Dependency Native runtime
Rust-Java REST com.reactor:java-rust-glowroot-agent:0.2.1 only when -javaagent syntax is needed rust-java-rest:4.4.1, REST ABI 28
Spring Boot Servlet MVC com.reactor:java-rust-glowroot-spring-boot-starter:0.2.1 Bundled standalone Glowroot ABI 1 runtime

The lowest-memory Rust-Java REST setup still uses reactor.glowroot.* properties directly and does
not need the bootstrap JAR. Spring WebFlux and full Glowroot bytecode/JDBC/profiler instrumentation
remain outside this focused agent.

Evidence

The GitHub Release contains both readable reports and machine-readable summaries:

  • spring-boot-production-gate.md
  • spring-boot-production-gate-summary.json
  • spring-boot-steady-memory.json
  • spring-boot-warmup-stability.json
  • rust-java-rest-production-gate.md
  • rust-java-rest-production-gate-summary.json
  • rust-java-rest-steady-memory.json
  • rust-java-rest-warmup-stability.json
  • rust-java-rest-protocol-gate-summary.json

Every binary, JAR, and evidence file is covered by the attached SHA256SUMS manifest.

java-rust-glowroot-agent 0.2.0

Choose a tag to compare

@github-actions github-actions released this 13 Aug 19:22

java-rust-glowroot-agent 0.2.0

This release adds a production-gated Spring Boot MVC path while keeping the existing Rust-Java REST
integration unchanged. Java controllers, handlers, services, validation, and database code remain
in Java.

What users get

  • A Spring Boot starter with one low-allocation Servlet filter and no bytecode weaving.
  • Exact HTTP 5xx counting and bounded sampling for successful requests.
  • A standalone Rust exporter with one bounded thread and one reused h2 collector connection.
  • The existing embedded Rust-Java REST path with no additional telemetry thread.
  • Process RSS, thread, HTTP, native Dubbo, native Redis, reconnect, failure, and drop metrics.
  • Clean Windows x64 and Linux glibc x64 native libraries with SHA-256 provenance.

Spring Boot MVC quick start

<dependency>
  <groupId>com.reactor</groupId>
  <artifactId>java-rust-glowroot-spring-boot-starter</artifactId>
  <version>0.2.0</version>
</dependency>
reactor.glowroot.enabled=true
reactor.glowroot.collector.address=http://glowroot-collector:8181
reactor.glowroot.agent.id=orders::pod-1
reactor.glowroot.application.name=orders-api
reactor.glowroot.http.sample-rate=256
reactor.glowroot.trace.capacity=0

No controller annotation or business API changes are required. Version 0.2.0 supports Spring
Servlet MVC. It does not support WebFlux or full Glowroot Java-method/JDBC instrumentation.

Rust-Java REST quick start

Use the coordinated rust-java-rest:4.4.0 line and enable reactor.glowroot.* properties. The
framework reuses its existing Rust runtime, so this path adds no telemetry thread. The optional
java-rust-glowroot-agent:0.2.0 bootstrap is needed only when your platform requires
-javaagent:key=value syntax.

Production contract

The release workflow accepts only a tag commit that passed the exact-commit production gate. The
gate compares telemetry off/on in the same Spring image with six randomized paired runs across
small JSON, raw/precomputed JSON, and dynamic heavy JSON at c64 and c256. Every cell must remain
inside the documented RPS, p99, error, thread, and startup limits. The equal-process-age memory
phase separately enforces the +3 MiB RSS and cgroup boundary after the complete workload.

The exact report, JSON summary, and steady-memory samples are attached to this release. They are
downloaded from the successful Production Gate run for this tag commit, not copied from a local run.

See the repository README and docs/VALIDATION.md for the measured evidence, package-auth setup,
Kubernetes configuration, tuning recipes, and unsupported boundaries.

java-rust-glowroot-agent 0.1.0-rc1

Pre-release

Choose a tag to compare

@github-actions github-actions released this 13 Aug 12:21

java-rust-glowroot-agent 0.1.0-rc1

This is the first release candidate of the optional bootstrap package for the bounded Rust-first
Glowroot telemetry path.

What users get

  • Existing Java handlers, services, validation, and business logic remain unchanged.
  • The Rust runtime records HTTP route latency/counts and exact HTTP 5xx counts.
  • Native Dubbo and Redis operations are reported as bounded aggregates.
  • Process RSS, thread count, exporter health, dropped data, and reconnect counters are available.
  • Telemetry is sent to the existing Glowroot Central collector. No new collector or UI is needed.

How to use it

The lowest-memory path does not need this JAR. Enable the coordinated Rust-Java native runtime with
reactor.glowroot.* properties or REACTOR_GLOWROOT_* environment variables.

Use this package only when -javaagent argument syntax is operationally useful. It translates those
arguments into the same properties. It does not weave bytecode and does not contain the telemetry
engine.

<dependency>
  <groupId>com.reactor</groupId>
  <artifactId>java-rust-glowroot-agent</artifactId>
  <version>0.1.0-rc1</version>
  <scope>runtime</scope>
</dependency>

GitHub Packages requires a GitHub username and a token with read:packages in Maven
settings.xml, including for this public repository. The README contains a complete example.

Compatibility boundary

This package requires the coordinated Rust-Java REST development runtime with native ABI 28. Do not
combine it with the published Rust-Java REST 4.3.0 ABI 26 binary. This release candidate does not
claim Spring Boot support or full Glowroot Java-agent feature parity.

Verified evidence

  • Rust all-feature tests: 57 passed.
  • Rust feature-disabled compatibility tests: 30 passed.
  • Rust-Java REST tests: 370 passed.
  • Bootstrap JAR tests: 5 passed.
  • Runtime dependency surface: java.base only; one application class; published JAR size 6,089 bytes.
  • Deterministic embedded-native attributed ceiling: 0.694 MiB under the 1 MiB contract.
  • Maximum observed embedded-native resident delta: 1.817 MiB; additional threads: 0.
  • Focused c256 small-direct gate: useful HTTP 200 RPS -0.17%, p99 +6.28%, 503 delta 0.
  • Glowroot init, aggregate, HdrHistogram, gauge, trace, optional bootstrap, and collector-down
    fail-open protocol gates passed.

The full c64/c256 endpoint matrix remains open because the release workstation did not pass its
strict host-noise preflight. Therefore this version is a pre-release and does not make a broad
performance claim. Run the full matrix on the target Kubernetes node class before production use.