Skip to content

feat: Add granted label pg_locks collector#1246

Open
eugercek wants to merge 1 commit intoprometheus-community:masterfrom
eugercek:add_granted_label_on_pg_locks
Open

feat: Add granted label pg_locks collector#1246
eugercek wants to merge 1 commit intoprometheus-community:masterfrom
eugercek:add_granted_label_on_pg_locks

Conversation

@eugercek
Copy link
Copy Markdown
Contributor

@eugercek eugercek commented Jan 25, 2026

Hi,

This PR adds granted label to pg_locks_count metric.

Implements and Closes #657.

Implementation Choices:

Postgres version compatibility: I believe pg_locks.granted exists since postgres started to using Git. This is the commit that src/backend/catalog/system_views.sql file is added and pg_locks.granted exists at that time too. Nov 11 2003. Also in 7.3.0 release notes pg_locks is mentioned. So It'll be available since 7.3.0, because of these I did not use instance.version.GE like check, it's too old.

Metric format: I did not touch current format it'll be cartesian product, value=0 will be exists. Only added granted label.

How bool is implemented: Since we already use data point's value for count of the current data point, like in below metric we know that there are 9 locks for granted="true",mode="accesssharelock", I can't use the metric's value like pg_replication_slot_slot_is_active, so used a new label called granted.

pg_locks_count{datname="postgres",granted="true",mode="accesssharelock"} 9`

Because we use count value I couldn't use this standard. Found open-telemetry/opentelemetry-dotnet#4822 standard looks like using lowercase "true" "false" so used that.

Cardinality and Metric Count: Cardinality will be 2, just granted="true|false". But metric count will be doubled because of the added 2 new dimension.

Tests

Unit Test:

go test ./collector -run TestPGLocksCollector -v
=== RUN   TestPGLocksCollector

  Metrics comparison ✔


1 total assertion

--- PASS: TestPGLocksCollector (0.00s)
PASS
ok      github.com/prometheus-community/postgres_exporter/collector     (cached)

Manual test

Ran below:

CREATE DATABASE foo;
-- \c foo
CREATE TABLE foo(name text);

begin;
LOCK TABLE foo IN EXCLUSIVE MODE; 

-- In another session
begin;
LOCK TABLE foo IN EXCLUSIVE MODE; 

curl -s http://localhost:9187/metrics | grep pg_locks | grep foo

Output
pg_locks_count{datname="foo",granted="false",mode="accessexclusivelock"} 0
pg_locks_count{datname="foo",granted="false",mode="accesssharelock"} 0
pg_locks_count{datname="foo",granted="false",mode="exclusivelock"} 1
pg_locks_count{datname="foo",granted="false",mode="rowexclusivelock"} 0
pg_locks_count{datname="foo",granted="false",mode="rowsharelock"} 0
pg_locks_count{datname="foo",granted="false",mode="sharelock"} 0
pg_locks_count{datname="foo",granted="false",mode="sharerowexclusivelock"} 0
pg_locks_count{datname="foo",granted="false",mode="shareupdateexclusivelock"} 0
pg_locks_count{datname="foo",granted="false",mode="sireadlock"} 0
pg_locks_count{datname="foo",granted="true",mode="accessexclusivelock"} 0
pg_locks_count{datname="foo",granted="true",mode="accesssharelock"} 0
pg_locks_count{datname="foo",granted="true",mode="exclusivelock"} 1
pg_locks_count{datname="foo",granted="true",mode="rowexclusivelock"} 0
pg_locks_count{datname="foo",granted="true",mode="rowsharelock"} 0
pg_locks_count{datname="foo",granted="true",mode="sharelock"} 0
pg_locks_count{datname="foo",granted="true",mode="sharerowexclusivelock"} 0
pg_locks_count{datname="foo",granted="true",mode="shareupdateexclusivelock"} 0
pg_locks_count{datname="foo",granted="true",mode="sireadlock"} 0

Signed-off-by: Emin Umut Gercek <eumutgercek@gmail.com>
@eugercek eugercek force-pushed the add_granted_label_on_pg_locks branch from 201b3fe to 9264e87 Compare January 25, 2026 21:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add "granted" to pg_locks_count as a label

1 participant