sql/functions/pgq.get_queue_info.sql
drop function if exists pgq.get_queue_info();
drop function if exists pgq.get_queue_info(text);
create or replace function pgq.get_queue_info(
out queue_name text,
out queue_ntables integer,
out queue_cur_table integer,
out queue_rotation_period interval,
out queue_switch_time timestamptz,
out queue_external_ticker boolean,
out queue_ticker_paused boolean,
out queue_ticker_max_count integer,
out queue_ticker_max_lag interval,
out queue_ticker_idle_period interval,
out ticker_lag interval,
out ev_per_sec float8,
out ev_new bigint,
out last_tick_id bigint)
returns setof record as $$
-- ----------------------------------------------------------------------
-- Function: pgq.get_queue_info(0)
--
-- Get info about all queues.
--
-- Returns:
-- List of pgq.ret_queue_info records.
-- queue_name - queue name
-- queue_ntables - number of tables in this queue
-- queue_cur_table - ???
-- queue_rotation_period - how often the event_N_M tables in this queue are rotated
-- queue_switch_time - ??? when was this queue last rotated
-- queue_external_ticker - ???
-- queue_ticker_paused - ??? is ticker paused in this queue
-- queue_ticker_max_count - max number of events before a tick is issued
-- queue_ticker_max_lag - maks time without a tick
-- queue_ticker_idle_period - how often the ticker should check this queue
-- ticker_lag - time from last tick
-- ev_per_sec - how many events per second this queue serves
-- ev_new - ???
-- last_tick_id - last tick id for this queue
--
-- ----------------------------------------------------------------------
begin
for queue_name, queue_ntables, queue_cur_table, queue_rotation_period,
queue_switch_time, queue_external_ticker, queue_ticker_paused,
queue_ticker_max_count, queue_ticker_max_lag, queue_ticker_idle_period,
ticker_lag, ev_per_sec, ev_new, last_tick_id
in select
f.queue_name, f.queue_ntables, f.queue_cur_table, f.queue_rotation_period,
f.queue_switch_time, f.queue_external_ticker, f.queue_ticker_paused,
f.queue_ticker_max_count, f.queue_ticker_max_lag, f.queue_ticker_idle_period,
f.ticker_lag, f.ev_per_sec, f.ev_new, f.last_tick_id
from pgq.get_queue_info(null) f
loop
return next;
end loop;
return;
end;
$$ language plpgsql;
create or replace function pgq.get_queue_info(
in i_queue_name text,
out queue_name text,
out queue_ntables integer,
out queue_cur_table integer,
out queue_rotation_period interval,
out queue_switch_time timestamptz,
out queue_external_ticker boolean,
out queue_ticker_paused boolean,
out queue_ticker_max_count integer,
out queue_ticker_max_lag interval,
out queue_ticker_idle_period interval,
out ticker_lag interval,
out ev_per_sec float8,
out ev_new bigint,
out last_tick_id bigint)
returns setof record as $$
-- ----------------------------------------------------------------------
-- Function: pgq.get_queue_info(1)
--
-- Get info about particular queue.
--
-- Returns:
-- One pgq.ret_queue_info record.
-- contente same as forpgq.get_queue_info()
-- ----------------------------------------------------------------------
declare
_ticker_lag interval;
_top_tick_id bigint;
_ht_tick_id bigint;
_top_tick_time timestamptz;
_top_tick_event_seq bigint;
_ht_tick_time timestamptz;
_ht_tick_event_seq bigint;
_queue_id integer;
_queue_event_seq text;
begin
for queue_name, queue_ntables, queue_cur_table, queue_rotation_period,
queue_switch_time, queue_external_ticker, queue_ticker_paused,
queue_ticker_max_count, queue_ticker_max_lag, queue_ticker_idle_period,
_queue_id, _queue_event_seq
in select
q.queue_name, q.queue_ntables, q.queue_cur_table,
q.queue_rotation_period, q.queue_switch_time,
q.queue_external_ticker, q.queue_ticker_paused,
q.queue_ticker_max_count, q.queue_ticker_max_lag,
q.queue_ticker_idle_period,
q.queue_id, q.queue_event_seq
from pgq.queue q
where (i_queue_name is null or q.queue_name = i_queue_name)
order by q.queue_name
loop
-- most recent tick
select (current_timestamp - t.tick_time),
tick_id, t.tick_time, t.tick_event_seq
into ticker_lag, _top_tick_id, _top_tick_time, _top_tick_event_seq
from pgq.tick t
where t.tick_queue = _queue_id
order by t.tick_queue desc, t.tick_id desc
limit 1;
-- slightly older tick
select ht.tick_id, ht.tick_time, ht.tick_event_seq
into _ht_tick_id, _ht_tick_time, _ht_tick_event_seq
from pgq.tick ht
where ht.tick_queue = _queue_id
and ht.tick_id >= _top_tick_id - 20
order by ht.tick_queue asc, ht.tick_id asc
limit 1;
if _ht_tick_time < _top_tick_time then
ev_per_sec = (_top_tick_event_seq - _ht_tick_event_seq) / extract(epoch from (_top_tick_time - _ht_tick_time));
else
ev_per_sec = null;
end if;
ev_new = pgq.seq_getval(_queue_event_seq) - _top_tick_event_seq;
last_tick_id = _top_tick_id;
return next;
end loop;
return;
end;
$$ language plpgsql;