packages feed

freckle-app-1.5.0.0: library/Freckle/App/Scientist.hs

module Freckle.App.Scientist
  ( experimentPublishDatadog
  ) where

import Freckle.App.Prelude

import Freckle.App.Stats (HasStatsClient)
import qualified Freckle.App.Stats as Stats
import Scientist
import Scientist.Duration

-- | Publish experiment durations using "Freckle.App.Stats"
--
-- * Experiments are labeled "science.${name}"
-- * Results are tagged with "variant:${name}"
--
experimentPublishDatadog
  :: (MonadReader env m, MonadUnliftIO m, HasStatsClient env)
  => Result c a b
  -> m ()
experimentPublishDatadog result = for_ (resultDetails result) $ \details -> do
  let
    statName = "science." <> resultDetailsExperimentName details
    ResultControl {..} = resultDetailsControl details

  Stats.tagged [("variant", resultControlName)]
    $ Stats.gauge statName
    $ durationToSeconds resultControlDuration

  for_ (resultDetailsCandidates details) $ \ResultCandidate {..} ->
    Stats.tagged [("variant", "candidate-" <> resultCandidateName)]
      $ Stats.gauge statName
      $ durationToSeconds resultCandidateDuration