@@ -19,6 +19,7 @@ import qualified PostgREST.AppState as AppState
1919import qualified PostgREST.Logger as Logger
2020import qualified PostgREST.Metrics as Metrics
2121
22+ import qualified Data.Text as T
2223import qualified Feature.Auth.AsymmetricJwtSpec
2324import qualified Feature.Auth.AudienceJwtSecretSpec
2425import qualified Feature.Auth.AuthSpec
@@ -29,6 +30,7 @@ import qualified Feature.Auth.NoJwtSecretSpec
2930import qualified Feature.ConcurrentSpec
3031import qualified Feature.CorsSpec
3132import qualified Feature.ExtraSearchPathSpec
33+ import qualified Feature.MetricsSpec
3234import qualified Feature.NoSuperuserSpec
3335import qualified Feature.ObservabilitySpec
3436import qualified Feature.OpenApi.DisabledOpenApiSpec
@@ -68,24 +70,48 @@ import qualified Feature.Query.UpdateSpec
6870import qualified Feature.Query.UpsertSpec
6971import qualified Feature.RollbackSpec
7072import qualified Feature.RpcPreRequestGucsSpec
73+ import qualified Feature.ToxiSpec
74+ import PostgREST.Observation (Observation (HasqlPoolObs ))
75+ import qualified System.Environment as System
7176
7277
7378main :: IO ()
7479main = do
80+ poolChan <- newChan
81+ -- make sure poolChan is not growing indefinitely
82+ -- start a thread that drains the channel
83+ -- this is necessary because test cases operate on
84+ -- copies so poolChan is never read from
85+ void $ forkIO $ forever $ readChan poolChan
86+ metricsState <- Metrics. init (configDbPoolSize testCfg)
7587 pool <- P. acquire $ P. settings
7688 [ P. size 3
7789 , P. acquisitionTimeout 10
7890 , P. agingTimeout 60
7991 , P. idlenessTimeout 60
8092 , P. staticConnectionSettings (toUtf8 $ configDbUri testCfg)
93+ -- make sure metrics are updated and pool observations published to poolChan
94+ , P. observationHandler $ (writeChan poolChan <> Metrics. observationMetrics metricsState) . HasqlPoolObs
95+ ]
96+
97+ toxiProxyName <- T. pack <$> System. getEnv " TOXI_PROXY_NAME"
98+ toxiPgPort <- T. pack <$> System. getEnv " TOXI_PGPORT"
99+ pgPort <- T. pack <$> System. getEnv " PGPORT"
100+ toxicPool <- P. acquire $ P. settings
101+ [ P. size 3
102+ , P. acquisitionTimeout 10
103+ , P. agingTimeout 60
104+ , P. idlenessTimeout 60
105+ , P. staticConnectionSettings (toUtf8 $ configDbUri (baseCfg { configDbUri = " postgresql://localhost:" <> toxiPgPort }))
106+ -- make sure metrics are updated and pool observations published to poolChan
107+ , P. observationHandler $ (writeChan poolChan <> Metrics. observationMetrics metricsState) . HasqlPoolObs
81108 ]
82109
83110 actualPgVersion <- either (panic . show ) id <$> P. use pool (queryPgVersion False )
84111
85112 -- cached schema cache so most tests run fast
86113 baseSchemaCache <- loadSCache pool testCfg
87114 loggerState <- Logger. init
88- metricsState <- Metrics. init (configDbPoolSize testCfg)
89115
90116 let
91117 initApp sCache st config = do
@@ -94,6 +120,15 @@ main = do
94120 AppState. putSchemaCache appState (Just sCache)
95121 return (st, postgrest (configLogLevel config) appState (pure () ))
96122
123+ initObservationsApp sCache config = do
124+ -- duplicate poolChan as a starting point
125+ obsChan <- dupChan poolChan
126+ stateObsChan <- newObsChan obsChan
127+ appState <- AppState. initWithPool toxicPool config loggerState metricsState (Metrics. observationMetrics metricsState <> writeChan obsChan)
128+ AppState. putPgVersion appState actualPgVersion
129+ AppState. putSchemaCache appState (Just sCache)
130+ return (SpecState appState metricsState stateObsChan $ testToxiProxy toxiProxyName toxiPgPort pgPort, postgrest (configLogLevel config) appState (pure () ))
131+
97132 -- For tests that run with the same schema cache
98133 app = initApp baseSchemaCache ()
99134
@@ -122,6 +157,7 @@ main = do
122157 obsApp = app testObservabilityCfg
123158 serverTiming = app testCfgServerTiming
124159 aggregatesEnabled = app testCfgAggregatesEnabled
160+ observationsApp = initObservationsApp baseSchemaCache testCfg
125161
126162 extraSearchPathApp = appDbs testCfgExtraSearchPath
127163 unicodeApp = appDbs testUnicodeCfg
@@ -277,6 +313,11 @@ main = do
277313 before (initApp baseSchemaCache metricsState testCfgJwtCache) $
278314 describe " Feature.Auth.JwtCacheSpec" Feature.Auth.JwtCacheSpec. spec
279315
316+ traverse_ (before observationsApp . uncurry describe) [
317+ (" Feature.MetricsSpec" , Feature.MetricsSpec. spec)
318+ , (" Feature.ToxiSpec" , Feature.ToxiSpec. spec)
319+ ]
320+
280321 where
281322 loadSCache pool conf =
282323 either (panic. show ) id <$> P. use pool (HT. transaction HT. ReadCommitted HT. Read $ querySchemaCache conf)
0 commit comments