diff --git a/cmd/postgres_exporter/postgres_exporter.go b/cmd/postgres_exporter/postgres_exporter.go index ed06cee65..2387cb61e 100644 --- a/cmd/postgres_exporter/postgres_exporter.go +++ b/cmd/postgres_exporter/postgres_exporter.go @@ -225,6 +225,14 @@ var builtinMetricMaps = map[string]intermediateMetricMap{ true, 0, }, + "pg_lock_conflicts": { + map[string]ColumnMapping{ + "blocking_pid": {LABEL, "PID of blocking session", nil, nil}, + "count": {GAUGE, "Number of blocked sessions", nil, nil}, + }, + true, + 0, + }, "pg_stat_replication": { map[string]ColumnMapping{ "procpid": {DISCARD, "Process ID of a WAL sender process", nil, semver.MustParseRange("<9.2.0")}, diff --git a/cmd/postgres_exporter/queries.go b/cmd/postgres_exporter/queries.go index 97642d991..ab87d018f 100644 --- a/cmd/postgres_exporter/queries.go +++ b/cmd/postgres_exporter/queries.go @@ -70,7 +70,19 @@ var queryOverrides = map[string][]OverrideQuery{ ON tmp.mode=tmp2.mode and pg_database.oid = tmp2.database ORDER BY 1`, }, }, - + "pg_lock_conflicts": { + { + semver.MustParseRange(">0.0.0"), + `SELECT blockinga.pid AS blocking_pid, count(*) as count + FROM pg_catalog.pg_locks blockedl + JOIN pg_stat_activity blockeda ON blockedl.pid = blockeda.pid + JOIN pg_catalog.pg_locks blockingl ON(blockingl.transactionid=blockedl.transactionid + AND blockedl.pid != blockingl.pid) + JOIN pg_stat_activity blockinga ON blockingl.pid = blockinga.pid + WHERE NOT blockedl.granted + group by blocking_pid`, + }, + }, "pg_stat_replication": { { semver.MustParseRange(">=10.0.0"),