11CREATE OR REPLACE FUNCTION generate_histogram()
22 RETURNS TABLE (
3- range TEXT, freq INT, bar TEXT
3+ RANGE TEXT, freq INT, bar TEXT
44 ) AS $$
5- Declare
5+ DECLARE
66 bucket_id integer;
7- query_id text ;
7+ query_id int8 ;
88BEGIN
9- select bucket into bucket_id from pg_stat_monitor order by calls desc limit 1;
10- select queryid into query_id from pg_stat_monitor order by calls desc limit 1;
11- --RAISE INFO 'bucket_id %', bucket_id;
12- --RAISE INFO 'query_id %', query_id;
13- return query
9+ SELECT bucket, queryid INTO bucket_id, query_id FROM pg_stat_monitor ORDER BY calls DESC LIMIT 1;
10+ -- RAISE INFO 'bucket_id %', bucket_id;
11+ -- RAISE INFO 'query_id %', query_id;
12+ RETURN query
1413 SELECT * FROM histogram(bucket_id, query_id) AS a(range TEXT, freq INT, bar TEXT);
1514END;
1615$$ LANGUAGE plpgsql;
@@ -19,53 +18,85 @@ DECLARE
1918 loops ALIAS FOR $1;
2019BEGIN
2120 FOR i IN 1..loops LOOP
22- --RAISE INFO 'Current timestamp: %', timeofday()::TIMESTAMP;
23- RAISE INFO 'Sleep % seconds', i;
24- PERFORM pg_sleep(i);
21+ -- RAISE INFO 'Current timestamp: %', timeofday()::TIMESTAMP;
22+ -- 0.4 seconds step used here to hit the same histogram buckets consistently.
23+ -- See histogram buckets timing distribution.
24+ PERFORM pg_sleep(0.4 * i);
2525 END LOOP;
2626END;
2727$$ LANGUAGE 'plpgsql' STRICT;
28+ CREATE OR REPLACE FUNCTION wait_for_new_bucket() RETURNS VOID AS $$
29+ DECLARE
30+ bucket_left_time int;
31+ BEGIN
32+ -- This test works correctly only if the bucket duration is default (60 seconds).
33+ SELECT 60 - EXTRACT(
34+ SECOND FROM(
35+ SELECT CURRENT_TIMESTAMP(0) bucket_start_time FROM pg_stat_monitor ORDER BY bucket_start_time DESC LIMIT 1
36+ )
37+ )::int INTO bucket_left_time;
38+
39+ -- If the bucket lifetime is less than 10 seconds, we would not fit.
40+ IF bucket_left_time <= 4 THEN
41+ -- RAISE NOTICE 'Bucket lifetime comes to an end → sleeping 4 seconds...';
42+ PERFORM pg_sleep(4);
43+ END IF;
44+ END;
45+ $$ LANGUAGE plpgsql;
2846CREATE EXTENSION pg_stat_monitor;
47+ SELECT wait_for_new_bucket();
48+ wait_for_new_bucket
49+ ---------------------
50+
51+ (1 row)
52+
2953SELECT pg_stat_monitor_reset();
3054 pg_stat_monitor_reset
3155-----------------------
3256
3357(1 row)
3458
35- Set pg_stat_monitor.pgsm_track='all';
36- select run_pg_sleep(5);
37- INFO: Sleep 1 seconds
38- INFO: Sleep 2 seconds
39- INFO: Sleep 3 seconds
40- INFO: Sleep 4 seconds
41- INFO: Sleep 5 seconds
59+ SET pg_stat_monitor.pgsm_track='all';
60+ SELECT run_pg_sleep(5);
4261 run_pg_sleep
4362--------------
4463
4564(1 row)
4665
47- SELECT substr(query, 0,50) as query, calls, resp_calls FROM pg_stat_monitor ORDER BY query COLLATE "C";
48- query | calls | resp_calls
49- --------------------------------------+-------+-----------------------
50- SELECT pg_sleep(i) | 5 | {0,0,0,0,0,0,3,2 ,0,0}
51- SELECT pg_stat_monitor_reset() | 1 | {1,0,0,0,0,0,0,0,0,0}
52- Set pg_stat_monitor.pgsm_track='all' | 1 | {1 ,0,0,0,0,0,0,0,0,0}
53- select run_pg_sleep(5) | 1 | {0,0,0,0,0,0,0,0,1 ,0}
66+ SELECT substr(query, 0, 50) as query, calls, resp_calls FROM pg_stat_monitor ORDER BY query COLLATE "C";
67+ query | calls | resp_calls
68+ --------------------------------------+-------+-----------------------------------------------
69+ SELECT pg_sleep(0.4 * i) | 5 | {0,0,0,0,0,0,0,0,0,0,0,1,1,2,1,0,0,0,0,0 ,0,0}
70+ SELECT pg_stat_monitor_reset() | 1 | {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
71+ SELECT run_pg_sleep(5) | 1 | {0 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 ,0,0,0,0,0}
72+ SET pg_stat_monitor.pgsm_track='all' | 1 | {1, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ,0}
5473(4 rows)
5574
56- select * from generate_histogram();
57- range | freq | bar
58- --------------------+------+--------------------------------
59- (0 - 3)} | 0 |
60- (3 - 10)} | 0 |
61- (10 - 31)} | 0 |
62- (31 - 100)} | 0 |
63- (100 - 316)} | 0 |
64- (316 - 1000)} | 0 |
65- (1000 - 3162)} | 3 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
66- (3162 - 10000)} | 2 | ■■■■■■■■■■■■■■■■■■■■
67- (10000 - 31622)} | 0 |
68- (31622 - 100000)} | 0 |
69- (10 rows)
75+ SELECT * FROM generate_histogram();
76+ range | freq | bar
77+ ---------------------------+------+--------------------------------
78+ {{0.000 - 1.000} | 0 |
79+ (1.000 - 2.778} | 0 |
80+ (2.778 - 4.162} | 0 |
81+ (4.162 - 6.623} | 0 |
82+ (6.623 - 11.000} | 0 |
83+ (11.000 - 18.783} | 0 |
84+ (18.783 - 32.623} | 0 |
85+ (32.623 - 57.234} | 0 |
86+ (57.234 - 101.000} | 0 |
87+ (101.000 - 178.827} | 0 |
88+ (178.827 - 317.226} | 0 |
89+ (317.226 - 563.338} | 1 | ■■■■■■■■■■■■■■■
90+ (563.338 - 1000.994} | 1 | ■■■■■■■■■■■■■■■
91+ (1000.994 - 1779.268} | 2 | ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
92+ (1779.268 - 3163.256} | 1 | ■■■■■■■■■■■■■■■
93+ (3163.256 - 5624.371} | 0 |
94+ (5624.371 - 10000.920} | 0 |
95+ (10000.920 - 17783.643} | 0 |
96+ (17783.643 - 31623.492} | 0 |
97+ (31623.492 - 56234.598} | 0 |
98+ (56234.598 - 100000.000} | 0 |
99+ (100000.000 - ...}} | 0 |
100+ (22 rows)
70101
71102DROP EXTENSION pg_stat_monitor;
0 commit comments