pgmq-migration-0.1.0.0: database/v1.9.0/07_metrics.sql
------------------------------------------------------------
-- Metrics functions
------------------------------------------------------------
CREATE FUNCTION pgmq.metrics(queue_name TEXT)
RETURNS pgmq.metrics_result AS $$
DECLARE
result_row pgmq.metrics_result;
query TEXT;
qtable TEXT := pgmq.format_table_name(queue_name, 'q');
BEGIN
query := FORMAT(
$QUERY$
WITH q_summary AS (
SELECT
count(*) as queue_length,
EXTRACT(epoch FROM (NOW() - max(enqueued_at)))::int as newest_msg_age_sec,
EXTRACT(epoch FROM (NOW() - min(enqueued_at)))::int as oldest_msg_age_sec,
NOW() as scrape_time,
count(*) FILTER (WHERE vt <= NOW()) AS queue_visible_length
FROM pgmq.%I
),
all_metrics AS (
SELECT CASE
WHEN is_partitioned THEN
%L || '_part_' || pgmq._get_partition_col(%L)
ELSE
%L
END as queue_name
FROM pgmq.meta
WHERE meta.queue_name = %L
)
SELECT
m.queue_name,
q_summary.queue_length,
q_summary.newest_msg_age_sec,
q_summary.oldest_msg_age_sec,
pgmq._get_pg_stat_get_xact_tuples_inserted(%L)::bigint,
q_summary.scrape_time,
q_summary.queue_visible_length
FROM q_summary
CROSS JOIN all_metrics m
$QUERY$,
qtable, queue_name, queue_name, queue_name, queue_name, 'pgmq.' || qtable
);
EXECUTE query INTO result_row;
RETURN result_row;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION pgmq.metrics_all()
RETURNS SETOF pgmq.metrics_result AS $$
DECLARE
row_name RECORD;
result_row pgmq.metrics_result;
BEGIN
FOR row_name IN SELECT queue_name FROM pgmq.meta LOOP
result_row := pgmq.metrics(row_name.queue_name);
RETURN NEXT result_row;
END LOOP;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION pgmq._get_pg_stat_get_xact_tuples_inserted(table_name TEXT)
RETURNS bigint AS $$
DECLARE
result bigint;
BEGIN
SELECT pg_stat_get_xact_tuples_inserted(oid)
INTO result
FROM pg_class
WHERE relname = table_name;
IF result IS NULL THEN
SELECT pg_stat_get_xact_tuples_inserted(oid)
INTO result
FROM pg_class
WHERE relname = SUBSTRING(table_name FROM 6); -- Remove 'pgmq.' prefix (5 chars + 1 for the dot)
END IF;
RETURN COALESCE(result, 0);
END;
$$ LANGUAGE plpgsql;