diff --git a/src/System/Metrics.purs b/src/System/Metrics.purs index 8e31816..acd5125 100644 --- a/src/System/Metrics.purs +++ b/src/System/Metrics.purs @@ -28,6 +28,8 @@ import Control.Monad.Eff (Eff) import Control.Monad.Eff.Class (liftEff) import Control.Monad.Eff.Exception (EXCEPTION, throw) import Control.Monad.Eff.Ref (REF, Ref, modifyRef', newRef, readRef) +import Data.Foreign.Class (class Encode) +import Data.Foreign.Generic (defaultOptions, genericEncode) import Data.Generic.Rep (class Generic) import Data.Generic.Rep.Show (genericShow) import Data.Map as Map @@ -185,6 +187,8 @@ derive instance eqVal :: Eq Value derive instance genVal :: Generic Value _ instance showVal :: Show Value where show = genericShow +instance encodeVal :: Encode Value where + encode = genericEncode $ defaultOptions { unwrapSingleConstructors = true } sampleOne :: forall eff. MetricSampler -> Aff (ref :: REF | eff) Value sampleOne (CounterS c) = CounterV <$> liftEff (Counter.read c) diff --git a/src/System/Metrics/Histogram.purs b/src/System/Metrics/Histogram.purs index c55304f..9d18310 100644 --- a/src/System/Metrics/Histogram.purs +++ b/src/System/Metrics/Histogram.purs @@ -16,15 +16,19 @@ module System.Metrics.Histogram , read ) where +import Prelude + import Control.Monad.Eff (Eff) import Control.Monad.Eff.Ref (REF) import Data.Array (index) +import Data.Foreign.Class (class Encode, encode) +import Data.Foreign.Generic (defaultOptions, genericEncode) +import Data.Foreign.NullOrUndefined (NullOrUndefined(..)) import Data.Function.Uncurried (Fn2, runFn2) import Data.Generic.Rep (class Generic) import Data.Generic.Rep.Show (genericShow) import Data.Maybe (Maybe) import Data.Nullable (Nullable, toMaybe) -import Prelude foreign import data Histogram :: Type foreign import _newWithExponentialDecaySampling :: @@ -85,10 +89,46 @@ newtype Summary = Summary { , p999 :: Maybe Number } -derive instance eqSummary :: Eq Summary -derive instance genericSummary :: Generic Summary _ -instance showSummary :: Show Summary where +derive instance eqHSummary :: Eq Summary +derive instance genericHSummary :: Generic Summary _ +instance showHSummary :: Show Summary where show = genericShow +instance encodeHSummary :: Encode Summary where + encode = fromSummary >>> encode + +newtype Summary' = Summary' { + min :: NullOrUndefined Number + , max :: NullOrUndefined Number + , sum :: NullOrUndefined Number + , variance :: NullOrUndefined Number + , mean :: NullOrUndefined Number + , stdDev :: NullOrUndefined Number + , count :: Int + , median :: NullOrUndefined Number + , p75 :: NullOrUndefined Number + , p95 :: NullOrUndefined Number + , p99 :: NullOrUndefined Number + , p999 :: NullOrUndefined Number +} + +fromSummary :: Summary -> Summary' +fromSummary (Summary { min , max , sum , variance , mean , stdDev , count , median , p75 , p95 , p99 , p999 }) = + Summary' { min: NullOrUndefined min + , max: NullOrUndefined max + , sum: NullOrUndefined sum + , variance: NullOrUndefined variance + , mean: NullOrUndefined mean + , stdDev: NullOrUndefined stdDev + , count: count + , median: NullOrUndefined median + , p75: NullOrUndefined p75 + , p95: NullOrUndefined p95 + , p99: NullOrUndefined p99 + , p999: NullOrUndefined p999 } + +derive instance genericHSummary' :: Generic Summary' _ +instance encodeHSummary' :: Encode Summary' where + encode = genericEncode $ defaultOptions { unwrapSingleConstructors = true } read :: forall eff. Histogram -> Eff (ref :: REF | eff) Summary read h = do diff --git a/src/System/Metrics/Meter.purs b/src/System/Metrics/Meter.purs index 70ed8b5..22c051d 100644 --- a/src/System/Metrics/Meter.purs +++ b/src/System/Metrics/Meter.purs @@ -14,10 +14,12 @@ module System.Metrics.Meter import Control.Monad.Eff (Eff) import Control.Monad.Eff.Ref (REF) +import Data.Foreign.Class (class Encode) +import Data.Foreign.Generic (defaultOptions, genericEncode) import Data.Function.Uncurried (Fn2, runFn2) import Data.Generic.Rep (class Generic) import Data.Generic.Rep.Show (genericShow) -import Prelude (class Eq, class Show, Unit, (<$>), (<*>)) +import Prelude foreign import data Meter :: Type foreign import _new :: forall eff. Eff (ref :: REF | eff) Meter @@ -45,10 +47,12 @@ newtype Summary = Summary { , mean :: Number } -derive instance eqSummary :: Eq Summary -derive instance genericSummary :: Generic Summary _ -instance showSummary :: Show Summary where +derive instance eqMSummary :: Eq Summary +derive instance genericMSummary :: Generic Summary _ +instance showMSummary :: Show Summary where show = genericShow +instance encodeMSummary :: Encode Summary where + encode = genericEncode $ defaultOptions { unwrapSingleConstructors = true } read :: forall eff. Meter -> Eff (ref :: REF | eff) Summary read m = Summary <$> ({ count: _ diff --git a/src/System/Metrics/Timer.purs b/src/System/Metrics/Timer.purs index ab75925..22d8bf4 100644 --- a/src/System/Metrics/Timer.purs +++ b/src/System/Metrics/Timer.purs @@ -27,6 +27,8 @@ import Control.Monad.Eff.Class (liftEff) import Control.Monad.Eff.Now (NOW, now) import Control.Monad.Eff.Ref (REF) import Data.DateTime.Instant (unInstant) +import Data.Foreign.Class (class Encode) +import Data.Foreign.Generic (defaultOptions, genericEncode) import Data.Generic.Rep (class Generic) import Data.Generic.Rep.Show (genericShow) import Data.Maybe (Maybe) @@ -95,10 +97,12 @@ 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 +derive instance eqTSummary :: Eq Summary +derive instance genericTSummary :: Generic Summary _ +instance showTSummary :: Show Summary where show = genericShow +instance encodeTSummary :: Encode Summary where + encode = genericEncode $ defaultOptions { unwrapSingleConstructors = true } read :: forall eff. Timer -> Eff (ref :: REF | eff) Summary read (Timer { meter, histogram }) =