packages feed

freckle-app 1.7.1.0 → 1.8.0.0

raw patch · 6 files changed

+63/−25 lines, 6 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

- Freckle.App.Stats: data GaugeName
+ Freckle.App.Database: class HasVaultData env
+ Freckle.App.Database: getVaultData :: HasVaultData env => env -> Maybe XRayVaultData
+ Freckle.App.Database: instance Freckle.App.Database.HasVaultData (Yesod.Core.Types.HandlerData child site)
+ Freckle.App.Stats: data Gauge
+ Freckle.App.Test: class HasVaultData env
+ Freckle.App.Test: getVaultData :: HasVaultData env => env -> Maybe XRayVaultData
+ Freckle.App.Test: instance Freckle.App.Database.HasVaultData app => Freckle.App.Database.HasVaultData (Freckle.App.Test.AppExample app a)
- Freckle.App.Database: runDB :: (HasSqlPool app, HasStatsClient app, MonadHandler m, MonadUnliftIO m, MonadReader app m) => SqlPersistT m a -> m a
+ Freckle.App.Database: runDB :: (HasSqlPool app, HasStatsClient app, HasVaultData app, MonadUnliftIO m, MonadReader app m) => SqlPersistT m a -> m a
- Freckle.App.Stats: dbConnections :: GaugeName
+ Freckle.App.Stats: dbConnections :: Gauges -> Gauge
- Freckle.App.Stats: withGauge :: (MonadReader app m, HasStatsClient app, MonadUnliftIO m) => GaugeName -> m a -> m a
+ Freckle.App.Stats: withGauge :: (MonadReader app m, HasStatsClient app, MonadUnliftIO m) => (Gauges -> Gauge) -> m a -> m a
- Freckle.App.Test: runDB :: (HasSqlPool app, HasStatsClient app, MonadHandler m, MonadUnliftIO m, MonadReader app m) => SqlPersistT m a -> m a
+ Freckle.App.Test: runDB :: (HasSqlPool app, HasStatsClient app, HasVaultData app, MonadUnliftIO m, MonadReader app m) => SqlPersistT m a -> m a

Files

