Observing Phoenix on Heroku
In this post, I’m going to show you how recent updates to the Heroku command line interface allows one to use Erlang’s Observer on Phoenix apps running on Heroku.
I wish I had time to write a lengthy blog post on using Observer, why it wasn’t possible on Heroku before, and why it is now, but I don’t. Instead, I’m just going to give a brief overview of what’s now possible due to recent changes in the CLI.
In order to connect directly to an Erlang node running your Phoenix application,
two things typically are needed. First, your node must be registered with the
Erlang Port Mapper Daemon (or
that you connect to locally. Second, your node must be listening on a port that
you can connect to directly.
The Heroku command line interface has a command called
heroku ps:forward that
forwards a local port to a port on your dyno. Until recently, though, this
command could only forward a single port at a time. What this meant was that
you couldn’t simultaneously forward your local
epmd client to
epmd on the
dyno and also forward a local port to the port your node listens on for
Recently, however, with the help of Herokai Joe
Kutner, I was able to land a pull
request in the Heroku command
line interface that updates
heroku ps:forward to accept a comma-separated list
of ports to forward.
In order for this to work, a few changes to a normal Phoenix deploy to Heroku are necessary. You can see these changes in my jclem/phoenix-template repository, or you can generate your own project from the template and deploy it directly to Heroku.
First, the application’s Procfile needs to set a few options that allows us to easily make remote connections:
This is a lengthy Procfile command, so here’s the command itself in a more readable form:
This new Procfile sets the distributed Erlang cookie to the value of an
OTP_COOKIE environment variable. It also gives your node a predictable name to
connect to (
email@example.com) and ensures that the node will listen for remote
connections on port
9000 (we set the port min and max to
9000, so it will
only be that value).
Once your app is running, you can easily connect directly to your dyno. First, in one shell, forward a couple of ports directly to your dyno:
This forwards your local port
9001 to the default port that
epmd will be
listening on on the dyno, which is
4369. Next, it forwards your local port
9000 to port
9000 on the dyno, which is where the node is listening for
In another shell, you can now start a console, connect to the remote node, and
open observer (you’ll need to get the value of the
OTP_COOKIE secret on the
dyno and use it here):
Once the Observer starts, you can use the “Nodes” dropdown menu to select your
remote node (
firstname.lastname@example.org) and begin observing!