module System.Metrics.Prometheus.Encode.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.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)