{-# 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)