cdp-0.0.1.0: src/CDP/Domains/HeapProfiler.hs
{-# LANGUAGE OverloadedStrings, RecordWildCards, TupleSections #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeFamilies #-}
{- |
= HeapProfiler
-}
module CDP.Domains.HeapProfiler (module CDP.Domains.HeapProfiler) where
import Control.Applicative ((<$>))
import Control.Monad
import Control.Monad.Loops
import Control.Monad.Trans (liftIO)
import qualified Data.Map as M
import Data.Maybe
import Data.Functor.Identity
import Data.String
import qualified Data.Text as T
import qualified Data.List as List
import qualified Data.Text.IO as TI
import qualified Data.Vector as V
import Data.Aeson.Types (Parser(..))
import Data.Aeson (FromJSON (..), ToJSON (..), (.:), (.:?), (.=), (.!=), (.:!))
import qualified Data.Aeson as A
import qualified Network.HTTP.Simple as Http
import qualified Network.URI as Uri
import qualified Network.WebSockets as WS
import Control.Concurrent
import qualified Data.ByteString.Lazy as BS
import qualified Data.Map as Map
import Data.Proxy
import System.Random
import GHC.Generics
import Data.Char
import Data.Default
import CDP.Internal.Utils
import CDP.Domains.Runtime as Runtime
-- | Type 'HeapProfiler.HeapSnapshotObjectId'.
-- Heap snapshot object id.
type HeapProfilerHeapSnapshotObjectId = T.Text
-- | Type 'HeapProfiler.SamplingHeapProfileNode'.
-- Sampling Heap Profile node. Holds callsite information, allocation statistics and child nodes.
data HeapProfilerSamplingHeapProfileNode = HeapProfilerSamplingHeapProfileNode
{
-- | Function location.
heapProfilerSamplingHeapProfileNodeCallFrame :: Runtime.RuntimeCallFrame,
-- | Allocations size in bytes for the node excluding children.
heapProfilerSamplingHeapProfileNodeSelfSize :: Double,
-- | Node id. Ids are unique across all profiles collected between startSampling and stopSampling.
heapProfilerSamplingHeapProfileNodeId :: Int,
-- | Child nodes.
heapProfilerSamplingHeapProfileNodeChildren :: [HeapProfilerSamplingHeapProfileNode]
}
deriving (Eq, Show)
instance FromJSON HeapProfilerSamplingHeapProfileNode where
parseJSON = A.withObject "HeapProfilerSamplingHeapProfileNode" $ \o -> HeapProfilerSamplingHeapProfileNode
<$> o A..: "callFrame"
<*> o A..: "selfSize"
<*> o A..: "id"
<*> o A..: "children"
instance ToJSON HeapProfilerSamplingHeapProfileNode where
toJSON p = A.object $ catMaybes [
("callFrame" A..=) <$> Just (heapProfilerSamplingHeapProfileNodeCallFrame p),
("selfSize" A..=) <$> Just (heapProfilerSamplingHeapProfileNodeSelfSize p),
("id" A..=) <$> Just (heapProfilerSamplingHeapProfileNodeId p),
("children" A..=) <$> Just (heapProfilerSamplingHeapProfileNodeChildren p)
]
-- | Type 'HeapProfiler.SamplingHeapProfileSample'.
-- A single sample from a sampling profile.
data HeapProfilerSamplingHeapProfileSample = HeapProfilerSamplingHeapProfileSample
{
-- | Allocation size in bytes attributed to the sample.
heapProfilerSamplingHeapProfileSampleSize :: Double,
-- | Id of the corresponding profile tree node.
heapProfilerSamplingHeapProfileSampleNodeId :: Int,
-- | Time-ordered sample ordinal number. It is unique across all profiles retrieved
-- between startSampling and stopSampling.
heapProfilerSamplingHeapProfileSampleOrdinal :: Double
}
deriving (Eq, Show)
instance FromJSON HeapProfilerSamplingHeapProfileSample where
parseJSON = A.withObject "HeapProfilerSamplingHeapProfileSample" $ \o -> HeapProfilerSamplingHeapProfileSample
<$> o A..: "size"
<*> o A..: "nodeId"
<*> o A..: "ordinal"
instance ToJSON HeapProfilerSamplingHeapProfileSample where
toJSON p = A.object $ catMaybes [
("size" A..=) <$> Just (heapProfilerSamplingHeapProfileSampleSize p),
("nodeId" A..=) <$> Just (heapProfilerSamplingHeapProfileSampleNodeId p),
("ordinal" A..=) <$> Just (heapProfilerSamplingHeapProfileSampleOrdinal p)
]
-- | Type 'HeapProfiler.SamplingHeapProfile'.
-- Sampling profile.
data HeapProfilerSamplingHeapProfile = HeapProfilerSamplingHeapProfile
{
heapProfilerSamplingHeapProfileHead :: HeapProfilerSamplingHeapProfileNode,
heapProfilerSamplingHeapProfileSamples :: [HeapProfilerSamplingHeapProfileSample]
}
deriving (Eq, Show)
instance FromJSON HeapProfilerSamplingHeapProfile where
parseJSON = A.withObject "HeapProfilerSamplingHeapProfile" $ \o -> HeapProfilerSamplingHeapProfile
<$> o A..: "head"
<*> o A..: "samples"
instance ToJSON HeapProfilerSamplingHeapProfile where
toJSON p = A.object $ catMaybes [
("head" A..=) <$> Just (heapProfilerSamplingHeapProfileHead p),
("samples" A..=) <$> Just (heapProfilerSamplingHeapProfileSamples p)
]
-- | Type of the 'HeapProfiler.addHeapSnapshotChunk' event.
data HeapProfilerAddHeapSnapshotChunk = HeapProfilerAddHeapSnapshotChunk
{
heapProfilerAddHeapSnapshotChunkChunk :: T.Text
}
deriving (Eq, Show)
instance FromJSON HeapProfilerAddHeapSnapshotChunk where
parseJSON = A.withObject "HeapProfilerAddHeapSnapshotChunk" $ \o -> HeapProfilerAddHeapSnapshotChunk
<$> o A..: "chunk"
instance Event HeapProfilerAddHeapSnapshotChunk where
eventName _ = "HeapProfiler.addHeapSnapshotChunk"
-- | Type of the 'HeapProfiler.heapStatsUpdate' event.
data HeapProfilerHeapStatsUpdate = HeapProfilerHeapStatsUpdate
{
-- | An array of triplets. Each triplet describes a fragment. The first integer is the fragment
-- index, the second integer is a total count of objects for the fragment, the third integer is
-- a total size of the objects for the fragment.
heapProfilerHeapStatsUpdateStatsUpdate :: [Int]
}
deriving (Eq, Show)
instance FromJSON HeapProfilerHeapStatsUpdate where
parseJSON = A.withObject "HeapProfilerHeapStatsUpdate" $ \o -> HeapProfilerHeapStatsUpdate
<$> o A..: "statsUpdate"
instance Event HeapProfilerHeapStatsUpdate where
eventName _ = "HeapProfiler.heapStatsUpdate"
-- | Type of the 'HeapProfiler.lastSeenObjectId' event.
data HeapProfilerLastSeenObjectId = HeapProfilerLastSeenObjectId
{
heapProfilerLastSeenObjectIdLastSeenObjectId :: Int,
heapProfilerLastSeenObjectIdTimestamp :: Double
}
deriving (Eq, Show)
instance FromJSON HeapProfilerLastSeenObjectId where
parseJSON = A.withObject "HeapProfilerLastSeenObjectId" $ \o -> HeapProfilerLastSeenObjectId
<$> o A..: "lastSeenObjectId"
<*> o A..: "timestamp"
instance Event HeapProfilerLastSeenObjectId where
eventName _ = "HeapProfiler.lastSeenObjectId"
-- | Type of the 'HeapProfiler.reportHeapSnapshotProgress' event.
data HeapProfilerReportHeapSnapshotProgress = HeapProfilerReportHeapSnapshotProgress
{
heapProfilerReportHeapSnapshotProgressDone :: Int,
heapProfilerReportHeapSnapshotProgressTotal :: Int,
heapProfilerReportHeapSnapshotProgressFinished :: Maybe Bool
}
deriving (Eq, Show)
instance FromJSON HeapProfilerReportHeapSnapshotProgress where
parseJSON = A.withObject "HeapProfilerReportHeapSnapshotProgress" $ \o -> HeapProfilerReportHeapSnapshotProgress
<$> o A..: "done"
<*> o A..: "total"
<*> o A..:? "finished"
instance Event HeapProfilerReportHeapSnapshotProgress where
eventName _ = "HeapProfiler.reportHeapSnapshotProgress"
-- | Type of the 'HeapProfiler.resetProfiles' event.
data HeapProfilerResetProfiles = HeapProfilerResetProfiles
deriving (Eq, Show, Read)
instance FromJSON HeapProfilerResetProfiles where
parseJSON _ = pure HeapProfilerResetProfiles
instance Event HeapProfilerResetProfiles where
eventName _ = "HeapProfiler.resetProfiles"
-- | Enables console to refer to the node with given id via $x (see Command Line API for more details
-- $x functions).
-- | Parameters of the 'HeapProfiler.addInspectedHeapObject' command.
data PHeapProfilerAddInspectedHeapObject = PHeapProfilerAddInspectedHeapObject
{
-- | Heap snapshot object id to be accessible by means of $x command line API.
pHeapProfilerAddInspectedHeapObjectHeapObjectId :: HeapProfilerHeapSnapshotObjectId
}
deriving (Eq, Show)
pHeapProfilerAddInspectedHeapObject
{-
-- | Heap snapshot object id to be accessible by means of $x command line API.
-}
:: HeapProfilerHeapSnapshotObjectId
-> PHeapProfilerAddInspectedHeapObject
pHeapProfilerAddInspectedHeapObject
arg_pHeapProfilerAddInspectedHeapObjectHeapObjectId
= PHeapProfilerAddInspectedHeapObject
arg_pHeapProfilerAddInspectedHeapObjectHeapObjectId
instance ToJSON PHeapProfilerAddInspectedHeapObject where
toJSON p = A.object $ catMaybes [
("heapObjectId" A..=) <$> Just (pHeapProfilerAddInspectedHeapObjectHeapObjectId p)
]
instance Command PHeapProfilerAddInspectedHeapObject where
type CommandResponse PHeapProfilerAddInspectedHeapObject = ()
commandName _ = "HeapProfiler.addInspectedHeapObject"
fromJSON = const . A.Success . const ()
-- | Parameters of the 'HeapProfiler.collectGarbage' command.
data PHeapProfilerCollectGarbage = PHeapProfilerCollectGarbage
deriving (Eq, Show)
pHeapProfilerCollectGarbage
:: PHeapProfilerCollectGarbage
pHeapProfilerCollectGarbage
= PHeapProfilerCollectGarbage
instance ToJSON PHeapProfilerCollectGarbage where
toJSON _ = A.Null
instance Command PHeapProfilerCollectGarbage where
type CommandResponse PHeapProfilerCollectGarbage = ()
commandName _ = "HeapProfiler.collectGarbage"
fromJSON = const . A.Success . const ()
-- | Parameters of the 'HeapProfiler.disable' command.
data PHeapProfilerDisable = PHeapProfilerDisable
deriving (Eq, Show)
pHeapProfilerDisable
:: PHeapProfilerDisable
pHeapProfilerDisable
= PHeapProfilerDisable
instance ToJSON PHeapProfilerDisable where
toJSON _ = A.Null
instance Command PHeapProfilerDisable where
type CommandResponse PHeapProfilerDisable = ()
commandName _ = "HeapProfiler.disable"
fromJSON = const . A.Success . const ()
-- | Parameters of the 'HeapProfiler.enable' command.
data PHeapProfilerEnable = PHeapProfilerEnable
deriving (Eq, Show)
pHeapProfilerEnable
:: PHeapProfilerEnable
pHeapProfilerEnable
= PHeapProfilerEnable
instance ToJSON PHeapProfilerEnable where
toJSON _ = A.Null
instance Command PHeapProfilerEnable where
type CommandResponse PHeapProfilerEnable = ()
commandName _ = "HeapProfiler.enable"
fromJSON = const . A.Success . const ()
-- | Parameters of the 'HeapProfiler.getHeapObjectId' command.
data PHeapProfilerGetHeapObjectId = PHeapProfilerGetHeapObjectId
{
-- | Identifier of the object to get heap object id for.
pHeapProfilerGetHeapObjectIdObjectId :: Runtime.RuntimeRemoteObjectId
}
deriving (Eq, Show)
pHeapProfilerGetHeapObjectId
{-
-- | Identifier of the object to get heap object id for.
-}
:: Runtime.RuntimeRemoteObjectId
-> PHeapProfilerGetHeapObjectId
pHeapProfilerGetHeapObjectId
arg_pHeapProfilerGetHeapObjectIdObjectId
= PHeapProfilerGetHeapObjectId
arg_pHeapProfilerGetHeapObjectIdObjectId
instance ToJSON PHeapProfilerGetHeapObjectId where
toJSON p = A.object $ catMaybes [
("objectId" A..=) <$> Just (pHeapProfilerGetHeapObjectIdObjectId p)
]
data HeapProfilerGetHeapObjectId = HeapProfilerGetHeapObjectId
{
-- | Id of the heap snapshot object corresponding to the passed remote object id.
heapProfilerGetHeapObjectIdHeapSnapshotObjectId :: HeapProfilerHeapSnapshotObjectId
}
deriving (Eq, Show)
instance FromJSON HeapProfilerGetHeapObjectId where
parseJSON = A.withObject "HeapProfilerGetHeapObjectId" $ \o -> HeapProfilerGetHeapObjectId
<$> o A..: "heapSnapshotObjectId"
instance Command PHeapProfilerGetHeapObjectId where
type CommandResponse PHeapProfilerGetHeapObjectId = HeapProfilerGetHeapObjectId
commandName _ = "HeapProfiler.getHeapObjectId"
-- | Parameters of the 'HeapProfiler.getObjectByHeapObjectId' command.
data PHeapProfilerGetObjectByHeapObjectId = PHeapProfilerGetObjectByHeapObjectId
{
pHeapProfilerGetObjectByHeapObjectIdObjectId :: HeapProfilerHeapSnapshotObjectId,
-- | Symbolic group name that can be used to release multiple objects.
pHeapProfilerGetObjectByHeapObjectIdObjectGroup :: Maybe T.Text
}
deriving (Eq, Show)
pHeapProfilerGetObjectByHeapObjectId
:: HeapProfilerHeapSnapshotObjectId
-> PHeapProfilerGetObjectByHeapObjectId
pHeapProfilerGetObjectByHeapObjectId
arg_pHeapProfilerGetObjectByHeapObjectIdObjectId
= PHeapProfilerGetObjectByHeapObjectId
arg_pHeapProfilerGetObjectByHeapObjectIdObjectId
Nothing
instance ToJSON PHeapProfilerGetObjectByHeapObjectId where
toJSON p = A.object $ catMaybes [
("objectId" A..=) <$> Just (pHeapProfilerGetObjectByHeapObjectIdObjectId p),
("objectGroup" A..=) <$> (pHeapProfilerGetObjectByHeapObjectIdObjectGroup p)
]
data HeapProfilerGetObjectByHeapObjectId = HeapProfilerGetObjectByHeapObjectId
{
-- | Evaluation result.
heapProfilerGetObjectByHeapObjectIdResult :: Runtime.RuntimeRemoteObject
}
deriving (Eq, Show)
instance FromJSON HeapProfilerGetObjectByHeapObjectId where
parseJSON = A.withObject "HeapProfilerGetObjectByHeapObjectId" $ \o -> HeapProfilerGetObjectByHeapObjectId
<$> o A..: "result"
instance Command PHeapProfilerGetObjectByHeapObjectId where
type CommandResponse PHeapProfilerGetObjectByHeapObjectId = HeapProfilerGetObjectByHeapObjectId
commandName _ = "HeapProfiler.getObjectByHeapObjectId"
-- | Parameters of the 'HeapProfiler.getSamplingProfile' command.
data PHeapProfilerGetSamplingProfile = PHeapProfilerGetSamplingProfile
deriving (Eq, Show)
pHeapProfilerGetSamplingProfile
:: PHeapProfilerGetSamplingProfile
pHeapProfilerGetSamplingProfile
= PHeapProfilerGetSamplingProfile
instance ToJSON PHeapProfilerGetSamplingProfile where
toJSON _ = A.Null
data HeapProfilerGetSamplingProfile = HeapProfilerGetSamplingProfile
{
-- | Return the sampling profile being collected.
heapProfilerGetSamplingProfileProfile :: HeapProfilerSamplingHeapProfile
}
deriving (Eq, Show)
instance FromJSON HeapProfilerGetSamplingProfile where
parseJSON = A.withObject "HeapProfilerGetSamplingProfile" $ \o -> HeapProfilerGetSamplingProfile
<$> o A..: "profile"
instance Command PHeapProfilerGetSamplingProfile where
type CommandResponse PHeapProfilerGetSamplingProfile = HeapProfilerGetSamplingProfile
commandName _ = "HeapProfiler.getSamplingProfile"
-- | Parameters of the 'HeapProfiler.startSampling' command.
data PHeapProfilerStartSampling = PHeapProfilerStartSampling
{
-- | Average sample interval in bytes. Poisson distribution is used for the intervals. The
-- default value is 32768 bytes.
pHeapProfilerStartSamplingSamplingInterval :: Maybe Double,
-- | By default, the sampling heap profiler reports only objects which are
-- still alive when the profile is returned via getSamplingProfile or
-- stopSampling, which is useful for determining what functions contribute
-- the most to steady-state memory usage. This flag instructs the sampling
-- heap profiler to also include information about objects discarded by
-- major GC, which will show which functions cause large temporary memory
-- usage or long GC pauses.
pHeapProfilerStartSamplingIncludeObjectsCollectedByMajorGC :: Maybe Bool,
-- | By default, the sampling heap profiler reports only objects which are
-- still alive when the profile is returned via getSamplingProfile or
-- stopSampling, which is useful for determining what functions contribute
-- the most to steady-state memory usage. This flag instructs the sampling
-- heap profiler to also include information about objects discarded by
-- minor GC, which is useful when tuning a latency-sensitive application
-- for minimal GC activity.
pHeapProfilerStartSamplingIncludeObjectsCollectedByMinorGC :: Maybe Bool
}
deriving (Eq, Show)
pHeapProfilerStartSampling
:: PHeapProfilerStartSampling
pHeapProfilerStartSampling
= PHeapProfilerStartSampling
Nothing
Nothing
Nothing
instance ToJSON PHeapProfilerStartSampling where
toJSON p = A.object $ catMaybes [
("samplingInterval" A..=) <$> (pHeapProfilerStartSamplingSamplingInterval p),
("includeObjectsCollectedByMajorGC" A..=) <$> (pHeapProfilerStartSamplingIncludeObjectsCollectedByMajorGC p),
("includeObjectsCollectedByMinorGC" A..=) <$> (pHeapProfilerStartSamplingIncludeObjectsCollectedByMinorGC p)
]
instance Command PHeapProfilerStartSampling where
type CommandResponse PHeapProfilerStartSampling = ()
commandName _ = "HeapProfiler.startSampling"
fromJSON = const . A.Success . const ()
-- | Parameters of the 'HeapProfiler.startTrackingHeapObjects' command.
data PHeapProfilerStartTrackingHeapObjects = PHeapProfilerStartTrackingHeapObjects
{
pHeapProfilerStartTrackingHeapObjectsTrackAllocations :: Maybe Bool
}
deriving (Eq, Show)
pHeapProfilerStartTrackingHeapObjects
:: PHeapProfilerStartTrackingHeapObjects
pHeapProfilerStartTrackingHeapObjects
= PHeapProfilerStartTrackingHeapObjects
Nothing
instance ToJSON PHeapProfilerStartTrackingHeapObjects where
toJSON p = A.object $ catMaybes [
("trackAllocations" A..=) <$> (pHeapProfilerStartTrackingHeapObjectsTrackAllocations p)
]
instance Command PHeapProfilerStartTrackingHeapObjects where
type CommandResponse PHeapProfilerStartTrackingHeapObjects = ()
commandName _ = "HeapProfiler.startTrackingHeapObjects"
fromJSON = const . A.Success . const ()
-- | Parameters of the 'HeapProfiler.stopSampling' command.
data PHeapProfilerStopSampling = PHeapProfilerStopSampling
deriving (Eq, Show)
pHeapProfilerStopSampling
:: PHeapProfilerStopSampling
pHeapProfilerStopSampling
= PHeapProfilerStopSampling
instance ToJSON PHeapProfilerStopSampling where
toJSON _ = A.Null
data HeapProfilerStopSampling = HeapProfilerStopSampling
{
-- | Recorded sampling heap profile.
heapProfilerStopSamplingProfile :: HeapProfilerSamplingHeapProfile
}
deriving (Eq, Show)
instance FromJSON HeapProfilerStopSampling where
parseJSON = A.withObject "HeapProfilerStopSampling" $ \o -> HeapProfilerStopSampling
<$> o A..: "profile"
instance Command PHeapProfilerStopSampling where
type CommandResponse PHeapProfilerStopSampling = HeapProfilerStopSampling
commandName _ = "HeapProfiler.stopSampling"
-- | Parameters of the 'HeapProfiler.stopTrackingHeapObjects' command.
data PHeapProfilerStopTrackingHeapObjects = PHeapProfilerStopTrackingHeapObjects
{
-- | If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken
-- when the tracking is stopped.
pHeapProfilerStopTrackingHeapObjectsReportProgress :: Maybe Bool,
-- | If true, numerical values are included in the snapshot
pHeapProfilerStopTrackingHeapObjectsCaptureNumericValue :: Maybe Bool,
-- | If true, exposes internals of the snapshot.
pHeapProfilerStopTrackingHeapObjectsExposeInternals :: Maybe Bool
}
deriving (Eq, Show)
pHeapProfilerStopTrackingHeapObjects
:: PHeapProfilerStopTrackingHeapObjects
pHeapProfilerStopTrackingHeapObjects
= PHeapProfilerStopTrackingHeapObjects
Nothing
Nothing
Nothing
instance ToJSON PHeapProfilerStopTrackingHeapObjects where
toJSON p = A.object $ catMaybes [
("reportProgress" A..=) <$> (pHeapProfilerStopTrackingHeapObjectsReportProgress p),
("captureNumericValue" A..=) <$> (pHeapProfilerStopTrackingHeapObjectsCaptureNumericValue p),
("exposeInternals" A..=) <$> (pHeapProfilerStopTrackingHeapObjectsExposeInternals p)
]
instance Command PHeapProfilerStopTrackingHeapObjects where
type CommandResponse PHeapProfilerStopTrackingHeapObjects = ()
commandName _ = "HeapProfiler.stopTrackingHeapObjects"
fromJSON = const . A.Success . const ()
-- | Parameters of the 'HeapProfiler.takeHeapSnapshot' command.
data PHeapProfilerTakeHeapSnapshot = PHeapProfilerTakeHeapSnapshot
{
-- | If true 'reportHeapSnapshotProgress' events will be generated while snapshot is being taken.
pHeapProfilerTakeHeapSnapshotReportProgress :: Maybe Bool,
-- | If true, numerical values are included in the snapshot
pHeapProfilerTakeHeapSnapshotCaptureNumericValue :: Maybe Bool,
-- | If true, exposes internals of the snapshot.
pHeapProfilerTakeHeapSnapshotExposeInternals :: Maybe Bool
}
deriving (Eq, Show)
pHeapProfilerTakeHeapSnapshot
:: PHeapProfilerTakeHeapSnapshot
pHeapProfilerTakeHeapSnapshot
= PHeapProfilerTakeHeapSnapshot
Nothing
Nothing
Nothing
instance ToJSON PHeapProfilerTakeHeapSnapshot where
toJSON p = A.object $ catMaybes [
("reportProgress" A..=) <$> (pHeapProfilerTakeHeapSnapshotReportProgress p),
("captureNumericValue" A..=) <$> (pHeapProfilerTakeHeapSnapshotCaptureNumericValue p),
("exposeInternals" A..=) <$> (pHeapProfilerTakeHeapSnapshotExposeInternals p)
]
instance Command PHeapProfilerTakeHeapSnapshot where
type CommandResponse PHeapProfilerTakeHeapSnapshot = ()
commandName _ = "HeapProfiler.takeHeapSnapshot"
fromJSON = const . A.Success . const ()