packages feed

prometheus-2.2.4: src/System/Metrics/Prometheus/Encode/Text.hs

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)