Configuration reference¶
Every Pulse property lives under the pulse.* namespace. As of Pulse 2.0
the surface is split into one @ConfigurationProperties record per
feature (CardinalityProperties, TimeoutBudgetProperties,
TenantProperties, SloProperties, …) living in each feature's package
under io.github.arun0009.pulse.
Generated metadata lives in
META-INF/spring-configuration-metadata.json (merged with processor output
from each *Properties record), so IntelliJ and VS Code autocomplete with
type hints out of the box.
See your effective configuration at runtime¶
The single source of truth for "what is actually running" is the actuator:
This dumps the resolved pulse.* configuration tree (every per-feature
*Properties record merged), so you can see exactly which defaults won
and which keys you overrode.
For a browser-friendly view, hit /actuator/pulseui.
A production-shaped baseline¶
Most teams need to override only a handful of keys. Here's the "I-want-to-tune-it-for-prod" minimum:
spring:
application:
name: order-service
management:
tracing:
sampling:
probability: 0.10 # 10% in prod, 1.0 in dev — Boot's standard knob
pulse:
sampling:
prefer-sampling-on-error: true # rescue error spans the head sampler would drop
timeout-budget:
default-budget: 2s
maximum-budget: 30s # edge clamp
safety-margin: 50ms
cardinality:
max-tag-values-per-meter: 1000
slo:
objectives:
- name: orders-availability
sli: availability
target: 0.999
health:
otel-exporter-stale-after: 5m
shutdown:
otel-flush-timeout: 10s
Every subsystem also exposes a single pulse.<subsystem>.enabled toggle so
you can disable any feature without exclusions or conditional beans.
Per-subsystem keys¶
Each feature page lists its own configuration prefix, defaults, and gotchas. The high-traffic ones:
| Subsystem | Prefix | Key page |
|---|---|---|
| Cardinality firewall | pulse.cardinality |
features/cardinality-firewall.md |
| Timeout-budget | pulse.timeout-budget |
features/timeout-budget.md |
| Trace-context guard | pulse.trace-guard |
features/trace-context-guard.md |
| SLO-as-code | pulse.slo |
features/slo-as-code.md |
| Sampling | pulse.sampling |
features/sampling.md |
| Multi-tenant context | pulse.tenant |
features/multi-tenant.md |
| Request priority | pulse.priority |
features/priority.md |
| Container memory | pulse.container-memory |
features/container-memory.md |
| Kafka time-lag | pulse.kafka (propagation-enabled, consumer-time-lag-enabled) |
features/kafka-time-lag.md |
| Cache (Caffeine) | pulse.cache.caffeine |
features/cache.md |
| OpenFeature | pulse.open-feature |
features/openfeature.md |
| Shutdown / drain | pulse.shutdown |
features/graceful-shutdown.md |
| Health indicators | pulse.health |
features/actuator.md |
Compatibility matrix¶
| Component | Supported |
|---|---|
| Java | 21, 25 (CI runs both) |
| Spring Boot | 4.0+ |
| Micrometer | The version Boot 4 brings transitively (no override needed) |
| OpenTelemetry SDK | The version io.opentelemetry.instrumentation:opentelemetry-spring-boot-starter brings |
| Logging | Log4j2 by default; Logback supported via opt-in |
| GraalVM native | Reflection / proxy / resource hints registered via RuntimeHints; CI runs a native-image smoke workflow (native-smoke.yml) |
Pulse uses Boot 4's repackaged actuator API, the new Micrometer + OTel starters, and Java 21 records / pattern matching. A Boot 3.x backport is not planned for the 2.x line.
Stability¶
See API stability for the 2.x compatibility promise — what's stable across minor versions, what's internal, and how deprecations land.