{-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} module OpenTelemetry.Exporter.Handle ( makeHandleExporter, -- $ stdoutExporter', stderrExporter', -- $ defaultFormatter, ) where import Data.IORef import qualified Data.Text.Lazy as L import qualified Data.Text.Lazy.IO as L import OpenTelemetry.Exporter import OpenTelemetry.Trace.Core import System.IO (Handle, hFlush, stderr, stdout) makeHandleExporter :: Handle -> (ImmutableSpan -> IO L.Text) -> Exporter ImmutableSpan makeHandleExporter h f = Exporter { exporterExport = \fs -> do mapM_ (mapM_ (\s -> f s >>= L.hPutStrLn h >> hFlush h)) fs pure Success , exporterShutdown = hFlush h } stdoutExporter' :: (ImmutableSpan -> IO L.Text) -> Exporter ImmutableSpan stdoutExporter' = makeHandleExporter stdout stderrExporter' :: (ImmutableSpan -> IO L.Text) -> Exporter ImmutableSpan stderrExporter' = makeHandleExporter stderr defaultFormatter :: ImmutableSpan -> L.Text defaultFormatter ImmutableSpan {..} = L.intercalate " " [ L.pack $ show $ traceId spanContext , L.pack $ show $ spanId spanContext , L.pack $ show spanStart , L.fromStrict spanName ]