93 lines
3.0 KiB
Plaintext
93 lines
3.0 KiB
Plaintext
module System.Metrics.Timer
|
|
( Timer
|
|
, Summary
|
|
, new
|
|
, update
|
|
, fifteenMinuteRate
|
|
, fiveMinuteRate
|
|
, oneMinuteRate
|
|
, meanRate
|
|
, clear
|
|
, percentiles
|
|
, mean
|
|
, stdDev
|
|
, min
|
|
, max
|
|
, sum
|
|
, count
|
|
, read
|
|
) where
|
|
|
|
import Prelude
|
|
|
|
import Control.Monad.Eff (Eff)
|
|
import Control.Monad.Eff.Ref (REF)
|
|
import Data.Generic.Rep (class Generic)
|
|
import Data.Generic.Rep.Show (genericShow)
|
|
import Data.Maybe (Maybe)
|
|
import Data.Time.Duration (class Duration, Milliseconds(..), fromDuration)
|
|
import System.Metrics.Histogram (Histogram)
|
|
import System.Metrics.Histogram as Histogram
|
|
import System.Metrics.Meter (Meter)
|
|
import System.Metrics.Meter as Meter
|
|
|
|
newtype Timer = Timer { meter :: Meter, histogram :: Histogram }
|
|
|
|
new :: forall eff. Eff (ref :: REF | eff) Timer
|
|
new = Timer <$> ({ meter: _, histogram: _ }
|
|
<$> Meter.new
|
|
<*> Histogram.newWithExponentialDecaySampling 1028 0.015)
|
|
|
|
update :: forall a eff. Duration a => Timer -> a -> Eff (ref :: REF | eff) Unit
|
|
update (Timer { meter, histogram }) d = do
|
|
let (Milliseconds ms) = fromDuration d
|
|
Histogram.update histogram ms
|
|
Meter.mark meter
|
|
|
|
fifteenMinuteRate :: forall eff. Timer -> Eff (ref :: REF | eff) Number
|
|
fifteenMinuteRate (Timer { meter }) = Meter.fifteenMinuteRate meter
|
|
|
|
fiveMinuteRate :: forall eff. Timer -> Eff (ref :: REF | eff) Number
|
|
fiveMinuteRate (Timer { meter }) = Meter.fiveMinuteRate meter
|
|
|
|
oneMinuteRate :: forall eff. Timer -> Eff (ref :: REF | eff) Number
|
|
oneMinuteRate (Timer { meter }) = Meter.oneMinuteRate meter
|
|
|
|
meanRate :: forall eff. Timer -> Eff (ref :: REF | eff) Number
|
|
meanRate (Timer { meter }) = Meter.meanRate meter
|
|
|
|
clear :: forall eff. Timer -> Eff (ref :: REF | eff) Unit
|
|
clear (Timer { histogram }) = Histogram.clear histogram
|
|
|
|
percentiles :: forall eff. Timer -> Array Number -> Eff (ref :: REF | eff) (Maybe (Array Number))
|
|
percentiles (Timer { histogram }) = Histogram.percentiles histogram
|
|
|
|
mean :: forall eff. Timer -> Eff (ref :: REF | eff) (Maybe Number)
|
|
mean (Timer { histogram }) = Histogram.mean histogram
|
|
|
|
stdDev :: forall eff. Timer -> Eff (ref :: REF | eff) (Maybe Number)
|
|
stdDev (Timer { histogram }) = Histogram.stdDev histogram
|
|
|
|
min :: forall eff. Timer -> Eff (ref :: REF | eff) (Maybe Number)
|
|
min (Timer { histogram }) = Histogram.min histogram
|
|
|
|
max :: forall eff. Timer -> Eff (ref :: REF | eff) (Maybe Number)
|
|
max (Timer { histogram }) = Histogram.max histogram
|
|
|
|
sum :: forall eff. Timer -> Eff (ref :: REF | eff) (Maybe Number)
|
|
sum (Timer { histogram }) = Histogram.sum histogram
|
|
|
|
count :: forall eff. Timer -> Eff (ref :: REF | eff) Int
|
|
count (Timer { histogram }) = Histogram.count histogram
|
|
|
|
newtype Summary = Summary { duration :: Histogram.Summary, rate :: Meter.Summary }
|
|
|
|
derive instance eqSummary :: Eq Summary
|
|
derive instance genericSummary :: Generic Summary _
|
|
instance showSummary :: Show Summary where
|
|
show = genericShow
|
|
|
|
read :: forall eff. Timer -> Eff (ref :: REF | eff) Summary
|
|
read (Timer { meter, histogram }) =
|
|
Summary <$> ({ duration: _, rate: _} <$> Histogram.read histogram <*> Meter.read meter)
|