module Prometheus.Metric.Observer (
Observer(..)
, observeDuration
, timeAction
) where
import Data.Ratio ((%))
import Prometheus.Metric
import Prometheus.MonadMonitor
import System.Clock (Clock(..), diffTimeSpec, getTime, toNanoSecs)
class Observer metric where
observe :: MonadMonitor m => Double -> Metric metric -> m ()
observeDuration :: Observer metric => IO a -> Metric metric -> IO a
observeDuration io metric = do
(result, duration) <- timeAction io
observe duration metric
return result
timeAction :: IO a -> IO (a, Double)
timeAction io = do
start <- getTime Monotonic
result <- io
end <- getTime Monotonic
let duration = toNanoSecs (end `diffTimeSpec` start) % 1000000000
return (result, fromRational duration)