{-# LANGUAGE OverloadedStrings #-}
module Network.Datadog.Monitor
( MonitorSpec(..)
, MonitorType(..)
, MonitorOptions(..)
, getSilencedMonitorScopes
, silenceMonitorScope
, unsilenceMonitorScope
, unsilenceAllMonitorScope
, doesNotifyOnNoMonitorData
, notifyOnNoMonitorData
, noNotifyOnNoMonitorData
, getMonitorTimeout
, setMonitorTimeout
, clearMonitorTimeout
, doesRenotifyMonitor
, renotifyMonitor
, noRenotifyMonitor
, doesNotifyOnAudit
, notifyOnAudit
, noNotifyOnAudit
, Monitor(..)
, MonitorId
, minimalMonitorSpec
, createMonitor
, updateMonitor
, deleteMonitor
, loadMonitor
, loadMonitors
, muteAllMonitors
, unmuteAllMonitors
, HasId'(..)
, HasSpec(..)
, HasType'(..)
, HasQuery(..)
, HasOptions(..)
, HasMessage(..)
, HasName(..)
, HasNotifyNoData(..)
, HasTimeoutH(..)
, HasRenotifyInterval(..)
, HasNoDataTimeframe(..)
, HasSilenced(..)
, AsMonitorType(..)
) where
import Control.Arrow
import Control.Exception
import Control.Lens
import Control.Monad (void)
import Data.Aeson
import qualified Data.HashMap.Strict as Data.HashMap
import Data.List (intercalate)
import Data.Maybe
import qualified Data.Text as T (Text, null)
import Data.Time.Clock
import Data.Time.Clock.POSIX
import Network.HTTP.Types
import Network.Datadog.Internal
getSilencedMonitorScopes :: MonitorOptions -> [(T.Text, Maybe UTCTime)]
getSilencedMonitorScopes opts = map (second (fmap (posixSecondsToUTCTime . fromIntegral))) $ Data.HashMap.toList $ opts ^. silenced
silenceMonitorScope :: T.Text -> Maybe UTCTime -> MonitorOptions -> MonitorOptions
silenceMonitorScope scopeName mtime old = old & silenced %~ silenceF
where silenceF = Data.HashMap.insert scopeName (fmap (floor . utcTimeToPOSIXSeconds) mtime)
unsilenceMonitorScope :: T.Text -> MonitorOptions -> MonitorOptions
unsilenceMonitorScope scopeName old = old & silenced %~ (Data.HashMap.delete scopeName)
unsilenceAllMonitorScope :: MonitorOptions -> MonitorOptions
unsilenceAllMonitorScope = set silenced Data.HashMap.empty
doesNotifyOnNoMonitorData :: MonitorOptions -> Maybe NominalDiffTime
doesNotifyOnNoMonitorData opts = if opts ^. notifyNoData
then Just $ maybe (throw (AssertionFailed "Datadog Library internal error")) (fromIntegral . (*60)) $ opts ^. noDataTimeframe
else Nothing
notifyOnNoMonitorData :: NominalDiffTime -> MonitorOptions -> MonitorOptions
notifyOnNoMonitorData difftime old = old & notifyNoData .~ True & noDataTimeframe ?~ stamp
where stamp = floor (difftime / 60)
noNotifyOnNoMonitorData :: MonitorOptions -> MonitorOptions
noNotifyOnNoMonitorData old = old & notifyNoData .~ False & noDataTimeframe .~ Nothing
getMonitorTimeout :: MonitorOptions -> Maybe NominalDiffTime
getMonitorTimeout opts = (fromIntegral . (*3600)) <$> (opts ^. timeoutH)
setMonitorTimeout :: NominalDiffTime -> MonitorOptions -> MonitorOptions
setMonitorTimeout difftime old = old & timeoutH ?~ stamp
where stamp = ceiling (difftime / 3600)
clearMonitorTimeout :: MonitorOptions -> MonitorOptions
clearMonitorTimeout = set timeoutH Nothing
doesRenotifyMonitor :: MonitorOptions -> Maybe (NominalDiffTime,Maybe T.Text)
doesRenotifyMonitor opts = (\i -> (fromIntegral (i * 60), result)) <$> (opts ^. renotifyInterval)
where msg = opts ^. escalationMessage
result = if T.null msg then Nothing else Just msg
renotifyMonitor :: NominalDiffTime -> Maybe T.Text -> MonitorOptions -> MonitorOptions
renotifyMonitor difftime mMessage old = old & renotifyInterval ?~ stamp & escalationMessage .~ msg
where stamp = floor (difftime / 60)
msg = fromMaybe "" mMessage
noRenotifyMonitor :: MonitorOptions -> MonitorOptions
noRenotifyMonitor old = old & renotifyInterval .~ Nothing & escalationMessage .~ ""
doesNotifyOnAudit :: MonitorOptions -> Bool
doesNotifyOnAudit = view notifyAudit
notifyOnAudit :: MonitorOptions -> MonitorOptions
notifyOnAudit = set notifyAudit True
noNotifyOnAudit :: MonitorOptions -> MonitorOptions
noNotifyOnAudit = set notifyAudit False
minimalMonitorSpec :: MonitorType -> T.Text -> MonitorSpec
minimalMonitorSpec cmtype cmquery = MonitorSpec { monitorSpecType' = cmtype
, monitorSpecQuery = cmquery
, monitorSpecName = Nothing
, monitorSpecMessage = Nothing
, monitorSpecOptions = defaultMonitorOptions
}
createMonitor :: Environment -> MonitorSpec -> IO Monitor
createMonitor env monitorspec =
let path = "monitor"
in datadogHttp env path [] POST (Just $ encode monitorspec) >>=
decodeDatadog "createMonitor"
loadMonitor :: Environment -> MonitorId -> IO Monitor
loadMonitor env monitorId =
let path = "monitor/" ++ show monitorId
in datadogHttp env path [] GET Nothing >>=
decodeDatadog "loadMonitor"
updateMonitor :: Environment -> MonitorId -> MonitorSpec -> IO Monitor
updateMonitor env monitorId mspec =
let path = "monitor/" ++ show monitorId
in datadogHttp env path [] PUT (Just $ encode mspec) >>=
decodeDatadog "updateMonitor"
deleteMonitor :: Environment -> MonitorId -> IO ()
deleteMonitor env monitorId =
let path = "monitor/" ++ show monitorId
in void $ datadogHttp env path [] DELETE Nothing
loadMonitors :: Environment
-> [Tag]
-> IO [Monitor]
loadMonitors env filterTags =
let path = "monitor"
q = [("tags", intercalate "," (map show filterTags)) | not (null filterTags)]
in datadogHttp env path q GET Nothing >>=
decodeDatadog "loadMonitors"
muteAllMonitors :: Environment -> IO ()
muteAllMonitors env =
let path = "monitor/mute_all"
in void $ datadogHttp env path [] POST Nothing
unmuteAllMonitors :: Environment -> IO ()
unmuteAllMonitors env =
let path = "monitor/unmute_all"
in void $ datadogHttp env path [] POST Nothing