Passive checks only observe real traffic. Active checks call a health endpoint on an interval, which is the only mechanism that can return a recovered target to the pool.
curl -X PATCH http://localhost:8001/upstreams/billing-upstream \
--data healthchecks.active.type=http \
--data healthchecks.active.http_path=/actuator/health \
--data healthchecks.active.healthy.interval=5 \
--data healthchecks.active.healthy.successes=2 \
--data healthchecks.active.unhealthy.interval=5 \
--data healthchecks.active.unhealthy.http_failures=3
curl -s localhost:8001/upstreams/billing-upstream/health | jq '.data[]'
{"target":"10.0.1.11:8080","health":"HEALTHY"}
{"target":"10.0.1.12:8080","health":"UNHEALTHY"}
# interval defaults to 0, which DISABLES that half of the check. Both the
# healthy and unhealthy blocks need a non-zero interval.
#
# Health state is per Kong node and is not shared across the cluster, so two
# nodes can disagree about the same target.
Run this yourself in the Online Java Compiler, spin up a live REST API in the API Sandbox, or practise with Java interview questions.
Published 2026-08-25