Skip to content

Commit 8a273ba

Browse files
Update pg_stat_statements version specific.
This will eliminate the duplicates on queryid collected by collector. Signed-off-by: VigneshViggu <[email protected]>
1 parent b126e62 commit 8a273ba

File tree

1 file changed

+39
-40
lines changed

1 file changed

+39
-40
lines changed

collector/pg_stat_statements.go

Lines changed: 39 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -71,50 +71,49 @@ var (
7171
prometheus.Labels{},
7272
)
7373

74-
pgStatStatementsQuery = `SELECT
75-
pg_get_userbyid(userid) as user,
76-
pg_database.datname,
77-
pg_stat_statements.queryid,
78-
pg_stat_statements.calls as calls_total,
79-
pg_stat_statements.total_time / 1000.0 as seconds_total,
80-
pg_stat_statements.rows as rows_total,
81-
pg_stat_statements.blk_read_time / 1000.0 as block_read_seconds_total,
82-
pg_stat_statements.blk_write_time / 1000.0 as block_write_seconds_total
83-
FROM pg_stat_statements
84-
JOIN pg_database
85-
ON pg_database.oid = pg_stat_statements.dbid
86-
WHERE
87-
total_time > (
88-
SELECT percentile_cont(0.1)
89-
WITHIN GROUP (ORDER BY total_time)
90-
FROM pg_stat_statements
74+
// Query is compatible for versions lesser than PostgreSQL 13.
75+
pgStatStatementsQuery = `WITH percentiles AS (
76+
SELECT percentile_cont(0.1) WITHIN GROUP (ORDER BY total_time) AS percentile
77+
FROM pg_stat_statements
9178
)
92-
ORDER BY seconds_total DESC
93-
LIMIT 100;`
94-
95-
pgStatStatementsNewQuery = `SELECT
96-
pg_get_userbyid(userid) as user,
97-
pg_database.datname,
98-
pg_stat_statements.queryid,
99-
pg_stat_statements.calls as calls_total,
100-
pg_stat_statements.total_exec_time / 1000.0 as seconds_total,
101-
pg_stat_statements.rows as rows_total,
102-
pg_stat_statements.blk_read_time / 1000.0 as block_read_seconds_total,
103-
pg_stat_statements.blk_write_time / 1000.0 as block_write_seconds_total
104-
FROM pg_stat_statements
105-
JOIN pg_database
106-
ON pg_database.oid = pg_stat_statements.dbid
107-
WHERE
108-
total_exec_time > (
109-
SELECT percentile_cont(0.1)
110-
WITHIN GROUP (ORDER BY total_exec_time)
111-
FROM pg_stat_statements
112-
)
113-
ORDER BY seconds_total DESC
114-
LIMIT 100;`
79+
SELECT DISTINCT ON (pss.queryid)
80+
pg_get_userbyid(pss.userid) as user,
81+
pg_database.datname,
82+
pss.queryid,
83+
pss.calls as calls_total,
84+
pss.total_time / 1000.0 as seconds_total,
85+
pss.rows as rows_total,
86+
pss.blk_read_time / 1000.0 as block_read_seconds_total,
87+
pss.blk_write_time / 1000.0 as block_write_seconds_total
88+
FROM pg_stat_statements pss
89+
JOIN pg_database ON pg_database.oid = pss.dbid
90+
CROSS JOIN percentiles
91+
WHERE pss.total_time > (SELECT percentile FROM percentiles)
92+
ORDER BY pss.queryid, pss.userid DESC
93+
LIMIT 100;`
94+
95+
// Query is compatible from PostgreSQL 13 and higher versions.
96+
pgStatStatementsNewQuery = `SELECT DISTINCT ON (pss.queryid)
97+
pg_get_userbyid(pss.userid) as user,
98+
pg_database.datname,
99+
pss.queryid,
100+
pss.calls as calls_total,
101+
pss.total_exec_time / 1000.0 as seconds_total,
102+
pss.rows as rows_total,
103+
pss.blk_read_time / 1000.0 as block_read_seconds_total,
104+
pss.blk_write_time / 1000.0 as block_write_seconds_total
105+
FROM pg_stat_statements pss
106+
JOIN pg_database ON pg_database.oid = pss.dbid
107+
JOIN (
108+
SELECT percentile_cont(0.1) WITHIN GROUP (ORDER BY total_exec_time) AS percentile_val
109+
FROM pg_stat_statements
110+
) AS perc ON pss.total_exec_time > perc.percentile_val
111+
ORDER BY pss.queryid, pss.userid DESC
112+
LIMIT 100;`
115113
)
116114

117115
func (PGStatStatementsCollector) Update(ctx context.Context, instance *instance, ch chan<- prometheus.Metric) error {
116+
// Set query based on the version parsed.
118117
query := pgStatStatementsQuery
119118
if instance.version.GE(semver.MustParse("13.0.0")) {
120119
query = pgStatStatementsNewQuery

0 commit comments

Comments
 (0)