Skip to content

Releases: arun0009/pulse

Release 2.0.1

25 Apr 04:51
2672b04

Choose a tag to compare

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

20 Apr 16:53

Choose a tag to compare

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

19 Apr 21:11

Choose a tag to compare

What's Changed

  • feat: ship Pulse 1.0 — hardening, request criticality, dependency health by @arun0009 in #6

Full Changelog: v0.1.0...v1.0.0

What's Changed

  • feat: ship Pulse 1.0 — hardening, request criticality, dependency health by @arun0009 in #6

Full Changelog: v0.1.0...v1.0.0

Release 0.1.0

19 Apr 05:30

Choose a tag to compare

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-Ms parsed → OTel baggage → forwarded on every outbound hop (RestTemplate / RestClient / WebClient / OkHttp / Kafka), with a per-transport pulse.timeout.budget.exhausted counter
  • Trace-context guard — counts inbound requests missing W3C traceparent, tagged by Spring route template

Context propagation

  • PulseTaskDecorator auto-applied across every TaskExecutor and TaskScheduler — MDC + OTel context survives @Async, @Scheduled, CompletableFuture, virtual threads, and Kafka listeners

Tracing

  • Prefer-sampling-on-error — best-effort upgrade to RECORD_AND_SAMPLE when 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), and pulse.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.commit resolution (system property → META-INF/build-info.properties + git.propertiesOTEL_RESOURCE_ATTRIBUTES → CI env vars → JAR Implementation-Versionunknown)
  • PII masking converter (emails, SSNs, credit cards, Bearer tokens, JSON password/secret/token/apikey fields)

SLOs

  • SLO-as-code in application.yml; curl /actuator/pulse/slo | kubectl apply -f - generates a PrometheusRule with 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 resolved pulse.* tree
  • /actuator/pulseui — single dependency-free HTML page rendering the same data
  • OtelExporterHealthIndicator exposing lastSuccessAgeMs / 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

  • @PulseTest Spring Boot test slice + PulseTestHarness — in-memory OTel SDK + fluent assertions over spans and meters. Ships in the main starter (no separate -test artifact)

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 -d brings 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