openzipkin/zipkin · critical · RuntimeException
Timeout establishing connection to RabbitMQ server
Error message
Timeout establishing connection to RabbitMQ server: {e.getMessage()} What it means
RabbitMQCollector's LazyInit.compute() wraps a TimeoutException from the AMQP connection handshake in a RuntimeException with this message. The ConnectionFactory has a connection timeout (default 60s); when the broker accepts TCP but never completes AMQP handshake (or the host is silently dropping packets), newConnection times out and this error propagates on first collector use.
Solutions
- Check the wrapped TimeoutException and broker logs to see whether the connection attempt arrived at all
- Verify network path and port (nc -zv rabbitmq 5672) and that nothing is dropping packets
- Align TLS settings: factory.useSslProtocol() if the broker requires TLS
- Tune factory.setConnectionTimeout() if the broker is legitimately slow, and add startup retry with backoff
Example fix
// before
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("rabbitmq"); // firewall DROPs 5672 -> timeout
// after
// fix network/firewall to allow 5672, and make the failure fast + retriable:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("rabbitmq");
factory.setConnectionTimeout(10_000); Defensive patterns
Strategy: retry
Validate before calling
ConnectionFactory factory = new ConnectionFactory(); factory.setHost(host); factory.setPort(port); factory.setConnectionTimeout(10_000); // fail fast instead of 60s stall if (useTls) factory.useSslProtocol();
Try / catch
try {
collector.check();
} catch (RuntimeException e) {
if (e.getCause() instanceof TimeoutException) {
log.error("RabbitMQ handshake timed out — check firewall/TLS alignment");
}
throw e;
} Prevention
- Verify the network path allows 5672/5671 (DROP firewalls manifest as timeouts, not refusals)
- Match TLS settings between client factory and broker
- Set an explicit connection timeout so misconfigurations fail quickly
When it happens
Trigger: Broker overloaded, network black-holing packets (firewall DROP instead of REJECT), wrong TLS settings causing handshake stall, or a misconfigured address that routes to a non-AMQP service. Thrown from newConnection() within compute().
Common situations: Kubernetes NetworkPolicy/firewall dropping port 5672 traffic, TLS-enabled broker contacted over plaintext (or vice versa), or heavily loaded broker during incident conditions.
Understand the failure class
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- connectionFactory == null
- Unable to establish connection to RabbitMQ server
- metrics == null
- No content reading Elasticsearch/OpenSearch version
- queue == null
AI-assisted analysis of openzipkin/zipkin@878ce2a1fa (2026-08-14).
Data as JSON: /api/errors/99396fcc728a13f2.
Report an issue: GitHub.
Appendix: source
Thrown at zipkin-collector/rabbitmq/src/main/java/zipkin2/collector/rabbitmq/RabbitMQCollector.java:181
void close() throws IOException {
Connection maybeConnection = connection;
if (maybeConnection != null) maybeConnection.close();
}
Connection compute() {
Connection connection;
try {
connection =
(builder.addresses == null)
? builder.connectionFactory.newConnection()
: builder.connectionFactory.newConnection(builder.addresses);
declareQueueIfMissing(connection);
} catch (IOException e) {
throw new UncheckedIOException(
"Unable to establish connection to RabbitMQ server: " + e.getMessage(), e);
} catch (TimeoutException e) {
throw new RuntimeException(
"Timeout establishing connection to RabbitMQ server: " + e.getMessage(), e);
}
Collector collector = builder.delegate.build();
CollectorMetrics metrics = builder.metrics;
for (int i = 0; i < builder.concurrency; i++) {
String consumerTag = "zipkin-rabbitmq." + i;
try {
// this sets up a channel for each consumer thread.
// We don't track channels, as the connection will close its channels implicitly
Channel channel = connection.createChannel();
RabbitMQSpanConsumer consumer = new RabbitMQSpanConsumer(channel, collector, metrics);
channel.basicConsume(builder.queue, true, consumerTag, consumer);
} catch (IOException e) {
throw new IllegalStateException("Failed to start RabbitMQ consumer " + consumerTag, e);
}
}
return connection;View on GitHub (pinned to 878ce2a1fa)