packages feed

calamity-0.1.2.0: src/Calamity/Metrics/Eff.hs

{-# LANGUAGE TemplateHaskell #-}

-- | Effect for handling metrics
module Calamity.Metrics.Eff
    ( Counter
    , Gauge
    , Histogram
    , HistogramSample
    , MetricEff(..)
    , registerCounter
    , registerGauge
    , registerHistogram
    , addCounter
    , modifyGauge
    , observeHistogram ) where

import           Calamity.Internal.Utils   ()
import           Calamity.Metrics.Internal

import           Data.Default.Class
import           Data.Map
import           Data.Text

import           GHC.Generics

import           Polysemy

import           TextShow
import qualified TextShow.Generic          as TSG

data HistogramSample = HistogramSample
  { buckets :: Map Double Double
  , sum     :: Double
  , count   :: Int
  }
  deriving ( Eq, Show, Generic, Default )
  deriving ( TextShow ) via TSG.FromGeneric HistogramSample

data MetricEff m a where
  -- | Register a 'Counter'
  RegisterCounter :: Text -- ^ Name
    -> [(Text, Text)] -- ^ Labels
    -> MetricEff m Counter

  -- | Register a 'Gauge'
  RegisterGauge :: Text -- ^ Name
    -> [(Text, Text)] -- ^ Labels
    -> MetricEff m Gauge

  -- | Register a 'Histogram'
  RegisterHistogram :: Text -- ^ Name
    -> [(Text, Text)] -- ^ Labels
    -> [Double] -- ^ Upper bounds
    -> MetricEff m Histogram

  AddCounter :: Int -> Counter -> MetricEff m Int

  ModifyGauge :: (Double -> Double) -> Gauge -> MetricEff m Double

  ObserveHistogram :: Double -> Histogram -> MetricEff m HistogramSample

makeSem ''MetricEff