diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,11 @@
-## [_Unreleased_](https://github.com/freckle/freckle-app/compare/v1.9.0.0...main)
+## [_Unreleased_](https://github.com/freckle/freckle-app/compare/v1.9.0.1...main)
+
+## [v1.9.0.1](https://github.com/freckle/freckle-app/compare/v1.9.0.0...v1.9.0.1)
+
+- Report errors getting ECS Metadata during `withStatsClient` initialization
+
+  This does change the type of `getEcsMetadata`, but we consider it a
+  patch-level bump because that module is very unlikely to be used directly.
 
 ## [v1.9.0.0](https://github.com/freckle/freckle-app/compare/v1.8.1.0...v1.9.0.0)
 
diff --git a/freckle-app.cabal b/freckle-app.cabal
--- a/freckle-app.cabal
+++ b/freckle-app.cabal
@@ -1,6 +1,6 @@
 cabal-version:      1.18
 name:               freckle-app
-version:            1.9.0.0
+version:            1.9.0.1
 license:            MIT
 license-file:       LICENSE
 maintainer:         Freckle Education
diff --git a/library/Freckle/App/Ecs.hs b/library/Freckle/App/Ecs.hs
--- a/library/Freckle/App/Ecs.hs
+++ b/library/Freckle/App/Ecs.hs
@@ -1,5 +1,6 @@
 module Freckle.App.Ecs
   ( EcsMetadata(..)
+  , EcsMetadataError(..)
   , EcsContainerMetadata(..)
   , EcsContainerTaskMetadata(..)
   , getEcsMetadata
@@ -7,17 +8,23 @@
 
 import Freckle.App.Prelude
 
-import Control.Error.Util (hush)
+import Control.Monad.Except (MonadError(..))
 import Data.Aeson
 import Data.List.Extra (dropPrefix)
 import Freckle.App.Http
 import System.Environment (lookupEnv)
+import UnliftIO.Exception (Exception(..))
 
 data EcsMetadata = EcsMetadata
   { emContainerMetadata :: EcsContainerMetadata
   , emContainerTaskMetadata :: EcsContainerTaskMetadata
   }
 
+data EcsMetadataError
+  = EcsMetadataErrorInvalidURI String
+  | EcsMetadataErrorInvalidJSON HttpDecodeError
+  deriving stock Show
+
 data EcsContainerMetadata = EcsContainerMetadata
   { ecmDockerId :: Text
   , ecmDockerName :: Text
@@ -43,15 +50,24 @@
 aesonDropPrefix :: String -> Options
 aesonDropPrefix x = defaultOptions { fieldLabelModifier = dropPrefix x }
 
-getEcsMetadata :: MonadIO m => m (Maybe EcsMetadata)
-getEcsMetadata =
-  liftA2 EcsMetadata
-    <$> makeContainerMetadataRequest "/"
-    <*> makeContainerMetadataRequest "/task"
-
-makeContainerMetadataRequest :: (MonadIO m, FromJSON a) => Text -> m (Maybe a)
-makeContainerMetadataRequest path = do
+getEcsMetadata
+  :: (MonadIO m, MonadError EcsMetadataError m) => m (Maybe EcsMetadata)
+getEcsMetadata = do
   mURI <- liftIO $ lookupEnv "ECS_CONTAINER_METADATA_URI"
-  meMetadata <- for mURI $ \uri -> do
-    httpJson $ parseRequest_ $ uri <> unpack path
-  pure $ hush . getResponseBody =<< meMetadata
+
+  for mURI $ \uri ->
+    EcsMetadata
+      <$> makeContainerMetadataRequest (uri <> "/")
+      <*> makeContainerMetadataRequest (uri <> "/task")
+
+makeContainerMetadataRequest
+  :: (MonadIO m, MonadError EcsMetadataError m, FromJSON a) => String -> m a
+makeContainerMetadataRequest =
+  mapEither EcsMetadataErrorInvalidJSON
+    . getResponseBody
+    <=< httpJson
+    <=< mapEither (EcsMetadataErrorInvalidURI . displayException)
+    . parseRequest
+
+mapEither :: MonadError e m => (x -> e) -> Either x a -> m a
+mapEither f = either (throwError . f) pure
diff --git a/library/Freckle/App/Stats.hs b/library/Freckle/App/Stats.hs
--- a/library/Freckle/App/Stats.hs
+++ b/library/Freckle/App/Stats.hs
@@ -36,6 +36,7 @@
 
 import Blammo.Logging
 import Control.Lens (Lens', lens, to, view, (&), (.~), (<>~))
+import Control.Monad.Except (runExceptT)
 import Control.Monad.Reader (local)
 import Data.Aeson (Value(..))
 import Data.String
@@ -43,6 +44,7 @@
 import Freckle.App.Ecs
 import qualified Freckle.App.Env as Env
 import qualified Network.StatsD.Datadog as Datadog
+import System.IO (hPutStrLn, stderr)
 import qualified System.Metrics.Gauge as EKG
 import UnliftIO.Exception (bracket_)
 import Yesod.Core.Lens
@@ -264,8 +266,12 @@
     & (Datadog.tags .~ map (uncurry Datadog.tag) scTags)
 
 getEcsMetadataTags :: MonadIO m => m [(Text, Text)]
-getEcsMetadataTags = maybe [] toTags <$> getEcsMetadata
+getEcsMetadataTags = do
+  emMetadata <- runExceptT getEcsMetadata
+  either (([] <$) . err) (pure . maybe [] toTags) emMetadata
  where
+  err e = liftIO $ hPutStrLn stderr $ "Error reading ECS Metadata: " <> show e
+
   toTags (EcsMetadata EcsContainerMetadata {..} EcsContainerTaskMetadata {..})
     = [ ("container_id", ecmDockerId)
       , ("container_name", ecmDockerName)
diff --git a/package.yaml b/package.yaml
--- a/package.yaml
+++ b/package.yaml
@@ -1,5 +1,5 @@
 name: freckle-app
-version: 1.9.0.0
+version: 1.9.0.1
 maintainer: Freckle Education
 category: Utils
 github: freckle/freckle-app
