Skip to content

Instantly share code, notes, and snippets.

@s3cur3
Created July 1, 2020 10:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save s3cur3/d0e5190947315b8b903d693f2d565353 to your computer and use it in GitHub Desktop.
Save s3cur3/d0e5190947315b8b903d693f2d565353 to your computer and use it in GitHub Desktop.
Sample gauge usage for AppSignal
defmodule MmoServer.WorldCache do
@moduledoc "A cache of all aircraft in the world, intermittently updated for 'flight tracker' API usage"
use GenServer
require Logger
import Appsignal, only: [set_gauge: 2]
def start_link(_), do: GenServer.start_link(__MODULE__, %{}, name: __MODULE__)
# Log a new connected user
def put(%{session_id: sid, lon: lon, lat: lat} = acf) when is_integer(sid) do
GenServer.call(__MODULE__, {:put, sid, {lon, lat, Map.get(acf, :elevation_m_amsl, 0), Map.get(acf, :heading_deg, 0)}})
end
# Delete our record of a previously connected user
def drop(%{session_id: sid}) when is_integer(sid) do
GenServer.call(__MODULE__, {:drop, sid})
end
# Just the count of the number of connected users
def count, do: GenServer.call(__MODULE__, :count)
################ Server Implementation ################
@impl GenServer
def init(state) do
:timer.send_after(60 * 1_000, :stats_once_per_min)
{:ok, state}
end
@impl GenServer
def handle_call(:count, _from, state), do: {:reply, map_size(state), state}
@impl GenServer
def handle_call({:put, session_id, lon_lat_ele}, _from, state) do
{:reply, :ok, Map.put(state, session_id, lon_lat_ele)}
end
@impl GenServer
def handle_call({:drop, session_id}, _from, state) when is_integer(session_id) do
{:reply, :ok, Map.delete(state, session_id)}
end
@impl GenServer
def handle_info(:stats_once_per_min, state) do
Logger.info("Users online: #{map_size(state)}")
set_gauge("users_online", map_size(state))
:timer.send_after(60 * 1_000, :stats_once_per_min)
{:noreply, state}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment