{-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE OverloadedStrings #-} {-| Module : Instana.SDK.TracingHeaders Description : A set of tracing headers -} module Instana.SDK.TracingHeaders ( TracingHeaders(..) , TracingLevel(..) , levelHeaderName , parseXInstanaL , spanIdHeaderName , stringToTracingLevel , syntheticHeaderName , traceIdHeaderName , tracingLevelToString ) where import GHC.Generics import qualified Network.HTTP.Types.Header as HTTPHeader import Text.Regex.PCRE ((=~)) -- |X-INSTANA-T traceIdHeaderName :: HTTPHeader.HeaderName traceIdHeaderName = "X-INSTANA-T" -- |X-INSTANA-S spanIdHeaderName :: HTTPHeader.HeaderName spanIdHeaderName = "X-INSTANA-S" -- |X-INSTANA-L levelHeaderName :: HTTPHeader.HeaderName levelHeaderName = "X-INSTANA-L" -- |X-INSTANA-SYNTHETIC syntheticHeaderName :: HTTPHeader.HeaderName syntheticHeaderName = "X-INSTANA-SYNTHETIC" -- |Tracing level. data TracingLevel = -- |Record calls. Trace -- |Don't record calls. | Suppress deriving (Eq, Generic, Show) -- |Converts a string into the tracing level. stringToTracingLevel :: String -> TracingLevel stringToTracingLevel s = if s == "0" then Suppress else Trace -- |Parses the X-INSTANA-L value to determine the tracing level, and optionally -- the correlation type and correlation ID. parseXInstanaL :: Maybe String -> (TracingLevel, Maybe String, Maybe String) parseXInstanaL xInstanaLValueMaybe = case xInstanaLValueMaybe of Nothing -> (Trace, Nothing, Nothing) Just xInstanaLValue -> let (_, _, _, groups) = xInstanaLValue =~ xInstanaLRegex :: (String, String, String, [String]) in case groups of [] -> (Trace, Nothing, Nothing) ["", "", ""] -> (Trace, Nothing, Nothing) ["0", _, _] -> (Suppress, Nothing, Nothing) ["1", "", ""] -> (Trace, Nothing, Nothing) ["1", _correlationType, _correlationId] -> (Trace, Just _correlationType, Just _correlationId) _ -> (Trace, Nothing, Nothing) xInstanaLRegex :: String xInstanaLRegex = -- example "1,correlationType=web;correlationId=1234567890abcdef" "^\\s*([01])\\s*(?:,\\s*correlationType\\s*=\\s*([^ ;]*)\\s*;\\s*correlationId\\s*=\\s*([^ ;]*)\\s*)?$" -- |Converts tracing level into a string. tracingLevelToString :: TracingLevel -> String tracingLevelToString l = case l of Trace -> "1" Suppress -> "0" -- |A set of tracing headers. data TracingHeaders = TracingHeaders { -- |the trace ID traceId :: Maybe String -- |the span ID , spanId :: Maybe String -- |the tracing level (on/off) , level :: TracingLevel -- |eum correlation type , correlationType :: Maybe String -- |eum correlation ID , correlationId :: Maybe String -- |synthetic flag , synthetic :: Bool } deriving (Eq, Generic, Show)