You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Production-grade resilience patterns for [Nova](https://github.com/novaframework/nova) web applications.
4
4
5
-
Bridges Nova and [Seki](https://github.com/Taure/seki) to provide dependency health checking, Kubernetes-ready probes, circuit breakers, bulkheads, and ordered graceful shutdown — all via declarative configuration.
5
+
Bridges Nova and [Seki](https://github.com/Taure/seki) to provide dependency health checking, Kubernetes-ready probes, circuit breakers, bulkheads, deadline propagation, and ordered graceful shutdown — all via declarative configuration.
6
+
7
+
## Features
8
+
9
+
-**Health endpoints** — `/health`, `/ready`, `/live` for Kubernetes probes
10
+
-**Startup gating** — traffic held until critical dependencies are healthy
4. Tears down dependencies in `shutdown_priority` order
100
+
5. Nova drains HTTP connections and stops
81
101
82
102
No manual `prep_stop` calls needed — shutdown is fully automatic.
83
103
84
104
## Health endpoints
85
105
86
106
| Endpoint | Purpose | Response |
87
107
|----------|---------|----------|
88
-
|`GET /health`| Full health report |`{"status":"healthy","dependencies":{...},"vm":{...}}`|
108
+
|`GET /health`| Full diagnostic report |`{"status":"healthy","dependencies":{...},"vm":{...}}`|
89
109
|`GET /ready`| Kubernetes readiness probe | 200 when ready, 503 when not |
90
110
|`GET /live`| Kubernetes liveness probe | 200 if process is responsive |
91
111
112
+
The `/health` endpoint returns per-dependency status with circuit breaker state, bulkhead occupancy, and VM metrics (memory, process count, run queue, uptime, node).
113
+
92
114
## Configuration
93
115
116
+
### Application environment
117
+
94
118
```erlang
95
119
{nova_resilience, [
96
-
{dependencies, [...]}, %% List of dependency configs
97
-
{health_check_interval, 10000}, %% ms between health checks
98
-
{vm_checks, true}, %% Include BEAM VM in health report
99
-
{gate_timeout, 30000}, %% Max ms to wait for deps on startup
100
-
{shutdown_delay, 5000}, %% ms to wait after marking not-ready
101
-
{shutdown_drain_timeout, 15000},%% Max ms to drain per priority group
102
-
{health_prefix, <<"">>} %% Prefix for health routes
120
+
{dependencies, [...]}, %% List of dependency configs
121
+
{health_check_interval, 10000}, %% ms between health checks
122
+
{vm_checks, true}, %% Include BEAM VM info in health report
123
+
{gate_enabled, true}, %% false to skip startup gating (dev/test)
124
+
{gate_timeout, 30000}, %% Max ms to wait for deps on startup
125
+
{gate_check_interval, 1000}, %% ms between gate readiness checks
126
+
{health_severity, info}, %% critical: /health returns 503 when unhealthy
127
+
{shutdown_delay, 5000}, %% ms to wait after marking not-ready
128
+
{shutdown_drain_timeout, 15000}, %% Max ms to drain per priority group
129
+
{drain_poll_interval, 100}, %% ms between drain occupancy polls
130
+
{health_prefix, ~""} %% Prefix for health routes (e.g. ~"/internal")
103
131
]}.
104
132
```
105
133
134
+
Unknown config keys are logged as warnings on startup to catch typos.
All built-in adapters are soft dependencies — they're only loaded when used. Your application only needs to include the adapter libraries it actually uses (pgo, kura, brod).
0 commit comments