{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeOperators #-}
-- | A mock server implementing the Agent API.
--
-- Unlike the real agent, input is not validated, and an additional endpoint is
-- exposed that allows downloading all the recorded data in a format compatible
-- with Jaeger tracing.
import Control.Monad (void)
import Control.Monad.IO.Class (liftIO)
import Data.IORef
import qualified Data.Map.Strict as M
import Network.Wai.Handler.Warp (run)
import Servant
import Datadog.Agent
import Datadog.Jaeger
type Services = (Traces3 :<|> Traces4 :<|> Dump)
main :: IO ()
main = do
ref <- newIORef []
let services = (postTraces3 ref) :<|> (postTraces4 ref) :<|> (getTraces ref)
run 8126 (serve (Proxy @ Services) services)
postTraces3 :: IORef [Trace] -> [Trace] -> Handler ()
postTraces3 r t = void $ postTraces4 r t
postTraces4 :: IORef [Trace] -> [Trace] -> Handler TraceResponse
postTraces4 ref traces = liftIO $ (atomicModifyIORef' ref update)
where update store = ((reverse traces) <> store, TraceResponse M.empty)
getTraces :: IORef [Trace] -> Handler Jaeger
getTraces ref = liftIO $ toJaeger <$> readIORef ref