From b9c8562641321b1ce0a2c47d32e5a2de6615fe62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20K=C5=82eczek?= Date: Tue, 27 Jan 2026 17:14:20 +0100 Subject: [PATCH] add: Log pg version details of listener connection Follow-up to #4617 adding more information to log entry produced upon successful listener connection establishement. --- CHANGELOG.md | 2 +- src/PostgREST/Listener.hs | 18 ++++++++++++------ src/PostgREST/Observation.hs | 6 +++--- test/io/test_io.py | 6 ++++-- test/observability/ObsHelper.hs | 2 +- 5 files changed, 21 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6442b9c57..ffae4da0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ All notable changes to this project will be documented in this file. From versio ### Added -- Log the actual host and port of listener database connection by @mkleczek in #4617 +- Log host, port and pg version of listener database connection by @mkleczek in #4617 #4618 ## [14.8] - 2026-04-03 diff --git a/src/PostgREST/Listener.hs b/src/PostgREST/Listener.hs index 2872cdc1d..e801e1d69 100644 --- a/src/PostgREST/Listener.hs +++ b/src/PostgREST/Listener.hs @@ -17,10 +17,13 @@ import PostgREST.Version (prettyVersion) import qualified PostgREST.AppState as AppState import qualified PostgREST.Config as Config -import Control.Arrow ((&&&)) -import Data.Bitraversable (bisequence) -import Data.Either.Combinators (whenRight) -import qualified Database.PostgreSQL.LibPQ as LibPQ +import Control.Arrow ((&&&)) +import Data.Bitraversable (bisequence) +import Data.Either.Combinators (whenRight) +import qualified Database.PostgreSQL.LibPQ as LibPQ +import qualified Hasql.Session as SQL +import PostgREST.Config.Database (queryPgVersion) +import PostgREST.Config.PgVersion (pgvFullName) import Protolude -- | Starts the Listener in a thread @@ -66,6 +69,9 @@ retryingListen appState = do \case Right db -> do SQL.listen db $ SQL.toPgIdentifier dbChannel + (pqHost, pqPort) <- SQL.withLibPQConnection db $ bisequence . (LibPQ.host &&& LibPQ.port) + pgFullName <- SQL.run (queryPgVersion False) db >>= either throwIO (pure . pgvFullName) + AppState.putIsListenerOn appState True delay <- AppState.getNextListenerDelay appState @@ -75,8 +81,8 @@ retryingListen appState = do -- reset the delay AppState.putNextListenerDelay appState 1 - (pqHost, pqPort) <- SQL.withLibPQConnection db $ bisequence . (LibPQ.host &&& LibPQ.port) - observer $ DBListenStart pqHost pqPort dbChannel + observer $ DBListenStart pqHost pqPort pgFullName dbChannel + -- wait for notifications -- this will never return, in case of an error it will throw and be caught by onError forever $ SQL.waitForNotifications handleNotification db diff --git a/src/PostgREST/Observation.hs b/src/PostgREST/Observation.hs index 1169897d6..dc354c26d 100644 --- a/src/PostgREST/Observation.hs +++ b/src/PostgREST/Observation.hs @@ -45,7 +45,7 @@ data Observation | SchemaCacheSummaryObs Text | SchemaCacheLoadedObs Double | ConnectionRetryObs Int - | DBListenStart (Maybe ByteString) (Maybe ByteString) Text -- host, port, channel + | DBListenStart (Maybe ByteString) (Maybe ByteString) Text Text -- host, port, version string, channel | DBListenFail Text (Either SQL.ConnectionError SomeException) | DBListenRetry Int | DBListenBugHint -- https://github.com/PostgREST/postgrest/issues/3147 @@ -114,8 +114,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 host port channel -> do - "Listener connected to " <> show (fold $ host <> fmap (":" <>) port) <> " and listening for database notifications on the " <> show channel <> " channel" + DBListenStart host port fullName channel -> do + "Listener connected to " <> fullName <> " on " <> 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 diff --git a/test/io/test_io.py b/test/io/test_io.py index 641476283..cb84cc764 100644 --- a/test/io/test_io.py +++ b/test/io/test_io.py @@ -1667,9 +1667,11 @@ def test_log_listener_connection_start(defaultenv): } with run(env=env, no_startup_stdout=False, wait_for_readiness=True) as postgrest: - output = postgrest.read_stdout(nlines=5) + output = postgrest.read_stdout(nlines=10) + # Check for the listener start message containing host and port + # Do not check if pg version is displayed properly as it is tricky to test it assert any( - f'Listener connected to "{defaultenv["PGHOST"]}:5432" and listening for database notifications on the "pgrst" channel' + f'"{defaultenv["PGHOST"]}:5432" and listening for database notifications on the "pgrst" channel' in line for line in output ) diff --git a/test/observability/ObsHelper.hs b/test/observability/ObsHelper.hs index e1ff88bc0..df8488760 100644 --- a/test/observability/ObsHelper.hs +++ b/test/observability/ObsHelper.hs @@ -206,5 +206,5 @@ waitForObs (ObsChan orig copy) t msg f = obsDiagMessage :: Observation -> Text obsDiagMessage = \case (HasqlPoolObs o) -> show o - o@(DBListenStart host port channel) -> constrName o <> show (host, port, channel) + o@(DBListenStart host port name channel) -> constrName o <> show (host, port, name, channel) o -> constrName o