diff --git a/lightstep-haskell.cabal b/lightstep-haskell.cabal
--- a/lightstep-haskell.cabal
+++ b/lightstep-haskell.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.4
 
 name:           lightstep-haskell
-version:        0.1.4
+version:        0.1.5
 synopsis:       LightStep OpenTracing client library
 description:    LightStep OpenTracing client library. Uses GRPC transport via proto-lens.
 category:       Tools
diff --git a/src/LightStep/HighLevel/IO.hs b/src/LightStep/HighLevel/IO.hs
--- a/src/LightStep/HighLevel/IO.hs
+++ b/src/LightStep/HighLevel/IO.hs
@@ -97,10 +97,11 @@
         shutdown client = do
           d_ "Getting the last spans before shutdown"
           spans <- liftIO $ atomically $ flushTBQueue globalSharedMutableSingletonState
-          d_ $ "Got " <> show (length spans) <> " spans"
-          when (not $ null spans) $
+          when (not $ null spans) $ do
+            d_ $ "Got " <> show (length spans) <> " spans"
             reportSpans client spans
-          d_ $ "Reported " <> show (length spans) <> " spans"
+            d_ $ "Reported " <> show (length spans) <> " spans"
+          d_ "No more spans"
           closeClient client
           d_ "Client closed"
           liftIO $ putMVar doneVar ()
@@ -113,10 +114,19 @@
               work client
               loop
         loop
-    pure ()
 
 submitSpan :: Span -> IO ()
-submitSpan = atomically . writeTBQueue globalSharedMutableSingletonState
+submitSpan sp = do
+  written <- atomically $ tryWriteTBQueue globalSharedMutableSingletonState sp
+  when (not written) $ do
+    d_ "internal span queue is full, dropping the span"
+
+tryWriteTBQueue :: TBQueue a -> a -> STM Bool
+tryWriteTBQueue q a = isFullTBQueue q >>= \case
+  True -> pure False
+  _ -> do
+    writeTBQueue q a
+    pure True
 
 -- TODO: handle span batches larger that queue size
 submitSpans :: Foldable f => f Span -> IO ()
diff --git a/src/LightStep/LowLevel.hs b/src/LightStep/LowLevel.hs
--- a/src/LightStep/LowLevel.hs
+++ b/src/LightStep/LowLevel.hs
@@ -31,6 +31,7 @@
 
 reportSpans :: LightStepClient -> [Span] -> ExceptT ClientError IO ()
 reportSpans (LightStepClient grpc token rep) sps = do
+  d_ $ show ("RPC timeout", (\(Timeout t) -> t) $ _grpcClientTimeout grpc)
   ret <-
     rawUnary
       (RPC :: RPC CollectorService "report")
@@ -40,13 +41,19 @@
           & spans .~ sps
           & reporter .~ rep
       )
-  d_ (show ret)
+  d_ $ show ret
   -- FIXME: handle errors
   pure ()
 
 mkClient :: LightStepConfig -> ClientIO LightStepClient
 mkClient LightStepConfig {..} = do
-  grpc <- setupGrpcClient ((grpcClientConfigSimple lsHostName lsPort True) {_grpcClientConfigCompression = compression})
+  grpc <-
+    setupGrpcClient
+      ( (grpcClientConfigSimple lsHostName lsPort True)
+          { _grpcClientConfigCompression = compression,
+            _grpcClientConfigTimeout = Timeout 5 -- seconds
+          }
+      )
   pure $ LightStepClient grpc lsToken rep
   where
     compression = if False then gzip else uncompressed
