-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathpg_statviz--0.1--0.3.sql
153 lines (140 loc) · 4.32 KB
/
pg_statviz--0.1--0.3.sql
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
142
143
144
145
146
147
148
149
150
151
152
153
/*
// pg_statviz - stats visualization and time series analysis
//
// Copyright (c) 2024 Jimmy Angelakos
// This software is released under the PostgreSQL Licence
//
// pg_statviz--0.1--0.3.sql - Upgrade extension to 0.3
*/
-- complain if script is sourced in psql, rather than via ALTER EXTENSION
\echo Use "ALTER EXTENSION pg_statviz UPDATE" to load this file. \quit
CREATE OR REPLACE FUNCTION @[email protected]_conf(snapshot_tstamp timestamptz)
RETURNS void
AS $$
INSERT INTO @[email protected] (
snapshot_tstamp,
conf)
SELECT
snapshot_tstamp,
jsonb_agg(s)
FROM (
SELECT "name" AS "setting",
"setting" AS "value"
FROM pg_settings
WHERE "name" IN (
'autovacuum',
'autovacuum_max_workers',
'autovacuum_naptime',
'autovacuum_work_mem',
'bgwriter_delay',
'bgwriter_lru_maxpages',
'bgwriter_lru_multiplier',
'checkpoint_completion_target',
'checkpoint_timeout',
'max_connections',
'max_wal_size',
'max_wal_senders',
'work_mem',
'maintenance_work_mem',
'max_replication_slots',
'max_parallel_workers',
'max_parallel_maintenance_workers',
'server_version_num',
'shared_buffers',
'vacuum_cost_delay',
'vacuum_cost_limit')) s;
$$ LANGUAGE SQL;
-- Locks
CREATE TABLE IF NOT EXISTS @[email protected](
snapshot_tstamp timestamptz REFERENCES @[email protected](snapshot_tstamp) ON DELETE CASCADE PRIMARY KEY,
locks_total int,
locks jsonb);
CREATE OR REPLACE FUNCTION @[email protected]_lock(snapshot_tstamp timestamptz)
RETURNS void
AS $$
WITH
pgl AS (
SELECT *
FROM pg_locks l, pg_database d
WHERE d.datname = current_database()
AND l.database = oid
AND locktype = 'relation'
AND pid != pg_backend_pid()), -- ignore snapshot session
lcks AS (
SELECT coalesce(jsonb_agg(l), '[]'::jsonb)
FROM (
SELECT mode AS lock_mode, count(*) AS lock_count
FROM pgl
GROUP BY lock_mode) l)
INSERT INTO @[email protected] (
snapshot_tstamp,
locks_total,
locks)
SELECT
snapshot_tstamp,
count(*) AS locks_total,
(SELECT * from lcks) AS locks
FROM pgl;
$$ LANGUAGE SQL;
-- DB
ALTER TABLE @[email protected] ADD COLUMN postmaster_start_time timestamptz;
CREATE OR REPLACE FUNCTION @[email protected]_db(snapshot_tstamp timestamptz)
RETURNS void
AS $$
INSERT INTO @[email protected] (
snapshot_tstamp,
xact_commit,
xact_rollback,
blks_read,
blks_hit,
tup_returned,
tup_fetched,
tup_inserted,
tup_updated,
tup_deleted,
temp_files,
temp_bytes,
stats_reset,
postmaster_start_time)
SELECT
snapshot_tstamp,
xact_commit,
xact_rollback,
blks_read,
blks_hit,
tup_returned,
tup_fetched,
tup_inserted,
tup_updated,
tup_deleted,
temp_files,
temp_bytes,
stats_reset,
pg_postmaster_start_time()
FROM pg_stat_database
WHERE datname = current_database();
$$ LANGUAGE SQL;
-- Snapshots
CREATE OR REPLACE FUNCTION @[email protected]()
RETURNS timestamptz
AS $$
DECLARE ts timestamptz;
BEGIN
ts := clock_timestamp();
INSERT INTO @[email protected]
VALUES (ts);
PERFORM @[email protected]_buf(ts);
PERFORM @[email protected]_conf(ts);
PERFORM @[email protected]_conn(ts);
PERFORM @[email protected]_db(ts);
PERFORM @[email protected]_lock(ts);
PERFORM @[email protected]_wait(ts);
-- pg_stat_wal only exists in PG15+
IF (SELECT current_setting('server_version_num')::int >= 150000) THEN
PERFORM @[email protected]_wal(ts);
END IF;
RAISE NOTICE 'created pg_statviz snapshot';
RETURN ts;
END
$$ LANGUAGE PLPGSQL;
GRANT TRUNCATE ON ALL TABLES IN SCHEMA @extschema@ TO pg_monitor;