(Rails 2.3) Upstream mongrel cluster: how to find out mongrel instance (port) which handles request

For debugging purpose I find it helpful to see which mongrel out of an
upstream cluster, specifically which port number, handles an actual
request. For example, let the load balancer operate on port 3000
(development) and the upstream mongrel cluster operating on ports 4000
upto 4002, then I would like to see not only the port 3000 (eg. using
request.host_with_port in a controller) but also the port number of
the actual mongrel instance.

With Rails 2.1 I used session.cgi to spot the mongrel port (4000, 4001
or 4002), however, I was not able to figure this out in Rails 2.3
which is using the rack middleware.

Any idea, how to do it?

Greetings and thanks!

Cant you just do `request.server_port' in controller?

Hi Kristian, this also results in port number '3000', and not in the
port number of the upstream mongrel.

Does request.env.inspect gives you any hint?

This helped!

Though, a bit strange, the only "hint" for the mongrel port is in
request.env["rack.errors"] which is an IO object pointing the logfile
of the mongrel. It is something like "/somepath/mongrel.400x.log".


verboses the mongrel port of the request.

Thanks, this solves my problem, Thomas

Thomas, I'm still on Rails 2.1 and would like to do exactly what you
were doing? What is the Rails 2.1 way? Call
session.cgi.handler.listener.port ? Will that give the port number of
the actual instance?

I was using the following lines in my _debug.html.erb partial:

    <% session.cgi.inspect.split(/,/).each{ |key| @mongrel_port = key
if(key =~ /@port/)} %>
    <%= @mongrel_port %>

Greetings, Thomas