{-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE MultiParamTypeClasses #-} module Arbor.Monad.Datadog.MetricApp ( runMetricApp ) where import Arbor.Monad.Metric import Control.Monad.Catch import Control.Monad.Logger (LoggingT, MonadLogger, runLoggingT) import Control.Monad.Reader import Data.Generics.Product.Any import GHC.Generics import System.Log.FastLogger import qualified Arbor.Network.StatsD as S import qualified Arbor.Network.StatsD.Type as Z data MiniConfig = MiniConfig { metrics :: Metrics , statsClient :: Z.StatsClient } deriving (Generic) instance MonadMetrics MetricApp where getMetrics = reader metrics instance S.MonadStats MetricApp where getStatsClient = reader statsClient newtype MetricApp a = MetricApp { unMetricApp :: ReaderT MiniConfig (LoggingT IO) a } deriving ( Functor , Applicative , Monad , MonadIO , MonadThrow , MonadCatch , MonadLogger , MonadReader MiniConfig) runMetricApp :: MetricApp () -> IO () runMetricApp f = do let statsOpts = Z.DogStatsSettings "localhost" 5555 statsClient <- S.createStatsClient statsOpts (Z.MetricName "MetricApp") [] metrics <- newMetricsIO let config = MiniConfig metrics statsClient runLoggingT (runReaderT (unMetricApp f) config) $ \_ _ _ _ -> return ()