diff --git a/CHANGELOG.md b/CHANGELOG.md index d4b20556c..519de98ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ This project adheres to [Semantic Versioning](http://semver.org/). ## Unreleased +### Fixed + +- Fix logging the Haskell type instead of the listener error message directly by @laurenceisla in #3588 + ## [13.0.5] - 2025-08-24 ### Fixed diff --git a/src/PostgREST/Observation.hs b/src/PostgREST/Observation.hs index 2b5f3361c..5300ee198 100644 --- a/src/PostgREST/Observation.hs +++ b/src/PostgREST/Observation.hs @@ -108,11 +108,8 @@ observationMessage = \case DBListenStart channel -> do "Listening for database notifications on the " <> show channel <> " channel" DBListenFail channel listenErr -> - "Failed listening for database notifications on the " <> show channel <> " channel. " <> ( - case listenErr of - Left err -> show err - Right err -> showListenerError err - ) + "Failed listening for database notifications on the " <> show channel <> " channel. " <> + either showListenerConnError showListenerException listenErr DBListenRetry delay -> "Retrying listening for database notifications in " <> (show delay::Text) <> " seconds..." DBListenerGotSCacheMsg channel -> @@ -157,8 +154,11 @@ observationMessage = \case jsonMessage err = T.decodeUtf8 . LBS.toStrict . Error.errorPayload $ Error.PgError False err - showListenerError :: Either SomeException () -> Text - showListenerError (Right _) = "Failed getting notifications" -- should not happen as the listener will never finish (hasql-notifications uses `forever` internally) with a Right result - showListenerError (Left e) = - let showOnSingleLine txt = T.intercalate " " $ T.filter (/= '\t') <$> T.lines txt in -- the errors from hasql-notifications come intercalated with "\t\n" - showOnSingleLine $ show e + showOnSingleLine txt = T.intercalate " " $ T.filter (/= '\t') <$> T.lines txt -- the errors from hasql-notifications come intercalated with "\t\n" + + showListenerConnError :: SQL.ConnectionError -> Text + showListenerConnError = maybe "Connection error" (showOnSingleLine . T.decodeUtf8) + + showListenerException :: Either SomeException () -> Text + showListenerException (Right _) = "Failed getting notifications" -- should not happen as the listener will never finish (hasql-notifications uses `forever` internally) with a Right result + showListenerException (Left e) = showOnSingleLine $ show e diff --git a/test/io/test_io.py b/test/io/test_io.py index ad933fa46..886cf82ba 100644 --- a/test/io/test_io.py +++ b/test/io/test_io.py @@ -1930,3 +1930,21 @@ def test_schema_cache_error_observation(defaultenv): "Failed to load the schema cache using db-schemas=public and db-extra-search-path=x" in output[7] ) + + +def test_log_listener_connection_errors(defaultenv): + "The logs should show the listener connection error message in a single line" + + env = { + **defaultenv, + "PGHOST": "no_host", + "PGRST_DB_CHANNEL_ENABLED": "true", + } + + with run(env=env, no_startup_stdout=False, wait_for_readiness=False) as postgrest: + output = postgrest.read_stdout(nlines=5) + assert any( + 'Failed listening for database notifications on the "pgrst" channel. could not translate host name "no_host" to address:' + in line + for line in output + )