module Avers.Metrics where


import           Control.Monad.State
import           Control.Exception.Base

import           System.Clock

import           Avers.Types
import           Avers.Metrics.Measurements



measureDuration :: Measurement -> Avers a -> Avers a
measureDuration m a = do
    start <- liftIO $ getTime Monotonic
    ret   <- a >>= liftIO . evaluate
    end   <- liftIO $ getTime Monotonic

    reportMeasurement m
        (fromIntegral (timeSpecAsNanoSecs (diffTimeSpec start end)) / 1000000000)

    return ret


reportMeasurement :: Measurement -> Double -> Avers ()
reportMeasurement m value = do
    conf <- gets config
    liftIO $ emitMeasurement conf m value