instana-haskell-trace-sdk-0.2.0.0: src/Instana/SDK/Internal/Metrics/Compression.hs
{-# LANGUAGE OverloadedStrings #-}
{-|
Module : Instana.SDK.Internal.Metrics.Compression
Description : Removes unchanged metrics from the sampled metrics to save
bandwidth/CPU (JSON seralization/deserialization).
-}
module Instana.SDK.Internal.Metrics.Compression
( compressSample
) where
import Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as HashMap
import qualified Data.List as List
import Data.Text (Text)
import Instana.SDK.Internal.Metrics.Deltas (deltaKeyList)
import Instana.SDK.Internal.Metrics.Sample (InstanaMetricValue (IntegralValue),
InstanaSample)
dummyMapWithKeysEligibleForDeltaComputation :: HashMap Text InstanaMetricValue
dummyMapWithKeysEligibleForDeltaComputation =
List.foldl
(\dummyMap key -> HashMap.insert key dummyValue dummyMap)
HashMap.empty
deltaKeyList
where
dummyValue = IntegralValue 0
-- |Removes metric values that are identical in the both samples, also removes
-- original values for which deltas have been computed.
compressSample :: InstanaSample -> InstanaSample -> InstanaSample
compressSample previous next =
let
-- step 1: remove the original metrics from which we have computed deltas,
-- those are not used in the back end (we are only interested in the delta
-- values of those metrics)
deltaSourcesRemoved =
HashMap.difference
next
dummyMapWithKeysEligibleForDeltaComputation
in
-- step 2: remove all values for which the value has not changed since the
-- last sent metric payload
HashMap.differenceWith dropUnchanged deltaSourcesRemoved previous
dropUnchanged ::
InstanaMetricValue
-> InstanaMetricValue
-> Maybe InstanaMetricValue
dropUnchanged nextValue previousValue =
if nextValue == previousValue then
Nothing
else
Just nextValue