1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
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;
|