From 7e99babec76ba71eef7608343e4642b862107452 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Mon, 16 Sep 2024 13:07:20 -0500 Subject: [PATCH] feat: log pool maximum size It's important for observability to have an historic trace of the pool size. Currently we expose it on the metrics endpoint, but not all deployments use it. This logs the pool size after the successful connection log to make it more visible: : Connection Pool initialized with a maximum size of 4 connections --- CHANGELOG.md | 1 + docs/references/observability.rst | 2 +- docs/tutorials/tut0.rst | 8 ++------ src/PostgREST/App.hs | 2 -- src/PostgREST/AppState.hs | 5 ++++- src/PostgREST/Observation.hs | 3 +++ 6 files changed, 11 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7602c1ab1..b0e3d1ee4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - #3607, Log to stderr when the JWT secret is less than 32 characters long - @laurenceisla - #2858, Performance improvements when calling RPCs via GET using indexes in more cases - @wolfgangwalther - #3560, Log resolved host in "Listening on ..." messages - @develop7 + - #3727, Log maximum pool size - @steve-chavez ### Fixed diff --git a/docs/references/observability.rst b/docs/references/observability.rst index a37d4e292..04a261ba4 100644 --- a/docs/references/observability.rst +++ b/docs/references/observability.rst @@ -31,8 +31,8 @@ For diagnostic information about the server itself, PostgREST logs to ``stderr`` .. code:: 06/May/2024:08:16:11 -0500: Starting PostgREST 12.1... - 06/May/2024:08:16:11 -0500: Attempting to connect to the database... 06/May/2024:08:16:11 -0500: Successfully connected to PostgreSQL 14.10 (Ubuntu 14.10-0ubuntu0.22.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit + 06/May/2024:08:16:11 -0500: Connection Pool initialized with a maximum size of 10 connections 06/May/2024:08:16:11 -0500: API server listening on port 3000 06/May/2024:08:16:11 -0500: Listening for database notifications on the "pgrst" channel 06/May/2024:08:16:11 -0500: Config reloaded diff --git a/docs/tutorials/tut0.rst b/docs/tutorials/tut0.rst index 64e0292ca..f70cf709d 100644 --- a/docs/tutorials/tut0.rst +++ b/docs/tutorials/tut0.rst @@ -213,12 +213,8 @@ You should see something similar to: .. code-block:: text Starting PostgREST 12.0.2... - Attempting to connect to the database... - Connection successful - Listening on port 3000 - Config reloaded - Listening for notifications on the pgrst channel - Schema cache loaded + Successfully connected to PostgreSQL 14.10 (Ubuntu 14.10-0ubuntu0.22.04.1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit + API server listening on port 3000 It's now ready to serve web requests. There are many nice graphical API exploration tools you can use, but for this tutorial we'll use :code:`curl` because it's likely to be installed on your system already. Open a new terminal (leaving the one open that PostgREST is running inside). Try doing an HTTP request for the todos. diff --git a/src/PostgREST/App.hs b/src/PostgREST/App.hs index f99d8683f..99febebac 100644 --- a/src/PostgREST/App.hs +++ b/src/PostgREST/App.hs @@ -67,8 +67,6 @@ run appState = do let observer = AppState.getObserver appState conf@AppConfig{..} <- AppState.getConfig appState - observer $ AppStartObs prettyVersion - AppState.schemaCacheLoader appState -- Loads the initial SchemaCache Unix.installSignalHandlers (AppState.getMainThreadId appState) (AppState.schemaCacheLoader appState) (AppState.readInDbConfig False appState) diff --git a/src/PostgREST/AppState.hs b/src/PostgREST/AppState.hs index 45dd2669a..c52c63d2a 100644 --- a/src/PostgREST/AppState.hs +++ b/src/PostgREST/AppState.hs @@ -132,6 +132,8 @@ init conf@AppConfig{configLogLevel, configDbPoolSize} = do metricsState <- Metrics.init configDbPoolSize let observer = liftA2 (>>) (Logger.observationLogger loggerState configLogLevel) (Metrics.observationMetrics metricsState) + observer $ AppStartObs prettyVersion + pool <- initPool conf observer (sock, adminSock) <- initSockets conf state' <- initWithPool (sock, adminSock) pool conf loggerState metricsState observer @@ -206,7 +208,7 @@ initSockets AppConfig{..} = do pure (sock, adminSock) initPool :: AppConfig -> ObservationHandler -> IO SQL.Pool -initPool AppConfig{..} observer = +initPool AppConfig{..} observer = do SQL.acquire $ SQL.settings [ SQL.size configDbPoolSize , SQL.acquisitionTimeout $ fromIntegral configDbPoolAcquisitionTimeout @@ -391,6 +393,7 @@ retryingSchemaCacheLoad appState@AppState{stateObserver=observer, stateMainThrea observer $ ExitUnsupportedPgVersion actualPgVersion minimumPgVersion killThread mainThreadId observer $ DBConnectedObs $ pgvFullName actualPgVersion + observer $ PoolInit configDbPoolSize putPgVersion appState actualPgVersion return $ Just actualPgVersion diff --git a/src/PostgREST/Observation.hs b/src/PostgREST/Observation.hs index 44c5c4d12..9e9866180 100644 --- a/src/PostgREST/Observation.hs +++ b/src/PostgREST/Observation.hs @@ -49,6 +49,7 @@ data Observation | QueryRoleSettingsErrorObs SQL.UsageError | QueryErrorCodeHighObs SQL.UsageError | QueryPgVersionError SQL.UsageError + | PoolInit Int | PoolAcqTimeoutObs SQL.UsageError | HasqlPoolObs SQL.Observation | PoolRequest @@ -118,6 +119,8 @@ observationMessage = \case "Failed reloading config: " <> err ConfigSucceededObs -> "Config reloaded" + PoolInit poolSize -> + "Connection Pool initialized with a maximum size of " <> show poolSize <> " connections" PoolAcqTimeoutObs usageErr -> jsonMessage usageErr HasqlPoolObs (SQL.ConnectionObservation uuid status) ->