packages feed

prometheus-0.1.0.0: src/System/Metrics/Prometheus/Sample.hs

module System.Metrics.Prometheus.Sample where


import           Data.Map                           (Map)

import qualified System.Metrics.Prometheus.Counter  as Counter
import qualified System.Metrics.Prometheus.Gauge    as Gauge
import           System.Metrics.Prometheus.Metric   (Metric)
import qualified System.Metrics.Prometheus.Metric   as Metric
import           System.Metrics.Prometheus.MetricId (MetricId)
import           System.Metrics.Prometheus.Registry (Registry, unRegistry)


newtype CounterSample = CounterSample { unCounterSample :: Int }

newtype GaugeSample = GaugeSample { unGaugeSample :: Double }


data HistogramSample =
    HistogramSample
    { histBuckets :: Map Double Int
    , histSum     :: Int
    , histCount   :: Int
    }


data SummarySample =
    SummarySample
    { sumQuantiles :: Map Double Int
    , sumSum       :: Int
    , sumCount     :: Int
    }


data MetricSample
    = Counter CounterSample
    | Gauge GaugeSample
    | Histogram HistogramSample
    | Summary SummarySample


metricSample :: (CounterSample -> a) -> (GaugeSample -> a)
             -> (HistogramSample -> a) -> (SummarySample -> a)
             -> MetricSample -> a
metricSample f _ _ _ (Counter s)   = f s
metricSample _ f _ _ (Gauge s)     = f s
metricSample _ _ f _ (Histogram s) = f s
metricSample _ _ _ f (Summary s)   = f s


newtype RegistrySample = RegistrySample { unRegistrySample :: Map MetricId MetricSample }


sample :: Registry -> IO RegistrySample
sample = fmap RegistrySample . mapM sampleMetric . unRegistry


sampleMetric :: Metric -> IO MetricSample
sampleMetric (Metric.Counter count) = Counter . CounterSample <$> Counter.view count
sampleMetric (Metric.Gauge gauge) = Gauge . GaugeSample <$> Gauge.get gauge