module JmlSvc.Metrics (Config(..), flags, prometheus) where
import Protolude
import qualified Control.Monad.Logger as Logger
import qualified Data.Default as Default
import GHC.Stats (getRTSStatsEnabled)
import qualified Network.Wai as Wai
import qualified Options.Applicative as Options
import qualified Prometheus as Prom
import qualified Prometheus.Metric.GHC as Prom
import qualified JmlSvc.Instrument as Instrument
newtype Config = Config
{ enableGhcMetrics :: Bool
} deriving (Eq, Show)
flags :: Options.Parser Config
flags =
Config <$> Options.switch (fold [Options.long "ghc-metrics", Options.help "Export GHC metrics. Requires running with +RTS."])
prometheus :: (Logger.MonadLogger m, MonadIO m) => Text -> Config -> m Wai.Middleware
prometheus appName Config {..} = do
requests <- liftIO $ Prom.registerIO Instrument.requestLatency
when enableGhcMetrics $ do
statsEnabled <- liftIO getRTSStatsEnabled
unless statsEnabled $ Logger.logWarnN "Exporting GHC metrics but GC stats not enabled. Re-run with +RTS -T."
void . liftIO $ Prom.register Prom.ghcMetrics
pure $ Instrument.prometheus Default.def requests appName