55 lines
2.3 KiB
Haskell
55 lines
2.3 KiB
Haskell
module PostgREST.Metrics
|
|
( init
|
|
, MetricsState (..)
|
|
, observationMetrics
|
|
, metricsToText
|
|
) where
|
|
|
|
import qualified Data.ByteString.Lazy as LBS
|
|
import qualified Hasql.Pool.Observation as SQL
|
|
|
|
import qualified Prometheus as Prom
|
|
|
|
import PostgREST.Observation
|
|
|
|
import Protolude
|
|
|
|
data MetricsState =
|
|
MetricsState Prom.Counter Prom.Gauge Prom.Gauge Prom.Gauge Prom.Counter Prom.Gauge
|
|
|
|
init :: Int -> IO MetricsState
|
|
init configDbPoolSize = do
|
|
poolTimeouts <- Prom.register $ Prom.counter (Prom.Info "pgrst_db_pool_timeouts_total" "The total number of pool connection timeouts")
|
|
poolAvailable <- Prom.register $ Prom.gauge (Prom.Info "pgrst_db_pool_available" "Available connections in the pool")
|
|
poolWaiting <- Prom.register $ Prom.gauge (Prom.Info "pgrst_db_pool_waiting" "Requests waiting to acquire a pool connection")
|
|
poolMaxSize <- Prom.register $ Prom.gauge (Prom.Info "pgrst_db_pool_max" "Max pool connections")
|
|
schemaCacheLoads <- Prom.register $ Prom.counter (Prom.Info "pgrst_schema_cache_loads_total" "The total number of times the schema cache was loaded")
|
|
schemaCacheQueryTime <- Prom.register $ Prom.gauge (Prom.Info "pgrst_schema_cache_query_time_seconds" "The query time in seconds of the last schema cache load")
|
|
Prom.setGauge poolMaxSize (fromIntegral configDbPoolSize)
|
|
pure $ MetricsState poolTimeouts poolAvailable poolWaiting poolMaxSize schemaCacheLoads schemaCacheQueryTime
|
|
|
|
observationMetrics :: MetricsState -> ObservationHandler
|
|
observationMetrics (MetricsState poolTimeouts poolAvailable poolWaiting _ schemaCacheLoads schemaCacheQueryTime) obs = case obs of
|
|
(PoolAcqTimeoutObs _) -> do
|
|
Prom.incCounter poolTimeouts
|
|
(HasqlPoolObs (SQL.ConnectionObservation _ status)) -> case status of
|
|
SQL.ReadyForUseConnectionStatus -> do
|
|
Prom.incGauge poolAvailable
|
|
SQL.InUseConnectionStatus -> do
|
|
Prom.decGauge poolAvailable
|
|
SQL.TerminatedConnectionStatus _ -> do
|
|
Prom.decGauge poolAvailable
|
|
SQL.ConnectingConnectionStatus -> pure ()
|
|
PoolRequest ->
|
|
Prom.incGauge poolWaiting
|
|
PoolRequestFullfilled ->
|
|
Prom.decGauge poolWaiting
|
|
SchemaCacheLoadedObs resTime -> do
|
|
Prom.incCounter schemaCacheLoads
|
|
Prom.setGauge schemaCacheQueryTime resTime
|
|
_ ->
|
|
pure ()
|
|
|
|
metricsToText :: IO LBS.ByteString
|
|
metricsToText = Prom.exportMetricsAsText
|