{-# 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 :: MetricId -> HistogramSample -> Builder encodeHistogram MetricId mid HistogramSample histogram = MetricId -> HistogramSample -> Builder encodeHistogramBuckets MetricId mid HistogramSample histogram forall a. Semigroup a => a -> a -> a <> Builder newline forall a. Semigroup a => a -> a -> a <> Builder n forall a. Semigroup a => a -> a -> a <> Builder "_sum" forall a. Semigroup a => a -> a -> a <> Builder ls forall a. Semigroup a => a -> a -> a <> Builder space forall a. Semigroup a => a -> a -> a <> forall f. RealFloat f => f -> Builder encodeDouble (HistogramSample -> Double histSum HistogramSample histogram) forall a. Semigroup a => a -> a -> a <> Builder newline forall a. Semigroup a => a -> a -> a <> Builder n forall a. Semigroup a => a -> a -> a <> Builder "_count" forall a. Semigroup a => a -> a -> a <> Builder ls forall a. Semigroup a => a -> a -> a <> Builder space forall a. Semigroup a => a -> a -> a <> Int -> Builder encodeInt (HistogramSample -> Int histCount HistogramSample histogram) where n :: Builder n = Name -> Builder encodeName forall a b. (a -> b) -> a -> b $ MetricId -> Name name MetricId mid ls :: Builder ls = Labels -> Builder encodeLabels forall a b. (a -> b) -> a -> b $ MetricId -> Labels labels MetricId mid encodeHistogramBuckets :: MetricId -> HistogramSample -> Builder encodeHistogramBuckets :: MetricId -> HistogramSample -> Builder encodeHistogramBuckets MetricId mid = forall a. Monoid a => [a] -> a mconcat forall b c a. (b -> c) -> (a -> b) -> a -> c . forall a. a -> [a] -> [a] intersperse Builder newline forall b c a. (b -> c) -> (a -> b) -> a -> c . forall a b. (a -> b) -> [a] -> [b] map forall a b. (a, b) -> b snd forall b c a. (b -> c) -> (a -> b) -> a -> c . forall k a. Map k a -> [(k, a)] Map.toList forall b c a. (b -> c) -> (a -> b) -> a -> c . forall k a b. (k -> a -> b) -> Map k a -> Map k b Map.mapWithKey (MetricId -> Double -> Double -> Builder encodeHistogramBucket MetricId mid) forall b c a. (b -> c) -> (a -> b) -> a -> c . HistogramSample -> Buckets histBuckets encodeHistogramBucket :: MetricId -> UpperBound -> Double -> Builder encodeHistogramBucket :: MetricId -> Double -> Double -> Builder encodeHistogramBucket MetricId mid Double upperBound Double count = Name -> Builder encodeName (MetricId -> Name name MetricId mid) forall a. Semigroup a => a -> a -> a <> Builder "_bucket" forall a. Semigroup a => a -> a -> a <> Labels -> Builder encodeLabels Labels labels' forall a. Semigroup a => a -> a -> a <> Builder space forall a. Semigroup a => a -> a -> a <> forall f. RealFloat f => f -> Builder encodeDouble Double count where labels' :: Labels labels' = Text -> Text -> Labels -> Labels addLabel Text "le" (forall f. RealFloat f => f -> Text textValue Double upperBound) (MetricId -> Labels labels MetricId mid)