{-# LANGUAGE OverloadedStrings #-} module System.Metrics.Prometheus.Encode.Text.Histogram ( encodeHistogram ) where import Data.ByteString.Builder (Builder) import Data.List (intersperse) import qualified Data.Map as Map import Data.Monoid ((<>)) import System.Metrics.Prometheus.Encode.Text.MetricId (encodeDouble, encodeInt, encodeLabels, encodeName, newline, space, textValue) import System.Metrics.Prometheus.Metric.Histogram (HistogramSample (..), UpperBound) import System.Metrics.Prometheus.MetricId (MetricId (..), addLabel) encodeHistogram :: MetricId -> HistogramSample -> Builder encodeHistogram mid histogram = encodeHistogramBuckets mid histogram <> newline <> n <> "_sum" <> ls <> space <> encodeDouble (histSum histogram) <> newline <> n <> "_count" <> ls <> space <> encodeInt (histCount histogram) where n = encodeName $ name mid ls = encodeLabels $ labels mid encodeHistogramBuckets :: MetricId -> HistogramSample -> Builder encodeHistogramBuckets mid = mconcat . intersperse newline . map snd . Map.toList . Map.mapWithKey (encodeHistogramBucket mid) . histBuckets encodeHistogramBucket :: MetricId -> UpperBound -> Double -> Builder encodeHistogramBucket mid upperBound count = encodeName (name mid) <> "_bucket" <> encodeLabels labels' <> space <> encodeDouble count where labels' = addLabel "le" (textValue upperBound) (labels mid)