Packages
exq
0.6.5
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.2
0.16.1
0.16.0
0.15.0
0.14.0
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.2
0.12.1
0.12.0
0.11.0
0.10.1
0.10.0
0.9.1
0.9.0
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.3
0.7.2
0.7.1
0.7.0
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.0
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.0
0.2.3
0.2.2
0.2.1
0.2.0
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.2
Exq is a job processing library compatible with Resque / Sidekiq for the Elixir language.
Current section
Files
Jump to
Current section
Files
lib/exq/stats/server.ex
defmodule Exq.Stats.Server do
@moduledoc """
Stats process is responsible for recording all stats into Redis.
The stats format is compatible with the Sidekiq stats format, so that
The Sidekiq UI can be also used to view Exq status as well, and Exq
can run side by side with Sidekiq without breaking any of it's UI.
This includes job success/failure as well as in-progress jobs
"""
use GenServer
use Timex
alias Timex.Format.DateTime.Formatter
alias Exq.Redis.JobStat
alias Exq.Support.Process
require Logger
defmodule State do
defstruct redis: nil
end
@doc """
Add in progress worker process
"""
def add_process(stats, namespace, worker, host, job) do
process_info = %Process{pid: worker,
host: host,
job: job,
started_at: Formatter.format!(DateTime.universal, "{ISO}")}
GenServer.cast(stats, {:add_process, namespace, process_info})
{:ok, process_info}
end
@doc """
Remove in progress worker process
"""
def process_terminated(stats, namespace, process_info) do
GenServer.cast(stats, {:process_terminated, namespace, process_info})
:ok
end
@doc """
Record job as successfully processes
"""
def record_processed(stats, namespace, job) do
GenServer.cast(stats, {:record_processed, namespace, job})
:ok
end
@doc """
Record job as failed
"""
def record_failure(stats, namespace, error, job) do
GenServer.cast(stats, {:record_failure, namespace, error, job})
:ok
end
def server_name(name) do
unless name, do: name = Exq.Support.Config.get(:name)
"#{name}.Stats" |> String.to_atom
end
##===========================================================
## gen server callbacks
##===========================================================
def start_link(opts \\[]) do
GenServer.start_link(__MODULE__, opts, name: server_name(opts[:name]))
end
# These are the callbacks that GenServer.Behaviour will use
def init(opts) do
{:ok, %State{redis: opts[:redis]}}
end
def handle_cast({:add_process, namespace, process_info}, state) do
JobStat.add_process(state.redis, namespace, process_info)
{:noreply, state}
end
def handle_cast({:record_processed, namespace, job}, state) do
JobStat.record_processed(state.redis, namespace, job)
{:noreply, state}
end
def handle_cast({:record_failure, namespace, error, job}, state) do
JobStat.record_failure(state.redis, namespace, error, job)
{:noreply, state}
end
def handle_cast({:process_terminated, namespace, process}, state) do
:ok = JobStat.remove_process(state.redis, namespace, process)
{:noreply, state}
end
##===========================================================
## Methods
##===========================================================
end