Packages
verk
0.13.2
1.7.3
1.7.2
1.7.1
1.7.0
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.0
1.4.1
1.4.0
1.3.0
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.1
1.1.0
1.0.2
1.0.1
1.0.0
0.14.1
0.14.0
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.1
0.11.0
0.10.0
0.9.13
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
Verk is a job processing system backed by Redis.
Current section
Files
Jump to
Current section
Files
lib/verk/queue_stats.ex
defmodule Verk.QueueStats do
@moduledoc """
This process will update an :ets table with the following information per queue
* Current amount of running jobs
* Amount of finished jobs
* Amount of failed jobs
It will persist to redis from time to time
"""
use GenEvent
require Logger
alias Verk.QueueStatsCounters
@persist_interval 10_000
@doc """
Lists the queues and their stats
"""
@spec all :: Map.t
def all do
for {queue, running, finished, failed} <- QueueStatsCounters.all, is_binary(queue) do
%{queue: queue, running_counter: running, finished_counter: finished, failed_counter: failed}
end
end
@doc """
Requests to reset started counter for a `queue`
"""
@spec reset_started(binary) :: :ok
def reset_started(queue) do
GenEvent.call(Verk.EventManager, Verk.QueueStats, {:reset_started, to_string(queue)})
end
@doc false
def init(_) do
QueueStatsCounters.init
Process.send_after(self, :persist_stats, @persist_interval)
{:ok, nil}
end
@doc false
def handle_event(%Verk.Events.JobStarted{job: job}, state) do
QueueStatsCounters.register(:started, job.queue)
{:ok, state}
end
def handle_event(%Verk.Events.JobFinished{job: job}, state) do
QueueStatsCounters.register(:finished, job.queue)
{:ok, state}
end
def handle_event(%Verk.Events.JobFailed{job: job}, state) do
QueueStatsCounters.register(:failed, job.queue)
{:ok, state}
end
@doc false
def handle_call({:reset_started, queue}, state) do
QueueStatsCounters.reset_started(queue)
{:ok, :ok, state}
end
@doc false
def handle_info(:persist_stats, state) do
case QueueStatsCounters.persist do
:ok -> :ok
{:error, reason} ->
Logger.error("QueueStats failed to persist stats to Redis. Reason: #{inspect reason}")
end
Process.send_after(self, :persist_stats, @persist_interval)
{:ok, state}
end
end