add: Log actual host and port of listener connection

Diagnosing problems with listener channel notifications not being handled properly by PostgREST connected to read replicas is difficult. Issues might be related to lost connections and listener not being connected to the right host after failover or database server restarts.
This patch adds logging of actual host:port used by libpq connection opened by the listener. It should make it easier to find out if PostgREST is connected to the right host.
This commit is contained in:
Michał Kłeczek
2026-01-27 11:00:30 -05:00
committed by Steve Chavez
parent 00c7cb1a22
commit 5356f4e973
4 changed files with 29 additions and 6 deletions
+8 -3
View File
@@ -17,8 +17,11 @@ import PostgREST.Version (prettyVersion)
import qualified PostgREST.AppState as AppState
import qualified PostgREST.Config as Config
import Data.Either.Combinators (whenRight)
import Protolude
import Control.Arrow ((&&&))
import Data.Bitraversable (bisequence)
import Data.Either.Combinators (whenRight)
import qualified Database.PostgreSQL.LibPQ as LibPQ
import Protolude
-- | Starts the Listener in a thread
runListener :: AppState -> IO ()
@@ -70,7 +73,9 @@ retryingListen appState = do
-- reset the delay
AppState.putNextListenerDelay appState 1
observer $ DBListenStart dbChannel
(pqHost, pqPort) <- SQL.withLibPQConnection db $ bisequence . (LibPQ.host &&& LibPQ.port)
observer $ DBListenStart pqHost pqPort dbChannel
SQL.waitForNotifications handleNotification db
Left err -> do
+3 -3
View File
@@ -44,7 +44,7 @@ data Observation
| SchemaCacheSummaryObs Text
| SchemaCacheLoadedObs Double
| ConnectionRetryObs Int
| DBListenStart Text
| DBListenStart (Maybe ByteString) (Maybe ByteString) Text -- host, port, channel
| DBListenFail Text (Either SQL.ConnectionError (Either SomeException ()))
| DBListenRetry Int
| DBListenBugHint -- https://github.com/PostgREST/postgrest/issues/3147
@@ -110,8 +110,8 @@ observationMessage = \case
"Attempting to reconnect to the database in " <> (show delay::Text) <> " seconds..."
QueryPgVersionError usageErr ->
"Failed to query the PostgreSQL version. " <> jsonMessage usageErr
DBListenStart channel -> do
"Listening for database notifications on the " <> show channel <> " channel"
DBListenStart host port channel -> do
"Listener connected to " <> show (fold $ host <> fmap (":" <>) port) <> " and listening for database notifications on the " <> show channel <> " channel"
DBListenFail channel listenErr ->
"Failed listening for database notifications on the " <> show channel <> " channel. " <>
either showListenerConnError showListenerException listenErr