{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeApplications #-} {- This tests the client against a real Datadog Agent but is manual because there is no way to get an HTTP error code from their API: 1. get a DD_API_KEY from datadog (sigh) 2. start the agent using the docker command (below) 3. cabal v2-run -O0 --constraint "datadog-tracing +manual" manual-test 4. check that the trace shows up in datadog, grep for "INFO (api.go" 5. docker stop datadog && docker rm datadog docker run -d --name datadog \ -p 8126:8126 \ --network host \ -e DD_API_KEY=${DD_API_KEY} \ -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro \ -v /proc/:/host/proc/:ro \ -e DD_APM_ENABLED=true \ -e DD_LOG_LEVEL=trace \ datadog/agent:6.10.3-logs-api-key-rc.1 -} module Main where import Crypto.Random import Data.Aeson.Text import Data.Binary (decode) import qualified Data.ByteString.Lazy as LBS import Data.Int (Int64) import qualified Data.Text.Lazy as LT import Data.Time.Clock.POSIX (POSIXTime, getPOSIXTime) import Data.Typeable import Data.Word (Word64) import Datadog.Agent import Network.HTTP.Client hiding (Proxy) import Servant.Client main :: IO () main = do mgr <- newManager defaultManagerSettings base <- parseBaseUrl "http://localhost:8126" start <- toNanos <$> getPOSIXTime traceid <- randomWord64 spanid <- randomWord64 let http = client (Proxy @ Traces3) env = mkClientEnv mgr base metrics = Just $ Metrics 2 traces = [ (Trace [ Span "tester" "span" "time" traceid spanid Nothing start 800971 Nothing Nothing metrics Nothing ]) ] putStrLn (LT.unpack . encodeToLazyText $ traces) res <- runClientM (http traces) env putStrLn (show res) toNanos :: POSIXTime -> Int64 toNanos nominal = let (nanos, _) = properFraction (1000000000 * nominal) in nanos randomWord64 :: MonadRandom m => m Word64 randomWord64 = decode . LBS.fromStrict <$> (getRandomBytes 8)