| name | spring-boot-observability |
| description | Spring Boot 4 observability with Actuator, Micrometer, and OpenTelemetry. Use when configuring health indicators, custom metrics, distributed tracing, production endpoint exposure, or Kubernetes/Cloud Run probes. Covers Actuator security, Micrometer Timer/Counter/Gauge patterns, and OpenTelemetry span customization. |
Spring Boot Observability
Production observability with Actuator endpoints, Micrometer metrics, and OpenTelemetry tracing.
Core Components
| Component |
Purpose |
| Actuator |
Health checks, info, metrics exposure, operational endpoints |
| Micrometer |
Metrics abstraction (Timer, Counter, Gauge, DistributionSummary) |
| OpenTelemetry |
Distributed tracing (default in Spring Boot 4) |
Core Workflow
- Add starters →
actuator, micrometer-registry-*, opentelemetry
- Configure endpoint exposure → Secure sensitive endpoints
- Define health groups → Separate liveness from readiness
- Add custom metrics → Business-specific measurements
- Configure tracing → Sampling, propagation, export
Quick Patterns
See EXAMPLES.md for complete working examples including:
- Production Actuator Configuration with health groups and Kubernetes probes
- Custom Health Indicator with latency monitoring (Java + Kotlin)
- Custom Micrometer Metrics with Counter, Timer, and Gauge patterns
- OpenTelemetry Span Customization with Observation API
- OpenTelemetry Configuration for OTLP export
- Actuator Endpoint Access Control (Boot 4)
Spring Boot 4 Specifics
- OpenTelemetry is the default tracer (replaces Brave)
- Health Indicator imports from
org.springframework.boot.health.contributor.*
- Endpoint Access Control with
access: none/unrestricted/read-only
Detailed References
Anti-Pattern Checklist
| Anti-Pattern |
Fix |
| DB checks in liveness probe |
Move to readiness group only |
| 100% trace sampling in production |
Use 10% or less |
| Exposing all endpoints publicly |
Separate management port + auth |
| High-cardinality metric tags |
Use low-cardinality tags only |
| Missing graceful shutdown |
Add server.shutdown=graceful |
| No health probe groups |
Separate liveness and readiness |
Critical Reminders
- Separate liveness from readiness — Liveness: "is process alive?", Readiness: "can handle traffic?"
- Low cardinality tags only — User IDs, request IDs = bad; status codes, regions = good
- Secure Actuator endpoints — Use separate port or authentication
- Sample traces in production — 100% sampling overwhelms collectors
- Graceful shutdown — Allow in-flight requests to complete