packages feed

nri-observability-0.4.0.1: scripts/memory-leak-test/Main.hs

{-# LANGUAGE NumericUnderscores #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedRecordUpdate #-}
{-# LANGUAGE OverloadedStrings #-}

module Main where

import qualified Conduit
import Control.Concurrent (threadDelay)
import Control.Concurrent.Async (mapConcurrently_)
import Control.Monad (forM_, sequence, void)
import Data.List (splitAt)
import qualified Environment
import GHC.Conc (numCapabilities)
import qualified Observability
import qualified Platform
import qualified Process
import Prelude (IO, div, fromIntegral, mapM_, pure, putStrLn, show)

threads :: Int
threads = fromIntegral numCapabilities

main :: IO ()
main = do
  settings' <- Environment.decode Observability.decoder
  putStrLn (show settings'.enabledReporters)
  let ids = [1 .. 12] |> List.map Text.fromInt
  Conduit.withAcquire (Observability.handler settings') <| \handler -> do
    forM_ [1 .. (floor (1_000_000 / fromIntegral threads))] <| \n -> do
      runRequests handler ids

runRequests :: Observability.Handler -> [Text] -> IO ()
runRequests handler =
  mapConcurrently_
    ( \requestId -> do
        Platform.rootTracingSpanIO
          requestId
          Platform.silentTrack
          (handler.report requestId)
          ("Running task" ++ requestId)
          ( \log -> do
              Task.perform
                log
                ( do
                    Process.sleep 5
                    Task.succeed ()
                )
          )
    )

chunks :: Int -> [a] -> [[a]]
chunks _ [] = []
chunks n xs =
  let (ys, zs) = splitAt (fromIntegral n) xs
   in ys : chunks n zs