Help with phoenix socket monitoring

Hello :slight_smile:,

I would like to monitore phoenix socket process, to count the current user connected to my application, without having them to join a channel.

defmodule ChatWeb.UserSocket do

use Phoenix.Socket

channel "topic:*", ChatWeb.Channel

  def connect(_params, socket) do
    :ok = SocketWatcher.monitor(socket.transport_pid)
    {:ok, socket}
  end

  def id(_socket), do: nil

end

The problem here is that transport_pid is nil…
As explained chrismccord in this post, a socket transport_id field is nil until the connection has been authorized in UserSocket.connect/3.

Is there a way to implement a callback for UserSocket.connect/3 method, where i can get this transport_id and monitore it.

Thanks for your help.

Can you elaborate on that constraint? Phoenix Presence basically solved the problem of tracking users.

In this monitore function, i use Presence ^^

I would like to do something like this. But this code doesn’t work anymore with newer phoenix versions. Transport_id is now nil until the connection has been authorized.

You should be able to do exactly that in a channel.

But as i said in the first sentence of my Post: “I would like to monitore phoenix socket process, to count the current user connected to my application, without having them to join a channel.”

Which is why I asked what’s preventing you from using a channel. Is there a particular reason for this constraint? Letting users join an additional channel doesn’t sound like a particular high barrier.

I’m building a SAAS product. I bill for number of simultaneous connected users.
Actually, in the SDK I give to my clients, when they connect to my service, i force them to join a special channel which is only used to count the number of simultaneous users thanks to Phoenix.Presence.

The problem is that if my clients comment the line that join this special channel, they can potentially use my service for free without any limit.

Then it might be worth going the route @chrismccord mentioned in the already linked topic and implement a custom Phoenix.Socket, which allows you to track the socket process using presence.

implementing my own socket seems pretty complicated compared to what I need.

I just need a callback that give me the pid of newly connected socket.

I think there must be an alternative solution that can solve my problem more simply.

Copy the implementation of phoenix and add the necessary callback or try to make a case for adding it to phoenix. The latter could include the first one as a PR.

2 Likes