module System.Metrics.Prometheus.Encode.Text ( encodeMetrics ) where import Data.ByteString.Builder (Builder) import Data.Function (on) import Data.List (groupBy, intersperse) import qualified Data.Map as Map import Data.Monoid ((<>)) import System.Metrics.Prometheus.Encode.Text.Histogram (encodeHistogram) import System.Metrics.Prometheus.Encode.Text.MetricId (encodeDouble, encodeHeader, encodeInt, encodeMetricId, newline, space) import System.Metrics.Prometheus.Metric (MetricSample (..), metricSample) import System.Metrics.Prometheus.Metric.Counter (CounterSample (..)) import System.Metrics.Prometheus.Metric.Gauge (GaugeSample (..)) import System.Metrics.Prometheus.MetricId (MetricId (..)) import System.Metrics.Prometheus.Registry (RegistrySample (..)) encodeMetrics :: RegistrySample -> Builder encodeMetrics = (<> newline) . mconcat . intersperse newline . map encodeMetricGroup . groupByName . Map.toList . unRegistrySample where groupByName = groupBy ((==) `on` (name . fst)) encodeMetricGroup :: [(MetricId, MetricSample)] -> Builder encodeMetricGroup group = encodeHeader mid sample <> newline <> mconcat (intersperse newline $ map encodeMetric group) where (mid, sample) = head group encodeMetric :: (MetricId, MetricSample) -> Builder encodeMetric (mid, sample) = metricSample (encodeCounter mid) (encodeGauge mid) (encodeHistogram mid) (encodeSummary mid) sample where encodeSummary = undefined encodeCounter :: MetricId -> CounterSample -> Builder encodeCounter mid counter = encodeMetricId mid <> space <> encodeInt (unCounterSample counter) encodeGauge :: MetricId -> GaugeSample -> Builder encodeGauge mid gauge = encodeMetricId mid <> space <> encodeDouble (unGaugeSample gauge)