packages feed

calamity-0.1.30.2: 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 (DefaultingMap)
import Calamity.Metrics.Internal
import Data.Default.Class
import Data.Map
import Data.Text
import GHC.Generics
import Polysemy
import TextShow
import Calamity.Internal.OverriddenVia

data HistogramSample' = HistogramSample'
  { buckets :: DefaultingMap Double Double
  , sum :: Double
  , count :: Int
  }
  deriving (Generic)
  deriving (Default)

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

data MetricEff m a where
  -- | Register a 'Counter'
  RegisterCounter ::
    -- | Name
    Text ->
    -- | Labels
    [(Text, Text)] ->
    MetricEff m Counter
  -- | Register a 'Gauge'
  RegisterGauge ::
    -- | Name
    Text ->
    -- | Labels
    [(Text, Text)] ->
    MetricEff m Gauge
  -- | Register a 'Histogram'
  RegisterHistogram ::
    -- | Name
    Text ->
    -- | Labels
    [(Text, Text)] ->
    -- | Upper bounds
    [Double] ->
    MetricEff m Histogram
  AddCounter :: Int -> Counter -> MetricEff m Int
  ModifyGauge :: (Double -> Double) -> Gauge -> MetricEff m Double
  ObserveHistogram :: Double -> Histogram -> MetricEff m HistogramSample

makeSem ''MetricEff