packages feed

instana-haskell-trace-sdk-0.1.0.0: test/agent-stub/Instana/SDK/AgentStub/StubServer.hs

{-# LANGUAGE OverloadedStrings #-}
module Instana.SDK.AgentStub.StubServer (stubServer) where


import           Control.Monad.IO.Class                  (liftIO)
import           Data.STRef                              (modifySTRef,
                                                          readSTRef)
import           Servant                                 ((:<|>) (..),
                                                          NoContent (NoContent))
import qualified Servant
import qualified System.Exit                             as Exit
import           System.Log.Logger                       (debugM, infoM)
import qualified System.Posix.Process                    as Posix

import           Instana.SDK.AgentStub.DiscoveryRequest  (DiscoveryRequest)
import           Instana.SDK.AgentStub.EntityDataRequest (EntityDataRequest)
import           Instana.SDK.AgentStub.Logging           (agentStubLogger)
import           Instana.SDK.AgentStub.Recorders         (Recorders)
import qualified Instana.SDK.AgentStub.Recorders         as Recorders
import           Instana.SDK.AgentStub.StubAPI           (ResetAPI, StubAPI)
import           Instana.SDK.AgentStub.TraceRequest      (Span)
import           Instana.SDK.AgentStub.Util              (stToServant)


stubServer :: Recorders -> Servant.Server StubAPI
stubServer recorders =
      getPing
 :<|> getRecordedDiscoveries recorders
 :<|> getRecordedAgentReadyRequests recorders
 :<|> getRecordedEntityDataRequests recorders
 :<|> getRecordedSpans recorders
 :<|> postShutdown
 :<|> resetServer recorders


getPing :: Servant.Handler NoContent
getPing = do
  liftIO $ debugM agentStubLogger $ "ping"
  return NoContent


getRecordedDiscoveries :: Recorders -> Servant.Handler [DiscoveryRequest]
getRecordedDiscoveries recorders = do
  recordedDiscoveries <-
    stToServant $ readSTRef $ Recorders.discoveryRecorder recorders
  return recordedDiscoveries


getRecordedAgentReadyRequests :: Recorders -> Servant.Handler [String]
getRecordedAgentReadyRequests recorders = do
  recordedAgentReadyPids <-
    stToServant $ readSTRef $ Recorders.agentReadyRecorder recorders
  return recordedAgentReadyPids


getRecordedEntityDataRequests ::
  Recorders
  -> Servant.Handler [EntityDataRequest]
getRecordedEntityDataRequests recorders = do
  recordedEntityDataRequests <-
    stToServant $ readSTRef $ Recorders.entityDataRecorder recorders
  return recordedEntityDataRequests


getRecordedSpans :: Recorders -> Servant.Handler [Span]
getRecordedSpans recorders = do
  recordedSpans <- stToServant $ readSTRef $ Recorders.spanRecorder recorders
  return recordedSpans


postShutdown :: Servant.Handler NoContent
postShutdown = do
  liftIO $ infoM agentStubLogger $ "AgentStub shutdown requested"
  _ <-liftIO $ Posix.exitImmediately Exit.ExitSuccess
  return NoContent


resetServer ::
  Recorders
  -> Servant.Server ResetAPI
resetServer recorders =
      postResetDiscoveries recorders
 :<|> postResetSpans recorders


postResetDiscoveries :: Recorders -> Servant.Handler NoContent
postResetDiscoveries recorders = do
  liftIO $ debugM agentStubLogger $
    "resetting recorded discoveries, agent ready and entity data requests"
  stToServant $ modifySTRef (Recorders.discoveryRecorder recorders) (\_ -> [])
  stToServant $ modifySTRef (Recorders.agentReadyRecorder recorders) (\_ -> [])
  stToServant $
    modifySTRef (Recorders.entityDataRecorder recorders) (\_ -> [])
  return NoContent


postResetSpans :: Recorders -> Servant.Handler NoContent
postResetSpans recorders = do
  liftIO $ debugM agentStubLogger $ "resetting recorded spans"
  stToServant $ modifySTRef (Recorders.spanRecorder recorders) (\_ -> [])
  return NoContent