Releases: arun0009/pulse
Releases · arun0009/pulse
Release 2.0.1
What's Changed
- chore: prepare for next release after v1.0.0 by @github-actions[bot] in #7
- build(deps): bump org.testcontainers:testcontainers-bom from 2.0.4 to 2.0.5 by @dependabot[bot] in #11
- build(deps-dev): bump the build-plugins group with 5 updates by @dependabot[bot] in #10
- chore: prepare for next release after v2.0.0 by @github-actions[bot] in #9
- ability to add custom features by @arun0009 in #15
- build(deps): bump the spring group with 2 updates by @dependabot[bot] in #14
- build(deps): bump com.uber.nullaway:nullaway from 0.13.3 to 0.13.4 by @dependabot[bot] in #13
New Contributors
- @github-actions[bot] made their first contribution in #7
- @dependabot[bot] made their first contribution in #11
Full Changelog: v1.0.0...v2.0.1
What's Changed
- chore: prepare for next release after v1.0.0 by @github-actions[bot] in #7
- build(deps): bump org.testcontainers:testcontainers-bom from 2.0.4 to 2.0.5 by @dependabot[bot] in #11
- build(deps-dev): bump the build-plugins group with 5 updates by @dependabot[bot] in #10
- chore: prepare for next release after v2.0.0 by @github-actions[bot] in #9
- ability to add custom features by @arun0009 in #15
- build(deps): bump the spring group with 2 updates by @dependabot[bot] in #14
- build(deps): bump com.uber.nullaway:nullaway from 0.13.3 to 0.13.4 by @dependabot[bot] in #13
New Contributors
- @github-actions[bot] made their first contribution in #7
- @dependabot[bot] made their first contribution in #11
Full Changelog: v1.0.0...v2.0.1
Release 2.0.0
What's Changed
- chore: prepare for next release after v1.0.0 by @github-actions[bot] in #7
New Contributors
- @github-actions[bot] made their first contribution in #7
Full Changelog: v1.0.0...v2.0.0
What's Changed
- chore: prepare for next release after v1.0.0 by @github-actions[bot] in #7
New Contributors
- @github-actions[bot] made their first contribution in #7
Full Changelog: v1.0.0...v2.0.0
Release 1.0.0
Release 0.1.0
Pulse 0.1.0 — first public release
Pulse is a batteries-included observability starter for Spring Boot 4. One dependency, zero agents, and the production-correctness stuff your default OTel + Micrometer stack quietly forgets — cardinality firewall, timeout-budget propagation, SLO-as-code, structured logging with build metadata, and a @PulseTest slice for in-memory observability assertions.
<dependency>
<groupId>io.github.arun0009</groupId>
<artifactId>pulse-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>What's in the box
Guardrails
- Cardinality firewall — per-meter cap on distinct tag values (default 1,000) with overflow bucketing +
pulse.cardinality.overflow{meter,tag_key}counter - Timeout-budget propagation — inbound
X-Timeout-Msparsed → OTel baggage → forwarded on every outbound hop (RestTemplate / RestClient / WebClient / OkHttp / Kafka), with a per-transportpulse.timeout.budget.exhaustedcounter - Trace-context guard — counts inbound requests missing W3C
traceparent, tagged by Spring route template
Context propagation
PulseTaskDecoratorauto-applied across everyTaskExecutorandTaskScheduler— MDC + OTel context survives@Async,@Scheduled,CompletableFuture, virtual threads, and Kafka listeners
Tracing
- Prefer-sampling-on-error — best-effort upgrade to
RECORD_AND_SAMPLEwhen an error signal is visible at span start (http.response.status_code ≥ 500,exception.type, gRPC non-OK,error.type) - Stable error fingerprints — every uncaught exception gets a low-cardinality hash on the
ProblemDetail, the active span (error.fingerprint), andpulse.errors.unhandled{exception,fingerprint} - Graceful OTel flush at shutdown so the last batch isn't dropped on rolling deploys
Logs
- Structured JSON layout that stamps
traceId,spanId,service,env,app.version,build.commit,requestId, and your custom MDC keys on every line — including pre-Spring-boot lines from background threads - Multi-source
app.version/build.commitresolution (system property →META-INF/build-info.properties+git.properties→OTEL_RESOURCE_ATTRIBUTES→ CI env vars → JARImplementation-Version→unknown) - PII masking converter (emails, SSNs, credit cards, Bearer tokens, JSON
password/secret/token/apikeyfields)
SLOs
- SLO-as-code in
application.yml;curl /actuator/pulse/slo | kubectl apply -f -generates aPrometheusRulewith multi-window burn-rate alerts (Google SRE workbook pattern)
Diagnostics
/actuator/pulse— every active subsystem and its effective config/actuator/pulse/runtime— cardinality top offenders, SLO compliance projection/actuator/pulse/effective-config— full resolvedpulse.*tree/actuator/pulseui— single dependency-free HTML page rendering the same dataOtelExporterHealthIndicatorexposinglastSuccessAgeMs/totalSuccess
Wide-event API
events.emit("order.placed", attrs)writes a span event, increments a bounded counter (pulse.events{event}), and stamps a structured log line in one call
Test slice
@PulseTestSpring Boot test slice +PulseTestHarness— in-memory OTel SDK + fluent assertions over spans and meters. Ships in the main starter (no separate-testartifact)
Ops artifacts
- Grafana dashboard, Prometheus burn-rate alert rules, on-call runbooks (cardinality / timeout / trace-context / error-budget-burn / HikariCP), production checklist
- One-command local stack:
docker compose -f deploy/local-stack/docker-compose.yml up -dbrings up Collector + Prometheus + Grafana + Jaeger + Loki
Build quality
- Reproducible builds (
project.build.outputTimestamp) - CycloneDX SBOM on every build
- Sigstore keyless signing on every release artifact
- JaCoCo gate at ≥70% line / ≥50% branch on merged unit + integration runs
- Error Prone + NullAway, Spotless + Google Java Format
- JMH benchmarks — overhead claims are falsifiable, not vibes
- GraalVM native hints registered
Measured overhead
| Operation | Latency |
|---|---|
CardinalityFirewall.map — cached value, hot path |
~17 ns/op |
CardinalityFirewall.map — new value, under cap |
~80 ns/op |
CardinalityFirewall.map — overflow, bucketed |
~90 ns/op |
SpanEvents.emit(name) — counter on, log off |
~25 ns/op |
JDK 21, Apple M-series. Reproduce with make bench.
Requirements
- Java 21+
- Spring Boot 4.0+
- Log4j2 runtime (Logback support is on the roadmap)
Links
Full Changelog: https://github.com/arun0009/pulse/commits/v0.1.0