CHANGELOG.md view
@@ -1,4 +1,9 @@-## [_Unreleased_](https://github.com/freckle/freckle-app/compare/v1.7.1.0...main)+## [_Unreleased_](https://github.com/freckle/freckle-app/compare/v1.8.0.0...main)++## [v1.8.0.0](https://github.com/freckle/freckle-app/compare/v1.7.1.0...v1.8.0.0)++- Fix bug: gauges not being published.+- Add HasVaultData type class to remove the dependency on Yesod's MonadHandler  ## [v1.7.1.0](https://github.com/freckle/freckle-app/compare/v1.7.0.0...v1.7.1.0) 
freckle-app.cabal view
@@ -1,6 +1,6 @@ cabal-version:      1.18 name:               freckle-app-version:            1.7.1.0+version:            1.8.0.0 license:            MIT license-file:       LICENSE maintainer:         Freckle Education
library/Freckle/App/Database.hs view
@@ -8,6 +8,7 @@ -- | Database access for your @App@ module Freckle.App.Database   ( HasSqlPool(..)+  , HasVaultData(..)   , SqlPool   , makePostgresPool   , makePostgresPoolWith@@ -54,7 +55,8 @@ import UnliftIO.Concurrent (threadDelay) import UnliftIO.Exception (displayException) import UnliftIO.IORef-import Yesod.Core (MonadHandler, MonadUnliftIO(withRunInIO), waiRequest)+import Yesod.Core (MonadUnliftIO(withRunInIO), YesodRequest(reqWaiRequest))+import Yesod.Core.Types (HandlerData(handlerRequest))  type SqlPool = Pool SqlBackend @@ -64,6 +66,12 @@ instance HasSqlPool SqlPool where   getSqlPool = id +class HasVaultData env where+  getVaultData :: env -> Maybe XRayVaultData++instance HasVaultData (HandlerData child site) where+  getVaultData = vaultDataFromRequest . reqWaiRequest . handlerRequest+ makePostgresPool :: (MonadUnliftIO m, MonadLoggerIO m) => m SqlPool makePostgresPool = do   conf <- liftIO $ do@@ -74,7 +82,7 @@ runDB   :: ( HasSqlPool app      , HasStatsClient app-     , MonadHandler m+     , HasVaultData app      , MonadUnliftIO m      , MonadReader app m      )@@ -82,7 +90,7 @@   -> m a runDB action = do   pool <- asks getSqlPool-  mVaultData <- vaultDataFromRequest <$> waiRequest+  mVaultData <- asks getVaultData   Stats.withGauge Stats.dbConnections $     maybe       runSqlPool
library/Freckle/App/Stats.hs view
@@ -18,7 +18,7 @@    -- * Gauges   , Gauges-  , GaugeName+  , Gauge   , dbConnections   , withGauge @@ -93,19 +93,18 @@         ]       <> tags --- should be data but newtype for now because there's only one and only one planned newtype Gauges = Gauges-  { gdbConnections :: EKG.Gauge+  { gdbConnections :: Gauge   -- ^ Track open db connections   } --- Opaque wrapper to hide EKG.Gauge-newtype GaugeName = GaugeName-  { unGaugeName :: Gauges -> EKG.Gauge+data Gauge = Gauge+  { gName :: Text+  , gGauge :: EKG.Gauge   } -dbConnections :: GaugeName-dbConnections = GaugeName gdbConnections+dbConnections :: Gauges -> Gauge+dbConnections = gdbConnections  data StatsClient = StatsClient   { scClient :: Datadog.StatsClient@@ -134,25 +133,48 @@   -> (StatsClient -> m a)   -> m a withStatsClient StatsSettings {..} f = do-  gauges <- liftIO $ fmap Gauges EKG.new+  gauges <- liftIO $ do+    gdbConnections <- Gauge "active_pool_connections" <$> EKG.new+    pure Gauges { .. }+   if amsEnabled     then do       tags <- (amsTags <>) <$> getEcsMetadataTags       Datadog.withDogStatsD amsSettings $ \client ->         -- Add the tags to the thread context so they're present in all logs-        withThreadContext (map toPair tags)-          $ f StatsClient { scClient = client, scTags = tags, scGauges = gauges }+        withThreadContext (map toPair tags) $ f StatsClient+          { scClient = client+          , scTags = tags+          , scGauges = gauges+          }     else do-      f $ StatsClient { scClient = Datadog.Dummy, scTags = amsTags, scGauges = gauges }+      f $ StatsClient+        { scClient = Datadog.Dummy+        , scTags = amsTags+        , scGauges = gauges+        }   where toPair = bimap (fromString . unpack) String -withGauge :: (MonadReader app m, HasStatsClient app, MonadUnliftIO m) => GaugeName -> m a -> m a-withGauge gaugeName f = do-  gauge' <- view $ statsClientL . gaugesL . to (unGaugeName gaugeName)-  bracket_ (plus1 gauge') (minus1 gauge') f-  where-    plus1 g = liftIO $ EKG.add g 1-    minus1 g = liftIO $ EKG.subtract g 1+withGauge+  :: (MonadReader app m, HasStatsClient app, MonadUnliftIO m)+  => (Gauges -> Gauge)+  -> m a+  -> m a+withGauge getGauge f = do+  gauge' <- view $ statsClientL . gaugesL . to getGauge+  bracket_ (inc gauge') (dec gauge') f+ where+  inc g@Gauge {..} = do+    liftIO $ EKG.inc gGauge+    publish g++  dec g@Gauge {..} = do+    liftIO $ EKG.dec gGauge+    publish g++  publish Gauge {..} = do+    n <- liftIO $ EKG.read gGauge+    gauge gName $ fromIntegral n  -- | Include the given tags on all metrics emitted from a block tagged
library/Freckle/App/Test.hs view
@@ -103,6 +103,9 @@     params     ($ ()) +instance HasVaultData app => HasVaultData (AppExample app a) where+  getVaultData = asks getVaultData+ -- | A type restricted version of id -- -- Like 'example', which forces the expectation to 'IO', this can be used to
package.yaml view
@@ -1,6 +1,6 @@ --- name: freckle-app-version: 1.7.1.0+version: 1.8.0.0 maintainer: Freckle Education category: Utils github: freckle/freckle-app