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)