Можно использовать системный каталог -
pg_stat_activity
в помощь.
Вот так, можно показать приложения (скорее сессии) и их запросы, которые заблокированы в транзакции:
select application_name
, client_addr
, state
, query
from pg_stat_activity
where wait_event_type = 'Lock' and wait_event = 'transactionid';
Но строка запроса тут plain text (с подставленными значениями). Если есть расширение pg_stat_statements, то можно использовать query_id, чтобы нормализовать ее
select a.application_name
, a.client_addr
, a.state
, s.query
from pg_stat_activity a
join pg_stat_statements s on a.query_id = s.queryid
where wait_event_type = 'Lock' and wait_event = 'transactionid';
Дальше все просто - находишь кто эти запросы посылает (если сервисов несколько) и по строке определяешь в каком месте затык/дедлок
P.S. также есть
pg_locks
, но он больше про блокировки объектов БД