diff --git a/preamble.cabal b/preamble.cabal
--- a/preamble.cabal
+++ b/preamble.cabal
@@ -1,5 +1,5 @@
 name:                  preamble
-version:               0.0.33
+version:               0.0.34
 synopsis:              Yet another prelude.
 description:           A prelude built on basic-prelude.
 homepage:              https://github.com/swift-nav/preamble
diff --git a/src/Preamble/Ctx.hs b/src/Preamble/Ctx.hs
--- a/src/Preamble/Ctx.hs
+++ b/src/Preamble/Ctx.hs
@@ -11,7 +11,8 @@
 
 import Control.Monad.Logger
 import Control.Monad.Reader
-import Network.Socket
+import Network.Socket            hiding (sendTo)
+import Network.Socket.ByteString
 import Preamble.Prelude
 import Preamble.Trace
 import Preamble.Types
@@ -45,8 +46,8 @@
   s <- liftIO $ socket AF_INET Datagram defaultProtocol
   h <- liftIO $ fromMaybe "127.0.0.1" <$> lookupEnv "STATS_HOST"
   a <- liftIO $ inet_addr h
-  let sa = SockAddrInet 8125 a
-  runTransT (StatsCtx c s sa) action
+  let stat m = void $ sendTo s m $ SockAddrInet 8125 a
+  runTransT (StatsCtx c mempty stat) action
 
 -- | Update stats context's preamble.
 --
diff --git a/src/Preamble/Stats.hs b/src/Preamble/Stats.hs
--- a/src/Preamble/Stats.hs
+++ b/src/Preamble/Stats.hs
@@ -14,21 +14,16 @@
   , statsDecrement
   ) where
 
-import Network.Socket.ByteString
 import Preamble.Prelude
 import Preamble.Types
 
-sendto :: MonadStatsCtx c m => ByteString -> m ()
-sendto metric = do
-  s <- view scSocket
-  a <- view scSockAddr
-  liftIO $ void $ sendTo s metric a
-
 stats :: (MonadStatsCtx c m, Show a) => Text -> Text -> a -> Tags -> m ()
-stats stat name value tags = do
-  let metric = name -:- show value -|- stat
-      tagged = intercalate "," $ flip map tags $ uncurry (-:-)
-  sendto $ encodeUtf8 $ bool (metric -|- "#" <> tagged) metric $ null tags
+stats metric name value tags = do
+  labels <- (<> tags) <$> view scLabels
+  let statsd = name -:- show value -|- metric
+      tagged = intercalate "," $ flip map labels $ uncurry (-:-)
+  stat <- view scStat
+  liftIO $ stat $ encodeUtf8 $ bool (statsd -|- "#" <> tagged) statsd $ null labels
 
 statsCount :: (MonadStatsCtx c m, Show a) => Text -> a -> Tags -> m ()
 statsCount = stats "c"
diff --git a/src/Preamble/Types/Alias.hs b/src/Preamble/Types/Alias.hs
--- a/src/Preamble/Types/Alias.hs
+++ b/src/Preamble/Types/Alias.hs
@@ -28,6 +28,10 @@
 --
 type Logger = Loc -> LogSource -> LogLevel -> LogStr -> IO ()
 
+-- | Stat
+--
+type Stat = ByteString -> IO ()
+
 -- | MonadControl
 --
 type MonadControl m =
diff --git a/src/Preamble/Types/Ctx.hs b/src/Preamble/Types/Ctx.hs
--- a/src/Preamble/Types/Ctx.hs
+++ b/src/Preamble/Types/Ctx.hs
@@ -13,7 +13,6 @@
 import Control.Monad.Logger
 import Control.Monad.Random
 import Control.Monad.Reader
-import Network.Socket
 import Preamble.Lens
 import Preamble.Prelude
 import Preamble.Types.Alias
@@ -46,12 +45,12 @@
 -- Stats context.
 --
 data StatsCtx = StatsCtx
-  { _scCtx      :: Ctx
+  { _scCtx    :: Ctx
     -- ^ Parent environment.
-  , _scSocket   :: Socket
-    -- ^ UDP Socket for statsd.
-  , _scSockAddr :: SockAddr
-    -- ^ UDP SockAddr for statsd.
+  , _scLabels :: Tags
+    -- ^ Tags to append to every stat.
+  , _scStat   :: Stat
+    -- ^ Configurable stat function.
   }
 
 $(makeClassyConstraints ''StatsCtx [''HasCtx])
