postgres-long-running-transactions Tool
2 minute read
About
The postgres-long-running-transactions tool reports transactions that exceed a configured duration threshold by scanning pg_stat_activity for sessions where xact_start is set and older than the configured interval.
The tool returns a JSON array with one object per matching session (non-idle). Each object contains the process id, database and user, application name, client address, session state, several age intervals (connection, transaction, query, and last activity), wait event info, and the SQL text currently associated with the session.
Parameters:
min_duration(optional): Only show transactions running at least this long (Postgres interval format, e.g., ‘5 minutes’). Default:5 minutes.limit(optional): Maximum number of results to return. Default:20.
Compatible Sources
This tool can be used with the following database sources:
| Source Name |
|---|
| PostgreSQL Source |
| AlloyDB for PostgreSQL Source |
| Cloud SQL for PostgreSQL Source |
Parameters
| field | type | required | description |
|---|---|---|---|
| pid | integer | true | Process id (backend pid). |
| datname | string | true | Database name. |
| usename | string | true | Database user name. |
| appname | string | false | Application name (client application). |
| client_addr | string | false | Client IPv4/IPv6 address (may be null for local connections). |
| state | string | true | Session state (e.g., active, idle in transaction). |
| conn_age | string | true | Age of the connection: now() - backend_start (Postgres interval serialized as string). |
| xact_age | string | true | Age of the transaction: now() - xact_start (Postgres interval serialized as string). |
| query_age | string | true | Age of the currently running query: now() - query_start (Postgres interval serialized as string). |
| last_activity_age | string | true | Time since last state change: now() - state_change (Postgres interval serialized as string). |
| wait_event_type | string | false | Type of event the backend is waiting on (may be null). |
| wait_event | string | false | Specific wait event name (may be null). |
| query | string | true | SQL text associated with the session. |
Example
kind: tools
name: long_running_transactions
type: postgres-long-running-transactions
source: postgres-source
description: "Identifies transactions open longer than a threshold and returns details including query text and durations."
Example response element:
{
"pid": 12345,
"datname": "my_database",
"usename": "dbuser",
"appname": "my_app",
"client_addr": "10.0.0.5",
"state": "idle in transaction",
"conn_age": "00:12:34",
"xact_age": "00:06:00",
"query_age": "00:02:00",
"last_activity_age": "00:01:30",
"wait_event_type": null,
"wait_event": null,
"query": "UPDATE users SET last_seen = now() WHERE id = 42;"
}
Query
The SQL used by the tool looks like:
SELECT
pid,
datname,
usename,
application_name as appname,
client_addr,
state,
now() - backend_start as conn_age,
now() - xact_start as xact_age,
now() - query_start as query_age,
now() - state_change as last_activity_age,
wait_event_type,
wait_event,
query
FROM
pg_stat_activity
WHERE
state <> 'idle'
AND (now() - xact_start) > COALESCE($1::INTERVAL, interval '5 minutes')
AND xact_start IS NOT NULL
AND pid <> pg_backend_pid()
ORDER BY
xact_age DESC
LIMIT
COALESCE($2::int, 20);
Feedback
Was this page helpful?
Glad to hear it! Please tell us how we can improve.
Sorry to hear that. Please tell us how we can improve.