Skip to content

Troubleshooting

Start with the symptom seen by the caller, then check the requester and receiver observability endpoints. Most failures are either a role/config mismatch, a NATS path issue, or the receiver being unable to reach the final upstream or TCP target.

SymptomProbable causeCheckFix
Requester returns 503 Service UnavailableRuntime boot not ready or no outbound bridge and no direct upstream fallbackcurl -sS http://requester:7000/observability/natsCheck NATS connectivity, NATS_URL, NATS_MODE, and requester boot logs.
Requester does not receive a responseReceiver not subscribed, subject roots mismatch, or stream/consumer issueCompare NATS_REQUEST_SUBJECT_ROOT, NATS_RESPONSE_SUBJECT_ROOT, LISTEN_SUBJECT; inspect /observability/cases on both rolesAlign subject roots and ensure receiver is running before sending traffic.
Receiver does not read requestsWrong SERVICE_ROLE, Core queue group issue, or JetStream consumer unavailableReceiver /observability/nats should show role=receiver and bridge_inbound=trueSet SERVICE_ROLE=receiver; verify NATS_QUEUE_GROUP for Core or stream/consumer state for JetStream.
Receiver pool does not distribute new workReplicas use different LISTEN_SUBJECT, NATS_QUEUE_GROUP, or JetStream request consumer names; traffic volume is too low to show distributionCompare receiver env; inspect /observability/cases or /observability/flows per receiverAlign receiver pool settings and send enough independent new requests or session opens to observe balancing.
Tunnel bytes or cancel do not reach the owner receiverDuplicate/missing SERVICE_ID, stale subject roots, or owner metadata was not received before an early cancelCheck response_start or session_established events for receiver_service_id; inspect session and cancel subjects in observability flowsUse unique live SERVICE_ID values and aligned request/response roots; early cancels before owner selection remain best effort.
JetStream requests do not moveStream missing or subjects do not cover rootscurl -sS http://receiver:7000/observability/nats and inspect mode_detailsCreate stream with <request_root>.> and <response_root>.> subjects, or use embedded receiver bootstrap with NATS_MODE=jetstream.
Proxy requests get generic 404 Not FoundProxy auth safety lock or invalid credentialsCheck logs for Proxy auth safety lock enabled; inspect PROXY_AUTH_USERS_JSONProvide valid bcrypt hashes or set PROXY_AUTH_ENABLED=false for a controlled test.
CONNECT returns Session establishment timeoutReceiver cannot establish the TCP target or response event did not arrive before NATS_RESPONSE_TIMEOUTReceiver logs and requester /observability/casesVerify target host/port from receiver network and increase timeout only after connectivity is confirmed.
Large stream or tunnel stops with flow_credit_timeoutThe publishing side could not reserve credit before STREAM_RESPONSE_TIMEOUT; the consuming side may be slow, disconnected, or missing the credit subject path/observability/cases for flow_timeouts_total; /observability/flows for flow_credit_wait and flow_credit_timeout; NATS subject/import coverageVerify the requester and receiver can exchange <request_root>.control.> and session credit frames, then check downstream client or target socket throughput.
Upstream unavailableUPSTREAM_URL missing or target refuses/times outReceiver logs; HTTP response body includes Upstream unavailable or missing upstream messageSet UPSTREAM_URL on receiver and verify receiver-to-upstream network path.
Embedded requester exits on startupMissing or conflicting leaf remote configContainer logs from entrypointSet LEAF_REMOTE_HOST plus either LEAF_REMOTE_USER/LEAF_REMOTE_PASSWORD or LEAF_REMOTE_NKEY, not both.
Embedded leaf connection failsReceiver leaf listener not reachable or credentials mismatchss -ltnp on receiver for :7422; requester logsStart receiver first, expose 7422, and use receiver leaf credentials on requester.