freckle-app-1.0.3.0: library/Freckle/App/Scientist.hs
module Freckle.App.Scientist
( experimentPublishDatadog
) where
import Freckle.App.Prelude
import Data.List.NonEmpty as NE
import qualified Freckle.App.Datadog as Datadog
import Scientist
import Scientist.Duration
-- | Publish experiment durations to Datadog
--
-- * Experiments are labeled "science.${name}"
-- * Control results are tagged with "variant:control"
-- * Candidates are tagged with "variant:control-${i}"
--
experimentPublishDatadog
:: ( MonadReader env m
, MonadUnliftIO m
, Datadog.HasDogStatsClient env
, Datadog.HasDogStatsTags env
)
=> Result c a b
-> m ()
experimentPublishDatadog result = for_ (resultDetails result) $ \details -> do
let statName = "science." <> resultDetailsExperimentName details
Datadog.gauge statName [("variant", "control")]
$ durationToSeconds
$ resultControlDuration
$ resultDetailsControl details
for_ (NE.zip (resultDetailsCandidates details) (NE.fromList [1 ..]))
$ \(candidate, i :: Int) -> do
Datadog.gauge statName [("variant", "candidate-" <> tshow i)]
$ durationToSeconds
$ resultCandidateDuration candidate