{-# LANGUAGE DeriveGeneric #-}
{-|
Module : Instana.SDK.Internal.Config
Description : Internal representation of the configuration.
This internal module is not supposed to be used by client code. It's API can
change between releases, no guarantee for any kind of compatibility between
releases exists for this module.
-}
module Instana.SDK.Internal.Config
( FinalConfig(..)
, mergeConfigs
, mkFinalConfig
, readConfigFromEnvironment
, readConfigFromEnvironmentAndApplyDefaults
) where
import Control.Applicative ((<|>))
import Data.Maybe (fromMaybe, isJust)
import GHC.Generics
import System.Environment (lookupEnv)
import Text.Read (readMaybe)
import Instana.SDK.Config (Config)
import qualified Instana.SDK.Config as Config
-- |Environment variable for the agent host
agentHostKey :: String
agentHostKey = "INSTANA_AGENT_HOST"
-- |Default agent host/IP
defaultAgentHost :: String
defaultAgentHost = "127.0.0.1"
-- |Environment variable for the agent port
agentPortKey :: String
agentPortKey = "INSTANA_AGENT_PORT"
-- |Default agent port
defaultAgentPort :: Int
defaultAgentPort = 42699
-- |Environment variable for the service name override.
serviceNameKey :: String
serviceNameKey = "INSTANA_SERVICE_NAME"
-- |Environment variable for the force-transmision-afeter setting
forceTransmissionAfterKey :: String
forceTransmissionAfterKey = "INSTANA_FORCE_TRANSMISSION_STARTING_AFTER"
-- |Default force-transmission-after setting
defaultForceTransmissionAfter :: Int
defaultForceTransmissionAfter = 1000
-- |Environment variable for the force-transmision-at setting
forceTransmissionStartingAtKey :: String
forceTransmissionStartingAtKey = "INSTANA_FORCE_TRANSMISSION_STARTING_AT"
-- |Default force-transmission-at setting
defaultForceTransmissionStartingAt :: Int
defaultForceTransmissionStartingAt = 500
-- |Environment variable for the max-buffered-spans setting
maxBufferedSpansKey :: String
maxBufferedSpansKey = "INSTANA_MAX_BUFFERED_SPANS"
-- |Default max-buffered-spans setting
defaultMaxBufferedSpans :: Int
defaultMaxBufferedSpans = 1000
-- |Environment variable to disable trace correlation via W3C trace context
-- headers.
disableW3cTraceCorrelationKey :: String
disableW3cTraceCorrelationKey = "INSTANA_DISABLE_W3C_TRACE_CORRELATION"
-- |Default value for disable W3C trace correlation.
defaultDisableW3cTraceCorrelation :: Bool
defaultDisableW3cTraceCorrelation = False
-- |The config after evaluating and merging user provided config, environment
-- variables and default values.
data FinalConfig = FinalConfig
{ agentHost :: String
, agentPort :: Int
, serviceName :: Maybe String
, forceTransmissionAfter :: Int
, forceTransmissionStartingAt :: Int
, maxBufferedSpans :: Int
, disableW3cTraceCorrelation :: Bool
} deriving (Eq, Generic, Show)
-- |Creates the FinalConfig.
mkFinalConfig ::
String
-> Int
-> Maybe String
-> Int
-> Int
-> Int
-> Bool
-> FinalConfig
mkFinalConfig
agentHost_
agentPort_
serviceName_
forceTransmissionAfter_
forceTransmissionStartingAt_
maxBufferedSpans_
disableW3cTraceCorrelation_ =
FinalConfig
{ agentHost = agentHost_
, agentPort = agentPort_
, serviceName = serviceName_
, forceTransmissionAfter = forceTransmissionAfter_
, forceTransmissionStartingAt = forceTransmissionStartingAt_
, maxBufferedSpans = maxBufferedSpans_
, disableW3cTraceCorrelation = disableW3cTraceCorrelation_
}
-- |Reads all provided config related environment variables.
readConfigFromEnvironment :: IO Config
readConfigFromEnvironment = do
agentHostEnv <- lookupEnv agentHostKey
agentPortEnv <- lookupEnv agentPortKey
serviceNameEnv <- lookupEnv serviceNameKey
forceTransmissionAfterEnv <- lookupEnv forceTransmissionAfterKey
forceTransmissionStartingAtEnv <- lookupEnv forceTransmissionStartingAtKey
maxBufferedSpansEnv <- lookupEnv maxBufferedSpansKey
disableW3cTraceCorrelationEnv <- lookupEnv disableW3cTraceCorrelationKey
let
-- parse numeric config values via readMaybe to Int if they were set,
-- otherwise they remain Nothing
agentPortParsed = agentPortEnv >>= readMaybe
forceTransmissionAfterParsed =
forceTransmissionAfterEnv >>= readMaybe
forceTransmissionStartingAtParsed =
forceTransmissionStartingAtEnv >>= readMaybe
maxBufferedSpansParsed = maxBufferedSpansEnv >>= readMaybe
disableW3cTraceCorrelationParsed = isJust disableW3cTraceCorrelationEnv
return $
Config.defaultConfig
{ Config.agentHost = agentHostEnv
, Config.agentPort = agentPortParsed
, Config.serviceName = serviceNameEnv
, Config.forceTransmissionAfter = forceTransmissionAfterParsed
, Config.forceTransmissionStartingAt = forceTransmissionStartingAtParsed
, Config.maxBufferedSpans = maxBufferedSpansParsed
, Config.disableW3cTraceCorrelation = disableW3cTraceCorrelationParsed
}
-- |Reads all provided config related environment variables and applies default
-- values for absent settings.
readConfigFromEnvironmentAndApplyDefaults :: IO FinalConfig
readConfigFromEnvironmentAndApplyDefaults = do
configFromEnv <- readConfigFromEnvironment
return $ applyDefaults configFromEnv
-- |Merges the user provided config with default values.
applyDefaults :: Config -> FinalConfig
applyDefaults config =
FinalConfig
{ agentHost =
fromMaybe defaultAgentHost (Config.agentHost config)
, agentPort =
fromMaybe defaultAgentPort (Config.agentPort config)
, serviceName = Config.serviceName config
, forceTransmissionAfter =
fromMaybe
defaultForceTransmissionAfter
(Config.forceTransmissionAfter config)
, forceTransmissionStartingAt =
fromMaybe
defaultForceTransmissionStartingAt
(Config.forceTransmissionStartingAt config)
, maxBufferedSpans =
fromMaybe
defaultMaxBufferedSpans
(Config.maxBufferedSpans config)
, disableW3cTraceCorrelation =
defaultDisableW3cTraceCorrelation ||
(Config.disableW3cTraceCorrelation config)
}
-- |Merges two configs into a FinalConfig.
mergeConfigs :: Config -> Config -> FinalConfig
mergeConfigs userConfig configFromEnv =
let
merged = userConfig
{ Config.agentHost =
(Config.agentHost userConfig) <|>
(Config.agentHost configFromEnv)
, Config.agentPort =
(Config.agentPort userConfig) <|>
(Config.agentPort configFromEnv)
, Config.serviceName =
(Config.serviceName userConfig) <|>
(Config.serviceName configFromEnv)
, Config.forceTransmissionAfter =
(Config.forceTransmissionAfter userConfig) <|>
(Config.forceTransmissionAfter configFromEnv)
, Config.forceTransmissionStartingAt =
(Config.forceTransmissionStartingAt userConfig) <|>
(Config.forceTransmissionStartingAt configFromEnv)
, Config.maxBufferedSpans =
(Config.maxBufferedSpans userConfig) <|>
(Config.maxBufferedSpans configFromEnv)
, Config.disableW3cTraceCorrelation =
(Config.disableW3cTraceCorrelation userConfig) ||
(Config.disableW3cTraceCorrelation configFromEnv)
}
in
applyDefaults merged