module Freckle.App.Stats.Gauge
( Gauge
, new
, increment
, decrement
, add
, subtract
) where
import Freckle.App.Prelude hiding (subtract)
import Freckle.App.Stats (HasStatsClient)
import qualified Freckle.App.Stats as Stats
import qualified System.Metrics.Gauge as EKG
data Gauge = Gauge
{ Gauge -> Text
name :: Text
, Gauge -> [(Text, Text)]
tags :: [(Text, Text)]
, Gauge -> Gauge
ekgGauge :: EKG.Gauge
}
new :: MonadIO m => Text -> [(Text, Text)] -> m Gauge
new :: forall (m :: * -> *).
MonadIO m =>
Text -> [(Text, Text)] -> m Gauge
new Text
name [(Text, Text)]
tags = Text -> [(Text, Text)] -> Gauge -> Gauge
Gauge Text
name [(Text, Text)]
tags forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO IO Gauge
EKG.new
increment
:: (MonadUnliftIO m, MonadReader env m, HasStatsClient env) => Gauge -> m ()
increment :: forall (m :: * -> *) env.
(MonadUnliftIO m, MonadReader env m, HasStatsClient env) =>
Gauge -> m ()
increment = forall (m :: * -> *) env.
(MonadUnliftIO m, MonadReader env m, HasStatsClient env) =>
Int64 -> Gauge -> m ()
add Int64
1
add
:: (MonadUnliftIO m, MonadReader env m, HasStatsClient env)
=> Int64
-> Gauge
-> m ()
add :: forall (m :: * -> *) env.
(MonadUnliftIO m, MonadReader env m, HasStatsClient env) =>
Int64 -> Gauge -> m ()
add Int64
i = forall (m :: * -> *) env.
(MonadUnliftIO m, MonadReader env m, HasStatsClient env) =>
(Gauge -> IO ()) -> Gauge -> m ()
withEKGGauge (Gauge -> Int64 -> IO ()
`EKG.add` Int64
i)
decrement
:: (MonadUnliftIO m, MonadReader env m, HasStatsClient env) => Gauge -> m ()
decrement :: forall (m :: * -> *) env.
(MonadUnliftIO m, MonadReader env m, HasStatsClient env) =>
Gauge -> m ()
decrement = forall (m :: * -> *) env.
(MonadUnliftIO m, MonadReader env m, HasStatsClient env) =>
Int64 -> Gauge -> m ()
subtract Int64
1
subtract
:: (MonadUnliftIO m, MonadReader env m, HasStatsClient env)
=> Int64
-> Gauge
-> m ()
subtract :: forall (m :: * -> *) env.
(MonadUnliftIO m, MonadReader env m, HasStatsClient env) =>
Int64 -> Gauge -> m ()
subtract Int64
i = forall (m :: * -> *) env.
(MonadUnliftIO m, MonadReader env m, HasStatsClient env) =>
(Gauge -> IO ()) -> Gauge -> m ()
withEKGGauge (Gauge -> Int64 -> IO ()
`EKG.subtract` Int64
i)
withEKGGauge
:: (MonadUnliftIO m, MonadReader env m, HasStatsClient env)
=> (EKG.Gauge -> IO ())
-> Gauge
-> m ()
withEKGGauge :: forall (m :: * -> *) env.
(MonadUnliftIO m, MonadReader env m, HasStatsClient env) =>
(Gauge -> IO ()) -> Gauge -> m ()
withEKGGauge Gauge -> IO ()
f Gauge {[(Text, Text)]
Text
Gauge
ekgGauge :: Gauge
tags :: [(Text, Text)]
name :: Text
ekgGauge :: Gauge -> Gauge
tags :: Gauge -> [(Text, Text)]
name :: Gauge -> Text
..} = do
Int64
current <- forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ do
Gauge -> IO ()
f Gauge
ekgGauge
Gauge -> IO Int64
EKG.read Gauge
ekgGauge
forall env (m :: * -> *) a.
(MonadReader env m, HasStatsClient env) =>
[(Text, Text)] -> m a -> m a
Stats.tagged [(Text, Text)]
tags forall a b. (a -> b) -> a -> b
$ forall (m :: * -> *) env.
(MonadUnliftIO m, MonadReader env m, HasStatsClient env) =>
Text -> Double -> m ()
Stats.gauge Text
name forall a b. (a -> b) -> a -> b
$ forall a b. (Integral a, Num b) => a -> b
fromIntegral Int64
current